mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-17 20:21:18 +00:00
Add project permission cache
This commit is contained in:
@@ -37,13 +37,19 @@ type TGroupProjectServiceFactoryDep = {
|
||||
TGroupProjectMembershipRoleDALFactory,
|
||||
"create" | "transaction" | "insertMany" | "delete"
|
||||
>;
|
||||
userGroupMembershipDAL: Pick<TUserGroupMembershipDALFactory, "findGroupMembersNotInProject">;
|
||||
userGroupMembershipDAL: Pick<TUserGroupMembershipDALFactory, "findGroupMembersNotInProject" | "find">;
|
||||
projectDAL: Pick<TProjectDALFactory, "findOne" | "findProjectGhostUser" | "findById">;
|
||||
projectKeyDAL: Pick<TProjectKeyDALFactory, "findLatestProjectKey" | "delete" | "insertMany" | "transaction">;
|
||||
projectRoleDAL: Pick<TProjectRoleDALFactory, "find">;
|
||||
projectBotDAL: TProjectBotDALFactory;
|
||||
groupDAL: Pick<TGroupDALFactory, "findOne" | "findAllGroupPossibleMembers">;
|
||||
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "getProjectPermissionByRole">;
|
||||
permissionService: Pick<
|
||||
TPermissionServiceFactory,
|
||||
| "getProjectPermission"
|
||||
| "getProjectPermissionByRole"
|
||||
| "invalidateProjectPermissionCache"
|
||||
| "invalidateUserProjectPermissionCache"
|
||||
>;
|
||||
};
|
||||
|
||||
export type TGroupProjectServiceFactory = ReturnType<typeof groupProjectServiceFactory>;
|
||||
@@ -263,6 +269,12 @@ export const groupProjectServiceFactory = ({
|
||||
return groupProjectMembership;
|
||||
});
|
||||
|
||||
const groupMembers = await userGroupMembershipDAL.find({ groupId: group.id });
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId))
|
||||
]);
|
||||
|
||||
return projectGroup;
|
||||
};
|
||||
|
||||
@@ -372,6 +384,12 @@ export const groupProjectServiceFactory = ({
|
||||
return groupProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx);
|
||||
});
|
||||
|
||||
const groupMembers = await userGroupMembershipDAL.find({ groupId });
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId))
|
||||
]);
|
||||
|
||||
return updatedRoles;
|
||||
};
|
||||
|
||||
@@ -403,15 +421,21 @@ export const groupProjectServiceFactory = ({
|
||||
});
|
||||
ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionGroupActions.Delete, ProjectPermissionSub.Groups);
|
||||
|
||||
const deletedProjectGroup = await groupProjectDAL.transaction(async (tx) => {
|
||||
const groupMembers = await userGroupMembershipDAL.findGroupMembersNotInProject(group.id, project.id, tx);
|
||||
const groupMembers = await userGroupMembershipDAL.find({ groupId: group.id });
|
||||
|
||||
if (groupMembers.length) {
|
||||
const deletedProjectGroup = await groupProjectDAL.transaction(async (tx) => {
|
||||
const groupMembersNotInProject = await userGroupMembershipDAL.findGroupMembersNotInProject(
|
||||
group.id,
|
||||
project.id,
|
||||
tx
|
||||
);
|
||||
|
||||
if (groupMembersNotInProject.length) {
|
||||
await projectKeyDAL.delete(
|
||||
{
|
||||
projectId: project.id,
|
||||
$in: {
|
||||
receiverId: groupMembers.map(({ user: { id } }) => id)
|
||||
receiverId: groupMembersNotInProject.map(({ user: { id } }) => id)
|
||||
}
|
||||
},
|
||||
tx
|
||||
@@ -422,6 +446,11 @@ export const groupProjectServiceFactory = ({
|
||||
return projectGroup;
|
||||
});
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
...groupMembers.map((member) => permissionService.invalidateUserProjectPermissionCache(member.userId))
|
||||
]);
|
||||
|
||||
return deletedProjectGroup;
|
||||
};
|
||||
|
||||
|
||||
@@ -35,7 +35,13 @@ type TIdentityProjectServiceFactoryDep = {
|
||||
projectDAL: Pick<TProjectDALFactory, "findById">;
|
||||
projectRoleDAL: Pick<TProjectRoleDALFactory, "find">;
|
||||
identityOrgMembershipDAL: Pick<TIdentityOrgDALFactory, "findOne">;
|
||||
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "getProjectPermissionByRole">;
|
||||
permissionService: Pick<
|
||||
TPermissionServiceFactory,
|
||||
| "getProjectPermission"
|
||||
| "getProjectPermissionByRole"
|
||||
| "invalidateIdentityProjectPermissionCache"
|
||||
| "invalidateProjectPermissionCache"
|
||||
>;
|
||||
};
|
||||
|
||||
export type TIdentityProjectServiceFactory = ReturnType<typeof identityProjectServiceFactory>;
|
||||
@@ -165,6 +171,12 @@ export const identityProjectServiceFactory = ({
|
||||
const identityRoles = await identityProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx);
|
||||
return { ...identityProjectMembership, roles: identityRoles };
|
||||
});
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
permissionService.invalidateIdentityProjectPermissionCache(identityId)
|
||||
]);
|
||||
|
||||
return projectIdentity;
|
||||
};
|
||||
|
||||
@@ -272,6 +284,11 @@ export const identityProjectServiceFactory = ({
|
||||
return identityProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx);
|
||||
});
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
permissionService.invalidateIdentityProjectPermissionCache(identityId)
|
||||
]);
|
||||
|
||||
return updatedRoles;
|
||||
};
|
||||
|
||||
@@ -302,6 +319,12 @@ export const identityProjectServiceFactory = ({
|
||||
);
|
||||
|
||||
const [deletedIdentity] = await identityProjectDAL.delete({ identityId, projectId });
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
permissionService.invalidateIdentityProjectPermissionCache(identityId)
|
||||
]);
|
||||
|
||||
return deletedIdentity;
|
||||
};
|
||||
|
||||
|
||||
@@ -43,7 +43,13 @@ import {
|
||||
import { TProjectUserMembershipRoleDALFactory } from "./project-user-membership-role-dal";
|
||||
|
||||
type TProjectMembershipServiceFactoryDep = {
|
||||
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "getProjectPermissionByRole">;
|
||||
permissionService: Pick<
|
||||
TPermissionServiceFactory,
|
||||
| "getProjectPermission"
|
||||
| "getProjectPermissionByRole"
|
||||
| "invalidateUserProjectPermissionCache"
|
||||
| "invalidateProjectPermissionCache"
|
||||
>;
|
||||
smtpService: TSmtpService;
|
||||
projectBotDAL: TProjectBotDALFactory;
|
||||
projectMembershipDAL: TProjectMembershipDALFactory;
|
||||
@@ -239,6 +245,13 @@ export const projectMembershipServiceFactory = ({
|
||||
);
|
||||
});
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
...orgMembers.map(({ userId }) =>
|
||||
userId ? permissionService.invalidateUserProjectPermissionCache(userId) : Promise.resolve()
|
||||
)
|
||||
]);
|
||||
|
||||
if (sendEmails) {
|
||||
await notificationService.createUserNotifications(
|
||||
orgMembers.map((member) => ({
|
||||
@@ -371,6 +384,13 @@ export const projectMembershipServiceFactory = ({
|
||||
return projectUserMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx);
|
||||
});
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
membershipUser?.userId
|
||||
? permissionService.invalidateUserProjectPermissionCache(membershipUser.userId)
|
||||
: Promise.resolve()
|
||||
]);
|
||||
|
||||
return updatedRoles;
|
||||
};
|
||||
|
||||
@@ -414,6 +434,12 @@ export const projectMembershipServiceFactory = ({
|
||||
);
|
||||
return deletedMembership;
|
||||
});
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
membership.userId ? permissionService.invalidateUserProjectPermissionCache(membership.userId) : Promise.resolve()
|
||||
]);
|
||||
|
||||
return membership;
|
||||
};
|
||||
|
||||
@@ -515,6 +541,14 @@ export const projectMembershipServiceFactory = ({
|
||||
|
||||
return deletedMemberships;
|
||||
});
|
||||
|
||||
await Promise.allSettled([
|
||||
permissionService.invalidateProjectPermissionCache(projectId),
|
||||
...memberships.map(({ userId }) =>
|
||||
userId ? permissionService.invalidateUserProjectPermissionCache(userId) : Promise.resolve()
|
||||
)
|
||||
]);
|
||||
|
||||
return memberships;
|
||||
};
|
||||
|
||||
|
||||
@@ -35,7 +35,10 @@ type TProjectRoleServiceFactoryDep = {
|
||||
identityDAL: Pick<TIdentityDALFactory, "findById">;
|
||||
userDAL: Pick<TUserDALFactory, "findById">;
|
||||
projectDAL: Pick<TProjectDALFactory, "findProjectBySlug" | "findProjectById">;
|
||||
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "getUserProjectPermission">;
|
||||
permissionService: Pick<
|
||||
TPermissionServiceFactory,
|
||||
"getProjectPermission" | "getUserProjectPermission" | "invalidateProjectPermissionCache"
|
||||
>;
|
||||
identityProjectMembershipRoleDAL: TIdentityProjectMembershipRoleDALFactory;
|
||||
projectUserMembershipRoleDAL: TProjectUserMembershipRoleDALFactory;
|
||||
};
|
||||
@@ -162,6 +165,8 @@ export const projectRoleServiceFactory = ({
|
||||
});
|
||||
if (!updatedRole) throw new NotFoundError({ message: "Project role not found", name: "Update role" });
|
||||
|
||||
await permissionService.invalidateProjectPermissionCache(projectRole.projectId);
|
||||
|
||||
return { ...updatedRole, permissions: unpackPermissions(updatedRole.permissions) };
|
||||
};
|
||||
|
||||
@@ -197,6 +202,8 @@ export const projectRoleServiceFactory = ({
|
||||
const deletedRole = await projectRoleDAL.deleteById(roleId);
|
||||
if (!deletedRole) throw new NotFoundError({ message: "Project role not found", name: "Delete role" });
|
||||
|
||||
await permissionService.invalidateProjectPermissionCache(projectRole.projectId);
|
||||
|
||||
return { ...deletedRole, permissions: unpackPermissions(deletedRole.permissions) };
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user