Add access approval requests to project permission cache logic

This commit is contained in:
Carlos Monastyrski
2025-09-26 17:50:14 -03:00
parent a0dc051f6b
commit 2374182f75
10 changed files with 36 additions and 160 deletions
@@ -35,7 +35,7 @@ import { ApprovalStatus, TAccessApprovalRequestServiceFactory } from "./access-a
type TSecretApprovalRequestServiceFactoryDep = { type TSecretApprovalRequestServiceFactoryDep = {
additionalPrivilegeDAL: Pick<TProjectUserAdditionalPrivilegeDALFactory, "create" | "findById">; additionalPrivilegeDAL: Pick<TProjectUserAdditionalPrivilegeDALFactory, "create" | "findById">;
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission">; permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "invalidateProjectPermissionCache">;
accessApprovalPolicyApproverDAL: Pick<TAccessApprovalPolicyApproverDALFactory, "find">; accessApprovalPolicyApproverDAL: Pick<TAccessApprovalPolicyApproverDALFactory, "find">;
projectEnvDAL: Pick<TProjectEnvDALFactory, "findOne">; projectEnvDAL: Pick<TProjectEnvDALFactory, "findOne">;
projectDAL: Pick< projectDAL: Pick<
@@ -758,6 +758,8 @@ export const accessApprovalRequestServiceFactory = ({
{ privilegeId: privilegeIdToSet, status: ApprovalStatus.APPROVED }, { privilegeId: privilegeIdToSet, status: ApprovalStatus.APPROVED },
tx tx
); );
await permissionService.invalidateProjectPermissionCache(accessApprovalRequest.projectId, tx);
} }
} }
+1 -10
View File
@@ -46,10 +46,7 @@ type TGroupServiceFactoryDep = {
projectKeyDAL: Pick<TProjectKeyDALFactory, "find" | "delete" | "findLatestProjectKey" | "insertMany">; projectKeyDAL: Pick<TProjectKeyDALFactory, "find" | "delete" | "findLatestProjectKey" | "insertMany">;
permissionService: Pick< permissionService: Pick<
TPermissionServiceFactory, TPermissionServiceFactory,
| "getOrgPermission" "getOrgPermission" | "getOrgPermissionByRole" | "invalidateProjectPermissionCache"
| "getOrgPermissionByRole"
| "invalidateUserProjectPermissionCache"
| "invalidateProjectPermissionCache"
>; >;
licenseService: Pick<TLicenseServiceFactory, "getPlan">; licenseService: Pick<TLicenseServiceFactory, "getPlan">;
oidcConfigDAL: Pick<TOidcConfigDALFactory, "findOne">; oidcConfigDAL: Pick<TOidcConfigDALFactory, "findOne">;
@@ -232,10 +229,8 @@ export const groupServiceFactory = ({
}); });
if (role) { if (role) {
const groupMembers = await userGroupMembershipDAL.find({ groupId: group.id });
const groupProjects = await groupProjectDAL.find({ groupId: group.id }); const groupProjects = await groupProjectDAL.find({ groupId: group.id });
await Promise.allSettled([ await Promise.allSettled([
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId)),
...groupProjects.map((groupProject) => ...groupProjects.map((groupProject) =>
permissionService.invalidateProjectPermissionCache(groupProject.projectId) permissionService.invalidateProjectPermissionCache(groupProject.projectId)
) )
@@ -264,7 +259,6 @@ export const groupServiceFactory = ({
message: "Failed to delete group due to plan restriction. Upgrade plan to delete group." message: "Failed to delete group due to plan restriction. Upgrade plan to delete group."
}); });
const groupMembers = await userGroupMembershipDAL.find({ groupId: id });
const groupProjects = await groupProjectDAL.find({ groupId: id }); const groupProjects = await groupProjectDAL.find({ groupId: id });
const [group] = await groupDAL.delete({ const [group] = await groupDAL.delete({
@@ -273,7 +267,6 @@ export const groupServiceFactory = ({
}); });
await Promise.allSettled([ await Promise.allSettled([
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId)),
...groupProjects.map((groupProject) => permissionService.invalidateProjectPermissionCache(groupProject.projectId)) ...groupProjects.map((groupProject) => permissionService.invalidateProjectPermissionCache(groupProject.projectId))
]); ]);
@@ -425,7 +418,6 @@ export const groupServiceFactory = ({
const groupProjects = await groupProjectDAL.find({ groupId: group.id }); const groupProjects = await groupProjectDAL.find({ groupId: group.id });
await Promise.allSettled([ await Promise.allSettled([
permissionService.invalidateUserProjectPermissionCache(user.id),
...groupProjects.map((groupProject) => permissionService.invalidateProjectPermissionCache(groupProject.projectId)) ...groupProjects.map((groupProject) => permissionService.invalidateProjectPermissionCache(groupProject.projectId))
]); ]);
@@ -512,7 +504,6 @@ export const groupServiceFactory = ({
const groupProjects = await groupProjectDAL.find({ groupId: group.id }); const groupProjects = await groupProjectDAL.find({ groupId: group.id });
await Promise.allSettled([ await Promise.allSettled([
permissionService.invalidateUserProjectPermissionCache(user.id),
...groupProjects.map((groupProject) => permissionService.invalidateProjectPermissionCache(groupProject.projectId)) ...groupProjects.map((groupProject) => permissionService.invalidateProjectPermissionCache(groupProject.projectId))
]); ]);
@@ -28,10 +28,7 @@ type TIdentityProjectAdditionalPrivilegeV2ServiceFactoryDep = {
identityProjectAdditionalPrivilegeDAL: TIdentityProjectAdditionalPrivilegeV2DALFactory; identityProjectAdditionalPrivilegeDAL: TIdentityProjectAdditionalPrivilegeV2DALFactory;
identityProjectDAL: Pick<TIdentityProjectDALFactory, "findOne" | "findById">; identityProjectDAL: Pick<TIdentityProjectDALFactory, "findOne" | "findById">;
projectDAL: Pick<TProjectDALFactory, "findProjectBySlug">; projectDAL: Pick<TProjectDALFactory, "findProjectBySlug">;
permissionService: Pick< permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "invalidateProjectPermissionCache">;
TPermissionServiceFactory,
"getProjectPermission" | "invalidateProjectPermissionCache" | "invalidateIdentityProjectPermissionCache"
>;
}; };
export type TIdentityProjectAdditionalPrivilegeV2ServiceFactory = ReturnType< export type TIdentityProjectAdditionalPrivilegeV2ServiceFactory = ReturnType<
@@ -118,10 +115,7 @@ export const identityProjectAdditionalPrivilegeV2ServiceFactory = ({
permissions: packedPermission permissions: packedPermission
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityProjectMembership.identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -141,10 +135,7 @@ export const identityProjectAdditionalPrivilegeV2ServiceFactory = ({
temporaryAccessEndTime: new Date(new Date(dto.temporaryAccessStartTime).getTime() + relativeTempAllocatedTimeInMs) temporaryAccessEndTime: new Date(new Date(dto.temporaryAccessStartTime).getTime() + relativeTempAllocatedTimeInMs)
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityProjectMembership.identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -239,10 +230,7 @@ export const identityProjectAdditionalPrivilegeV2ServiceFactory = ({
temporaryAccessEndTime: new Date(new Date(temporaryAccessStartTime || "").getTime() + ms(temporaryRange || "")) temporaryAccessEndTime: new Date(new Date(temporaryAccessStartTime || "").getTime() + ms(temporaryRange || ""))
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityProjectMembership.identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -260,10 +248,7 @@ export const identityProjectAdditionalPrivilegeV2ServiceFactory = ({
temporaryMode: null temporaryMode: null
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityProjectMembership.identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -321,10 +306,7 @@ export const identityProjectAdditionalPrivilegeV2ServiceFactory = ({
const deletedPrivilege = await identityProjectAdditionalPrivilegeDAL.deleteById(identityPrivilege.id); const deletedPrivilege = await identityProjectAdditionalPrivilegeDAL.deleteById(identityPrivilege.id);
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityProjectMembership.identityId)
]);
return { return {
...deletedPrivilege, ...deletedPrivilege,
@@ -31,10 +31,7 @@ type TIdentityProjectAdditionalPrivilegeServiceFactoryDep = {
identityProjectAdditionalPrivilegeDAL: TIdentityProjectAdditionalPrivilegeDALFactory; identityProjectAdditionalPrivilegeDAL: TIdentityProjectAdditionalPrivilegeDALFactory;
identityProjectDAL: Pick<TIdentityProjectDALFactory, "findOne" | "findById">; identityProjectDAL: Pick<TIdentityProjectDALFactory, "findOne" | "findById">;
projectDAL: Pick<TProjectDALFactory, "findProjectBySlug">; projectDAL: Pick<TProjectDALFactory, "findProjectBySlug">;
permissionService: Pick< permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "invalidateProjectPermissionCache">;
TPermissionServiceFactory,
"getProjectPermission" | "invalidateProjectPermissionCache" | "invalidateIdentityProjectPermissionCache"
>;
}; };
export type TIdentityProjectAdditionalPrivilegeServiceFactory = ReturnType< export type TIdentityProjectAdditionalPrivilegeServiceFactory = ReturnType<
@@ -133,10 +130,7 @@ export const identityProjectAdditionalPrivilegeServiceFactory = ({
permissions: packedPermission permissions: packedPermission
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -156,10 +150,7 @@ export const identityProjectAdditionalPrivilegeServiceFactory = ({
temporaryAccessEndTime: new Date(new Date(dto.temporaryAccessStartTime).getTime() + relativeTempAllocatedTimeInMs) temporaryAccessEndTime: new Date(new Date(dto.temporaryAccessStartTime).getTime() + relativeTempAllocatedTimeInMs)
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -266,10 +257,7 @@ export const identityProjectAdditionalPrivilegeServiceFactory = ({
temporaryAccessEndTime: new Date(new Date(temporaryAccessStartTime || "").getTime() + ms(temporaryRange || "")) temporaryAccessEndTime: new Date(new Date(temporaryAccessStartTime || "").getTime() + ms(temporaryRange || ""))
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -287,10 +275,7 @@ export const identityProjectAdditionalPrivilegeServiceFactory = ({
temporaryMode: null temporaryMode: null
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -366,10 +351,7 @@ export const identityProjectAdditionalPrivilegeServiceFactory = ({
const deletedPrivilege = await identityProjectAdditionalPrivilegeDAL.deleteById(identityPrivilege.id); const deletedPrivilege = await identityProjectAdditionalPrivilegeDAL.deleteById(identityPrivilege.id);
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId);
permissionService.invalidateProjectPermissionCache(identityProjectMembership.projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return { return {
...deletedPrivilege, ...deletedPrivilege,
@@ -285,6 +285,4 @@ export type TPermissionServiceFactory = {
checkPermissions: ProjectPermissionSet; checkPermissions: ProjectPermissionSet;
}) => Promise<boolean>; }) => Promise<boolean>;
invalidateProjectPermissionCache: (projectId: string, tx?: Knex) => Promise<void>; invalidateProjectPermissionCache: (projectId: string, tx?: Knex) => Promise<void>;
invalidateUserProjectPermissionCache: (userId: string) => Promise<void>;
invalidateIdentityProjectPermissionCache: (identityId: string) => Promise<void>;
}; };
@@ -97,16 +97,6 @@ export const permissionServiceFactory = ({
}); });
}; };
const invalidateUserProjectPermissionCache = async (userId: string) => {
const pattern = KeyStorePrefixes.UserProjectPermissionPattern(userId);
await keyStore.deleteItems({ pattern });
};
const invalidateIdentityProjectPermissionCache = async (identityId: string) => {
const pattern = KeyStorePrefixes.IdentityProjectPermissionPattern(identityId);
await keyStore.deleteItems({ pattern });
};
const calculateProjectPermissionTtl = (membership: unknown): number => { const calculateProjectPermissionTtl = (membership: unknown): number => {
const now = new Date(); const now = new Date();
let minTtl = KeyStoreTtls.ProjectPermissionCacheInSeconds; let minTtl = KeyStoreTtls.ProjectPermissionCacheInSeconds;
@@ -805,8 +795,6 @@ export const permissionServiceFactory = ({
buildOrgPermission, buildOrgPermission,
buildProjectPermissionRules, buildProjectPermissionRules,
checkGroupProjectPermission, checkGroupProjectPermission,
invalidateProjectPermissionCache, invalidateProjectPermissionCache
invalidateUserProjectPermissionCache,
invalidateIdentityProjectPermissionCache
}; };
}; };
@@ -27,10 +27,7 @@ import {
type TProjectUserAdditionalPrivilegeServiceFactoryDep = { type TProjectUserAdditionalPrivilegeServiceFactoryDep = {
projectUserAdditionalPrivilegeDAL: TProjectUserAdditionalPrivilegeDALFactory; projectUserAdditionalPrivilegeDAL: TProjectUserAdditionalPrivilegeDALFactory;
projectMembershipDAL: Pick<TProjectMembershipDALFactory, "findById" | "findOne">; projectMembershipDAL: Pick<TProjectMembershipDALFactory, "findById" | "findOne">;
permissionService: Pick< permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "invalidateProjectPermissionCache">;
TPermissionServiceFactory,
"getProjectPermission" | "invalidateUserProjectPermissionCache" | "invalidateProjectPermissionCache"
>;
accessApprovalRequestDAL: Pick<TAccessApprovalRequestDALFactory, "update">; accessApprovalRequestDAL: Pick<TAccessApprovalRequestDALFactory, "update">;
}; };
@@ -119,10 +116,7 @@ export const projectUserAdditionalPrivilegeServiceFactory = ({
permissions: packedPermission permissions: packedPermission
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectMembership.projectId);
permissionService.invalidateProjectPermissionCache(projectMembership.projectId),
permissionService.invalidateUserProjectPermissionCache(projectMembership.userId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -143,10 +137,7 @@ export const projectUserAdditionalPrivilegeServiceFactory = ({
temporaryAccessEndTime: new Date(new Date(dto.temporaryAccessStartTime).getTime() + relativeTempAllocatedTimeInMs) temporaryAccessEndTime: new Date(new Date(dto.temporaryAccessStartTime).getTime() + relativeTempAllocatedTimeInMs)
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectMembership.projectId);
permissionService.invalidateProjectPermissionCache(projectMembership.projectId),
permissionService.invalidateUserProjectPermissionCache(projectMembership.userId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -245,10 +236,7 @@ export const projectUserAdditionalPrivilegeServiceFactory = ({
temporaryAccessEndTime: new Date(new Date(temporaryAccessStartTime || "").getTime() + ms(temporaryRange || "")) temporaryAccessEndTime: new Date(new Date(temporaryAccessStartTime || "").getTime() + ms(temporaryRange || ""))
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectMembership.projectId);
permissionService.invalidateProjectPermissionCache(projectMembership.projectId),
permissionService.invalidateUserProjectPermissionCache(projectMembership.userId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -266,10 +254,7 @@ export const projectUserAdditionalPrivilegeServiceFactory = ({
temporaryMode: null temporaryMode: null
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectMembership.projectId);
permissionService.invalidateProjectPermissionCache(projectMembership.projectId),
permissionService.invalidateUserProjectPermissionCache(projectMembership.userId)
]);
return { return {
...additionalPrivilege, ...additionalPrivilege,
@@ -318,10 +303,7 @@ export const projectUserAdditionalPrivilegeServiceFactory = ({
); );
const deletedPrivilege = await projectUserAdditionalPrivilegeDAL.deleteById(userPrivilege.id); const deletedPrivilege = await projectUserAdditionalPrivilegeDAL.deleteById(userPrivilege.id);
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectMembership.projectId);
permissionService.invalidateProjectPermissionCache(projectMembership.projectId),
permissionService.invalidateUserProjectPermissionCache(projectMembership.userId)
]);
return { return {
...deletedPrivilege, ...deletedPrivilege,
@@ -45,10 +45,7 @@ type TGroupProjectServiceFactoryDep = {
groupDAL: Pick<TGroupDALFactory, "findOne" | "findAllGroupPossibleMembers">; groupDAL: Pick<TGroupDALFactory, "findOne" | "findAllGroupPossibleMembers">;
permissionService: Pick< permissionService: Pick<
TPermissionServiceFactory, TPermissionServiceFactory,
| "getProjectPermission" "getProjectPermission" | "getProjectPermissionByRole" | "invalidateProjectPermissionCache"
| "getProjectPermissionByRole"
| "invalidateProjectPermissionCache"
| "invalidateUserProjectPermissionCache"
>; >;
}; };
@@ -269,11 +266,7 @@ export const groupProjectServiceFactory = ({
return groupProjectMembership; return groupProjectMembership;
}); });
const groupMembers = await userGroupMembershipDAL.find({ groupId: group.id }); await permissionService.invalidateProjectPermissionCache(projectId);
await Promise.allSettled([
permissionService.invalidateProjectPermissionCache(projectId),
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId))
]);
return projectGroup; return projectGroup;
}; };
@@ -384,11 +377,7 @@ export const groupProjectServiceFactory = ({
return groupProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx); return groupProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx);
}); });
const groupMembers = await userGroupMembershipDAL.find({ groupId }); await permissionService.invalidateProjectPermissionCache(projectId);
await Promise.allSettled([
permissionService.invalidateProjectPermissionCache(projectId),
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId))
]);
return updatedRoles; return updatedRoles;
}; };
@@ -421,8 +410,6 @@ export const groupProjectServiceFactory = ({
}); });
ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionGroupActions.Delete, ProjectPermissionSub.Groups); ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionGroupActions.Delete, ProjectPermissionSub.Groups);
const groupMembers = await userGroupMembershipDAL.find({ groupId: group.id });
const deletedProjectGroup = await groupProjectDAL.transaction(async (tx) => { const deletedProjectGroup = await groupProjectDAL.transaction(async (tx) => {
const groupMembersNotInProject = await userGroupMembershipDAL.findGroupMembersNotInProject( const groupMembersNotInProject = await userGroupMembershipDAL.findGroupMembersNotInProject(
group.id, group.id,
@@ -446,10 +433,7 @@ export const groupProjectServiceFactory = ({
return projectGroup; return projectGroup;
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId))
]);
return deletedProjectGroup; return deletedProjectGroup;
}; };
@@ -37,10 +37,7 @@ type TIdentityProjectServiceFactoryDep = {
identityOrgMembershipDAL: Pick<TIdentityOrgDALFactory, "findOne">; identityOrgMembershipDAL: Pick<TIdentityOrgDALFactory, "findOne">;
permissionService: Pick< permissionService: Pick<
TPermissionServiceFactory, TPermissionServiceFactory,
| "getProjectPermission" "getProjectPermission" | "getProjectPermissionByRole" | "invalidateProjectPermissionCache"
| "getProjectPermissionByRole"
| "invalidateIdentityProjectPermissionCache"
| "invalidateProjectPermissionCache"
>; >;
}; };
@@ -172,10 +169,7 @@ export const identityProjectServiceFactory = ({
return { ...identityProjectMembership, roles: identityRoles }; return { ...identityProjectMembership, roles: identityRoles };
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return projectIdentity; return projectIdentity;
}; };
@@ -284,10 +278,7 @@ export const identityProjectServiceFactory = ({
return identityProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx); return identityProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx);
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return updatedRoles; return updatedRoles;
}; };
@@ -320,10 +311,7 @@ export const identityProjectServiceFactory = ({
const [deletedIdentity] = await identityProjectDAL.delete({ identityId, projectId }); const [deletedIdentity] = await identityProjectDAL.delete({ identityId, projectId });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
permissionService.invalidateIdentityProjectPermissionCache(identityId)
]);
return deletedIdentity; return deletedIdentity;
}; };
@@ -45,10 +45,7 @@ import { TProjectUserMembershipRoleDALFactory } from "./project-user-membership-
type TProjectMembershipServiceFactoryDep = { type TProjectMembershipServiceFactoryDep = {
permissionService: Pick< permissionService: Pick<
TPermissionServiceFactory, TPermissionServiceFactory,
| "getProjectPermission" "getProjectPermission" | "getProjectPermissionByRole" | "invalidateProjectPermissionCache"
| "getProjectPermissionByRole"
| "invalidateUserProjectPermissionCache"
| "invalidateProjectPermissionCache"
>; >;
smtpService: TSmtpService; smtpService: TSmtpService;
projectBotDAL: TProjectBotDALFactory; projectBotDAL: TProjectBotDALFactory;
@@ -245,12 +242,7 @@ export const projectMembershipServiceFactory = ({
); );
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
...orgMembers.map(({ userId }) =>
userId ? permissionService.invalidateUserProjectPermissionCache(userId) : Promise.resolve()
)
]);
if (sendEmails) { if (sendEmails) {
await notificationService.createUserNotifications( await notificationService.createUserNotifications(
@@ -384,12 +376,7 @@ export const projectMembershipServiceFactory = ({
return projectUserMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx); return projectUserMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx);
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
membershipUser?.userId
? permissionService.invalidateUserProjectPermissionCache(membershipUser.userId)
: Promise.resolve()
]);
return updatedRoles; return updatedRoles;
}; };
@@ -435,10 +422,7 @@ export const projectMembershipServiceFactory = ({
return deletedMembership; return deletedMembership;
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
membership.userId ? permissionService.invalidateUserProjectPermissionCache(membership.userId) : Promise.resolve()
]);
return membership; return membership;
}; };
@@ -542,12 +526,7 @@ export const projectMembershipServiceFactory = ({
return deletedMemberships; return deletedMemberships;
}); });
await Promise.allSettled([ await permissionService.invalidateProjectPermissionCache(projectId);
permissionService.invalidateProjectPermissionCache(projectId),
...memberships.map(({ userId }) =>
userId ? permissionService.invalidateUserProjectPermissionCache(userId) : Promise.resolve()
)
]);
return memberships; return memberships;
}; };