fix update username
This commit is contained in:
		
							parent
							
								
									72801c5cf6
								
							
						
					
					
						commit
						5e4b777ab8
					
				| 
						 | 
				
			
			@ -14,25 +14,26 @@ export class AuthMessagerController {
 | 
			
		|||
  @RabbitSubscribe({
 | 
			
		||||
    exchange: 'user',
 | 
			
		||||
    routingKey: 'user.update',
 | 
			
		||||
    queue: 'auth-user-update',
 | 
			
		||||
  })
 | 
			
		||||
  public async userUpdatedHandler(message: string) {
 | 
			
		||||
    const updatedUser = JSON.parse(message);
 | 
			
		||||
    if (!updatedUser.hasOwnProperty('uuid')) throw new Error();
 | 
			
		||||
    if (updatedUser.hasOwnProperty('email')) {
 | 
			
		||||
    if (updatedUser.hasOwnProperty('email') && updatedUser.email) {
 | 
			
		||||
      const updateUsernameRequest = new UpdateUsernameRequest();
 | 
			
		||||
      updateUsernameRequest.uuid = updatedUser.uuid;
 | 
			
		||||
      updateUsernameRequest.username = updatedUser.email;
 | 
			
		||||
      updateUsernameRequest.type = Type.EMAIL;
 | 
			
		||||
      this._commandBus.execute(
 | 
			
		||||
      await this._commandBus.execute(
 | 
			
		||||
        new UpdateUsernameCommand(updateUsernameRequest),
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
    if (updatedUser.hasOwnProperty('phone')) {
 | 
			
		||||
    if (updatedUser.hasOwnProperty('phone') && updatedUser.phone) {
 | 
			
		||||
      const updateUsernameRequest = new UpdateUsernameRequest();
 | 
			
		||||
      updateUsernameRequest.uuid = updatedUser.uuid;
 | 
			
		||||
      updateUsernameRequest.username = updatedUser.phone;
 | 
			
		||||
      updateUsernameRequest.type = Type.PHONE;
 | 
			
		||||
      this._commandBus.execute(
 | 
			
		||||
      await this._commandBus.execute(
 | 
			
		||||
        new UpdateUsernameCommand(updateUsernameRequest),
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -41,12 +42,13 @@ export class AuthMessagerController {
 | 
			
		|||
  @RabbitSubscribe({
 | 
			
		||||
    exchange: 'user',
 | 
			
		||||
    routingKey: 'user.delete',
 | 
			
		||||
    queue: 'auth-user-delete',
 | 
			
		||||
  })
 | 
			
		||||
  public async userDeletedHandler(message: string) {
 | 
			
		||||
    const deletedUser = JSON.parse(message);
 | 
			
		||||
    if (!deletedUser.hasOwnProperty('uuid')) throw new Error();
 | 
			
		||||
    const deleteAuthRequest = new DeleteAuthRequest();
 | 
			
		||||
    deleteAuthRequest.uuid = deletedUser.uuid;
 | 
			
		||||
    this._commandBus.execute(new DeleteAuthCommand(deleteAuthRequest));
 | 
			
		||||
    await this._commandBus.execute(new DeleteAuthCommand(deleteAuthRequest));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,25 +1,55 @@
 | 
			
		|||
import { CommandHandler } from '@nestjs/cqrs';
 | 
			
		||||
import { Mapper } from '@automapper/core';
 | 
			
		||||
import { InjectMapper } from '@automapper/nestjs';
 | 
			
		||||
import { BadRequestException } from '@nestjs/common';
 | 
			
		||||
import { CommandBus, CommandHandler } from '@nestjs/cqrs';
 | 
			
		||||
import { UsernameRepository } from '../../adapters/secondaries/username.repository';
 | 
			
		||||
import { AddUsernameCommand } from '../../commands/add-username.command';
 | 
			
		||||
import { UpdateUsernameCommand } from '../../commands/update-username.command';
 | 
			
		||||
import { AddUsernameRequest } from '../dtos/add-username.request';
 | 
			
		||||
import { UpdateUsernameRequest } from '../dtos/update-username.request';
 | 
			
		||||
import { Username } from '../entities/username';
 | 
			
		||||
 | 
			
		||||
@CommandHandler(UpdateUsernameCommand)
 | 
			
		||||
export class UpdateUsernameUseCase {
 | 
			
		||||
  constructor(private readonly _usernameRepository: UsernameRepository) {}
 | 
			
		||||
  constructor(
 | 
			
		||||
    private readonly _usernameRepository: UsernameRepository,
 | 
			
		||||
    private readonly _commandBus: CommandBus,
 | 
			
		||||
    @InjectMapper() private readonly _mapper: Mapper,
 | 
			
		||||
  ) {}
 | 
			
		||||
 | 
			
		||||
  async execute(command: UpdateUsernameCommand): Promise<Username> {
 | 
			
		||||
    const { uuid, username, type } = command.updateUsernameRequest;
 | 
			
		||||
    try {
 | 
			
		||||
      return await this._usernameRepository.updateWhere(
 | 
			
		||||
        {
 | 
			
		||||
          uuid_type: {
 | 
			
		||||
            uuid,
 | 
			
		||||
            type,
 | 
			
		||||
    if (!username) throw new BadRequestException();
 | 
			
		||||
    // update username if it exists, otherwise create it
 | 
			
		||||
    const existingUsername = await this._usernameRepository.findOne({
 | 
			
		||||
      uuid,
 | 
			
		||||
      type,
 | 
			
		||||
    });
 | 
			
		||||
    if (existingUsername) {
 | 
			
		||||
      try {
 | 
			
		||||
        return await this._usernameRepository.updateWhere(
 | 
			
		||||
          {
 | 
			
		||||
            uuid_type: {
 | 
			
		||||
              uuid,
 | 
			
		||||
              type,
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          username,
 | 
			
		||||
        },
 | 
			
		||||
          {
 | 
			
		||||
            username,
 | 
			
		||||
          },
 | 
			
		||||
        );
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        throw e;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    const addUsernameRequest = this._mapper.map(
 | 
			
		||||
      command.updateUsernameRequest,
 | 
			
		||||
      UpdateUsernameRequest,
 | 
			
		||||
      AddUsernameRequest,
 | 
			
		||||
    );
 | 
			
		||||
    try {
 | 
			
		||||
      return await this._commandBus.execute(
 | 
			
		||||
        new AddUsernameCommand(addUsernameRequest),
 | 
			
		||||
      );
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw e;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,8 @@ import { createMap, Mapper } from '@automapper/core';
 | 
			
		|||
import { AutomapperProfile, InjectMapper } from '@automapper/nestjs';
 | 
			
		||||
import { Injectable } from '@nestjs/common';
 | 
			
		||||
import { UsernamePresenter } from '../adapters/primaries/username.presenter';
 | 
			
		||||
import { AddUsernameRequest } from '../domain/dtos/add-username.request';
 | 
			
		||||
import { UpdateUsernameRequest } from '../domain/dtos/update-username.request';
 | 
			
		||||
import { Username } from '../domain/entities/username';
 | 
			
		||||
 | 
			
		||||
@Injectable()
 | 
			
		||||
| 
						 | 
				
			
			@ -13,6 +15,7 @@ export class UsernameProfile extends AutomapperProfile {
 | 
			
		|||
  override get profile() {
 | 
			
		||||
    return (mapper: any) => {
 | 
			
		||||
      createMap(mapper, Username, UsernamePresenter);
 | 
			
		||||
      createMap(mapper, UpdateUsernameRequest, AddUsernameRequest);
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,18 +7,56 @@ import { UpdateUsernameRequest } from '../../domain/dtos/update-username.request
 | 
			
		|||
import { UpdateUsernameCommand } from '../../commands/update-username.command';
 | 
			
		||||
import { Type } from '../../domain/dtos/type.enum';
 | 
			
		||||
import { UpdateUsernameUseCase } from '../../domain/usecases/update-username.usecase';
 | 
			
		||||
import { CommandBus } from '@nestjs/cqrs';
 | 
			
		||||
import { UsernameProfile } from '../../mappers/username.profile';
 | 
			
		||||
import { BadRequestException } from '@nestjs/common';
 | 
			
		||||
 | 
			
		||||
const existingUsername = {
 | 
			
		||||
  uuid: 'bb281075-1b98-4456-89d6-c643d3044a91',
 | 
			
		||||
  username: 'john.doe@email.com',
 | 
			
		||||
  type: Type.EMAIL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const updateUsernameRequest: UpdateUsernameRequest = {
 | 
			
		||||
  uuid: 'bb281075-1b98-4456-89d6-c643d3044a91',
 | 
			
		||||
  username: 'johnny.doe@email.com',
 | 
			
		||||
  type: Type.EMAIL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const newUsernameRequest: UpdateUsernameRequest = {
 | 
			
		||||
  uuid: 'bb281075-1b98-4456-89d6-c643d3044a91',
 | 
			
		||||
  username: '+33611223344',
 | 
			
		||||
  type: Type.PHONE,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const invalidUpdateUsernameRequest: UpdateUsernameRequest = {
 | 
			
		||||
  uuid: 'bb281075-1b98-4456-89d6-c643d3044a91',
 | 
			
		||||
  username: '',
 | 
			
		||||
  type: Type.EMAIL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const updateUsernameCommand: UpdateUsernameCommand = new UpdateUsernameCommand(
 | 
			
		||||
  updateUsernameRequest,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
const newUsernameCommand: UpdateUsernameCommand = new UpdateUsernameCommand(
 | 
			
		||||
  newUsernameRequest,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
const invalidUpdateUsernameCommand: UpdateUsernameCommand =
 | 
			
		||||
  new UpdateUsernameCommand(invalidUpdateUsernameRequest);
 | 
			
		||||
 | 
			
		||||
const mockUsernameRepository = {
 | 
			
		||||
  updateWhere: jest.fn().mockResolvedValue(updateUsernameRequest),
 | 
			
		||||
  findOne: jest.fn().mockResolvedValue(existingUsername),
 | 
			
		||||
  updateWhere: jest
 | 
			
		||||
    .fn()
 | 
			
		||||
    .mockResolvedValueOnce(updateUsernameRequest)
 | 
			
		||||
    .mockResolvedValueOnce(newUsernameRequest)
 | 
			
		||||
    .mockResolvedValueOnce(invalidUpdateUsernameRequest),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const mockAddUsernameCommand = {
 | 
			
		||||
  execute: jest.fn().mockResolvedValue(newUsernameRequest),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
describe('UpdateUsernameUseCase', () => {
 | 
			
		||||
| 
						 | 
				
			
			@ -32,7 +70,12 @@ describe('UpdateUsernameUseCase', () => {
 | 
			
		|||
          provide: UsernameRepository,
 | 
			
		||||
          useValue: mockUsernameRepository,
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          provide: CommandBus,
 | 
			
		||||
          useValue: mockAddUsernameCommand,
 | 
			
		||||
        },
 | 
			
		||||
        UpdateUsernameUseCase,
 | 
			
		||||
        UsernameProfile,
 | 
			
		||||
      ],
 | 
			
		||||
    }).compile();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -54,5 +97,20 @@ describe('UpdateUsernameUseCase', () => {
 | 
			
		|||
      expect(updatedUsername.username).toBe(updateUsernameRequest.username);
 | 
			
		||||
      expect(updatedUsername.type).toBe(updateUsernameRequest.type);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should create a new username', async () => {
 | 
			
		||||
      const newUsername: Username = await updateUsernameUseCase.execute(
 | 
			
		||||
        newUsernameCommand,
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      expect(newUsername.username).toBe(newUsernameRequest.username);
 | 
			
		||||
      expect(newUsername.type).toBe(newUsernameRequest.type);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should throw an exception if username is invalid', async () => {
 | 
			
		||||
      await expect(
 | 
			
		||||
        updateUsernameUseCase.execute(invalidUpdateUsernameCommand),
 | 
			
		||||
      ).rejects.toBeInstanceOf(BadRequestException);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -131,6 +131,7 @@ export abstract class PrismaRepository<T> implements IRepository<T> {
 | 
			
		|||
 | 
			
		||||
      return updatedEntity;
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      console.log('error', e);
 | 
			
		||||
      if (e instanceof PrismaClientKnownRequestError) {
 | 
			
		||||
        throw new DatabaseException(
 | 
			
		||||
          PrismaClientKnownRequestError.name,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue