diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/FileStorageController.java b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/FileStorageController.java index e3ebca36f..89de65d88 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/FileStorageController.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/FileStorageController.java @@ -15,6 +15,10 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.rmi.ServerException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.List; // TODO: Get should be viewed by both attestor and reviewer @@ -24,7 +28,6 @@ public class FileStorageController { private static final Logger logger = LoggerFactory.getLogger(FileStorageController.class); private final FileStorageService fileStorageService; private final RegistryHelper registryHelper; - FileStorageController(FileStorageService fileStorageService, RegistryHelper registryHelper) { this.fileStorageService = fileStorageService; this.registryHelper = registryHelper; @@ -62,6 +65,23 @@ public ResponseEntity deleteMultipleFiles(@PathVariable Strin return new ResponseEntity<>(documentsResponse, HttpStatus.OK); } + @PutMapping("/api/v1/{entityName}/{entityId}/{property}/documents/{documentId}") + public ResponseEntity update(@RequestParam MultipartFile[] files, + @PathVariable String entityName, + @PathVariable String entityId, + @PathVariable String documentId, + @PathVariable String property, + HttpServletRequest httpServletRequest) { + try { + registryHelper.authorize(entityName, entityId, httpServletRequest); + } catch (Exception e) { + logger.error("An error occurred during authorization: {}", ExceptionUtils.getStackTrace(e)); + return new ResponseEntity<>(HttpStatus.FORBIDDEN); + } + DocumentsResponse documentsResponse = fileStorageService.updateFiles(files, httpServletRequest.getRequestURI()); + return new ResponseEntity<>(documentsResponse, HttpStatus.OK); + } + @DeleteMapping(value = "/api/v1/{entity}/{entityId}/{property}/documents/{documentId}") public ResponseEntity deleteAFile(@PathVariable String entity, @PathVariable String entityId, diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/service/FileStorageService.java b/java/registry/src/main/java/dev/sunbirdrc/registry/service/FileStorageService.java index 172b3c276..5b9da0ca2 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/service/FileStorageService.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/service/FileStorageService.java @@ -138,4 +138,27 @@ public ComponentHealthInfo getHealthInfo() { return new ComponentHealthInfo(getServiceName(), false, CONNECTION_FAILURE, e.getMessage()); } } + public DocumentsResponse updateFiles(MultipartFile[] files, String requestedURI) { + String objectPath = getDirectoryPath(requestedURI); + DocumentsResponse documentsResponse = new DocumentsResponse(); + for (MultipartFile file : files) { + String fileName = getFileName(file.getOriginalFilename()); + try { + boolean objectExists = minioClient.statObject( + StatObjectArgs.builder().bucket(bucketName).object(objectPath).build() + ) != null; + + if (objectExists) { + save(file.getInputStream(),objectPath); + documentsResponse.addDocumentLocation(objectPath); + return documentsResponse; + } + } catch (Exception e) { + documentsResponse.addError(file.getOriginalFilename()); + logger.error("Error has occurred while trying to update the file {}: {}", fileName, ExceptionUtils.getStackTrace(e)); + + } + } + return documentsResponse; + } }