Handler.cs 2.0 KB

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