feat: resolved some more missing corner case in scim

This commit is contained in:
=
2024-09-02 13:42:38 +05:30
parent 8f48a64fd6
commit 58bab4d163
3 changed files with 34 additions and 24 deletions

View File

@@ -180,14 +180,7 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
orgMembershipId: z.string().trim() orgMembershipId: z.string().trim()
}), }),
response: { response: {
200: ScimUserSchema.extend({ 200: ScimUserSchema
groups: z.array(
z.object({
value: z.string().trim(),
display: z.string().trim()
})
)
})
} }
}, },
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]), onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
@@ -284,6 +277,15 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
}) })
.optional(), .optional(),
displayName: z.string().trim(), displayName: z.string().trim(),
emails: z
.array(
z.object({
primary: z.boolean(),
value: z.string().email(),
type: z.string().trim()
})
)
.optional(),
active: z.boolean() active: z.boolean()
}), }),
response: { response: {
@@ -315,10 +317,15 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
}, },
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]), onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
handler: async (req) => { handler: async (req) => {
const primaryEmail = req.body.emails?.find((email) => email.primary)?.value;
const user = await req.server.services.scim.replaceScimUser({ const user = await req.server.services.scim.replaceScimUser({
orgMembershipId: req.params.orgMembershipId, orgMembershipId: req.params.orgMembershipId,
orgId: req.permission.orgId, orgId: req.permission.orgId,
active: req.body.active firstName: req.body?.name?.givenName,
lastName: req.body?.name?.familyName,
active: req.body?.active,
email: primaryEmail,
externalId: req.body.userName
}); });
return user; return user;
} }
@@ -450,6 +457,7 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
groupId: req.params.groupId, groupId: req.params.groupId,
orgId: req.permission.orgId orgId: req.permission.orgId
}); });
return group; return group;
} }
}); });
@@ -523,13 +531,11 @@ export const registerScimRouter = async (server: FastifyZodProvider) => {
}, },
onRequest: verifyAuth([AuthMode.SCIM_TOKEN]), onRequest: verifyAuth([AuthMode.SCIM_TOKEN]),
handler: async (req) => { handler: async (req) => {
console.log(JSON.stringify(req.body, null, 4));
const group = await req.server.services.scim.updateScimGroup({ const group = await req.server.services.scim.updateScimGroup({
groupId: req.params.groupId, groupId: req.params.groupId,
orgId: req.permission.orgId, orgId: req.permission.orgId,
operations: req.body.Operations operations: req.body.Operations
}); });
console.log(group);
return group; return group;
} }
}); });

View File

@@ -59,7 +59,7 @@ type TScimServiceFactoryDep = {
TUserDALFactory, TUserDALFactory,
"find" | "findOne" | "create" | "transaction" | "findUserEncKeyByUserIdsBatch" | "findById" | "updateById" "find" | "findOne" | "create" | "transaction" | "findUserEncKeyByUserIdsBatch" | "findById" | "updateById"
>; >;
userAliasDAL: Pick<TUserAliasDALFactory, "findOne" | "create" | "delete">; userAliasDAL: Pick<TUserAliasDALFactory, "findOne" | "create" | "delete" | "update">;
orgDAL: Pick< orgDAL: Pick<
TOrgDALFactory, TOrgDALFactory,
| "createMembership" | "createMembership"
@@ -259,11 +259,6 @@ export const scimServiceFactory = ({
status: 403 status: 403
}); });
const groupMembershipsInOrg = await userGroupMembershipDAL.findGroupMembershipsByUserIdInOrg(
membership.userId,
orgId
);
return buildScimUser({ return buildScimUser({
orgMembershipId: membership.id, orgMembershipId: membership.id,
username: membership.externalId ?? membership.username, username: membership.externalId ?? membership.username,
@@ -271,10 +266,6 @@ export const scimServiceFactory = ({
firstName: membership.firstName, firstName: membership.firstName,
lastName: membership.lastName, lastName: membership.lastName,
active: membership.isActive, active: membership.isActive,
groups: groupMembershipsInOrg.map((group) => ({
value: group.groupId,
display: group.groupName
})),
createdAt: membership.createdAt, createdAt: membership.createdAt,
updatedAt: membership.updatedAt updatedAt: membership.updatedAt
}); });
@@ -475,7 +466,7 @@ export const scimServiceFactory = ({
lastName: membership.lastName, lastName: membership.lastName,
firstName: membership.firstName, firstName: membership.firstName,
active: membership.isActive, active: membership.isActive,
username: membership.username, username: membership.externalId ?? membership.username,
createdAt: membership.createdAt, createdAt: membership.createdAt,
updatedAt: membership.updatedAt updatedAt: membership.updatedAt
}); });
@@ -512,7 +503,8 @@ export const scimServiceFactory = ({
orgId, orgId,
lastName, lastName,
firstName, firstName,
email email,
externalId
}: TReplaceScimUserDTO) => { }: TReplaceScimUserDTO) => {
const [membership] = await orgDAL const [membership] = await orgDAL
.findMembership({ .findMembership({
@@ -540,6 +532,17 @@ export const scimServiceFactory = ({
const serverCfg = await getServerCfg(); const serverCfg = await getServerCfg();
await userDAL.transaction(async (tx) => { await userDAL.transaction(async (tx) => {
await userAliasDAL.update(
{
orgId,
aliasType: UserAliasType.SAML,
userId: membership.userId
},
{
externalId
},
tx
);
await orgMembershipDAL.updateById( await orgMembershipDAL.updateById(
membership.id, membership.id,
{ {
@@ -561,7 +564,7 @@ export const scimServiceFactory = ({
return buildScimUser({ return buildScimUser({
orgMembershipId: membership.id, orgMembershipId: membership.id,
username: membership.externalId ?? membership.username, username: externalId,
email: membership.email, email: membership.email,
firstName: membership.firstName, firstName: membership.firstName,
lastName: membership.lastName, lastName: membership.lastName,

View File

@@ -54,6 +54,7 @@ export type TReplaceScimUserDTO = {
email?: string; email?: string;
firstName?: string; firstName?: string;
lastName?: string; lastName?: string;
externalId: string;
}; };
export type TDeleteScimUserDTO = { export type TDeleteScimUserDTO = {