From 204248b0ad11c6730390a62f9df688b673b7c15f Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Fri, 30 May 2025 13:05:06 +0000 Subject: [PATCH 1/3] Add SAML user registration support and update user entity - Introduced SAML user registration endpoint in SaasController. - Added SAML properties to UserEntity and RegisterUserDs. - Updated IUserRepository and user repository implementation to handle SAML. - Created SaasSAMLUserRegisterDS for SAML registration data structure. - Implemented SaaSRegisterUserWIthSamlUseCase for user registration logic. - Updated Docker Compose to include Keycloak for SAML integration. - Added migration to include SAML properties in the user table. --- backend/src/common/data-injection.tokens.ts | 1 + .../data-structures/register-user-ds.ts | 1 + .../external-registration-provider.enum.ts | 1 + .../user-custom-repository-extension.ts | 4 + .../repository/user.repository.interface.ts | 1 + backend/src/entities/user/user.entity.ts | 3 + .../saas-saml-user-register.ds.ts | 21 ++++++ .../saas-microservice/saas.controller.ts | 30 +++++++- .../saas-microservice/saas.module.ts | 6 ++ .../register-user-with-saml-use.case.ts | 73 +++++++++++++++++++ .../use-cases/saas-use-cases.interface.ts | 5 ++ ...002305012-AddSamlPropertiesToUserEntity.ts | 33 +++++++++ docker-compose.yml | 33 +++++++++ 13 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 backend/src/microservices/saas-microservice/data-structures/saas-saml-user-register.ds.ts create mode 100644 backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts create mode 100644 backend/src/migrations/1748002305012-AddSamlPropertiesToUserEntity.ts diff --git a/backend/src/common/data-injection.tokens.ts b/backend/src/common/data-injection.tokens.ts index f3752a4c4..e65e687a5 100644 --- a/backend/src/common/data-injection.tokens.ts +++ b/backend/src/common/data-injection.tokens.ts @@ -108,6 +108,7 @@ export enum UseCaseType { SAAS_GET_USERS_COUNT_IN_COMPANY = 'SAAS_GET_USERS_COUNT_IN_COMPANY', FREEZE_CONNECTIONS_IN_COMPANY = 'FREEZE_CONNECTIONS_IN_COMPANY', UNFREEZE_CONNECTIONS_IN_COMPANY = 'UNFREEZE_CONNECTIONS_IN_COMPANY', + SAAS_REGISTER_USER_WITH_SAML = 'SAAS_REGISTER_USER_WITH_SAML', INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = 'INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP', VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = 'VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP', diff --git a/backend/src/entities/user/application/data-structures/register-user-ds.ts b/backend/src/entities/user/application/data-structures/register-user-ds.ts index e0215c4c3..178b4e65a 100644 --- a/backend/src/entities/user/application/data-structures/register-user-ds.ts +++ b/backend/src/entities/user/application/data-structures/register-user-ds.ts @@ -7,4 +7,5 @@ export class RegisterUserDs { isActive: boolean; name: string; role?: UserRoleEnum; + samlNameId?: string; } diff --git a/backend/src/entities/user/enums/external-registration-provider.enum.ts b/backend/src/entities/user/enums/external-registration-provider.enum.ts index 69d5c29ae..aceb02fa2 100644 --- a/backend/src/entities/user/enums/external-registration-provider.enum.ts +++ b/backend/src/entities/user/enums/external-registration-provider.enum.ts @@ -1,4 +1,5 @@ export enum ExternalRegistrationProviderEnum { GOOGLE = 'GOOGLE', GITHUB = 'GITHUB', + SAML = 'SAML', } diff --git a/backend/src/entities/user/repository/user-custom-repository-extension.ts b/backend/src/entities/user/repository/user-custom-repository-extension.ts index 58e055081..cbf9149e8 100644 --- a/backend/src/entities/user/repository/user-custom-repository-extension.ts +++ b/backend/src/entities/user/repository/user-custom-repository-extension.ts @@ -47,6 +47,7 @@ export const userCustomRepositoryExtension: IUserRepository = { async findOneUserByEmail( email: string, externalRegistrationProvider: ExternalRegistrationProviderEnum = null, + samlNameId: string = null, ): Promise { const userQb = this.createQueryBuilder('user').where('user.email = :userEmail', { userEmail: email?.toLowerCase(), @@ -56,6 +57,9 @@ export const userCustomRepositoryExtension: IUserRepository = { externalRegistrationProvider: externalRegistrationProvider, }); } + if (samlNameId && externalRegistrationProvider === ExternalRegistrationProviderEnum.SAML) { + userQb.andWhere('user.samlNameId = :samlNameId', { samlNameId: samlNameId }); + } return userQb.getOne(); }, diff --git a/backend/src/entities/user/repository/user.repository.interface.ts b/backend/src/entities/user/repository/user.repository.interface.ts index 8b0e2a4f1..d0b06f0bd 100644 --- a/backend/src/entities/user/repository/user.repository.interface.ts +++ b/backend/src/entities/user/repository/user.repository.interface.ts @@ -13,6 +13,7 @@ export interface IUserRepository { findOneUserByEmail( email: string, externalRegistrationProvider?: ExternalRegistrationProviderEnum, + samlNameId?: string, ): Promise; findUserWithConnections(userId: string): Promise; diff --git a/backend/src/entities/user/user.entity.ts b/backend/src/entities/user/user.entity.ts index f3084c58c..bb44d1e1b 100644 --- a/backend/src/entities/user/user.entity.ts +++ b/backend/src/entities/user/user.entity.ts @@ -136,6 +136,9 @@ export class UserEntity { }) externalRegistrationProvider: ExternalRegistrationProviderEnum; + @Column({ default: null }) + samlNameId: string; + @Column({ default: true }) showTestConnections: boolean; diff --git a/backend/src/microservices/saas-microservice/data-structures/saas-saml-user-register.ds.ts b/backend/src/microservices/saas-microservice/data-structures/saas-saml-user-register.ds.ts new file mode 100644 index 000000000..9cf6e6652 --- /dev/null +++ b/backend/src/microservices/saas-microservice/data-structures/saas-saml-user-register.ds.ts @@ -0,0 +1,21 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class SaasSAMLUserRegisterDS { + @ApiProperty() + email: string; + + @ApiProperty() + name: string; + + @ApiProperty() + companyId: string; + + @ApiProperty() + samlConfigId: string; + + @ApiProperty() + samlNameId: string; + + @ApiProperty({ required: false }) + samlAttributes?: Record; +} diff --git a/backend/src/microservices/saas-microservice/saas.controller.ts b/backend/src/microservices/saas-microservice/saas.controller.ts index ca8e5e7d3..f6fe4b4f6 100644 --- a/backend/src/microservices/saas-microservice/saas.controller.ts +++ b/backend/src/microservices/saas-microservice/saas.controller.ts @@ -6,11 +6,13 @@ import { SaasUsualUserRegisterDS } from '../../entities/user/application/data-st import { FoundUserDto } from '../../entities/user/dto/found-user.dto.js'; import { ExternalRegistrationProviderEnum } from '../../entities/user/enums/external-registration-provider.enum.js'; import { UserEntity } from '../../entities/user/user.entity.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { SuccessResponse } from './data-structures/common-responce.ds.js'; import { RegisterCompanyWebhookDS } from './data-structures/register-company.ds.js'; import { RegisteredCompanyDS } from './data-structures/registered-company.ds.js'; import { SaasRegisterUserWithGithub } from './data-structures/saas-register-user-with-github.js'; +import { SaasSAMLUserRegisterDS } from './data-structures/saas-saml-user-register.ds.js'; import { SaasRegisterUserWithGoogleDS } from './data-structures/sass-register-user-with-google.js'; import { ICompanyRegistration, @@ -23,9 +25,9 @@ import { ISaaSGetUsersCountInCompany, ISaasGetUsersInfosByEmail, ISaasRegisterUser, + ISaasSAMLRegisterUser, ISuspendUsers, } from './use-cases/saas-use-cases.interface.js'; -import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; @UseInterceptors(SentryInterceptor) @Controller('saas') @@ -48,6 +50,8 @@ export class SaasController { private readonly loginUserWithGoogleUseCase: ILoginUserWithGoogle, @Inject(UseCaseType.SAAS_LOGIN_USER_WITH_GITHUB) private readonly loginUserWithGithubUseCase: ILoginUserWithGitHub, + @Inject(UseCaseType.SAAS_REGISTER_USER_WITH_SAML) + private readonly registerUserWithSamlUseCase: ISaasSAMLRegisterUser, @Inject(UseCaseType.SAAS_SUSPEND_USERS) private readonly suspendUsersUseCase: ISuspendUsers, @Inject(UseCaseType.SAAS_GET_COMPANY_INFO_BY_USER_ID) @@ -203,4 +207,28 @@ export class SaasController { async unfreezeConnectionsInCompany(@Body('companyIds') companyIds: Array) { return await this.unfreezeConnectionsInCompanyUseCase.execute({ companyIds }); } + + @ApiOperation({ summary: 'Register user with SAML' }) + @ApiBody({ type: SaasSAMLUserRegisterDS }) + @ApiResponse({ + status: 201, + }) + @Post('user/saml/login') + async registerUserWithSaml( + @Body('email') email: string, + @Body('name') name: string, + @Body('companyId') companyId: string, + @Body('samlConfigId') samlConfigId: string, + @Body('samlNameId') samlNameId: string, + @Body('samlAttributes') samlAttributes: Record, + ): Promise { + return await this.registerUserWithSamlUseCase.execute({ + email, + name, + companyId, + samlConfigId, + samlNameId, + samlAttributes + }); + } } diff --git a/backend/src/microservices/saas-microservice/saas.module.ts b/backend/src/microservices/saas-microservice/saas.module.ts index d19b7a3ab..754b4e928 100644 --- a/backend/src/microservices/saas-microservice/saas.module.ts +++ b/backend/src/microservices/saas-microservice/saas.module.ts @@ -15,6 +15,7 @@ import { SaasUsualRegisterUseCase } from './use-cases/saas-usual-register-user.u import { SuspendUsersUseCase } from './use-cases/suspend-users.use.case.js'; import { UnFreezeConnectionsInCompanyUseCase } from './use-cases/unfreeze-connections-in-company-use.case.js'; import { SaasRegisterDemoUserAccountUseCase } from './use-cases/register-demo-user-account.use.case.js'; +import { SaaSRegisterUserWIthSamlUseCase } from './use-cases/register-user-with-saml-use.case.js'; @Module({ imports: [], @@ -71,6 +72,10 @@ import { SaasRegisterDemoUserAccountUseCase } from './use-cases/register-demo-us provide: UseCaseType.SAAS_DEMO_USER_REGISTRATION, useClass: SaasRegisterDemoUserAccountUseCase, }, + { + provide: UseCaseType.SAAS_REGISTER_USER_WITH_SAML, + useClass: SaaSRegisterUserWIthSamlUseCase, + }, ], controllers: [SaasController], exports: [], @@ -91,6 +96,7 @@ export class SaasModule { { path: 'saas/company/:companyId/users/count', method: RequestMethod.GET }, { path: 'saas/company/freeze-connections', method: RequestMethod.PUT }, { path: 'saas/company/unfreeze-connections', method: RequestMethod.PUT }, + { path: 'saas/user/saml/login', method: RequestMethod.POST }, ); } } diff --git a/backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts b/backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts new file mode 100644 index 000000000..0037a264d --- /dev/null +++ b/backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts @@ -0,0 +1,73 @@ +import { Inject, Injectable } from '@nestjs/common'; +import AbstractUseCase from '../../../common/abstract-use.case.js'; +import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; +import { BaseType } from '../../../common/data-injection.tokens.js'; +import { ConnectionEntity } from '../../../entities/connection/connection.entity.js'; +import { GroupEntity } from '../../../entities/group/group.entity.js'; +import { PermissionEntity } from '../../../entities/permission/permission.entity.js'; +import { RegisterUserDs } from '../../../entities/user/application/data-structures/register-user-ds.js'; +import { ExternalRegistrationProviderEnum } from '../../../entities/user/enums/external-registration-provider.enum.js'; +import { UserEntity } from '../../../entities/user/user.entity.js'; +import { buildConnectionEntitiesFromTestDtos } from '../../../entities/user/utils/build-connection-entities-from-test-dtos.js'; +import { buildDefaultAdminGroups } from '../../../entities/user/utils/build-default-admin-groups.js'; +import { buildDefaultAdminPermissions } from '../../../entities/user/utils/build-default-admin-permissions.js'; +import { Constants } from '../../../helpers/constants/constants.js'; +import { SaasSAMLUserRegisterDS } from '../data-structures/saas-saml-user-register.ds.js'; + +@Injectable() +export class SaaSRegisterUserWIthSamlUseCase extends AbstractUseCase { + constructor( + @Inject(BaseType.GLOBAL_DB_CONTEXT) + protected _dbContext: IGlobalDatabaseContext, + ) { + super(); + } + + public async implementation(inputData: SaasSAMLUserRegisterDS): Promise { + const { email, name, samlNameId } = inputData; + const foundUser = await this._dbContext.userRepository.findOneUserByEmail( + email, + ExternalRegistrationProviderEnum.SAML, + samlNameId, + ); + if (foundUser) { + return foundUser; + } + + const userData: RegisterUserDs = { + email: email, + password: null, + isActive: true, + name: name ? name : null, + gclidValue: null, + }; + + const savedUser = await this._dbContext.userRepository.saveRegisteringUser( + userData, + ExternalRegistrationProviderEnum.SAML, + ); + + const testConnections = Constants.getTestConnectionsArr(); + const testConnectionsEntities = buildConnectionEntitiesFromTestDtos(testConnections); + const createdTestConnections = await Promise.all( + testConnectionsEntities.map(async (connection): Promise => { + connection.author = savedUser; + return await this._dbContext.connectionRepository.saveNewConnection(connection); + }), + ); + const testGroupsEntities = buildDefaultAdminGroups(savedUser, createdTestConnections); + const createdTestGroups = await Promise.all( + testGroupsEntities.map(async (group: GroupEntity) => { + return await this._dbContext.groupRepository.saveNewOrUpdatedGroup(group); + }), + ); + const testPermissionsEntities = buildDefaultAdminPermissions(createdTestGroups); + await Promise.all( + testPermissionsEntities.map(async (permission: PermissionEntity) => { + await this._dbContext.permissionRepository.saveNewOrUpdatedPermission(permission); + }), + ); + + return savedUser; + } +} diff --git a/backend/src/microservices/saas-microservice/use-cases/saas-use-cases.interface.ts b/backend/src/microservices/saas-microservice/use-cases/saas-use-cases.interface.ts index a4b801868..fbbe002df 100644 --- a/backend/src/microservices/saas-microservice/use-cases/saas-use-cases.interface.ts +++ b/backend/src/microservices/saas-microservice/use-cases/saas-use-cases.interface.ts @@ -11,6 +11,7 @@ import { GetUsersInfosByEmailDS } from '../data-structures/get-users-infos-by-em import { RegisterCompanyWebhookDS } from '../data-structures/register-company.ds.js'; import { RegisteredCompanyDS } from '../data-structures/registered-company.ds.js'; import { SaasRegisterUserWithGithub } from '../data-structures/saas-register-user-with-github.js'; +import { SaasSAMLUserRegisterDS } from '../data-structures/saas-saml-user-register.ds.js'; import { SaasRegisterUserWithGoogleDS } from '../data-structures/sass-register-user-with-google.js'; import { SuspendUsersDS } from '../data-structures/suspend-users.ds.js'; @@ -57,3 +58,7 @@ export interface ISaaSGetUsersCountInCompany { export interface IFreezeConnectionsInCompany { execute(inputData: FreezeConnectionsInCompanyDS): Promise; } + +export interface ISaasSAMLRegisterUser { + execute(userData: SaasSAMLUserRegisterDS): Promise; +} diff --git a/backend/src/migrations/1748002305012-AddSamlPropertiesToUserEntity.ts b/backend/src/migrations/1748002305012-AddSamlPropertiesToUserEntity.ts new file mode 100644 index 000000000..ab058662d --- /dev/null +++ b/backend/src/migrations/1748002305012-AddSamlPropertiesToUserEntity.ts @@ -0,0 +1,33 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddSamlPropertiesToUserEntity1748002305012 implements MigrationInterface { + name = 'AddSamlPropertiesToUserEntity1748002305012'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "user" ADD "samlNameId" character varying`); + await queryRunner.query( + `ALTER TYPE "public"."user_externalregistrationprovider_enum" RENAME TO "user_externalregistrationprovider_enum_old"`, + ); + await queryRunner.query( + `CREATE TYPE "public"."user_externalregistrationprovider_enum" AS ENUM('GOOGLE', 'GITHUB', 'SAML')`, + ); + await queryRunner.query( + `ALTER TABLE "user" ALTER COLUMN "externalRegistrationProvider" TYPE "public"."user_externalregistrationprovider_enum" USING "externalRegistrationProvider"::"text"::"public"."user_externalregistrationprovider_enum"`, + ); + await queryRunner.query(`DROP TYPE "public"."user_externalregistrationprovider_enum_old"`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TYPE "public"."user_externalregistrationprovider_enum_old" AS ENUM('GOOGLE', 'GITHUB')`, + ); + await queryRunner.query( + `ALTER TABLE "user" ALTER COLUMN "externalRegistrationProvider" TYPE "public"."user_externalregistrationprovider_enum_old" USING "externalRegistrationProvider"::"text"::"public"."user_externalregistrationprovider_enum_old"`, + ); + await queryRunner.query(`DROP TYPE "public"."user_externalregistrationprovider_enum"`); + await queryRunner.query( + `ALTER TYPE "public"."user_externalregistrationprovider_enum_old" RENAME TO "user_externalregistrationprovider_enum"`, + ); + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "samlNameId"`); + } +} diff --git a/docker-compose.yml b/docker-compose.yml index 800c5970f..3cd684ead 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,6 +20,7 @@ services: - test-mongo-e2e-testing - test-dynamodb-e2e-testing - test-elasticsearch-e2e-testing + - keycloak links: - postgres - testMySQL-e2e-testing @@ -30,6 +31,7 @@ services: - test-mongo-e2e-testing - test-dynamodb-e2e-testing - test-elasticsearch-e2e-testing + - keycloak command: ["yarn", "start"] testMySQL-e2e-testing: @@ -271,3 +273,34 @@ services: - REMOTE_WEBSOCKET_ADDRESS=ws://autoadmin-ws-server:8009 - APPLICATION_CONFIG_FILE_NAME=.mssql_test_agent_config.txt command: ["yarn", "start:dev"] + + keycloak-db: + image: postgres + ports: + - 5433:5432 + environment: + POSTGRES_DB: keycloak + POSTGRES_USER: keycloak + POSTGRES_PASSWORD: keycloakpass + command: postgres -c 'max_connections=300' + + keycloak: + image: quay.io/keycloak/keycloak:26.2.5 + ports: + - 8080:8080 + environment: + - KC_DB=postgres + - KC_DB_URL_HOST=keycloak-db + - KC_DB_URL_PORT=5432 + - KC_DB_URL_DATABASE=keycloak + - KC_DB_USERNAME=keycloak + - KC_DB_PASSWORD=keycloakpass + - KC_HOSTNAME=localhost + - KC_HTTP_ENABLED=true + - KC_HTTP_PORT=8080 + - KC_BOOTSTRAP_ADMIN_USERNAME=admin + - KC_BOOTSTRAP_ADMIN_PASSWORD=admin + - KC_FEATURES=admin-fine-grained-authz + depends_on: + - keycloak-db + command: start-dev From 3ff70a1a8ae49c805fa6f15476ec464495a0fed8 Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Wed, 4 Jun 2025 13:10:24 +0000 Subject: [PATCH 2/3] Remove Keycloak service and its database from docker-compose configuration --- docker-compose.yml | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3cd684ead..800c5970f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,7 +20,6 @@ services: - test-mongo-e2e-testing - test-dynamodb-e2e-testing - test-elasticsearch-e2e-testing - - keycloak links: - postgres - testMySQL-e2e-testing @@ -31,7 +30,6 @@ services: - test-mongo-e2e-testing - test-dynamodb-e2e-testing - test-elasticsearch-e2e-testing - - keycloak command: ["yarn", "start"] testMySQL-e2e-testing: @@ -273,34 +271,3 @@ services: - REMOTE_WEBSOCKET_ADDRESS=ws://autoadmin-ws-server:8009 - APPLICATION_CONFIG_FILE_NAME=.mssql_test_agent_config.txt command: ["yarn", "start:dev"] - - keycloak-db: - image: postgres - ports: - - 5433:5432 - environment: - POSTGRES_DB: keycloak - POSTGRES_USER: keycloak - POSTGRES_PASSWORD: keycloakpass - command: postgres -c 'max_connections=300' - - keycloak: - image: quay.io/keycloak/keycloak:26.2.5 - ports: - - 8080:8080 - environment: - - KC_DB=postgres - - KC_DB_URL_HOST=keycloak-db - - KC_DB_URL_PORT=5432 - - KC_DB_URL_DATABASE=keycloak - - KC_DB_USERNAME=keycloak - - KC_DB_PASSWORD=keycloakpass - - KC_HOSTNAME=localhost - - KC_HTTP_ENABLED=true - - KC_HTTP_PORT=8080 - - KC_BOOTSTRAP_ADMIN_USERNAME=admin - - KC_BOOTSTRAP_ADMIN_PASSWORD=admin - - KC_FEATURES=admin-fine-grained-authz - depends_on: - - keycloak-db - command: start-dev From 00be02b6f90c69f03b218ae790caf050804269ed Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Fri, 6 Jun 2025 12:48:25 +0000 Subject: [PATCH 3/3] Refactor SAML user registration to include company validation and remove unused imports --- .../register-user-with-saml-use.case.ts | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts b/backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts index 0037a264d..bbe8b6fc3 100644 --- a/backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts +++ b/backend/src/microservices/saas-microservice/use-cases/register-user-with-saml-use.case.ts @@ -1,17 +1,12 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { Inject, Injectable, NotFoundException } from '@nestjs/common'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { ConnectionEntity } from '../../../entities/connection/connection.entity.js'; -import { GroupEntity } from '../../../entities/group/group.entity.js'; -import { PermissionEntity } from '../../../entities/permission/permission.entity.js'; import { RegisterUserDs } from '../../../entities/user/application/data-structures/register-user-ds.js'; import { ExternalRegistrationProviderEnum } from '../../../entities/user/enums/external-registration-provider.enum.js'; +import { UserRoleEnum } from '../../../entities/user/enums/user-role.enum.js'; import { UserEntity } from '../../../entities/user/user.entity.js'; -import { buildConnectionEntitiesFromTestDtos } from '../../../entities/user/utils/build-connection-entities-from-test-dtos.js'; -import { buildDefaultAdminGroups } from '../../../entities/user/utils/build-default-admin-groups.js'; -import { buildDefaultAdminPermissions } from '../../../entities/user/utils/build-default-admin-permissions.js'; -import { Constants } from '../../../helpers/constants/constants.js'; +import { Messages } from '../../../exceptions/text/messages.js'; import { SaasSAMLUserRegisterDS } from '../data-structures/saas-saml-user-register.ds.js'; @Injectable() @@ -24,7 +19,7 @@ export class SaaSRegisterUserWIthSamlUseCase extends AbstractUseCase { - const { email, name, samlNameId } = inputData; + const { email, name, samlNameId, companyId } = inputData; const foundUser = await this._dbContext.userRepository.findOneUserByEmail( email, ExternalRegistrationProviderEnum.SAML, @@ -47,27 +42,15 @@ export class SaaSRegisterUserWIthSamlUseCase extends AbstractUseCase => { - connection.author = savedUser; - return await this._dbContext.connectionRepository.saveNewConnection(connection); - }), - ); - const testGroupsEntities = buildDefaultAdminGroups(savedUser, createdTestConnections); - const createdTestGroups = await Promise.all( - testGroupsEntities.map(async (group: GroupEntity) => { - return await this._dbContext.groupRepository.saveNewOrUpdatedGroup(group); - }), - ); - const testPermissionsEntities = buildDefaultAdminPermissions(createdTestGroups); - await Promise.all( - testPermissionsEntities.map(async (permission: PermissionEntity) => { - await this._dbContext.permissionRepository.saveNewOrUpdatedPermission(permission); - }), - ); + const foundCompanyInfo = await this._dbContext.companyInfoRepository.findOne({ where: { id: companyId } }); + if (!foundCompanyInfo) { + throw new NotFoundException(Messages.COMPANY_NOT_FOUND); + } + + savedUser.company = foundCompanyInfo; + savedUser.samlNameId = samlNameId; + savedUser.role = UserRoleEnum.USER; - return savedUser; + return await this._dbContext.userRepository.saveUserEntity(savedUser); } }