EmailVerifyNumberRepository.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Microsoft.EntityFrameworkCore;
  2. using bitforum.Constants;
  3. using bitforum.Models.Account;
  4. namespace bitforum.Repository
  5. {
  6. public interface IEmailVerifyNumberRepository
  7. {
  8. /// <summary>
  9. /// 새 인증번호 생성 및 저장
  10. /// </summary>
  11. public Task<string> GenerateCodeAsync(string email, VerificationType type);
  12. /// <summary>
  13. /// 인증번호 검증 및 사용 처리
  14. /// </summary>
  15. public Task<bool> ValidateCodeAsync(string email, string code, VerificationType type);
  16. /// <summary>
  17. /// 만료된 인증번호 삭제
  18. /// </summary>
  19. public Task CleanupExpiredCodesAsync();
  20. }
  21. public class EmailVerifyNumberRepository : IEmailVerifyNumberRepository
  22. {
  23. private readonly DefaultDbContext _db;
  24. private readonly int _codeExpirationMinutes = 2;
  25. public EmailVerifyNumberRepository(DefaultDbContext db)
  26. {
  27. _db = db;
  28. }
  29. public async Task<string> GenerateCodeAsync(string email, VerificationType type)
  30. {
  31. _db.EmailVerifyNumber.RemoveRange(
  32. _db.EmailVerifyNumber.Where(x => x.Email == email && x.Type == type)
  33. );
  34. var code = Random.Shared.Next(100000, 999999).ToString(); // 6자리 숫자 인증번호 생성
  35. var expiration = DateTime.UtcNow.AddMinutes(_codeExpirationMinutes);
  36. _db.EmailVerifyNumber.Add(new EmailVerifyNumber
  37. {
  38. Type = type,
  39. Email = email,
  40. Code = code,
  41. Expiration = expiration
  42. });
  43. await _db.SaveChangesAsync();
  44. return code;
  45. }
  46. public async Task<bool> ValidateCodeAsync(string email, string code, VerificationType type)
  47. {
  48. var data = await _db.EmailVerifyNumber.FirstOrDefaultAsync(x => x.Email == email && x.Code == code && x.Type == type && !x.IsVerified && x.Expiration > DateTime.UtcNow);
  49. if (data == null)
  50. {
  51. return false;
  52. }
  53. data.IsVerified = true; // 사용 처리
  54. await _db.SaveChangesAsync();
  55. return true;
  56. }
  57. public async Task CleanupExpiredCodesAsync()
  58. {
  59. _db.EmailVerifyNumber.RemoveRange(
  60. _db.EmailVerifyNumber.Where(x => x.Expiration < DateTime.UtcNow)
  61. );
  62. await _db.SaveChangesAsync();
  63. }
  64. }
  65. }