From 02111c2dc22b1f24df7204242d3f05396c55b7e3 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Sun, 22 Sep 2024 19:46:36 +0800 Subject: [PATCH] misc: moved to group project v3 for get with ID based --- .../server/routes/v2/group-project-router.ts | 57 ---------------- .../server/routes/v3/group-project-router.ts | 65 +++++++++++++++++++ backend/src/server/routes/v3/index.ts | 9 ++- .../group-project/group-project-dal.ts | 6 +- .../group-project/group-project-service.ts | 14 ++-- .../group-project/group-project-types.ts | 4 +- 6 files changed, 84 insertions(+), 71 deletions(-) create mode 100644 backend/src/server/routes/v3/group-project-router.ts diff --git a/backend/src/server/routes/v2/group-project-router.ts b/backend/src/server/routes/v2/group-project-router.ts index 69f309e55..77649049d 100644 --- a/backend/src/server/routes/v2/group-project-router.ts +++ b/backend/src/server/routes/v2/group-project-router.ts @@ -231,61 +231,4 @@ export const registerGroupProjectRouter = async (server: FastifyZodProvider) => return { groupMemberships }; } }); - - server.route({ - method: "GET", - url: "/:projectSlug/groups/:groupSlug", - onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - config: { - rateLimit: readLimit - }, - schema: { - description: "Return project group", - security: [ - { - bearerAuth: [] - } - ], - params: z.object({ - projectSlug: z.string().trim(), - groupSlug: z.string().trim() - }), - response: { - 200: z.object({ - groupMembership: z.object({ - id: z.string(), - groupId: z.string(), - createdAt: z.date(), - updatedAt: z.date(), - roles: z.array( - z.object({ - id: z.string(), - role: z.string(), - customRoleId: z.string().optional().nullable(), - customRoleName: z.string().optional().nullable(), - customRoleSlug: z.string().optional().nullable(), - isTemporary: z.boolean(), - temporaryMode: z.string().optional().nullable(), - temporaryRange: z.string().nullable().optional(), - temporaryAccessStartTime: z.date().nullable().optional(), - temporaryAccessEndTime: z.date().nullable().optional() - }) - ), - group: GroupsSchema.pick({ name: true, id: true, slug: true }) - }) - }) - } - }, - handler: async (req) => { - const groupMembership = await server.services.groupProject.getGroupInProject({ - actor: req.permission.type, - actorId: req.permission.id, - actorAuthMethod: req.permission.authMethod, - actorOrgId: req.permission.orgId, - ...req.params - }); - - return { groupMembership }; - } - }); }; diff --git a/backend/src/server/routes/v3/group-project-router.ts b/backend/src/server/routes/v3/group-project-router.ts new file mode 100644 index 000000000..8e4e7dffe --- /dev/null +++ b/backend/src/server/routes/v3/group-project-router.ts @@ -0,0 +1,65 @@ +import { z } from "zod"; + +import { GroupsSchema } from "@app/db/schemas"; +import { readLimit } from "@app/server/config/rateLimiter"; +import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { AuthMode } from "@app/services/auth/auth-type"; + +export const registerGroupProjectRouter = async (server: FastifyZodProvider) => { + server.route({ + method: "GET", + url: "/:projectId/groups/:groupId", + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + config: { + rateLimit: readLimit + }, + schema: { + description: "Return project group", + security: [ + { + bearerAuth: [] + } + ], + params: z.object({ + projectId: z.string().trim(), + groupId: z.string().trim() + }), + response: { + 200: z.object({ + groupMembership: z.object({ + id: z.string(), + groupId: z.string(), + createdAt: z.date(), + updatedAt: z.date(), + roles: z.array( + z.object({ + id: z.string(), + role: z.string(), + customRoleId: z.string().optional().nullable(), + customRoleName: z.string().optional().nullable(), + customRoleSlug: z.string().optional().nullable(), + isTemporary: z.boolean(), + temporaryMode: z.string().optional().nullable(), + temporaryRange: z.string().nullable().optional(), + temporaryAccessStartTime: z.date().nullable().optional(), + temporaryAccessEndTime: z.date().nullable().optional() + }) + ), + group: GroupsSchema.pick({ name: true, id: true, slug: true }) + }) + }) + } + }, + handler: async (req) => { + const groupMembership = await server.services.groupProject.getGroupInProject({ + actor: req.permission.type, + actorId: req.permission.id, + actorAuthMethod: req.permission.authMethod, + actorOrgId: req.permission.orgId, + ...req.params + }); + + return { groupMembership }; + } + }); +}; diff --git a/backend/src/server/routes/v3/index.ts b/backend/src/server/routes/v3/index.ts index 6a061a635..10f3c9330 100644 --- a/backend/src/server/routes/v3/index.ts +++ b/backend/src/server/routes/v3/index.ts @@ -1,3 +1,4 @@ +import { registerGroupProjectRouter } from "./group-project-router"; import { registerLoginRouter } from "./login-router"; import { registerSecretBlindIndexRouter } from "./secret-blind-index-router"; import { registerSecretRouter } from "./secret-router"; @@ -9,5 +10,11 @@ export const registerV3Routes = async (server: FastifyZodProvider) => { await server.register(registerLoginRouter, { prefix: "/auth" }); await server.register(registerUserRouter, { prefix: "/users" }); await server.register(registerSecretRouter, { prefix: "/secrets" }); - await server.register(registerSecretBlindIndexRouter, { prefix: "/workspaces" }); + await server.register( + async (projectServer) => { + await projectServer.register(registerSecretBlindIndexRouter); + await projectServer.register(registerGroupProjectRouter); + }, + { prefix: "/workspaces" } + ); }; diff --git a/backend/src/services/group-project/group-project-dal.ts b/backend/src/services/group-project/group-project-dal.ts index 05724df74..bbcadb96e 100644 --- a/backend/src/services/group-project/group-project-dal.ts +++ b/backend/src/services/group-project/group-project-dal.ts @@ -10,13 +10,13 @@ export type TGroupProjectDALFactory = ReturnType; export const groupProjectDALFactory = (db: TDbClient) => { const groupProjectOrm = ormify(db, TableName.GroupProjectMembership); - const findByProjectId = async (projectId: string, filter?: { groupSlug?: string }, tx?: Knex) => { + const findByProjectId = async (projectId: string, filter?: { groupId?: string }, tx?: Knex) => { try { const docs = await (tx || db.replicaNode())(TableName.GroupProjectMembership) .where(`${TableName.GroupProjectMembership}.projectId`, projectId) .where((qb) => { - if (filter?.groupSlug) { - void qb.where(`${TableName.Groups}.slug`, "=", filter.groupSlug); + if (filter?.groupId) { + void qb.where(`${TableName.Groups}.id`, "=", filter.groupId); } }) .join(TableName.Groups, `${TableName.GroupProjectMembership}.groupId`, `${TableName.Groups}.id`) diff --git a/backend/src/services/group-project/group-project-service.ts b/backend/src/services/group-project/group-project-service.ts index fe9e68c55..90fd5a785 100644 --- a/backend/src/services/group-project/group-project-service.ts +++ b/backend/src/services/group-project/group-project-service.ts @@ -34,7 +34,7 @@ type TGroupProjectServiceFactoryDep = { "create" | "transaction" | "insertMany" | "delete" >; userGroupMembershipDAL: Pick; - projectDAL: Pick; + projectDAL: Pick; projectKeyDAL: Pick; projectRoleDAL: Pick; projectBotDAL: TProjectBotDALFactory; @@ -403,19 +403,17 @@ export const groupProjectServiceFactory = ({ }; const getGroupInProject = async ({ - projectSlug, actor, actorId, actorAuthMethod, actorOrgId, - groupSlug + groupId, + projectId }: TGetGroupInProjectDTO) => { - const project = await projectDAL.findOne({ - slug: projectSlug - }); + const project = await projectDAL.findById(projectId); if (!project) { - throw new NotFoundError({ message: `Failed to find project with slug ${projectSlug}` }); + throw new NotFoundError({ message: `Failed to find project with ID ${projectId}` }); } const { permission } = await permissionService.getProjectPermission( @@ -428,7 +426,7 @@ export const groupProjectServiceFactory = ({ ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.Groups); const [groupMembership] = await groupProjectDAL.findByProjectId(project.id, { - groupSlug + groupId }); if (!groupMembership) { diff --git a/backend/src/services/group-project/group-project-types.ts b/backend/src/services/group-project/group-project-types.ts index 20827ce52..2b596365c 100644 --- a/backend/src/services/group-project/group-project-types.ts +++ b/backend/src/services/group-project/group-project-types.ts @@ -1,4 +1,4 @@ -import { TProjectSlugPermission } from "@app/lib/types"; +import { TProjectPermission, TProjectSlugPermission } from "@app/lib/types"; import { ProjectUserMembershipTemporaryMode } from "../project-membership/project-membership-types"; @@ -42,4 +42,4 @@ export type TDeleteProjectGroupDTO = { export type TListProjectGroupDTO = TProjectSlugPermission; -export type TGetGroupInProjectDTO = TProjectSlugPermission & { groupSlug: string }; +export type TGetGroupInProjectDTO = TProjectPermission & { groupId: string };