mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-05 07:26:34 +00:00
feat(project-members): PR suggestions improvements
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import slugify from "@sindresorhus/slugify";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -79,7 +80,16 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => {
|
|||||||
.enum(["true", "false"])
|
.enum(["true", "false"])
|
||||||
.default("false")
|
.default("false")
|
||||||
.transform((value) => value === "true"),
|
.transform((value) => value === "true"),
|
||||||
roles: z.string().trim().transform(decodeURIComponent).optional()
|
roles: z
|
||||||
|
.string()
|
||||||
|
.trim()
|
||||||
|
.transform(decodeURIComponent)
|
||||||
|
.refine((value) => {
|
||||||
|
if (!value) return true;
|
||||||
|
const slugs = value.split(",");
|
||||||
|
return slugs.every((slug) => slugify(slug.trim(), { lowercase: true }) === slug.trim());
|
||||||
|
})
|
||||||
|
.optional()
|
||||||
}),
|
}),
|
||||||
params: z.object({
|
params: z.object({
|
||||||
workspaceId: z.string().trim()
|
workspaceId: z.string().trim()
|
||||||
@@ -118,7 +128,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => {
|
|||||||
},
|
},
|
||||||
onRequest: verifyAuth([AuthMode.JWT]),
|
onRequest: verifyAuth([AuthMode.JWT]),
|
||||||
handler: async (req) => {
|
handler: async (req) => {
|
||||||
const roles = req.query.roles?.split(",") ?? [];
|
const roles = (req.query.roles?.split(",") || []).filter(Boolean);
|
||||||
const users = await server.services.projectMembership.getProjectMemberships({
|
const users = await server.services.projectMembership.getProjectMemberships({
|
||||||
actorId: req.permission.id,
|
actorId: req.permission.id,
|
||||||
actor: req.permission.type,
|
actor: req.permission.type,
|
||||||
|
|||||||
@@ -31,6 +31,26 @@ export const projectMembershipDALFactory = (db: TDbClient) => {
|
|||||||
if (filter.id) {
|
if (filter.id) {
|
||||||
void qb.where(`${TableName.ProjectMembership}.id`, filter.id);
|
void qb.where(`${TableName.ProjectMembership}.id`, filter.id);
|
||||||
}
|
}
|
||||||
|
if (filter.roles && filter.roles.length > 0) {
|
||||||
|
void qb.whereExists((subQuery) => {
|
||||||
|
void subQuery
|
||||||
|
.select("role")
|
||||||
|
.from(TableName.ProjectUserMembershipRole)
|
||||||
|
.leftJoin(
|
||||||
|
TableName.ProjectRoles,
|
||||||
|
`${TableName.ProjectRoles}.id`,
|
||||||
|
`${TableName.ProjectUserMembershipRole}.customRoleId`
|
||||||
|
)
|
||||||
|
.whereRaw(
|
||||||
|
`"${TableName.ProjectUserMembershipRole}"."projectMembershipId" = "${TableName.ProjectMembership}"."id"`
|
||||||
|
)
|
||||||
|
.where((subQb) => {
|
||||||
|
void subQb
|
||||||
|
.whereIn(`${TableName.ProjectUserMembershipRole}.role`, filter.roles as string[])
|
||||||
|
.orWhereIn(`${TableName.ProjectRoles}.slug`, filter.roles as string[]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.join<TUserEncryptionKeys>(
|
.join<TUserEncryptionKeys>(
|
||||||
TableName.UserEncryptionKey,
|
TableName.UserEncryptionKey,
|
||||||
@@ -126,11 +146,6 @@ export const projectMembershipDALFactory = (db: TDbClient) => {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
if (filter.roles && filter.roles.length > 0) {
|
|
||||||
return members.filter((member) =>
|
|
||||||
member.roles.some((role) => filter.roles?.includes(role.role) || filter.roles?.includes(role.customRoleSlug))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return members;
|
return members;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new DatabaseError({ error, name: "Find all project members" });
|
throw new DatabaseError({ error, name: "Find all project members" });
|
||||||
|
|||||||
@@ -445,7 +445,10 @@ export const useGetWorkspaceUsers = (
|
|||||||
{
|
{
|
||||||
params: {
|
params: {
|
||||||
includeGroupMembers,
|
includeGroupMembers,
|
||||||
roles: roles && roles.length > 0 ? encodeURIComponent(roles.join(",")) : undefined
|
roles:
|
||||||
|
roles && roles.length > 0
|
||||||
|
? roles.map((role) => encodeURIComponent(role)).join(",")
|
||||||
|
: undefined
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
+1
-1
@@ -173,7 +173,7 @@ export const MembersTable = ({ handlePopUpOpen }: Props) => {
|
|||||||
setOrderDirection(OrderByDirection.ASC);
|
setOrderDirection(OrderByDirection.ASC);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isTableFiltered = Boolean(Object.values(filter.roles).length);
|
const isTableFiltered = Boolean(filter.roles.length);
|
||||||
|
|
||||||
const handleRoleToggle = useCallback(
|
const handleRoleToggle = useCallback(
|
||||||
(roleSlug: string) =>
|
(roleSlug: string) =>
|
||||||
|
|||||||
Reference in New Issue
Block a user