123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- using Aip.Service.Aip.Serivces;
- using Aip.Service.Models.Request;
- using Aip.Service.Models.Response;
- using Aip.Service.Repositories;
- using Aip.Service.Services.Interfaces;
- using Aip.Service.Utils;
- using AipGateway.Messaging.Models;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.InformationProtection;
- using Swashbuckle.AspNetCore.Annotations;
- using System;
- using System.ComponentModel.DataAnnotations;
- using System.Diagnostics;
- namespace Aip.Service.Controllers;
- [ApiController]
- [Route("/api/v1/file")]
- [Produces("application/json")]
- public class ApiFileController : BaseController
- {
- private readonly ILogger<ApiFileController> _log;
- private readonly IApiConfigService _configService;
- private readonly IApiAuthService _authService;
- private readonly IApiFileService _service;
- private readonly IAipDbLoggingService _aipDbLoggingService;
- public ApiFileController(ILogger<ApiFileController> log, IApiConfigService configService, IApiAuthService authService, IApiFileService apiFileService, IAipDbLoggingService aipDbLoggingService)
- {
- _log = log;
- _configService = configService;
- _authService = authService;
- _service = apiFileService;
- _aipDbLoggingService = aipDbLoggingService;
- }
- [HttpPost("info")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseInfo>))]
- public async Task<IResult> GetFileInfo([FromBody] RequestFileInfo req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_INFO, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_INFO);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.GetInfo(req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("set-label")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> SetFileLabel([FromBody] RequestFileSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABEL, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_LABEL);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.SetLabel(req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("set-labels")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<List<ResponseFile>>))]
- public async Task<IResult> SetFileLabels([FromBody] RequestMultiFileSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- var start = Stopwatch.GetTimestamp();
- _log.LogInformation("SetFileLabels Request Start: {0} EA.", req.files.Count);
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABELS, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_LABELS);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- DateTime dateTime = DateTime.Now;
- string? remoteIpAddr = HttpContext.Connection.RemoteIpAddress?.ToString();
- string guid = GlobalConstants.GetApiGuid(HttpContext);
- int jobs = req.files.Count;
- List<ResponseFile> result = new List<ResponseFile>();
- var tasks = new List<Task<ResponseFile>>();
- foreach (var obj in req.files)
- {
- RequestFileSet reqSet = new RequestFileSet
- {
- apiKey = req.apiKey,
- email = req.email,
- decryptKey = req.decryptKey,
- aipGuid = req.aipGuid,
- comment = req.comment,
- file = new RequestFile
- {
- dispFileName = obj.dispFileName,
- realFileName = obj.realFileName,
- }
- };
- tasks.Add(_service.SetLabel(reqSet));
- }
- await Task.WhenAll(tasks);
- foreach (var task in tasks)
- {
- result.Add(task.Result);
- _aipDbLoggingService.Send(new FileJobLog
- {
- FileId = guid,
- ApiGuid = guid,
- ApiId = GlobalConstants.API_FILE_SET_LABEL,
- ServerIpAddr = remoteIpAddr,
- JobResult = task.Result.errorCode,
- JobMessage = task.Result.errorMessage,
- FileName = task.Result.dispFileName,
- FileExt = Path.GetExtension(task.Result.dispFileName),
- FileOwner = task.Result.FileOwner,
- FileLabelGuid = task.Result.FileLabelGuid,
- FileProtectionGuid = task.Result.FileProtectionGuid,
- FileSize = task.Result.FileSize,
- NewFileName = task.Result.NewFileName,
- NewFileExt = Path.GetExtension(task.Result.NewFileName),
- NewFileOwner = task.Result.NewFileOwner,
- NewFileLabelGuid = task.Result.NewFileLabelGuid,
- NewFileProtectionGuid = task.Result.NewFileProtectionGuid,
- NewFileSize = task.Result.NewFileSize,
- JobOwner = req.email,
- ApiKey = req.apiKey,
- DecryptKey = req.decryptKey,
- JobTime = TimeUtils.GetElapsedMilliseconds(dateTime, task.Result.endDateTime),
- TimeStamp = task.Result.endDateTime
- });
- }
- HttpContext.Items[GlobalConstants.API_RESULT_CODE] = GlobalConstants.API_RESULT_SUCCESS_CODE;
- HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS;
- _log.LogInformation("SetFileLabels Request ..End: {0} EA. {1} ms.", req.files.Count, TimeUtils.GetElapsedMilliseconds(start));
- return Results.Ok(new ApiResponseModel<List<ResponseFile>>()
- {
- success = true,
- errorCode = 0,
- errorMessage = GlobalConstants.API_RESULT_SUCCESS,
- result = result,
- });
- });
- }
- [HttpPost("set-labels1")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<List<ResponseFile>>))]
- public async Task<IResult> SetFileLabels1([FromBody] RequestMultiFileSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABELS, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_LABELS);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- // 쓰레드를 모두 한번에 실행
- var result = await _service.SetLabels1(req);
- HttpContext.Items[GlobalConstants.API_RESULT_CODE] = GlobalConstants.API_RESULT_SUCCESS_CODE;
- HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS;
- return Results.Ok(new ApiResponseModel<List<ResponseFile>>()
- {
- success = true,
- errorCode = 0,
- errorMessage = GlobalConstants.API_RESULT_SUCCESS,
- result = result,
- });
- });
- }
- [HttpPost("set-labels2")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<List<ResponseFile>>))]
- public async Task<IResult> SetFileLabels2([FromBody] RequestMultiFileSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABELS, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_LABELS);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- // 스레드 그룹으로 나누어서
- var response = await _service.SetLabels(req);
- return Results.Ok(new ApiResponseModel<List<ResponseFile>>()
- {
- success = true,
- errorCode = 0,
- errorMessage = GlobalConstants.API_RESULT_SUCCESS,
- result = response,
- });
- });
- }
- [HttpPost("set-labels3")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<List<ResponseFile>>))]
- public async Task<IResult> SetFileLabels3([FromBody] RequestMultiFileSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABELS, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_LABELS);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- // 단일 쓰레드 방식
- var result = await _service.SetLabels3(req);
- HttpContext.Items[GlobalConstants.API_RESULT_CODE] = GlobalConstants.API_RESULT_SUCCESS_CODE;
- HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS;
- return Results.Ok(new ApiResponseModel<List<ResponseFile>>()
- {
- success = true,
- errorCode = 0,
- errorMessage = GlobalConstants.API_RESULT_SUCCESS,
- result = result,
- });
- });
- }
- [HttpPost("set-labels4")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<List<ResponseFile>>))]
- public async Task<IResult> SetFileLabels4([FromBody] RequestMultiFileSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABELS, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_LABELS);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- // 단일 쓰레드 방식
- var result = await _service.SetLabels4(req);
- HttpContext.Items[GlobalConstants.API_RESULT_CODE] = GlobalConstants.API_RESULT_SUCCESS_CODE;
- HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS;
- return Results.Ok(new ApiResponseModel<List<ResponseFile>>()
- {
- success = true,
- errorCode = 0,
- errorMessage = GlobalConstants.API_RESULT_SUCCESS,
- result = result,
- });
- });
- }
- [HttpPost("delete-label")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> DelFileLabel([FromBody] RequestFileDel req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_DELETE_LABEL, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_DELETE_LABEL);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.DelLabel(req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("delete-labels")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> DelFileLabels([FromBody] RequestMultiFileDel req)
- {
- return await CreateResponseAsync(async () =>
- {
- var start = Stopwatch.GetTimestamp();
- _log.LogInformation("DelFileLabels Request Start: {0} EA.", req.files.Count);
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_DELETE_LABELS, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_DELETE_LABELS);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- DateTime dateTime = DateTime.Now;
- string? remoteIpAddr = HttpContext.Connection.RemoteIpAddress?.ToString();
- string guid = GlobalConstants.GetApiGuid(HttpContext);
-
- int jobs = req.files.Count;
- List<ResponseFile> result = new List<ResponseFile>();
- var tasks = new List<Task<ResponseFile>>();
- foreach (var obj in req.files)
- {
- RequestFileDel reqSet = new RequestFileDel
- {
- apiKey = req.apiKey,
- email = req.email,
- decryptKey = req.decryptKey,
- comment = req.comment,
- file = new RequestFile
- {
- dispFileName = obj.dispFileName,
- realFileName = obj.realFileName,
- }
- };
- tasks.Add(_service.DelLabel(reqSet));
- }
- await Task.WhenAll(tasks);
- foreach (var task in tasks)
- {
- result.Add(task.Result);
- _aipDbLoggingService.Send(new FileJobLog
- {
- FileId = guid,
- ApiGuid = guid,
- ApiId = GlobalConstants.API_FILE_DELETE_LABEL,
- ServerIpAddr = remoteIpAddr,
- JobResult = task.Result.errorCode,
- JobMessage = task.Result.errorMessage,
- FileName = task.Result.dispFileName,
- FileExt = Path.GetExtension(task.Result.dispFileName),
- FileOwner = task.Result.FileOwner,
- FileLabelGuid = task.Result.FileLabelGuid,
- FileProtectionGuid = task.Result.FileProtectionGuid,
- FileSize = task.Result.FileSize,
- NewFileName = task.Result.NewFileName,
- NewFileExt = Path.GetExtension(task.Result.NewFileName),
- NewFileOwner = task.Result.NewFileOwner,
- NewFileLabelGuid = task.Result.NewFileLabelGuid,
- NewFileProtectionGuid = task.Result.NewFileProtectionGuid,
- NewFileSize = task.Result.NewFileSize,
- JobOwner = req.email,
- ApiKey = req.apiKey,
- DecryptKey = req.decryptKey,
- JobTime = TimeUtils.GetElapsedMilliseconds(dateTime, task.Result.endDateTime),
- TimeStamp = task.Result.endDateTime
- });
- }
- HttpContext.Items[GlobalConstants.API_RESULT_CODE] = GlobalConstants.API_RESULT_SUCCESS_CODE;
- HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS;
- _log.LogInformation("DelFileLabels Request ..End: {0} EA. {1} ms.", req.files.Count, TimeUtils.GetElapsedMilliseconds(start));
- return Results.Ok(new ApiResponseModel<List<ResponseFile>>()
- {
- success = true,
- errorCode = 0,
- errorMessage = GlobalConstants.API_RESULT_SUCCESS,
- result = result,
- });
- });
- }
- [HttpPost("set-protection")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> SetFileProtection([FromBody] RequestFileSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_PROTECTION, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_PROTECTION);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.SetProtection(req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("delete-protection")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> DelFileProtection([FromBody] RequestFileDel req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_DELETE_PROTECTIN, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_DELETE_PROTECTIN);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.RemoveProtection(req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("set-label-protection")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> SetFileLabelProtection([FromBody] RequestFileAllSet req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABEL_PROTECTION, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_SET_LABEL_PROTECTION);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.SetLabelProtection(req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("delete-label-protection")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> DelFileLabelProtection([FromBody] RequestFileDel req)
- {
- return await CreateResponseAsync(async () =>
- {
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_DELETE_LABEL_PROTECTION, req.apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_DELETE_LABEL_PROTECTION);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.RemoveLabelProtection(req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("encrypt")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> EncryptFile([Required] IFormFile file, [Required] string apiKey, [Required] string email)
- {
- return await CreateResponseAsync(async () =>
- {
- RequestBase req = new RequestBase
- {
- apiKey = apiKey,
- email = email,
- decryptKey = string.Empty,
- apiGuid = string.Empty
- };
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_ENCRYPT, apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_ENCRYPT);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.EncryptFile(file, req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- [HttpPost("decrypt")]
- [SwaggerResponse(200, type: typeof(ApiResponseModel<ResponseFile>))]
- public async Task<IResult> DecryptFile([Required] IFormFile file, [Required] string apiKey, [Required] string email)
- {
- return await CreateResponseAsync(async () =>
- {
- RequestBase req = new RequestBase
- {
- apiKey = apiKey,
- email = email,
- decryptKey = string.Empty,
- apiGuid = string.Empty
- };
- GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_DECRYPT, apiKey, req);
- HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req;
- int authError = _authService.CheckApiKeyValidation(HttpContext, req.apiKey, GlobalConstants.API_FILE_DECRYPT);
- if (authError != 0)
- {
- throw ResponseApiKeyValidationError(HttpContext, authError);
- }
- var response = await _service.DecryptFile(file, req);
- return Results.Ok(ResponseSuccess(HttpContext, response));
- });
- }
- }
|