Fix SCIM patch group fn

This commit is contained in:
Tuan Dang
2024-07-15 00:29:18 +07:00
parent b582a4a06d
commit d8b1da3ddd
3 changed files with 44 additions and 26 deletions
+7 -4
View File
@@ -475,10 +475,13 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
}), }),
z.object({ z.object({
op: z.literal("add"), op: z.literal("add"),
value: z.object({ path: z.string().trim(),
value: z.string().trim(), value: z.array(
display: z.string().trim().optional() z.object({
}) value: z.string().trim(),
display: z.string().trim().optional()
})
)
}) })
]) ])
) )
+35 -21
View File
@@ -2,7 +2,7 @@ import { ForbiddenError } from "@casl/ability";
import slugify from "@sindresorhus/slugify"; import slugify from "@sindresorhus/slugify";
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import { OrgMembershipRole, OrgMembershipStatus, TableName, TGroups, TOrgMemberships, TUsers } from "@app/db/schemas"; import { OrgMembershipRole, OrgMembershipStatus, TableName, TOrgMemberships, TUsers } from "@app/db/schemas";
import { TGroupDALFactory } from "@app/ee/services/group/group-dal"; import { TGroupDALFactory } from "@app/ee/services/group/group-dal";
import { addUsersToGroupByUserIds, removeUsersFromGroupByUserIds } from "@app/ee/services/group/group-fns"; import { addUsersToGroupByUserIds, removeUsersFromGroupByUserIds } from "@app/ee/services/group/group-fns";
import { TUserGroupMembershipDALFactory } from "@app/ee/services/group/user-group-membership-dal"; import { TUserGroupMembershipDALFactory } from "@app/ee/services/group/user-group-membership-dal";
@@ -66,7 +66,7 @@ type TScimServiceFactoryDep = {
projectMembershipDAL: Pick<TProjectMembershipDALFactory, "find" | "delete" | "findProjectMembershipsByUserId">; projectMembershipDAL: Pick<TProjectMembershipDALFactory, "find" | "delete" | "findProjectMembershipsByUserId">;
groupDAL: Pick< groupDAL: Pick<
TGroupDALFactory, TGroupDALFactory,
"create" | "findOne" | "findAllGroupMembers" | "update" | "delete" | "findGroups" | "transaction" "create" | "findOne" | "findAllGroupMembers" | "delete" | "findGroups" | "transaction" | "updateById" | "update"
>; >;
groupProjectDAL: Pick<TGroupProjectDALFactory, "find">; groupProjectDAL: Pick<TGroupProjectDALFactory, "find">;
userGroupMembershipDAL: Pick< userGroupMembershipDAL: Pick<
@@ -817,7 +817,6 @@ export const scimServiceFactory = ({
}); });
}; };
// TODO: add support for add/remove op
const updateScimGroupNamePatch = async ({ groupId, orgId, operations }: TUpdateScimGroupNamePatchDTO) => { const updateScimGroupNamePatch = async ({ groupId, orgId, operations }: TUpdateScimGroupNamePatchDTO) => {
const plan = await licenseService.getPlan(orgId); const plan = await licenseService.getPlan(orgId);
if (!plan.groups) if (!plan.groups)
@@ -840,23 +839,45 @@ export const scimServiceFactory = ({
status: 403 status: 403
}); });
let group: TGroups | undefined; let group = await groupDAL.findOne({
id: groupId,
orgId
});
if (!group) {
throw new ScimRequestError({
detail: "Group Not Found",
status: 404
});
}
for await (const operation of operations) { for await (const operation of operations) {
switch (operation.op) { switch (operation.op) {
case "replace": { case "replace": {
await groupDAL.update( group = await groupDAL.updateById(group.id, {
{ name: operation.value.displayName
id: groupId, });
orgId
},
{
name: operation.value.displayName
}
);
break; break;
} }
case "add": { case "add": {
// TODO const orgMemberships = await orgMembershipDAL.find({
$in: {
id: operation.value.map((member) => member.value)
}
});
await addUsersToGroupByUserIds({
group,
userIds: orgMemberships.map((membership) => membership.userId as string),
userDAL,
userGroupMembershipDAL,
orgDAL,
groupProjectDAL,
projectKeyDAL,
projectDAL,
projectBotDAL
});
break; break;
} }
case "remove": { case "remove": {
@@ -872,13 +893,6 @@ export const scimServiceFactory = ({
} }
} }
if (!group) {
throw new ScimRequestError({
detail: "Group Not Found",
status: 404
});
}
return buildScimGroup({ return buildScimGroup({
groupId: group.id, groupId: group.id,
name: group.name, name: group.name,
+2 -1
View File
@@ -125,10 +125,11 @@ type TRemoveOp = {
type TAddOp = { type TAddOp = {
op: "add"; op: "add";
path: string;
value: { value: {
value: string; value: string;
display?: string; display?: string;
}; }[];
}; };
export type TDeleteScimGroupDTO = { export type TDeleteScimGroupDTO = {