Handler.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Cache;
  3. using Application.Abstractions.Messaging;
  4. using Application.Helpers;
  5. using SharedKernel.Results;
  6. using Microsoft.EntityFrameworkCore;
  7. namespace Application.Features.Api.Auth.ResetPassword;
  8. internal sealed class Handler(
  9. IAppDbContext db,
  10. ICacheService cache
  11. ) : ICommandHandler<Command, Result>
  12. {
  13. public async Task<Result> Handle(Command request, CancellationToken ct)
  14. {
  15. // 쿠키 인증 확인
  16. if (request.CookieValue != "true")
  17. {
  18. return Result.Failure(Error.Unauthorized("Auth.NotVerified", "사전 인증을 먼저 수행하세요."));
  19. }
  20. // 이메일 유효성 검사
  21. if (string.IsNullOrWhiteSpace(request.Email))
  22. {
  23. return Result.Failure(Error.Problem("Auth.EmailRequired", "이메일은 필수입니다."));
  24. }
  25. // 비밀번호 유효성 검사 (복잡도 포함)
  26. if (string.IsNullOrWhiteSpace(request.Password))
  27. {
  28. return Result.Failure(Error.Problem("Auth.PasswordRequired", "비밀번호는 필수입니다."));
  29. }
  30. var accountConfig = await AccountConfigLoader.GetAccountConfigAsync(cache, db, ct);
  31. var passwordResult = PasswordPolicyValidator.Validate(request.Password, accountConfig);
  32. if (!passwordResult.IsSuccess)
  33. {
  34. return passwordResult;
  35. }
  36. var email = request.Email.Trim().ToLower();
  37. // 회원 조회
  38. var member = await db.Member.FirstOrDefaultAsync(m => m.Email == email, ct);
  39. if (member is null)
  40. {
  41. return Result.Failure(Error.NotFound("Auth.MemberNotFound", "회원 정보를 찾을 수 없습니다."));
  42. }
  43. // 비밀번호 변경
  44. member.SetPassword(request.Password);
  45. await db.SaveChangesAsync(ct);
  46. return Result.Success();
  47. }
  48. }