106 lines
4.0 KiB
C#
106 lines
4.0 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Swashbuckle.AspNetCore.Annotations;
|
|
using SPMS.Application.DTOs.File;
|
|
using SPMS.Application.Interfaces;
|
|
using SPMS.Domain.Common;
|
|
using SPMS.Domain.Exceptions;
|
|
|
|
namespace SPMS.API.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("v1/in/file")]
|
|
[Authorize]
|
|
[ApiExplorerSettings(GroupName = "file")]
|
|
public class FileController : ControllerBase
|
|
{
|
|
private readonly IFileService _fileService;
|
|
|
|
public FileController(IFileService fileService)
|
|
{
|
|
_fileService = fileService;
|
|
}
|
|
|
|
[HttpPost("upload")]
|
|
[SwaggerOperation(Summary = "파일 업로드", Description = "이미지 또는 CSV 파일을 업로드합니다.")]
|
|
[RequestSizeLimit(52_428_800)] // 50MB
|
|
public async Task<IActionResult> UploadAsync(IFormFile file, [FromForm] string file_type)
|
|
{
|
|
var serviceId = GetServiceId();
|
|
var adminId = GetAdminId();
|
|
|
|
using var stream = file.OpenReadStream();
|
|
var result = await _fileService.UploadAsync(
|
|
serviceId, adminId, stream, file.FileName, file.Length, file_type);
|
|
|
|
return Ok(ApiResponse<FileUploadResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("info")]
|
|
[SwaggerOperation(Summary = "파일 조회", Description = "파일 메타데이터를 조회합니다.")]
|
|
public async Task<IActionResult> GetInfoAsync([FromBody] FileInfoRequestDto request)
|
|
{
|
|
var serviceId = GetServiceId();
|
|
var result = await _fileService.GetInfoAsync(serviceId, request.FileId);
|
|
return Ok(ApiResponse<FileInfoResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("list")]
|
|
[SwaggerOperation(Summary = "파일 목록 조회", Description = "서비스의 파일 목록을 페이징 조회합니다.")]
|
|
public async Task<IActionResult> GetListAsync([FromBody] FileListRequestDto request)
|
|
{
|
|
var serviceId = GetServiceId();
|
|
var result = await _fileService.GetListAsync(serviceId, request);
|
|
return Ok(ApiResponse<FileListResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("delete")]
|
|
[SwaggerOperation(Summary = "파일 삭제", Description = "파일을 삭제합니다. (Soft Delete)")]
|
|
public async Task<IActionResult> DeleteAsync([FromBody] FileDeleteRequestDto request)
|
|
{
|
|
var serviceId = GetServiceId();
|
|
await _fileService.DeleteAsync(serviceId, request.FileId);
|
|
return Ok(ApiResponse.Success());
|
|
}
|
|
|
|
[HttpPost("csv/validate")]
|
|
[SwaggerOperation(Summary = "CSV 검증", Description = "대용량 발송용 CSV 파일을 검증합니다.")]
|
|
[RequestSizeLimit(52_428_800)] // 50MB
|
|
public async Task<IActionResult> ValidateCsvAsync(IFormFile file, [FromForm] string message_code)
|
|
{
|
|
var serviceId = GetServiceId();
|
|
|
|
using var stream = file.OpenReadStream();
|
|
var result = await _fileService.ValidateCsvAsync(serviceId, stream, file.FileName, message_code);
|
|
|
|
return Ok(ApiResponse<CsvValidateResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("csv/template")]
|
|
[SwaggerOperation(Summary = "CSV 템플릿 다운로드", Description = "메시지별 CSV 템플릿을 다운로드합니다.")]
|
|
public async Task<IActionResult> GetCsvTemplateAsync([FromBody] CsvTemplateRequestDto request)
|
|
{
|
|
var serviceId = GetServiceId();
|
|
var csvBytes = await _fileService.GetCsvTemplateAsync(serviceId, request.MessageCode);
|
|
|
|
return File(csvBytes, "text/csv", $"template_{request.MessageCode}.csv");
|
|
}
|
|
|
|
private long GetServiceId()
|
|
{
|
|
if (HttpContext.Items.TryGetValue("ServiceId", out var serviceIdObj) && serviceIdObj is long serviceId)
|
|
return serviceId;
|
|
|
|
throw new SpmsException(ErrorCodes.BadRequest, "서비스 식별 정보가 없습니다.", 400);
|
|
}
|
|
|
|
private long GetAdminId()
|
|
{
|
|
var adminIdClaim = User.FindFirst("adminId")?.Value;
|
|
if (string.IsNullOrEmpty(adminIdClaim) || !long.TryParse(adminIdClaim, out var adminId))
|
|
throw new SpmsException(ErrorCodes.Unauthorized, "인증 정보가 올바르지 않습니다.", 401);
|
|
|
|
return adminId;
|
|
}
|
|
}
|