Skip to content

Commit

Permalink
feat: delete team
Browse files Browse the repository at this point in the history
  • Loading branch information
Amama-Fatima committed Jun 22, 2024
1 parent 7e64030 commit 329f031
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 12 deletions.
44 changes: 42 additions & 2 deletions src/app/api/teams/team/[team_id]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,49 @@ export async function DELETE(
{ params }: { params: { team_id: string } }
) {
try {
const { team_id } = params;

const team_id = params.team_id;
const teamHead = await req.json();
const serverSupabase = createSupabaseServerClient();

//before deleting team, get all members of the team
const { data: membersData, error: membersError } = await serverSupabase
.from('teams-members')
.select('member_id')
.eq('team_id', team_id);
if (membersError) {
throw new Error(membersError.message);
}

const updateDataArray = await Promise.all(
membersData.map(async (member) => {
const { data: profileData, error } = await serverSupabase
.from('profiles')
.select('teams_joined')
.eq('id', member.member_id);
if (error) {
throw new Error(error.message);
}
return {
teams_joined: profileData[0].teams_joined - 1,
user_id: member.member_id,
requester_id: teamHead.userId,
};
})
);

await Promise.all(
updateDataArray.map(async (updateData) => {
const { error } = await serverSupabase.rpc('update_teams_joined', {
requester_id: updateData.requester_id,
user_id: updateData.user_id,
updated_teams_joined: updateData.teams_joined,
});
if (error) {
throw new Error(error.message);
}
})
);

//delete team
const { error } = await serverSupabase
.from('teams')
Expand Down
51 changes: 41 additions & 10 deletions src/components/teams-tabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,21 @@ export default function TeamsTabs({
return true;
}

const mutate = useMutation({
async function deleteTeam(team_id: string) {
const response = await fetch(`/api/teams/team/${team_id}`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ userId }),
});
if (response.status !== 200) {
throw new Error('Failed to delete team');
}
return true;
}

const leaveMutate = useMutation({
mutationFn: leaveTeam,
onSuccess: () => {
toast.success('Successfully left team');
Expand All @@ -78,9 +92,16 @@ export default function TeamsTabs({
},
});

const onLeaveClick = (team_id: string) => {
mutate.mutate(team_id);
};
const deleteMutate = useMutation({
mutationFn: deleteTeam,
onSuccess: () => {
toast.success('Successfully deleted team');
router.replace('/dashboard/teams');
},
onError: () => {
toast.error('Failed to delete team');
},
});

return (
<div>
Expand Down Expand Up @@ -122,19 +143,29 @@ export default function TeamsTabs({
/>
)}
<MembersTable members={tableMembers} />
<div className='self-end'>
<div className='self-end flex gap-2'>
{isHead(teamToShow) && (
<Button size='sm' variant='destructive'>
Delete Team
<Button
size='sm'
variant='destructive'
disabled={deleteMutate.isPending}
onClick={() =>
deleteMutate.mutate(teamToShow.team_id)
}
>
{deleteMutate.isPending && (
<Icons.spinner className='size-4 animate-spin mr-2' />
)}
Delete
</Button>
)}
<Button
size='sm'
variant='ghost'
disabled={mutate.isPending}
onClick={() => onLeaveClick(teamToShow.team_id)}
disabled={leaveMutate.isPending}
onClick={() => leaveMutate.mutate(teamToShow.team_id)}
>
{mutate.isPending && (
{leaveMutate.isPending && (
<Icons.spinner className='size-4 animate-spin mr-2' />
)}
Leave
Expand Down
9 changes: 9 additions & 0 deletions supabase/migrations/20240622223525_delete-team-policy.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
create policy "Enable delete for users based on user_id"
on "public"."teams"
as permissive
for delete
to public
using ((( SELECT auth.uid() AS uid) = team_head));



0 comments on commit 329f031

Please sign in to comment.