diff --git a/TaxBaik.Application.Tests/InquiryServiceTests.cs b/TaxBaik.Application.Tests/InquiryServiceTests.cs index b1875e6..9b1efc8 100644 --- a/TaxBaik.Application.Tests/InquiryServiceTests.cs +++ b/TaxBaik.Application.Tests/InquiryServiceTests.cs @@ -62,7 +62,7 @@ public class InquiryServiceTests public Task NotifyCreatedAsync(int inquiryId, string name, string phone, string serviceType, string message, string? ipAddress, DateTime createdAtUtc, CancellationToken ct = default) => Task.CompletedTask; - public Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, CancellationToken ct = default) + public Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, string? changedBy = null, CancellationToken ct = default) => Task.CompletedTask; } } diff --git a/TaxBaik.Application/Services/IInquiryNotificationService.cs b/TaxBaik.Application/Services/IInquiryNotificationService.cs index c55ffb7..eccd9a9 100644 --- a/TaxBaik.Application/Services/IInquiryNotificationService.cs +++ b/TaxBaik.Application/Services/IInquiryNotificationService.cs @@ -3,5 +3,5 @@ namespace TaxBaik.Application.Services; public interface IInquiryNotificationService { Task NotifyCreatedAsync(int inquiryId, string name, string phone, string serviceType, string message, string? ipAddress, DateTime createdAtUtc, CancellationToken ct = default); - Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, CancellationToken ct = default); + Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, string? changedBy = null, CancellationToken ct = default); } diff --git a/TaxBaik.Application/Services/InquiryService.cs b/TaxBaik.Application/Services/InquiryService.cs index b1566a4..930952e 100644 --- a/TaxBaik.Application/Services/InquiryService.cs +++ b/TaxBaik.Application/Services/InquiryService.cs @@ -46,7 +46,7 @@ public class InquiryService(IInquiryRepository repository, IInquiryNotificationS int page, int pageSize, string? status = null, CancellationToken ct = default) => await repository.GetPagedAsync(NormalizePage(page), NormalizePageSize(pageSize), NormalizeOptionalStatus(status), ct); - public async Task UpdateStatusAsync(int id, string status, CancellationToken ct = default) + public async Task UpdateStatusAsync(int id, string status, string? changedBy = null, CancellationToken ct = default) { if (!InquiryStatusMapper.TryParse(status, out var parsed)) throw new ValidationException("지원하지 않는 문의 상태입니다."); @@ -59,7 +59,7 @@ public class InquiryService(IInquiryRepository repository, IInquiryNotificationS var newStatus = InquiryStatusMapper.ToStorageValue(parsed); await repository.UpdateStatusAsync(id, newStatus, ct); - await notificationService.NotifyStatusChangedAsync(id, inquiry.Name, inquiry.Phone, inquiry.ServiceType, previousStatus, newStatus, ct); + await notificationService.NotifyStatusChangedAsync(id, inquiry.Name, inquiry.Phone, inquiry.ServiceType, previousStatus, newStatus, changedBy, ct); } private static int NormalizePage(int page) => Math.Max(1, page); diff --git a/TaxBaik.Application/Services/NoopInquiryNotificationService.cs b/TaxBaik.Application/Services/NoopInquiryNotificationService.cs index 37e4765..f9af415 100644 --- a/TaxBaik.Application/Services/NoopInquiryNotificationService.cs +++ b/TaxBaik.Application/Services/NoopInquiryNotificationService.cs @@ -5,6 +5,6 @@ public sealed class NoopInquiryNotificationService : IInquiryNotificationService public Task NotifyCreatedAsync(int inquiryId, string name, string phone, string serviceType, string message, string? ipAddress, DateTime createdAtUtc, CancellationToken ct = default) => Task.CompletedTask; - public Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, CancellationToken ct = default) + public Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, string? changedBy = null, CancellationToken ct = default) => Task.CompletedTask; } diff --git a/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryDetail.razor b/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryDetail.razor index 2cffeca..16e9339 100644 --- a/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryDetail.razor +++ b/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryDetail.razor @@ -85,7 +85,7 @@ else try { - await InquiryService.UpdateStatusAsync(inquiry.Id, status); + await InquiryService.UpdateStatusAsync(inquiry.Id, status, "관리자"); inquiry.Status = status; Snackbar.Add("상태가 변경되었습니다.", Severity.Success); } diff --git a/TaxBaik.Web/Controllers/InquiryController.cs b/TaxBaik.Web/Controllers/InquiryController.cs index 3283066..4ed1b03 100644 --- a/TaxBaik.Web/Controllers/InquiryController.cs +++ b/TaxBaik.Web/Controllers/InquiryController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System.Security.Claims; using TaxBaik.Application.Services; namespace TaxBaik.Web.Controllers; @@ -66,7 +67,8 @@ public class InquiryController : ControllerBase try { - await _inquiryService.UpdateStatusAsync(id, request.Status); + var changedBy = User.FindFirstValue(ClaimTypes.Name) ?? User.Identity?.Name; + await _inquiryService.UpdateStatusAsync(id, request.Status, changedBy); return Ok(new { message = "상태가 변경되었습니다." }); } catch (ValidationException ex) diff --git a/TaxBaik.Web/Services/TelegramInquiryNotificationService.cs b/TaxBaik.Web/Services/TelegramInquiryNotificationService.cs index 54245ac..072563f 100644 --- a/TaxBaik.Web/Services/TelegramInquiryNotificationService.cs +++ b/TaxBaik.Web/Services/TelegramInquiryNotificationService.cs @@ -66,7 +66,7 @@ public class TelegramInquiryNotificationService : IInquiryNotificationService } } - public async Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, CancellationToken ct = default) + public async Task NotifyStatusChangedAsync(int inquiryId, string name, string phone, string serviceType, string previousStatus, string newStatus, string? changedBy = null, CancellationToken ct = default) { var botToken = _configuration["Telegram:BotToken"]; var chatId = _configuration["Telegram:ChatId"]; @@ -82,6 +82,7 @@ public class TelegramInquiryNotificationService : IInquiryNotificationService .AppendLine($"이름: {name}") .AppendLine($"연락처: {phone}") .AppendLine($"상태: {FormatStatus(previousStatus)} -> {FormatStatus(newStatus)}") + .AppendLine($"변경자: {(string.IsNullOrWhiteSpace(changedBy) ? "-" : changedBy)}") .AppendLine() .AppendLine($"답변 목록 링크: {adminLink}") .ToString();