diff --git a/src/invite-user/invite-user.module.ts b/src/invite-user/invite-user.module.ts index fc0b579..ad78d63 100644 --- a/src/invite-user/invite-user.module.ts +++ b/src/invite-user/invite-user.module.ts @@ -15,7 +15,10 @@ import { import { EmailService } from '@app/common/util/email.service'; import { SpaceUserService, ValidationService } from 'src/space/services'; import { CommunityService } from 'src/community/services'; -import { SpaceRepository } from '@app/common/modules/space'; +import { + InviteSpaceRepository, + SpaceRepository, +} from '@app/common/modules/space'; import { SpaceModelRepository } from '@app/common/modules/space-model'; import { CommunityRepository } from '@app/common/modules/community/repositories'; import { ProjectRepository } from '@app/common/modules/project/repositiories'; @@ -51,6 +54,7 @@ import { RoleTypeRepository } from '@app/common/modules/role-type/repositories'; PermissionTypeRepository, ProjectUserService, RoleTypeRepository, + InviteSpaceRepository, ], exports: [InviteUserService], }) diff --git a/src/users/services/user-space.service.ts b/src/users/services/user-space.service.ts index 71611bc..58a66b4 100644 --- a/src/users/services/user-space.service.ts +++ b/src/users/services/user-space.service.ts @@ -3,17 +3,21 @@ import { UserSpaceRepository } from '@app/common/modules/user/repositories'; import { SuccessResponseDto } from '@app/common/dto/success.response.dto'; import { BaseResponseDto } from '@app/common/dto/base.response.dto'; import { AddUserSpaceDto, AddUserSpaceUsingCodeDto } from '../dtos'; -import { SpaceRepository } from '@app/common/modules/space/repositories'; +import { + InviteSpaceRepository, + SpaceRepository, +} from '@app/common/modules/space/repositories'; import { CommonErrorCodes } from '@app/common/constants/error-codes.enum'; import { UserDevicePermissionService } from 'src/user-device-permission/services'; import { PermissionType } from '@app/common/constants/permission-type.enum'; -import { SpaceEntity } from '@app/common/modules/space/entities'; +import { InviteSpaceEntity } from '@app/common/modules/space/entities/invite-space.entity'; @Injectable() export class UserSpaceService { constructor( private readonly userSpaceRepository: UserSpaceRepository, private readonly spaceRepository: SpaceRepository, + private readonly inviteSpaceRepository: InviteSpaceRepository, private readonly userDevicePermissionService: UserDevicePermissionService, ) {} @@ -38,15 +42,17 @@ export class UserSpaceService { userUuid: string, ) { try { - const space = await this.findSpaceByInviteCode(params.inviteCode); + const inviteSpace = await this.findInviteSpaceByInviteCode( + params.inviteCode, + ); - await this.addUserToSpace(userUuid, space.uuid); + await this.addUserToSpace(userUuid, inviteSpace.space.uuid); - await this.clearUnitInvitationCode(space.uuid); - - const deviceUUIDs = await this.getDeviceUUIDsForSpace(space.uuid); + const deviceUUIDs = await this.getDeviceUUIDsForSpace(inviteSpace.uuid); await this.addUserPermissionsToDevices(userUuid, deviceUUIDs); + + await this.clearSpaceInvitationCode(inviteSpace.uuid); } catch (err) { if (err instanceof HttpException) { throw err; @@ -59,23 +65,31 @@ export class UserSpaceService { } } - private async findSpaceByInviteCode( + private async findInviteSpaceByInviteCode( inviteCode: string, - ): Promise { + ): Promise { try { - const space = await this.spaceRepository.findOneOrFail({ + const inviteSpace = await this.inviteSpaceRepository.findOneOrFail({ where: { invitationCode: inviteCode, + isActive: true, }, + relations: ['space'], }); - return space; + return inviteSpace; } catch (error) { throw new HttpException( - 'Space with the provided invite code not found', - HttpStatus.NOT_FOUND, + 'Invalid invitation code', + HttpStatus.BAD_REQUEST, ); } } + private async clearSpaceInvitationCode(inviteSpaceUuid: string) { + await this.inviteSpaceRepository.update( + { uuid: inviteSpaceUuid }, + { isActive: false }, + ); + } private async addUserToSpace(userUuid: string, spaceUuid: string) { try { @@ -110,13 +124,6 @@ export class UserSpaceService { } } - private async clearUnitInvitationCode(spaceUuid: string) { - await this.spaceRepository.update( - { uuid: spaceUuid }, - { invitationCode: null }, - ); - } - async getDeviceUUIDsForSpace(unitUuid: string): Promise<{ uuid: string }[]> { const devices = await this.spaceRepository.find({ where: { uuid: unitUuid }, diff --git a/src/users/user.module.ts b/src/users/user.module.ts index 20bd06f..46e3903 100644 --- a/src/users/user.module.ts +++ b/src/users/user.module.ts @@ -12,7 +12,10 @@ import { UserSpaceController } from './controllers'; import { CommunityModule } from 'src/community/community.module'; import { UserSpaceService } from './services'; import { CommunityRepository } from '@app/common/modules/community/repositories'; -import { SpaceRepository } from '@app/common/modules/space/repositories'; +import { + InviteSpaceRepository, + SpaceRepository, +} from '@app/common/modules/space/repositories'; import { UserDevicePermissionService } from 'src/user-device-permission/services'; import { DeviceUserPermissionRepository } from '@app/common/modules/device/repositories'; import { PermissionTypeRepository } from '@app/common/modules/permission/repositories'; @@ -32,6 +35,7 @@ import { PermissionTypeRepository } from '@app/common/modules/permission/reposit DeviceUserPermissionRepository, PermissionTypeRepository, UserSpaceService, + InviteSpaceRepository, ], exports: [UserService], })