From e5195403e9bd65f2454d5b1a32f13a8389b09f68 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 7 Oct 2025 23:26:12 +0530 Subject: [PATCH] feat: more testing fix --- .../20251005152640_simplify-membership.ts | 10 ++--- .../src/ee/services/group/group-service.ts | 2 +- .../membership-group/membership-group-dal.ts | 3 ++ .../project-membership-user-factory.ts | 39 +++++++++++++------ 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/backend/src/db/migrations/20251005152640_simplify-membership.ts b/backend/src/db/migrations/20251005152640_simplify-membership.ts index 74086aa06..dbd669793 100644 --- a/backend/src/db/migrations/20251005152640_simplify-membership.ts +++ b/backend/src/db/migrations/20251005152640_simplify-membership.ts @@ -1061,16 +1061,16 @@ const rollbackMembershipData = async (knex: Knex) => { }; export async function down(knex: Knex): Promise { - const hasMembershipTable = await knex.schema.hasTable(TableName.Membership); - if (hasMembershipTable) { - await rollbackMembershipData(knex); - } - const hasRoleTable = await knex.schema.hasTable(TableName.Role); if (hasRoleTable) { await rollbackRoleData(knex); } + const hasMembershipTable = await knex.schema.hasTable(TableName.Membership); + if (hasMembershipTable) { + await rollbackMembershipData(knex); + } + const hasMembershipRoleTable = await knex.schema.hasTable(TableName.MembershipRole); if (hasMembershipRoleTable) { await rollbackMembershipRoleData(knex); diff --git a/backend/src/ee/services/group/group-service.ts b/backend/src/ee/services/group/group-service.ts index b3ed86748..075488488 100644 --- a/backend/src/ee/services/group/group-service.ts +++ b/backend/src/ee/services/group/group-service.ts @@ -126,7 +126,7 @@ export const groupServiceFactory = ({ slug: slug || slugify(`${name}-${alphaNumericNanoId(4)}`), orgId: actorOrgId, role: isCustomRole ? OrgMembershipRole.Custom : role, - roleId: rolePermissionDetails?.role?.id + roleId: null }, tx ); diff --git a/backend/src/services/membership-group/membership-group-dal.ts b/backend/src/services/membership-group/membership-group-dal.ts index f23638dff..35a587dc5 100644 --- a/backend/src/services/membership-group/membership-group-dal.ts +++ b/backend/src/services/membership-group/membership-group-dal.ts @@ -195,6 +195,7 @@ export const membershipGroupDALFactory = (db: TDbClient) => { db.ref("id").withSchema(TableName.Groups).as("groupId"), db.ref("slug").withSchema(TableName.Role).as("roleSlug"), + db.ref("name").withSchema(TableName.Role).as("roleName"), db.ref("id").withSchema(TableName.MembershipRole).as("membershipRoleId"), db.ref("role").withSchema(TableName.MembershipRole).as("membershipRole"), db.ref("temporaryMode").withSchema(TableName.MembershipRole).as("membershipRoleTemporaryMode"), @@ -237,6 +238,7 @@ export const membershipGroupDALFactory = (db: TDbClient) => { label: "roles" as const, mapper: ({ roleSlug, + roleName, membershipRoleId, membershipRole, membershipRoleIsTemporary, @@ -250,6 +252,7 @@ export const membershipGroupDALFactory = (db: TDbClient) => { id: membershipRoleId, role: membershipRole, customRoleSlug: roleSlug, + customRoleName: roleName, temporaryRange: membershipRoleTemporaryRange, temporaryMode: membershipRoleTemporaryMode, temporaryAccessStartTime: membershipRoleTemporaryAccessStartTime, diff --git a/backend/src/services/membership-user/project/project-membership-user-factory.ts b/backend/src/services/membership-user/project/project-membership-user-factory.ts index 6957f565f..0a9bb955a 100644 --- a/backend/src/services/membership-user/project/project-membership-user-factory.ts +++ b/backend/src/services/membership-user/project/project-membership-user-factory.ts @@ -1,6 +1,6 @@ import { ForbiddenError } from "@casl/ability"; -import { AccessScope, ActionProjectType, ProjectMembershipRole } from "@app/db/schemas"; +import { AccessScope, ActionProjectType, OrgMembershipStatus, ProjectMembershipRole } from "@app/db/schemas"; import { constructPermissionErrorMessage, validatePrivilegeChangeOperation @@ -112,19 +112,36 @@ export const newProjectMembershipUserFactory = ({ dto, newMembers ) => { + const orgMembershipAccepted = await membershipUserDAL.find({ + scope: AccessScope.Organization, + scopeOrgId: dto.permission.orgId, + status: OrgMembershipStatus.Accepted, + $in: { + actorUserId: newMembers.map((el) => el.id) + } + }); + + if (!orgMembershipAccepted.length) return { signUpTokens: [] }; + const appCfg = getConfig(); const scope = getScopeField(dto.scopeData); const project = await projectDAL.findById(scope.value); - const emails = newMembers.filter((el) => Boolean(el?.email)).map((el) => el?.email as string); - await smtpService.sendMail({ - template: SmtpTemplates.WorkspaceInvite, - subjectLine: "Infisical project invitation", - recipients: emails, - substitutions: { - workspaceName: project.name, - callback_url: `${appCfg.SITE_URL}/login` - } - }); + + const orgMembershipAcceptedUserIds = orgMembershipAccepted.map((el) => el.actorUserId as string); + const emails = newMembers + .filter((el) => Boolean(el?.email) && orgMembershipAcceptedUserIds.includes(el.id)) + .map((el) => el?.email as string); + if (emails.length) { + await smtpService.sendMail({ + template: SmtpTemplates.WorkspaceInvite, + subjectLine: "Infisical project invitation", + recipients: emails, + substitutions: { + workspaceName: project.name, + callback_url: `${appCfg.SITE_URL}/login` + } + }); + } return { signUpTokens: [] }; };