using AipGateway.API.Application; using AipGateway.API.Application.Interfaces.Services; using AipGateway.API.Domain.Models.Request; using AipGateway.API.Domain.Models.Response; using Azure; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using System.ComponentModel.DataAnnotations; using System.Diagnostics; namespace AipGateway.AIP.Service.Controllers { [ApiController] [Route("/api/v1/file")] [Produces("application/json")] public class ApiFileController : BaseController { private readonly ILogger _log; private readonly IApiFileService _service; public ApiFileController(ILogger log, IApiFileService apiFileService) { _log = log; _service = apiFileService; } [HttpPost("info")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.GetInfo(req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("set-label")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task SetFileLabel([FromBody] RequestFileSet req) { _log.LogError("Request: [{0}], {1}", HttpContext.Request.Headers.Date, JsonConvert.SerializeObject(req)); return await CreateResponseAsync(async () => { GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_SET_LABEL, req.apiKey, req); HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req; var response = await _service.SetLabel(req); _log.LogError("Response: {0}", JsonConvert.SerializeObject(response)); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("set-labels")] [SwaggerResponse(200, type: typeof(ApiResponseModel>))] public async Task SetFileLabels([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 jobs = req.files.Count; List result = new List(); var tasks = new List>(); 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); } HttpContext.Items[GlobalConstants.API_RESULT_CODE] = 0; HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS; return Results.Ok(new ApiResponseModel>() { success = true, errorCode = 0, errorMessage = GlobalConstants.API_RESULT_SUCCESS, result = result, }); }); } [HttpPost("delete-label")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.DelLabel(req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("delete-labels")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task DelFileLabels([FromBody] RequestMultiFileDel req) { return await CreateResponseAsync(async () => { Stopwatch sw = new Stopwatch(); sw.Start(); _log.LogInformation("*** Start DelFileLabels: {0} EA.", req.files.Count); GlobalConstants.SetAuthorization(HttpContext, GlobalConstants.API_FILE_DELETE_LABELS, req.apiKey, req); HttpContext.Items[GlobalConstants.API_REQUEST] = (RequestBase)req; int ii = 0; int jobs = req.files.Count; List result = new List(); var tasks = new Task[jobs]; 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[ii++] = _service.DelLabel(reqSet); } await Task.WhenAll(tasks); foreach (var task in tasks) { result.Add(task.Result); } HttpContext.Items[GlobalConstants.API_RESULT_CODE] = 0; HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS; sw.Stop(); _log.LogInformation("*** ...End SetFileLabels: {0} EA. {1,6} ms.", req.files.Count, sw.ElapsedMilliseconds.ToString("#,##0")); return Results.Ok(new ApiResponseModel>() { success = true, errorCode = 0, errorMessage = GlobalConstants.API_RESULT_SUCCESS, result = result, }); }); } [HttpPost("set-protection")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.SetProtection(req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("delete-protection")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.DelProtection(req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("set-label-protection")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.SetLabelProtection(req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("delete-label-protection")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.DelLabelProtection(req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("encrypt")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.EncryptFile(file, req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } [HttpPost("decrypt")] [SwaggerResponse(200, type: typeof(ApiResponseModel))] public async Task 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; var response = await _service.DecryptFile(file, req); return Results.Ok(ResponseSuccess(HttpContext, response)); }); } } }