From 4152b3a524a21f357605103329d0ca4e176bc73f Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Mon, 11 Mar 2024 20:47:01 +0530 Subject: [PATCH] feat: minor bug fixes and text changes --- backend/src/ee/routes/v1/org-role-router.ts | 24 ++++++++++++++-- .../routes/v1/project-membership-router.ts | 3 +- .../routes/v2/identity-project-router.ts | 4 +-- .../identity-project-service.ts | 3 -- backend/src/services/org/org-role-service.ts | 4 +-- .../project-membership-service.ts | 3 -- .../project-role/project-role-service.ts | 2 +- .../views/Project/MembersPage/MembersPage.tsx | 16 ++--------- .../IdentitySection/IdentityRoles.tsx | 2 +- .../components/MemberListTab/MemberRoles.tsx | 2 +- .../ProjectNameChangeSection.tsx | 28 ++++++++++++------- 11 files changed, 51 insertions(+), 40 deletions(-) diff --git a/backend/src/ee/routes/v1/org-role-router.ts b/backend/src/ee/routes/v1/org-role-router.ts index 46b80e7a9..1ea5e461d 100644 --- a/backend/src/ee/routes/v1/org-role-router.ts +++ b/backend/src/ee/routes/v1/org-role-router.ts @@ -1,6 +1,7 @@ +import slugify from "@sindresorhus/slugify"; import { z } from "zod"; -import { OrgMembershipsSchema, OrgRolesSchema } from "@app/db/schemas"; +import { OrgMembershipRole, OrgMembershipsSchema, OrgRolesSchema } from "@app/db/schemas"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -13,7 +14,14 @@ export const registerOrgRoleRouter = async (server: FastifyZodProvider) => { organizationId: z.string().trim() }), body: z.object({ - slug: z.string().trim(), + slug: z + .string() + .min(1) + .trim() + .refine((val) => Object.keys(OrgMembershipRole).includes(val), "Invalid keyword slugs") + .refine((v) => slugify(v) === v, { + message: "Slug must be a valid slug" + }), name: z.string().trim(), description: z.string().trim().optional(), permissions: z.any().array() @@ -45,7 +53,17 @@ export const registerOrgRoleRouter = async (server: FastifyZodProvider) => { roleId: z.string().trim() }), body: z.object({ - slug: z.string().trim().optional(), + slug: z + .string() + .trim() + .optional() + .refine( + (val) => typeof val === "undefined" || Object.keys(OrgMembershipRole).includes(val), + "Invalid keyword slugs" + ) + .refine((val) => typeof val === "undefined" || slugify(val) === val, { + message: "Slug must be a valid slug" + }), name: z.string().trim().optional(), description: z.string().trim().optional(), permissions: z.any().array() diff --git a/backend/src/server/routes/v1/project-membership-router.ts b/backend/src/server/routes/v1/project-membership-router.ts index 1c7bd8770..fa46d34f2 100644 --- a/backend/src/server/routes/v1/project-membership-router.ts +++ b/backend/src/server/routes/v1/project-membership-router.ts @@ -1,3 +1,4 @@ +import ms from "ms"; import { z } from "zod"; import { @@ -147,7 +148,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider role: z.string(), isTemporary: z.literal(true), temporaryMode: z.nativeEnum(ProjectUserMembershipTemporaryMode), - temporaryRange: z.string(), + temporaryRange: z.string().refine((val) => ms(val) > 0, "Temporary range must be positive"), temporaryAccessStartTime: z.string().datetime() }) ]) diff --git a/backend/src/server/routes/v2/identity-project-router.ts b/backend/src/server/routes/v2/identity-project-router.ts index 460a48aa3..639a56f11 100644 --- a/backend/src/server/routes/v2/identity-project-router.ts +++ b/backend/src/server/routes/v2/identity-project-router.ts @@ -1,3 +1,4 @@ +import ms from "ms"; import { z } from "zod"; import { @@ -69,13 +70,12 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) role: z.string(), isTemporary: z.literal(true), temporaryMode: z.nativeEnum(ProjectUserMembershipTemporaryMode), - temporaryRange: z.string(), + temporaryRange: z.string().refine((val) => ms(val) > 0, "Temporary range must be positive"), temporaryAccessStartTime: z.string().datetime() }) ]) ) .min(1) - .refine((data) => data.some(({ isTemporary }) => !isTemporary), "Atleast one permanent role required") }), response: { 200: z.object({ diff --git a/backend/src/services/identity-project/identity-project-service.ts b/backend/src/services/identity-project/identity-project-service.ts index 6b751b4fa..d13a43659 100644 --- a/backend/src/services/identity-project/identity-project-service.ts +++ b/backend/src/services/identity-project/identity-project-service.ts @@ -158,9 +158,6 @@ export const identityProjectServiceFactory = ({ // check cron or relative here later for now its just relative const relativeTimeInMs = ms(inputRole.temporaryRange); - if (relativeTimeInMs <= 0) { - throw new BadRequestError({ message: "Temporary relative time range must be positive" }); - } return { projectMembershipId: projectIdentity.id, role: isCustomRole ? ProjectMembershipRole.Custom : inputRole.role, diff --git a/backend/src/services/org/org-role-service.ts b/backend/src/services/org/org-role-service.ts index b3d8121c3..fb8a57440 100644 --- a/backend/src/services/org/org-role-service.ts +++ b/backend/src/services/org/org-role-service.ts @@ -58,7 +58,7 @@ export const orgRoleServiceFactory = ({ orgRoleDAL, permissionService }: TOrgRol { id: roleId, orgId }, { ...data, permissions: data.permissions ? JSON.stringify(data.permissions) : undefined } ); - if (!updateRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); + if (!updatedRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); return updatedRole; }; @@ -66,7 +66,7 @@ export const orgRoleServiceFactory = ({ orgRoleDAL, permissionService }: TOrgRol const { permission } = await permissionService.getUserOrgPermission(userId, orgId, actorOrgId); ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Delete, OrgPermissionSubjects.Role); const [deletedRole] = await orgRoleDAL.delete({ id: roleId, orgId }); - if (!deleteRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); + if (!deletedRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); return deletedRole; }; diff --git a/backend/src/services/project-membership/project-membership-service.ts b/backend/src/services/project-membership/project-membership-service.ts index 1170640ca..68eb13732 100644 --- a/backend/src/services/project-membership/project-membership-service.ts +++ b/backend/src/services/project-membership/project-membership-service.ts @@ -320,9 +320,6 @@ export const projectMembershipServiceFactory = ({ // check cron or relative here later for now its just relative const relativeTimeInMs = ms(inputRole.temporaryRange); - if (relativeTimeInMs <= 0) { - throw new BadRequestError({ message: "Temporary relative time range must be positive" }); - } return { projectMembershipId: membershipId, role: isCustomRole ? ProjectMembershipRole.Custom : inputRole.role, diff --git a/backend/src/services/project-role/project-role-service.ts b/backend/src/services/project-role/project-role-service.ts index 720c808ff..b45a6e8a5 100644 --- a/backend/src/services/project-role/project-role-service.ts +++ b/backend/src/services/project-role/project-role-service.ts @@ -76,7 +76,7 @@ export const projectRoleServiceFactory = ({ projectRoleDAL, permissionService }: const { permission } = await permissionService.getProjectPermission(actor, actorId, projectId, actorOrgId); ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Delete, ProjectPermissionSub.Role); const [deletedRole] = await projectRoleDAL.delete({ id: roleId, projectId }); - if (!deleteRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); + if (!deletedRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); return deletedRole; }; diff --git a/frontend/src/views/Project/MembersPage/MembersPage.tsx b/frontend/src/views/Project/MembersPage/MembersPage.tsx index f4e88de4e..b565d426c 100644 --- a/frontend/src/views/Project/MembersPage/MembersPage.tsx +++ b/frontend/src/views/Project/MembersPage/MembersPage.tsx @@ -5,12 +5,7 @@ import { Tab, TabList, TabPanel, Tabs } from "@app/components/v2"; import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; import { withProjectPermission } from "@app/hoc"; -import { - IdentityTab, - MemberListTab, - ProjectRoleListTab, - ServiceTokenTab -} from "./components"; +import { IdentityTab, MemberListTab, ProjectRoleListTab, ServiceTokenTab } from "./components"; enum TabSections { Member = "members", @@ -23,19 +18,14 @@ export const MembersPage = withProjectPermission( () => { return (
-
-

- Project Access Control -

+
+

Project Access Control

People

Machine Identities

-
- New -
Service Tokens diff --git a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentitySection/IdentityRoles.tsx b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentitySection/IdentityRoles.tsx index 1f046f586..c7a68a6b2 100644 --- a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentitySection/IdentityRoles.tsx +++ b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentitySection/IdentityRoles.tsx @@ -155,7 +155,7 @@ const IdentityTemporaryRoleForm = ({ })() } > - Give access + Grant access ) : ( ) : (
-
- ( - - - + + {(isAllowed) => ( + ( + + + + )} + control={control} + name="name" + /> )} - control={control} - name="name" - /> +
{(isAllowed) => (