using SharedKernel.Results; using Application.Abstractions.Data; using MediatR; using Microsoft.EntityFrameworkCore; using MemberEntity = Domain.Entities.Members.Member; namespace Application.Features.Auth.Register; internal sealed class Handler( IAppDbContext db ) : IRequestHandler> { public async Task> Handle(Command request, CancellationToken ct) { // 유효성 검사 if (string.IsNullOrWhiteSpace(request.Email)) { return Result.Failure(Error.Problem("Auth.EmailRequired", "이메일은 필수입니다.")); } if (string.IsNullOrWhiteSpace(request.Password)) { return Result.Failure(Error.Problem("Auth.PasswordRequired", "비밀번호는 필수입니다.")); } if (request.Password.Length < 6) { return Result.Failure(Error.Problem("Auth.PasswordTooShort", "비밀번호는 6자 이상이어야 합니다.")); } // 이메일 중복 체크 var email = request.Email.Trim().ToLower(); var exists = await db.Member.AnyAsync(m => m.Email == email, ct); if (exists) { return Result.Failure(Error.Conflict("Auth.EmailExists", "이미 사용 중인 이메일입니다.")); } // Member 생성 (비밀번호 해싱 포함) var member = MemberEntity.Create(request.Email.Trim().ToLower(), request.Password); await db.Member.AddAsync(member, ct); await db.SaveChangesAsync(ct); return Result.Success(member.ID); } }