import { ApiProperty } from '@nestjs/swagger';
import { UserGender, UserType } from '../../../commons/enums';
import { SignUpCommand } from '../../../domains/ports/in/command/user.command';

export class SignUpRequest extends SignUpCommand {
  /**
   * 유저 가입 이메일
   * @example testUser@livey.kr
   */
  @ApiProperty()
  userEmail: string;

  /**
   * @example testPW
   */
  @ApiProperty()
  userPW: string;

  /**
   * @example tester
   */
  @ApiProperty()
  userName: string;

  /**
   *
   */
  userGender: UserGender;

  userType: UserType;

  /**
   * @example 010-1234-5678
   */
  @ApiProperty()
  userPhoneNum: string;

  
/**
* 이메일 유효성 검사 API 추가 예시 
*/
@IsEmail() // <- 여기에 이메일 유효성을 확인하는 데코레이터를 추가합니다.
@ApiProperty({
    example: '테스트용 이메일',
    description: '유저 가입 이메일',
})
userEmail:string;
  

  
/**
* 여기까지 예시입니다. 나머지 코드는 그대로 사용하시면 됩니다.
위의 코드에서 SignUpRequest 클래스의 userEmail 프로퍼티에
@IsEmail() 데코레이터를 추가하여 이메일의 유효성을 검사할 수 있습니다. 
해당 데코레이터는 NestJS에서 제공하는 class-validator 패키지의 일부입니다.

또한, @ApiProperty() 데코레이터를 사용하여 Swagger 문서화에 필요한 정보를 추가할 수 있습니다. 
예를 들어, example 속성을 사용하여 예시 값을 제공하고, description 속성을 사용하여 
프로퍼티에 대한 설명을 추가할 수 있습니다.

추가된 코드 부분은 주석으로 표시되어 있으며,
위와 같은 방식으로 기존 코드에 이메일 유효성 검사 API를 추가할 수 있습니다.
*/

}

생략된 내용이 굉장히 많은데, 아무래도 프로젝트 내용 상 철저히 보안이 유지되어야 하기 때문에 코드 공유가 어려워서, 예시 코드 내용 올린 점.. 양해 바란다.

아무튼 대충 위와 같이 유저 리퀘스트 DTO에 이메일 유효성 검사 API를 추가해주고, 실행하려는데..

 

Object literal may only specify known properties, and 'email' does not exist in type 'FindOptionsWhere<User> | FindOptionsWhere<User>[]'.

하.. 이번엔 또 뭐가..

알고 보니 FindOptionsWhere<User> 타입에 'email' 속성이 존재하지 않기 때문에 발생했다. 이 오류를 해결하기 위해서는 FindOptionsWhere<User> 타입에 'email' 속성을 추가해야 한다.

import { User } from '../../domains/entities/User.entity';
import { FindConditions } from 'typeorm';

// ...

const conditions: FindConditions<User> = {
  email: 'testUser@livey.kr',
};

// 사용 예시:
const user = await userRepository.findOne(conditions);

//위의 코드에서는 FindConditions<User>를 사용하여 검색 조건을 정의하고 있습니다.
해당 타입은 TypeORM에서 제공하는 타입으로, email과 같은 필드로 검색 조건을 지정할 수 있도록 합니다.

userRepository.findOne() 메서드를 호출할 때 검색 조건으로 conditions 객체를 전달하여 
사용할 수 있습니다. 이렇게 하면 원하는 이메일 값을 가진 유저를 찾을 수 있습니다.

프로젝트의 실제 구조와 TypeORM 설정에 따라 코드가 달라질 수 있으므로, 
필요한 경우 해당 프로젝트의 구조와 설정에 맞게 코드를 수정하셔야 합니다.

처음에 이렇게 했다가, 유저 레포지토리가 있길래 

import { User } from '../../domains/entities/User.entity';
import { FindConditions, Repository } from 'typeorm';

class UserRepository extends Repository<User> {
  // ...

  async findUserByEmail(email: string): Promise<User | undefined> {
    const conditions: FindConditions<User> = {
      email: email,
    };

    return this.findOne(conditions);
  }

  // ...
}
//위의 코드에서는 findUserByEmail() 메서드를 추가하여 이메일로 유저를 조회하고 있습니다.
해당 메서드 내에서 검색 조건으로 주어진 이메일 값을 사용하고 있습니다.

위와 같이 바꿔주었다.

 

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, FindOptions } from 'typeorm';
import { User } from '../../domains/entities/User.entity';

@Injectable()
export class EmailService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  validateEmailFormat(email: string): boolean {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
  }

  async checkDuplicateEmail(email: string): Promise<boolean> {
    const options: FindOptions<User> = {
      where: {
        email: email,
      },
    };

    const existingUser = await this.usersRepository.findOne(options);
    return !!existingUser;
  }
}
//위의 코드는 checkDuplicateEmail() 메서드 내에서 
검색 조건으로 이메일 값을 사용하도록 수정한 것입니다. 
FindOptions<User> 타입을 사용하여 검색 조건 객체를 정의하고, 
해당 객체를 findOne() 메서드에 전달하여 중복된 이메일을 확인합니다.
**typeorm에서는 FindConditions 대신 FindOptions를 사용해야 합니다.
typeorm에서는 FindOptions를 사용하여 검색 조건을 정의합니다**

이렇게 바꿨는데, 또 오류가 발생했다... 나머지는 4편에서.

아마 한 6~7편까지 나올 듯 하다..ㅋㅋ

+ Recent posts