diff --git a/backend/src/ee/routes/v1/project-role-router.ts b/backend/src/ee/routes/v1/project-role-router.ts index 9ff1e400f..bb4d2fa8e 100644 --- a/backend/src/ee/routes/v1/project-role-router.ts +++ b/backend/src/ee/routes/v1/project-role-router.ts @@ -157,7 +157,13 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { response: { 200: z.object({ data: z.object({ - membership: ProjectMembershipsSchema, + membership: ProjectMembershipsSchema.extend({ + roles: z + .object({ + role: z.string() + }) + .array() + }), permissions: z.any().array() }) }) diff --git a/docs/documentation/platform/dynamic-secrets/cassandra.mdx b/docs/documentation/platform/dynamic-secrets/cassandra.mdx index 31e9658b7..78e03e011 100644 --- a/docs/documentation/platform/dynamic-secrets/cassandra.mdx +++ b/docs/documentation/platform/dynamic-secrets/cassandra.mdx @@ -1,6 +1,6 @@ --- title: "Cassandra" -description: "How to dynamically generate Cassandra database users" +description: "How to dynamically generate Cassandra database users." --- The Infisical Cassandra dynamic secret allows you to generate Cassandra database credentials on demand based on configured role. diff --git a/docs/documentation/platform/dynamic-secrets/postgresql.mdx b/docs/documentation/platform/dynamic-secrets/postgresql.mdx index 78ba87ee5..13adfc750 100644 --- a/docs/documentation/platform/dynamic-secrets/postgresql.mdx +++ b/docs/documentation/platform/dynamic-secrets/postgresql.mdx @@ -1,6 +1,6 @@ --- title: "PostgreSQL" -description: "How to dynamically generate PostgreSQL database users" +description: "How to dynamically generate PostgreSQL database users." --- The Infisical PostgreSQL dynamic secret allows you to generate PostgreSQL database credentials on demand based on configured role. @@ -115,4 +115,4 @@ To extend the life of the generated dynamic secret leases past its initial time Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret - \ No newline at end of file + diff --git a/frontend/src/components/v2/UpgradeProjectAlert/UpgradeProjectAlert.tsx b/frontend/src/components/v2/UpgradeProjectAlert/UpgradeProjectAlert.tsx index b4c8d9912..ebcba1d87 100644 --- a/frontend/src/components/v2/UpgradeProjectAlert/UpgradeProjectAlert.tsx +++ b/frontend/src/components/v2/UpgradeProjectAlert/UpgradeProjectAlert.tsx @@ -25,23 +25,24 @@ export const UpgradeProjectAlert = ({ project, transparent }: UpgradeProjectAlertProps): JSX.Element | null => { - const router = useRouter(); - const { membership } = useProjectPermission(); + const { hasProjectRole } = useProjectPermission(); const upgradeProject = useUpgradeProject(); const [currentStatus, setCurrentStatus] = useState(null); const [isUpgrading, setIsUpgrading] = useState(false); + const isProjectAdmin = hasProjectRole("admin"); + const { data: projectStatus, isLoading: statusIsLoading, refetch: manualProjectStatusRefetch } = useGetUpgradeProjectStatus({ projectId: project.id, - enabled: membership.role === "admin" && project.version === ProjectVersion.V1, + enabled: isProjectAdmin && project.version === ProjectVersion.V1, refetchInterval: 5_000, onSuccess: (data) => { - if (membership.role !== "admin") { + if (!isProjectAdmin) { return; } @@ -101,7 +102,7 @@ export const UpgradeProjectAlert = ({ variant="solid" size="md" isLoading={isLoading} - isDisabled={isLoading || membership.role !== "admin"} + isDisabled={isLoading || !isProjectAdmin} onClick={onUpgradeProject} > Upgrade @@ -113,13 +114,13 @@ export const UpgradeProjectAlert = ({ Upgrade your project - {membership.role === "admin" ? ( + {isProjectAdmin ? ( <> Upgrade your project version to continue receiving the latest improvements and @@ -150,12 +151,12 @@ export const UpgradeProjectAlert = ({ Upgrade diff --git a/frontend/src/context/ProjectPermissionContext/ProjectPermissionContext.tsx b/frontend/src/context/ProjectPermissionContext/ProjectPermissionContext.tsx index a7023a867..b0ee59960 100644 --- a/frontend/src/context/ProjectPermissionContext/ProjectPermissionContext.tsx +++ b/frontend/src/context/ProjectPermissionContext/ProjectPermissionContext.tsx @@ -56,5 +56,7 @@ export const useProjectPermission = () => { throw new Error("useProjectPermission to be used within "); } - return ctx; + const hasProjectRole = (role: string) => ctx?.membership?.roles?.includes(role) || false; + + return { ...ctx, hasProjectRole }; }; diff --git a/frontend/src/hooks/api/roles/queries.tsx b/frontend/src/hooks/api/roles/queries.tsx index 8647353cb..3280bface 100644 --- a/frontend/src/hooks/api/roles/queries.tsx +++ b/frontend/src/hooks/api/roles/queries.tsx @@ -106,7 +106,7 @@ const getUserProjectPermissions = async ({ workspaceId }: TGetUserProjectPermiss const { data } = await apiRequest.get<{ data: { permissions: PackRule>>[]; - membership: TProjectMembership; + membership: Omit & { roles: { role: string }[] }; }; }>(`/api/v1/workspace/${workspaceId}/permissions`, {}); @@ -121,6 +121,12 @@ export const useGetUserProjectPermissions = ({ workspaceId }: TGetUserProjectPer select: (data) => { const rule = unpackRules>>(data.permissions); const ability = createMongoAbility(rule, { conditionsMatcher }); - return { permission: ability, membership: data.membership }; + + const membership = { + ...data.membership, + roles: data.membership.roles.map(({ role }) => role) + }; + + return { permission: ability, membership }; } }); diff --git a/frontend/src/hooks/api/users/types.ts b/frontend/src/hooks/api/users/types.ts index 845030e9f..572296e75 100644 --- a/frontend/src/hooks/api/users/types.ts +++ b/frontend/src/hooks/api/users/types.ts @@ -62,7 +62,7 @@ export type TProjectMembership = { createdAt: string; updatedAt: string; projectId: string; - roleId: string; + roles: string[]; }; export type TWorkspaceUser = { @@ -79,29 +79,29 @@ export type TWorkspaceUser = { organization: string; roles: ( | { - id: string; - role: "owner" | "admin" | "member" | "no-access" | "custom"; - customRoleId: string; - customRoleName: string; - customRoleSlug: string; - isTemporary: false; - temporaryRange: null; - temporaryMode: null; - temporaryAccessEndTime: null; - temporaryAccessStartTime: null; - } + id: string; + role: "owner" | "admin" | "member" | "no-access" | "custom"; + customRoleId: string; + customRoleName: string; + customRoleSlug: string; + isTemporary: false; + temporaryRange: null; + temporaryMode: null; + temporaryAccessEndTime: null; + temporaryAccessStartTime: null; + } | { - id: string; - role: "owner" | "admin" | "member" | "no-access" | "custom"; - customRoleId: string; - customRoleName: string; - customRoleSlug: string; - isTemporary: true; - temporaryRange: string; - temporaryMode: string; - temporaryAccessEndTime: string; - temporaryAccessStartTime: string; - } + id: string; + role: "owner" | "admin" | "member" | "no-access" | "custom"; + customRoleId: string; + customRoleName: string; + customRoleSlug: string; + isTemporary: true; + temporaryRange: string; + temporaryMode: string; + temporaryAccessEndTime: string; + temporaryAccessStartTime: string; + } )[]; status: "invited" | "accepted" | "verified" | "completed"; deniedPermissions: any[];
Upgrade your project version to continue receiving the latest improvements and @@ -150,12 +151,12 @@ export const UpgradeProjectAlert = ({