feat: 서비스 삭제 API 구현 (#68)
All checks were successful
SPMS_API/pipeline/head This commit looks good

Reviewed-on: https://git.ipstein.myds.me/SPMS/SPMS_API/pulls/69
This commit is contained in:
김선규 2026-02-10 02:21:25 +00:00
commit cc10378efa
4 changed files with 55 additions and 0 deletions

View File

@ -57,6 +57,21 @@ public class ServiceController : ControllerBase
return Ok(ApiResponse<ServiceResponseDto>.Success(result)); return Ok(ApiResponse<ServiceResponseDto>.Success(result));
} }
[HttpPost("delete")]
[SwaggerOperation(
Summary = "서비스 삭제",
Description = "서비스를 Soft Delete 처리합니다. IsDeleted=true, 상태를 Suspended로 변경합니다.")]
[SwaggerResponse(200, "삭제 성공", typeof(ApiResponse))]
[SwaggerResponse(401, "인증되지 않은 요청")]
[SwaggerResponse(403, "권한 없음")]
[SwaggerResponse(404, "서비스를 찾을 수 없음")]
[SwaggerResponse(409, "이미 삭제된 서비스")]
public async Task<IActionResult> DeleteAsync([FromBody] DeleteServiceRequestDto request)
{
await _serviceManagementService.DeleteAsync(request);
return Ok(ApiResponse.Success());
}
[HttpPost("list")] [HttpPost("list")]
[SwaggerOperation( [SwaggerOperation(
Summary = "서비스 목록 조회", Summary = "서비스 목록 조회",

View File

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace SPMS.Application.DTOs.Service;
public class DeleteServiceRequestDto
{
[Required(ErrorMessage = "서비스 코드는 필수입니다.")]
[JsonPropertyName("service_code")]
public string ServiceCode { get; set; } = string.Empty;
}

View File

@ -8,6 +8,7 @@ public interface IServiceManagementService
Task<ServiceResponseDto> UpdateAsync(UpdateServiceRequestDto request); Task<ServiceResponseDto> UpdateAsync(UpdateServiceRequestDto request);
Task<ServiceListResponseDto> GetListAsync(ServiceListRequestDto request); Task<ServiceListResponseDto> GetListAsync(ServiceListRequestDto request);
Task<ServiceResponseDto> GetByServiceCodeAsync(string serviceCode); Task<ServiceResponseDto> GetByServiceCodeAsync(string serviceCode);
Task DeleteAsync(DeleteServiceRequestDto request);
Task<ServiceResponseDto> ChangeStatusAsync(string serviceCode, ChangeServiceStatusRequestDto request); Task<ServiceResponseDto> ChangeStatusAsync(string serviceCode, ChangeServiceStatusRequestDto request);
Task<ApiKeyRefreshResponseDto> RefreshApiKeyAsync(string serviceCode); Task<ApiKeyRefreshResponseDto> RefreshApiKeyAsync(string serviceCode);
Task RegisterApnsCredentialsAsync(string serviceCode, ApnsCredentialsRequestDto request); Task RegisterApnsCredentialsAsync(string serviceCode, ApnsCredentialsRequestDto request);

View File

@ -233,6 +233,34 @@ public class ServiceManagementService : IServiceManagementService
return MapToDto(serviceWithIps ?? service); return MapToDto(serviceWithIps ?? service);
} }
public async Task DeleteAsync(DeleteServiceRequestDto request)
{
var service = await _serviceRepository.GetByServiceCodeAsync(request.ServiceCode);
if (service is null)
{
throw new SpmsException(
ErrorCodes.NotFound,
"서비스를 찾을 수 없습니다.",
404);
}
if (service.IsDeleted)
{
throw new SpmsException(
ErrorCodes.Conflict,
"이미 삭제된 서비스입니다.",
409);
}
service.IsDeleted = true;
service.DeletedAt = DateTime.UtcNow;
service.Status = ServiceStatus.Suspended;
service.UpdatedAt = DateTime.UtcNow;
_serviceRepository.Update(service);
await _unitOfWork.SaveChangesAsync();
}
public async Task<ServiceResponseDto> ChangeStatusAsync(string serviceCode, ChangeServiceStatusRequestDto request) public async Task<ServiceResponseDto> ChangeStatusAsync(string serviceCode, ChangeServiceStatusRequestDto request)
{ {
var service = await _serviceRepository.GetByServiceCodeAsync(serviceCode); var service = await _serviceRepository.GetByServiceCodeAsync(serviceCode);