Address PR suggestions

This commit is contained in:
Carlos Monastyrski
2025-09-05 23:06:22 -03:00
parent 5822210511
commit b56af1cbdc
+15 -14
View File
@@ -1,4 +1,5 @@
import { ForbiddenError, subject } from "@casl/ability"; import { createMongoAbility, ForbiddenError, MongoAbility, RawRuleOf, subject } from "@casl/ability";
import { PackRule, unpackRules } from "@casl/ability/extra";
import slugify from "@sindresorhus/slugify"; import slugify from "@sindresorhus/slugify";
import { import {
@@ -20,6 +21,7 @@ import {
ProjectPermissionPkiSubscriberActions, ProjectPermissionPkiSubscriberActions,
ProjectPermissionPkiTemplateActions, ProjectPermissionPkiTemplateActions,
ProjectPermissionSecretActions, ProjectPermissionSecretActions,
ProjectPermissionSet,
ProjectPermissionSshHostActions, ProjectPermissionSshHostActions,
ProjectPermissionSub ProjectPermissionSub
} from "@app/ee/services/permission/project-permission"; } from "@app/ee/services/permission/project-permission";
@@ -1859,30 +1861,29 @@ export const projectServiceFactory = ({
.map((el) => el.user.email!); .map((el) => el.user.email!);
if (filteredProjectMembers.length === 0) { if (filteredProjectMembers.length === 0) {
const customRolesWithMemberCreate = await projectRoleDAL.find({ projectId }); const customRolesWithMemberCreate = await projectRoleDAL.find({ projectId });
const customRoleSlugsCanalCreate = customRolesWithMemberCreate const customRoleSlugsCanCreate = customRolesWithMemberCreate
.filter((role) => { .filter((role) => {
try { try {
const permissions = ( const permissions = (
typeof role.permissions === "string" ? JSON.parse(role.permissions) : role.permissions typeof role.permissions === "string"
) as Array<[string, string, object?, number?]>; ? (JSON.parse(role.permissions) as PackRule<RawRuleOf<MongoAbility<ProjectPermissionSet>>>[])
: role.permissions
) as PackRule<RawRuleOf<MongoAbility<ProjectPermissionSet>>>[];
return permissions.some(([permissionActions, permissionSubject]) => { const ability = createMongoAbility<MongoAbility<ProjectPermissionSet>>(
if (permissionSubject === ProjectPermissionSub.Member) { unpackRules<RawRuleOf<MongoAbility<ProjectPermissionSet>>>(permissions)
const actionsList = permissionActions.split(",").map((action) => action.trim()); );
return actionsList.includes(ProjectPermissionMemberActions.Create); return ability.can(ProjectPermissionMemberActions.Create, ProjectPermissionSub.Member);
}
return false;
});
} catch { } catch {
return false; return false;
} }
}) })
.map((role) => role.slug); .map((role) => role.slug);
if (customRoleSlugsCanalCreate.length > 0) { if (customRoleSlugsCanCreate.length > 0) {
const usersWithCustomCreateMemberRole = projectMembers const usersWithCustomCreateMemberRole = projectMembers
.filter((member) => .filter((member) =>
member.roles.some((role) => role.customRoleSlug && customRoleSlugsCanalCreate.includes(role.customRoleSlug)) member.roles.some((role) => role.customRoleSlug && customRoleSlugsCanCreate.includes(role.customRoleSlug))
) )
.map((el) => el.user.email!) .map((el) => el.user.email!)
.filter(Boolean); .filter(Boolean);
@@ -1896,7 +1897,7 @@ export const projectServiceFactory = ({
if (filteredProjectMembers.length === 0) { if (filteredProjectMembers.length === 0) {
throw new BadRequestError({ throw new BadRequestError({
message: message:
"No users in this project have permission to grant access. Please contact an organization administrator to assign appropriate permissions to project members." "No users in this project have permission to grant you access. Please contact an organization administrator to assign the necessary permissions."
}); });
} }