feat: harden auth ops and deployment baseline

This commit is contained in:
2026-06-27 10:53:53 +09:00
parent a6ca30eec8
commit 28060b71be
41 changed files with 714 additions and 208 deletions
+27 -5
View File
@@ -2,6 +2,7 @@ namespace TaxBaik.Application.Services;
using System.Text.RegularExpressions;
using TaxBaik.Domain.Entities;
using TaxBaik.Domain.Enums;
using TaxBaik.Domain.Interfaces;
public class InquiryService(IInquiryRepository repository)
@@ -10,7 +11,7 @@ public class InquiryService(IInquiryRepository repository)
public async Task<int> SubmitAsync(
string name, string phone, string serviceType, string message,
string? ipAddress = null, CancellationToken ct = default)
string? email = null, string? ipAddress = null, CancellationToken ct = default)
{
if (string.IsNullOrWhiteSpace(name))
throw new ValidationException("이름을 입력하세요.");
@@ -25,10 +26,11 @@ public class InquiryService(IInquiryRepository repository)
{
Name = name.Trim(),
Phone = phone.Trim(),
Email = string.IsNullOrWhiteSpace(email) ? null : email.Trim(),
ServiceType = serviceType ?? "기타",
Message = message.Trim(),
IpAddress = ipAddress,
Status = "new",
Status = InquiryStatusMapper.ToStorageValue(InquiryStatus.New),
CreatedAt = DateTime.UtcNow
};
@@ -40,10 +42,30 @@ public class InquiryService(IInquiryRepository repository)
public async Task<(IEnumerable<Inquiry>, int)> GetPagedAsync(
int page, int pageSize, string? status = null, CancellationToken ct = default) =>
await repository.GetPagedAsync(page, pageSize, status, ct);
await repository.GetPagedAsync(NormalizePage(page), NormalizePageSize(pageSize), NormalizeOptionalStatus(status), ct);
public async Task UpdateStatusAsync(int id, string status, CancellationToken ct = default) =>
await repository.UpdateStatusAsync(id, status, ct);
public async Task UpdateStatusAsync(int id, string status, CancellationToken ct = default)
{
if (!InquiryStatusMapper.TryParse(status, out var parsed))
throw new ValidationException("지원하지 않는 문의 상태입니다.");
await repository.UpdateStatusAsync(id, InquiryStatusMapper.ToStorageValue(parsed), ct);
}
private static int NormalizePage(int page) => Math.Max(1, page);
private static int NormalizePageSize(int pageSize) => Math.Clamp(pageSize, 1, 100);
private static string? NormalizeOptionalStatus(string? status)
{
if (string.IsNullOrWhiteSpace(status))
return null;
if (!InquiryStatusMapper.TryParse(status, out var parsed))
throw new ValidationException("지원하지 않는 문의 상태입니다.");
return InquiryStatusMapper.ToStorageValue(parsed);
}
}
public class ValidationException : Exception