From 90ca97339dd7a0d1f4e8728b304601f4b9c117fe Mon Sep 17 00:00:00 2001 From: Zai Shi Date: Wed, 8 May 2024 16:39:54 +0200 Subject: [PATCH] added team deletion --- .../projects/[projectId]/teams/team-table.tsx | 4 +- .../src/app/api/v1/teams/[teamId]/route.tsx | 40 ++++++++++++++++++- .../src/interface/serverInterface.ts | 8 ++++ packages/stack/src/lib/stack-app.ts | 5 +++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/packages/stack-server/src/app/(main)/(protected)/projects/[projectId]/teams/team-table.tsx b/packages/stack-server/src/app/(main)/(protected)/projects/[projectId]/teams/team-table.tsx index 0bfaea5f8..508dfa3d1 100644 --- a/packages/stack-server/src/app/(main)/(protected)/projects/[projectId]/teams/team-table.tsx +++ b/packages/stack-server/src/app/(main)/(protected)/projects/[projectId]/teams/team-table.tsx @@ -152,14 +152,14 @@ function Actions(props: { params: any }) { open={isDeleteModalOpen} onClose={() => setIsDeleteModalOpen(false)} okButton={{ - label: "Delete user", + label: "Delete Team", onClick: async () => { await props.params.row.delete(); } }} cancelButton={true} > - Are you sure you want to delete the user '{props.params.row.displayName}' with ID {props.params.row.id}? This action cannot be undone. + Are you sure you want to delete the team '{props.params.row.displayName}' with ID {props.params.row.id}? This action cannot be undone. All team members will be removed from the team. ); diff --git a/packages/stack-server/src/app/api/v1/teams/[teamId]/route.tsx b/packages/stack-server/src/app/api/v1/teams/[teamId]/route.tsx index 8152548a5..2ab8f2ae4 100644 --- a/packages/stack-server/src/app/api/v1/teams/[teamId]/route.tsx +++ b/packages/stack-server/src/app/api/v1/teams/[teamId]/route.tsx @@ -5,7 +5,7 @@ import { deprecatedSmartRouteHandler } from "@/route-handlers/smart-route-handle import { deprecatedParseRequest } from "@/route-handlers/smart-request"; import { checkApiKeySet, secretServerKeyHeaderSchema } from "@/lib/api-keys"; import { isProjectAdmin } from "@/lib/projects"; -import { updateServerTeam } from "@/lib/teams"; +import { deleteServerTeam, updateServerTeam } from "@/lib/teams"; const putSchema = yup.object({ query: yup.object({ @@ -47,3 +47,41 @@ export const PUT = deprecatedSmartRouteHandler(async (req: NextRequest, options: return NextResponse.json(null); }); + + +const deleteSchema = yup.object({ + query: yup.object({ + server: yup.string().oneOf(["true"]).required(), + }).required(), + headers: yup.object({ + "x-stack-secret-server-key": secretServerKeyHeaderSchema.default(""), + "x-stack-admin-access-token": yup.string().default(""), + "x-stack-project-id": yup.string().required(), + }).required(), +}); + +export const DELETE = deprecatedSmartRouteHandler(async (req: NextRequest, options: { params: { teamId: string } }) => { + const { + query: { + server, + }, + headers: { + "x-stack-project-id": projectId, + "x-stack-secret-server-key": secretServerKey, + "x-stack-admin-access-token": adminAccessToken, + }, + } = await deprecatedParseRequest(req, deleteSchema); + + const skValid = await checkApiKeySet(projectId, { secretServerKey }); + const asValid = await isProjectAdmin(projectId, adminAccessToken); + + if (server === "true") { + if (!skValid && !asValid) { + throw new StatusError(StatusError.Forbidden); + } + + await deleteServerTeam(projectId, options.params.teamId); + } + + return NextResponse.json(null); +}); \ No newline at end of file diff --git a/packages/stack-shared/src/interface/serverInterface.ts b/packages/stack-shared/src/interface/serverInterface.ts index 977711619..943c9ef6b 100644 --- a/packages/stack-shared/src/interface/serverInterface.ts +++ b/packages/stack-shared/src/interface/serverInterface.ts @@ -216,6 +216,14 @@ export class StackServerInterface extends StackClientInterface { ); } + async deleteTeam(teamId: string): Promise { + await this.sendServerRequest( + `/teams/${teamId}?server=true`, + { method: "DELETE" }, + null, + ); + } + async addUserToTeam(options: { userId: string, teamId: string, diff --git a/packages/stack/src/lib/stack-app.ts b/packages/stack/src/lib/stack-app.ts index 90aa185e7..e1a1a4d48 100644 --- a/packages/stack/src/lib/stack-app.ts +++ b/packages/stack/src/lib/stack-app.ts @@ -1152,6 +1152,10 @@ class _StackServerAppImpl result.map((u) => app._serverTeamMemberFromJson(u)), [result]); @@ -1576,6 +1580,7 @@ export type ServerTeam = Team & { listMembers(): Promise, useMembers(): ServerTeamMember[], update(update: Partial): Promise, + delete(): Promise, addUser(userId: string): Promise, removeUser(userId: string): Promise, };