improvement: 관리자 기기 삭제/차단 API 추가 (#239)

- IDeviceService: AdminDeleteAsync(long deviceId) 추가
- DeviceService: Device 조회 → IsActive=false → 토큰 캐시 무효화
- DeviceController: POST /v1/in/device/admin/delete [Authorize] 엔드포인트 추가
- 기존 SDK 삭제 API와 분리, JWT 인증 기반 관리자 전용

Closes #239
This commit is contained in:
SEAN 2026-02-25 17:06:11 +09:00
parent d98f8c89a4
commit 48049bba9e
3 changed files with 23 additions and 0 deletions

View File

@ -73,6 +73,15 @@ public class DeviceController : ControllerBase
return Ok(ApiResponse.Success());
}
[HttpPost("admin/delete")]
[Authorize]
[SwaggerOperation(Summary = "관리자 기기 삭제", Description = "관리자가 기기를 삭제(비활성화)합니다. 삭제 즉시 발송이 차단됩니다. JWT 인증 필요.")]
public async Task<IActionResult> AdminDeleteAsync([FromBody] DeviceDeleteRequestDto request)
{
await _deviceService.AdminDeleteAsync(request.DeviceId);
return Ok(ApiResponse.Success());
}
[HttpPost("list")]
[Authorize]
[SwaggerOperation(Summary = "디바이스 목록", Description = "대시보드에서 디바이스 목록을 조회합니다. JWT 인증 필요.")]

View File

@ -8,6 +8,7 @@ public interface IDeviceService
Task<DeviceInfoResponseDto> GetInfoAsync(long serviceId, DeviceInfoRequestDto request);
Task UpdateAsync(long serviceId, DeviceUpdateRequestDto request);
Task DeleteAsync(long serviceId, DeviceDeleteRequestDto request);
Task AdminDeleteAsync(long deviceId);
Task<DeviceListResponseDto> GetListAsync(long? serviceId, DeviceListRequestDto request);
Task SetTagsAsync(long serviceId, DeviceTagsRequestDto request);
Task SetAgreeAsync(long serviceId, DeviceAgreeRequestDto request);

View File

@ -119,6 +119,19 @@ public class DeviceService : IDeviceService
await _tokenCache.InvalidateAsync(serviceId, device.Id);
}
public async Task AdminDeleteAsync(long deviceId)
{
var device = await _deviceRepository.GetByIdAsync(deviceId);
if (device == null)
throw new SpmsException(ErrorCodes.DeviceNotFound, "존재하지 않는 디바이스입니다.", 404);
device.IsActive = false;
device.UpdatedAt = DateTime.UtcNow;
_deviceRepository.Update(device);
await _unitOfWork.SaveChangesAsync();
await _tokenCache.InvalidateAsync(device.ServiceId, device.Id);
}
public async Task<DeviceListResponseDto> GetListAsync(long? serviceId, DeviceListRequestDto request)
{
Platform? platform = null;