feat: completed ap, org roles and project roles and project membership

This commit is contained in:
=
2025-10-09 23:58:10 +05:30
parent e232282bea
commit 4d68d48d89
13 changed files with 714 additions and 244 deletions
@@ -274,7 +274,7 @@ export const membershipUserServiceFactory = ({
const existingMembership = await membershipUserDAL.findOne({
scope: scopeData.scope,
...scopeDatabaseFields,
actorUserId: dto.selector.actorId
actorUserId: dto.selector.userId
});
if (!existingMembership)
throw new BadRequestError({
@@ -338,31 +338,31 @@ export const membershipUserServiceFactory = ({
},
tx
);
await membershipRoleDAL.insertMany(roleDocs, tx);
return doc;
const insertedRoles = await membershipRoleDAL.insertMany(roleDocs, tx);
return { ...doc, roles: insertedRoles };
});
return { memberships: membershipDoc };
return { membership: membershipDoc };
};
const deleteMembership = async (dto: TDeleteMembershipUserDTO) => {
const { scopeData } = dto;
const factory = scopeFactory[scopeData.scope];
const { actorIdOfDeletor } = await factory.onDeleteMembershipUserGuard(dto);
await factory.onDeleteMembershipUserGuard(dto);
const scopeDatabaseFields = factory.getScopeDatabaseFields(dto.scopeData);
const existingMembership = await membershipUserDAL.findOne({
scope: scopeData.scope,
...scopeDatabaseFields,
actorUserId: dto.selector.actorId
actorUserId: dto.selector.userId
});
if (!existingMembership)
throw new BadRequestError({
message: "User doesn't have membership"
});
if (existingMembership.actorUserId === actorIdOfDeletor)
if (existingMembership.actorUserId === dto.permission.id)
throw new BadRequestError({
message: "You can delete you own membership"
});
@@ -403,7 +403,7 @@ export const membershipUserServiceFactory = ({
await factory.onGetMembershipUserByUserIdGuard(dto);
const membership = await membershipUserDAL.getUserById({
scopeData,
userId: selector.actorId
userId: selector.userId
});
if (!membership) throw new NotFoundError({ message: `User membership not found` });
@@ -6,7 +6,7 @@ export interface TMembershipUserScopeFactory {
onCreateMembershipComplete: (arg: { id: string; email: string }[]) => Promise<void>;
onUpdateMembershipUserGuard: (arg: TUpdateMembershipUserDTO) => Promise<void>;
onDeleteMembershipUserGuard: (arg: TDeleteMembershipUserDTO) => Promise<{ actorIdOfDeletor: string }>;
onDeleteMembershipUserGuard: (arg: TDeleteMembershipUserDTO) => Promise<void>;
onListMembershipUserGuard: (arg: TListMembershipUserDTO) => Promise<void>;
onGetMembershipUserByUserIdGuard: (arg: TGetMembershipUserByUserIdDTO) => Promise<void>;
getScopeField: (scope: AccessScopeData) => { key: "orgId" | "namespaceId" | "projectId"; value: string };
@@ -37,7 +37,7 @@ export type TUpdateMembershipUserDTO = {
permission: OrgServiceActor;
scopeData: AccessScopeData;
selector: {
actorId: string;
userId: string;
};
data: {
isActive?: boolean;
@@ -67,7 +67,7 @@ export type TDeleteMembershipUserDTO = {
permission: OrgServiceActor;
scopeData: AccessScopeData;
selector: {
actorId: string;
userId: string;
};
};
@@ -75,6 +75,6 @@ export type TGetMembershipUserByUserIdDTO = {
permission: OrgServiceActor;
scopeData: AccessScopeData;
selector: {
actorId: string;
userId: string;
};
};
@@ -63,4 +63,4 @@ export const newNamespaceMembershipUserFactory = (
getScopeDatabaseFields,
isCustomRole
};
};
};
@@ -67,7 +67,6 @@ export const newOrgMembershipUserFactory = ({
dto.permission.orgId
);
ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Delete, OrgPermissionSubjects.Member);
return { actorIdOfDeletor: dto.permission.id };
};
const onListMembershipUserGuard: TMembershipUserScopeFactory["onListMembershipUserGuard"] = async (dto) => {
@@ -134,7 +134,6 @@ export const newProjectMembershipUserFactory = ({
actorOrgId: dto.permission.orgId
});
ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionMemberActions.Delete, ProjectPermissionSub.Member);
return { actorIdOfDeletor: dto.permission.id };
};
const onListMembershipUserGuard: TMembershipUserScopeFactory["onListMembershipUserGuard"] = async (dto) => {