diff --git a/src/TaxBaik.Web/Controllers/ClientController.cs b/src/TaxBaik.Web/Controllers/ClientController.cs.bak similarity index 100% rename from src/TaxBaik.Web/Controllers/ClientController.cs rename to src/TaxBaik.Web/Controllers/ClientController.cs.bak diff --git a/src/TaxBaik.Web/Endpoints/Client/ClientDtos.cs b/src/TaxBaik.Web/Endpoints/Client/ClientDtos.cs new file mode 100644 index 0000000..674d7ab --- /dev/null +++ b/src/TaxBaik.Web/Endpoints/Client/ClientDtos.cs @@ -0,0 +1,22 @@ +namespace TaxBaik.Web.Endpoints.Client; + +public class ClientQuery +{ + public int Page { get; set; } = 1; + public int PageSize { get; set; } = 20; + public string? Status { get; set; } + public string? Search { get; set; } +} + +public class ClientPagedResponse +{ + public List Data { get; set; } = []; + public int Total { get; set; } + public int Page { get; set; } + public int PageSize { get; set; } +} + +public class MessageResponse +{ + public string Message { get; set; } = string.Empty; +} diff --git a/src/TaxBaik.Web/Endpoints/Client/CreateEndpoint.cs b/src/TaxBaik.Web/Endpoints/Client/CreateEndpoint.cs new file mode 100644 index 0000000..871f4e5 --- /dev/null +++ b/src/TaxBaik.Web/Endpoints/Client/CreateEndpoint.cs @@ -0,0 +1,35 @@ +using FastEndpoints; +using TaxBaik.Application.DTOs; +using TaxBaik.Application.Services; + +namespace TaxBaik.Web.Endpoints.Client; + +public class CreateEndpoint : Endpoint +{ + private readonly ClientService _clientService; + + public CreateEndpoint(ClientService clientService) + { + _clientService = clientService; + } + + public override void Configure() + { + Post("/api/client"); + Policies("Bearer"); + } + + public override async Task HandleAsync(CreateClientDto request, CancellationToken ct) + { + try + { + var clientId = await _clientService.CreateAsync(request); + var client = await _clientService.GetByIdAsync(clientId) ?? request; + await SendAsync(client, 201, cancellation: ct); + } + catch (ValidationException ex) + { + ThrowError(ex.Message); + } + } +} diff --git a/src/TaxBaik.Web/Endpoints/Client/DeleteEndpoint.cs b/src/TaxBaik.Web/Endpoints/Client/DeleteEndpoint.cs new file mode 100644 index 0000000..40aebba --- /dev/null +++ b/src/TaxBaik.Web/Endpoints/Client/DeleteEndpoint.cs @@ -0,0 +1,27 @@ +using FastEndpoints; +using TaxBaik.Application.Services; + +namespace TaxBaik.Web.Endpoints.Client; + +public class DeleteEndpoint : Endpoint +{ + private readonly ClientService _clientService; + + public DeleteEndpoint(ClientService clientService) + { + _clientService = clientService; + } + + public override void Configure() + { + Delete("/api/client/{id}"); + Policies("Bearer"); + } + + public override async Task HandleAsync(EmptyRequest _, CancellationToken ct) + { + var id = Route("id"); + await _clientService.DeleteAsync(id); + await SendAsync(new EmptyResponse(), 204, cancellation: ct); + } +} diff --git a/src/TaxBaik.Web/Endpoints/Client/GetByIdEndpoint.cs b/src/TaxBaik.Web/Endpoints/Client/GetByIdEndpoint.cs new file mode 100644 index 0000000..8a46c76 --- /dev/null +++ b/src/TaxBaik.Web/Endpoints/Client/GetByIdEndpoint.cs @@ -0,0 +1,32 @@ +using FastEndpoints; +using TaxBaik.Application.Services; + +namespace TaxBaik.Web.Endpoints.Client; + +public class GetByIdEndpoint : Endpoint +{ + private readonly ClientService _clientService; + + public GetByIdEndpoint(ClientService clientService) + { + _clientService = clientService; + } + + public override void Configure() + { + Get("/api/client/{id}"); + Policies("Bearer"); + } + + public override async Task HandleAsync(EmptyRequest _, CancellationToken ct) + { + var id = Route("id"); + var client = await _clientService.GetByIdAsync(id); + if (client == null) + { + ThrowError("고객을 찾을 수 없습니다.", statusCode: 404); + } + + await SendAsync(client, 200, cancellation: ct); + } +} diff --git a/src/TaxBaik.Web/Endpoints/Client/GetPagedEndpoint.cs b/src/TaxBaik.Web/Endpoints/Client/GetPagedEndpoint.cs new file mode 100644 index 0000000..f47cf4b --- /dev/null +++ b/src/TaxBaik.Web/Endpoints/Client/GetPagedEndpoint.cs @@ -0,0 +1,32 @@ +using FastEndpoints; +using TaxBaik.Application.Services; + +namespace TaxBaik.Web.Endpoints.Client; + +public class GetPagedEndpoint : Endpoint +{ + private readonly ClientService _clientService; + + public GetPagedEndpoint(ClientService clientService) + { + _clientService = clientService; + } + + public override void Configure() + { + Get("/api/client"); + Policies("Bearer"); + } + + public override async Task HandleAsync(ClientQuery request, CancellationToken ct) + { + var (clients, total) = await _clientService.GetPagedAsync(request.Page, request.PageSize, request.Status, request.Search); + await SendAsync(new ClientPagedResponse + { + Data = clients.Cast().ToList(), + Total = total, + Page = request.Page, + PageSize = request.PageSize + }, 200, cancellation: ct); + } +} diff --git a/src/TaxBaik.Web/Endpoints/Client/UpdateEndpoint.cs b/src/TaxBaik.Web/Endpoints/Client/UpdateEndpoint.cs new file mode 100644 index 0000000..cf8bf3c --- /dev/null +++ b/src/TaxBaik.Web/Endpoints/Client/UpdateEndpoint.cs @@ -0,0 +1,41 @@ +using FastEndpoints; +using TaxBaik.Application.DTOs; +using TaxBaik.Application.Services; + +namespace TaxBaik.Web.Endpoints.Client; + +public class UpdateEndpoint : Endpoint +{ + private readonly ClientService _clientService; + + public UpdateEndpoint(ClientService clientService) + { + _clientService = clientService; + } + + public override void Configure() + { + Put("/api/client/{id}"); + Policies("Bearer"); + } + + public override async Task HandleAsync(CreateClientDto request, CancellationToken ct) + { + var id = Route("id"); + try + { + await _clientService.UpdateAsync(id, request); + var client = await _clientService.GetByIdAsync(id); + if (client == null) + { + ThrowError("고객을 찾을 수 없습니다.", statusCode: 404); + } + + await SendAsync(client, 200, cancellation: ct); + } + catch (ValidationException ex) + { + ThrowError(ex.Message); + } + } +}