Handler.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using SharedKernel.Results;
  2. using Application.Abstractions.Data;
  3. using MediatR;
  4. using Microsoft.EntityFrameworkCore;
  5. using MemberEntity = Domain.Entities.Members.Member;
  6. namespace Application.Features.Auth.Register;
  7. internal sealed class Handler(
  8. IAppDbContext db
  9. ) : IRequestHandler<Command, Result<int>> {
  10. public async Task<Result<int>> Handle(Command request, CancellationToken ct)
  11. {
  12. // 유효성 검사
  13. if (string.IsNullOrWhiteSpace(request.Email))
  14. {
  15. return Result.Failure<int>(Error.Problem("Auth.EmailRequired", "이메일은 필수입니다."));
  16. }
  17. if (string.IsNullOrWhiteSpace(request.Password))
  18. {
  19. return Result.Failure<int>(Error.Problem("Auth.PasswordRequired", "비밀번호는 필수입니다."));
  20. }
  21. if (request.Password.Length < 6)
  22. {
  23. return Result.Failure<int>(Error.Problem("Auth.PasswordTooShort", "비밀번호는 6자 이상이어야 합니다."));
  24. }
  25. // 이메일 중복 체크
  26. var email = request.Email.Trim().ToLower();
  27. var exists = await db.Member.AnyAsync(m => m.Email == email, ct);
  28. if (exists)
  29. {
  30. return Result.Failure<int>(Error.Conflict("Auth.EmailExists", "이미 사용 중인 이메일입니다."));
  31. }
  32. // Member 생성 (비밀번호 해싱 포함)
  33. var member = MemberEntity.Create(request.Email.Trim().ToLower(), request.Password);
  34. await db.Member.AddAsync(member, ct);
  35. await db.SaveChangesAsync(ct);
  36. return Result.Success(member.ID);
  37. }
  38. }