package com.aip.gateway.api.controller; import com.aip.gateway.api.model.request.*; import com.aip.gateway.api.model.response.ApiResponseModel; import com.aip.gateway.api.repository.AppRepository; import com.aip.gateway.api.repository.GlobalConstants; import com.aip.gateway.api.service.IApiFileService; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @Slf4j @Tag(name = "03.ApiFile", description = "FILE AIP API") @RestController @RequiredArgsConstructor @CrossOrigin @Validated @RequestMapping(GlobalConstants.API_FILE) public class ApiFileController extends BaseController { private final AppRepository appRepo; private final IApiFileService service; @Operation(summary = "01.File Info", description = "AIP File Information Query.") @ApiResponse(responseCode = "200", description = "AIP File Information query Success.") @ApiOperation(value = "File Info", response = ApiResponseModel.class) @PostMapping(value = "info", produces = {"application/json; charset=utf8"}) public ResponseEntity getFileInfo( @Parameter(name = "req", description = "File 정보 요청 데이터", required = true) @RequestBody @Valid final RequestFile req, HttpServletRequest request) { try { GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_INFO, req.getApiKey(), req); int authError = this.appRepo.checkApiKeyValidation(req.getApiKey(), getRemoteIP(request), GlobalConstants.API_FILE_INFO); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.getInfo(req)); } catch (Exception e) { log.error("exception: {}/info, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } @Operation(summary = "02.File AIP Label 설정", description = "File AIP Label Set.") @ApiResponse(responseCode = "200", description = "File AIP Label set success.") @ApiOperation(value = "File AIP Label 설정", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "set-label", produces = {"application/json; charset=utf8"}) public ResponseEntity setLabel( @Parameter(name = "req", description = "File AIP Label 설정 요청 데이터", required = true) @RequestBody @Valid final RequestFileSet req, HttpServletRequest request) { try { GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_SET_LABEL, req.getApiKey(), req); int authError = this.appRepo.checkApiKeyValidation(req.getApiKey(), getRemoteIP(request), GlobalConstants.API_FILE_SET_LABEL); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.setLabel(req)); } catch (Exception e) { log.error("exception: {}/set-label, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } @Operation(summary = "03.File AIP Label Delete", description = "File AIP Label Delete.") @ApiResponse(responseCode = "200", description = "File AIP Label delete success.") @ApiOperation(value = "File AIP Label 해제", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "delete-label", produces = {"application/json; charset=utf8"}) public ResponseEntity delLabel( @Parameter(name = "req", description = "File AIP Label 해제 요청 데이터", required = true) @RequestBody @Valid final RequestFileDel req, HttpServletRequest request) { try { GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_DELETE_LABEL, req.getApiKey(), req); int authError = this.appRepo.checkApiKeyValidation(req.getApiKey(), getRemoteIP(request), GlobalConstants.API_FILE_DELETE_LABEL); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.delLabel(req)); } catch (Exception e) { log.error("exception: {}/delete-label, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } @Operation(summary = "04.File AIP Protection 설정", description = "File AIP Protection AIP.") @ApiResponse(responseCode = "200", description = "File AIP Protection set success.") @ApiOperation(value = "File AIP Protection 설정", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "set-protection", produces = {"application/json; charset=utf8"}) public ResponseEntity setProtection( @Parameter(name = "req", description = "File AIP Protection 설정 요청 데이터", required = true) @RequestBody @Valid final RequestFileSet req, HttpServletRequest request) { try { GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_SET_PROTECTION, req.getApiKey(), req); int authError = this.appRepo.checkApiKeyValidation(req.getApiKey(), getRemoteIP(request), GlobalConstants.API_FILE_SET_PROTECTION); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.setProtection(req)); } catch (Exception e) { log.error("exception: {}/set-protection, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } @Operation(summary = "05.File AIP Protection Delete", description = "File AIP Protection Delete.") @ApiResponse(responseCode = "200", description = "File AIP Protection delete success.") @ApiOperation(value = "File AIP Protection 해제", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "delete-protection", produces = {"application/json; charset=utf8"}) public ResponseEntity delProtection( @Parameter(name = "req", description = "File AIP Protection 해제 요청 데이터", required = true) @RequestBody @Valid final RequestFileDel req, HttpServletRequest request) { try { GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_DELETE_PROTECTIN, req.getApiKey(), req); int authError = this.appRepo.checkApiKeyValidation(req.getApiKey(), getRemoteIP(request), GlobalConstants.API_FILE_DELETE_PROTECTIN); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.delProtection(req)); } catch (Exception e) { log.error("exception: {}/delete-protection, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } @Operation(summary = "06.File AIP Label Or Protection 설정", description = "File AIP Label Or Protection AIP.") @ApiResponse(responseCode = "200", description = "File AIP Label Or Protection set success.") @ApiOperation(value = "File AIP Label Or Protection 설정", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "set-label-protection", produces = {"application/json; charset=utf8"}) public ResponseEntity setLabelProtection( @Parameter(name = "req", description = "File AIP Label Or Protection 설정 요청 데이터", required = true) @RequestBody @Valid final RequestFileAllSet req, HttpServletRequest request) { try { GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_SET_LABEL_PROTECTION, req.getApiKey(), req); int authError = this.appRepo.checkApiKeyValidation(req.getApiKey(), getRemoteIP(request), GlobalConstants.API_FILE_SET_LABEL_PROTECTION); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.setLabelProtection(req)); } catch (Exception e) { log.error("exception: {}/set-label-protection, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } @Operation(summary = "07.File AIP Label Or Protection Delete", description = "File AIP Label Or Protection Delete.") @ApiResponse(responseCode = "200", description = "File AIP Label Or Protection delete success.") @ApiOperation(value = "File AIP Label Or Protection 해제", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "delete-label-protection", produces = {"application/json; charset=utf8"}) public ResponseEntity delLabelProtection( @Parameter(name = "req", description = "File AIP Label Or Protection 해제 요청 데이터", required = true) @RequestBody @Valid final RequestFileDel req, HttpServletRequest request) { try { GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_DELETE_LABEL_PROTECTION, req.getApiKey(), req); int authError = this.appRepo.checkApiKeyValidation(req.getApiKey(), getRemoteIP(request), GlobalConstants.API_FILE_DELETE_LABEL_PROTECTION); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.delLabelProtection(req)); } catch (Exception e) { log.error("exception: {}/delete-label-protection, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } // https://www.callicoder.com/spring-boot-file-upload-download-rest-api-example/ @Operation(summary = "08.Encrypt File", description = "Encrypt File.") @ApiResponse(responseCode = "200", description = "Encrypt File set success.") @ApiOperation(value = "Encrypt File", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "encrypt", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity encryptFile( @Parameter(description = "multipart/form-data 형식의 파일을 input 으로 받습니다. 이때 key 값은 multipartFile 입니다.") @RequestParam("file") MultipartFile file, @RequestParam("apiKey") String apiKey, @RequestParam("email") String email, HttpServletRequest request) { try { RequestBase baseReq = RequestBase.builder() .apiKey(apiKey) .decryptKey("") .email(email) .apiGuid("") .build(); GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_ENCRYPT, apiKey, baseReq); int authError = this.appRepo.checkApiKeyValidation(apiKey, getRemoteIP(request), GlobalConstants.API_FILE_ENCRYPT); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.encryptFile(file, baseReq)); } catch (Exception e) { log.error("exception: {}/encrypt, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } @Operation(summary = "09.Decrypt File", description = "Decrypt File.") @ApiResponse(responseCode = "200", description = "Decrypt File set success.") @ApiOperation(value = "Decrypt File", response = ApiResponseModel.class, responseContainer = "ArrayList") @PostMapping(value = "decrypt", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity decryptFile( @Parameter(description = "multipart/form-data 형식의 파일을 input 으로 받습니다. 이때 key 값은 multipartFile 입니다.") @RequestParam("file") MultipartFile file, @RequestParam("apiKey") String apiKey, @RequestParam("email") String email, HttpServletRequest request) { try { RequestBase baseReq = RequestBase.builder() .apiKey(apiKey) .decryptKey("") .email(email) .apiGuid("") .build(); GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_DECRYPT, apiKey, baseReq); int authError = this.appRepo.checkApiKeyValidation(apiKey, getRemoteIP(request), GlobalConstants.API_FILE_DECRYPT); if (authError != 0) { return responseApiKeyValidationError(request, authError); } return responseSuccess(request, this.service.decryptFile(file, baseReq)); } catch (Exception e) { log.error("exception: {}/decrypt, {}", GlobalConstants.API_FILE, e.getMessage()); return responseException(request, e); } } }