Skip to content
Extraits de code Groupes Projets
Valider 42ce3931 rédigé par Mohamed Lemine BAILLAHI's avatar Mohamed Lemine BAILLAHI
Parcourir les fichiers

Merge branch 'MP-243' into 'develop'

MP-244 / multiple + single file deletions

See merge request !58
parents 32f53517 db5539fb
Branches
Étiquettes
1 requête de fusion!58MP-244 / multiple + single file deletions
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
- adding dtos : ElementContentDTO and InnerFileDTO - adding dtos : ElementContentDTO and InnerFileDTO
- Adding feature of : getting files within a certain tender analysis folder - Adding feature of : getting files within a certain tender analysis folder
## Changed ## Changed
- Docs Controller : adding multiple files deletion feature.
- Docs controller : adding single file deletion feature.
- File import & subfolder creation logics : tracking the current session infoss. - File import & subfolder creation logics : tracking the current session infoss.
- Docs controller : exposing the detailed content feature via endpoint - Docs controller : exposing the detailed content feature via endpoint
- Docs service : by defining a detailed folder content getter function : getDetailedFolderContent - Docs service : by defining a detailed folder content getter function : getDetailedFolderContent
......
package com.marketingconfort.mobimarche.user_management_service.Controller; package com.marketingconfort.mobimarche.user_management_service.Controller;
import com.amazonaws.services.s3.model.S3ObjectSummary; import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.marketingconfort.mobimarche.user_management_service.dto.request.MultipleFilesDeletionReqDTO;
import com.marketingconfort.mobimarche.user_management_service.dto.response.ElementContentDTO; import com.marketingconfort.mobimarche.user_management_service.dto.response.ElementContentDTO;
import com.marketingconfort.mobimarche.user_management_service.service.DocsService; import com.marketingconfort.mobimarche.user_management_service.service.DocsService;
import com.marketingconfort.starter.core.exceptions.FunctionalException; import com.marketingconfort.starter.core.exceptions.FunctionalException;
...@@ -30,10 +31,10 @@ public class DocsController { ...@@ -30,10 +31,10 @@ public class DocsController {
@PostMapping(value=UPLOAD_FILE,consumes = "multipart/form-data") @PostMapping(value=UPLOAD_FILE,consumes = "multipart/form-data")
public ResponseEntity<String> uploadFile public ResponseEntity<String> uploadFile
(@RequestPart("file") MultipartFile file, (@RequestPart("file") MultipartFile file,
@RequestParam String appelOffre, @RequestParam String parent,
@PathVariable("email") String email) @PathVariable("email") String email)
throws S3FunctionalException, FunctionalException { throws S3FunctionalException, FunctionalException {
String fileUrl = service.uploadAnalyseFileToFolder(appelOffre, String fileUrl = service.uploadAnalyseFileToFolder(parent,
file, file,
email); email);
return ResponseEntity.ok().body(fileUrl); return ResponseEntity.ok().body(fileUrl);
...@@ -74,4 +75,21 @@ public class DocsController { ...@@ -74,4 +75,21 @@ public class DocsController {
return ResponseEntity.ok(). return ResponseEntity.ok().
body(service.createSubFolder(parent,name,email)); body(service.createSubFolder(parent,name,email));
} }
@DeleteMapping(DELETE_SINGLE_FILE)
ResponseEntity<?> deleteFile(
@RequestParam("fileName") String fileName,
@RequestParam("email") String email
) throws S3FunctionalException, FunctionalException {
service.deleteSingleFileInBucket(fileName,email);
return ResponseEntity.ok().build();
}
@DeleteMapping(DELETE_MULTIPLE_FILES)
ResponseEntity<?> deleteFile(
@RequestBody MultipleFilesDeletionReqDTO req)
throws S3FunctionalException, FunctionalException {
service.deleteFilesInBucket(req.getEmail(),req.getFileNames());
return ResponseEntity.ok().build();
}
} }
...@@ -64,4 +64,6 @@ public class ApiPaths { ...@@ -64,4 +64,6 @@ public class ApiPaths {
public static final String GET_DETAILED_CONTENT_OF_ELEMENT = public static final String GET_DETAILED_CONTENT_OF_ELEMENT =
"/folder-content"; "/folder-content";
public static final String CREATE_SUBFOLDER = "/create-subfolder"; public static final String CREATE_SUBFOLDER = "/create-subfolder";
public static final String DELETE_SINGLE_FILE = "/delete";
public static final String DELETE_MULTIPLE_FILES = "/delete-multiple";
} }
package com.marketingconfort.mobimarche.user_management_service.dto.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class MultipleFilesDeletionReqDTO {
private String email;
private List<String> fileNames;
}
...@@ -4,6 +4,10 @@ import com.marketingconfort.mobimarche.common.user.models.File; ...@@ -4,6 +4,10 @@ import com.marketingconfort.mobimarche.common.user.models.File;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository @Repository
public interface FileRepository extends JpaRepository<File, Long> { public interface FileRepository extends JpaRepository<File, Long> {
Optional<File> findByUrl(String url);
} }
...@@ -18,8 +18,14 @@ public interface DocsService { ...@@ -18,8 +18,14 @@ public interface DocsService {
ElementContentDTO getSpecFolderContent(String id) ElementContentDTO getSpecFolderContent(String id)
throws S3FunctionalException; throws S3FunctionalException;
public String createSubFolder(String parent, String name, String createSubFolder(String parent, String name,
String email) throws String email) throws
S3FunctionalException, FunctionalException; S3FunctionalException, FunctionalException;
void deleteSingleFileInBucket(String fileName,String email)
throws S3FunctionalException , FunctionalException;
void deleteFilesInBucket(String email, List<String> fileNames)
throws S3FunctionalException , FunctionalException;
} }
package com.marketingconfort.mobimarche.user_management_service.serviceImpl; package com.marketingconfort.mobimarche.user_management_service.serviceImpl;
import com.amazonaws.services.s3.model.S3ObjectSummary; import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.marketingconfort.mobimarche.common.TenderManagement.enums.UserType;
import com.marketingconfort.mobimarche.common.user.models.File; import com.marketingconfort.mobimarche.common.user.models.File;
import com.marketingconfort.mobimarche.common.user.models.Folder; import com.marketingconfort.mobimarche.common.user.models.Folder;
import com.marketingconfort.mobimarche.common.user.models.User; import com.marketingconfort.mobimarche.common.user.models.User;
...@@ -20,6 +21,9 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -20,6 +21,9 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import static com.marketingconfort.mobimarche.common.TenderManagement.enums.UserType.ADMIN;
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
...@@ -54,7 +58,7 @@ public class DocsServiceImpl implements DocsService { ...@@ -54,7 +58,7 @@ public class DocsServiceImpl implements DocsService {
Folder local = Folder.builder().folderName("analyse/appelsOffres/" + id). Folder local = Folder.builder().folderName("analyse/appelsOffres/" + id).
build(); build();
folderRepository.save(local); folderRepository.save(local);
return "analyse/appelsOffres/" + id; return "analyse/appelsOffres/" + id+ "/";
} }
@Override @Override
...@@ -133,6 +137,42 @@ public class DocsServiceImpl implements DocsService { ...@@ -133,6 +137,42 @@ public class DocsServiceImpl implements DocsService {
return id; return id;
} }
@Override
public void deleteSingleFileInBucket
(String fileName, String email)
throws S3FunctionalException , FunctionalException
{
User connected = userRepository.findByEmail(email).
orElseThrow(()-> new FunctionalException("user not found"));
File concernedFile = fileRepository.findByUrl(fileName).
orElseThrow(()-> new FunctionalException("unknown file"));
User fileOwner = concernedFile.getUser();
if(!Objects.equals(connected.getEmail(),fileOwner.getEmail()) &&
connected.getUserType() != ADMIN) {
throw new FunctionalException("files are only deleted by admins or their owners");
}
s3FileService.deleteSingleFileInBucket(bucketName,fileName);
}
@Override
public void deleteFilesInBucket(String email, List<String> fileNames)
throws S3FunctionalException, FunctionalException
{
User connected = userRepository.findByEmail(email).
orElseThrow(()-> new FunctionalException("user not found"));
for(String fileName : fileNames) {
File concernedFile = fileRepository.findByUrl(fileName).
orElseThrow(()-> new FunctionalException("unknown file"));
User owner = concernedFile.getUser();
if(! owner.getEmail().equals(connected.getEmail()) &&
connected.getUserType() != ADMIN) {
throw new FunctionalException("can't delete files you don't possess");
}
}
s3FileService.deleteFilesInBucket(bucketName,fileNames);
}
@Override @Override
public String uploadAnalyseFileToFolder public String uploadAnalyseFileToFolder
(String parentFolder, MultipartFile fileMult, String email) (String parentFolder, MultipartFile fileMult, String email)
......
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter