diff --git a/Match-Api/src/main/java/com/example/matchapi/admin/project/controller/AdminProjectController.java b/Match-Api/src/main/java/com/example/matchapi/admin/project/controller/AdminProjectController.java index 49d53976..6669eedc 100644 --- a/Match-Api/src/main/java/com/example/matchapi/admin/project/controller/AdminProjectController.java +++ b/Match-Api/src/main/java/com/example/matchapi/admin/project/controller/AdminProjectController.java @@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -111,11 +112,14 @@ public CommonResponse patchActiveProject(@PathVariable Long projectId){ @PatchMapping("/{projectId}") @ApiErrorCodeExample({UserAuthErrorCode.class, ProjectGetErrorCode.class}) public CommonResponse patchProject(@PathVariable Long projectId, - @RequestPart ProjectReq.ModifyProject modifyProject){ - projectService.patchProject(projectId, modifyProject); + @RequestPart ProjectReq.ModifyProject modifyProject, + @Schema(description = "대표 이미지 파일 변경될 경우") @RequestPart(value = "presentFile", required = false) MultipartFile presentFile, + @Schema(description = "이미지 리스트 추가될 경우")@RequestPart(value = "multipartFiles", required = false) List multipartFiles){ + projectService.patchProject(projectId, modifyProject, presentFile, multipartFiles); return CommonResponse.onSuccess("수정 성공"); } + /* @Operation(summary = "ADMIN-03-07💻 프로젝트 이미지 수정", description = "프로젝트 이미지 수정 API") @PatchMapping(value = "/img/{projectId}/{projectImgId}", consumes = {"multipart/form-data"}, produces = "application/json") @ApiErrorCodeExample({UserAuthErrorCode.class, PatchProjectImageErrorCode.class, FileUploadException.class}) @@ -125,6 +129,7 @@ public CommonResponse modifyProjectImg(@PathVariable ProjectRes.PatchProjectImg patchProjectImg = projectService.modifyProjectImg(projectId, projectImgId, multipartFile); return CommonResponse.onSuccess(patchProjectImg); } + */ } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectReq.java b/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectReq.java index 2ef4d71d..978e3ecf 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectReq.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectReq.java @@ -11,6 +11,7 @@ import javax.validation.constraints.NotNull; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.List; public class ProjectReq { @Getter @@ -75,7 +76,11 @@ public static class ModifyProject { private LocalDateTime endDate; @Enum(message = "DOG, CHILDREN,YOUTH,WOMEN, ELDER, DISABLED, SOCIAL, EARTH, NEIGHBOR, ANIMAL, ENVIRONMENT 중 입력해주세요") private ProjectKind projectKind; + @Schema(description = "추천 검색어", required = false) private String searchKeyword; + @Schema(description = "삭제할 이미지 리스트", required = false) + private List deleteImageList; + } @Getter @Setter diff --git a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectImgService.java b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectImgService.java index a1987d1c..563958a4 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectImgService.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectImgService.java @@ -2,9 +2,13 @@ import com.example.matchapi.project.converter.ProjectConverter; import com.example.matchdomain.project.adaptor.ProjectImgAdaptor; +import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.project.entity.ProjectImage; +import com.example.matchinfrastructure.config.s3.S3UploadService; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.transaction.Transactional; import java.util.ArrayList; @@ -18,8 +22,8 @@ public class ProjectImgService { private final ProjectImgAdaptor projectImgAdaptor; private final ProjectConverter projectConverter; + private final S3UploadService s3UploadService; - @Transactional public void saveImgList(Long id, String url, List imgUrlList) { imgUrlList.add(url); List projectImages = new ArrayList<>(); @@ -42,4 +46,23 @@ public List findByProjectId(Long projectId) { public ProjectImage save(ProjectImage projectImage) { return projectImgAdaptor.save(projectImage); } + + public void updateImageLists(Project project, List deleteImageList, MultipartFile presentFile, List multipartFiles) { + if(deleteImageList != null){ + List images = projectImgAdaptor.findByIdIn(deleteImageList); + for (ProjectImage image : images) { + s3UploadService.deleteFile(image.getUrl()); + } + projectImgAdaptor.deleteImgList(deleteImageList); + } + if(presentFile != null){ + String presentUrl = s3UploadService.uploadProjectPresentFile(project.getId(), presentFile); + projectImgAdaptor.deletePresentImg(project.getId()); + projectImgAdaptor.save(projectConverter.postProjectImage(project.getId(), presentUrl, REPRESENT, 0)); + } + if(multipartFiles != null){ + List imgUrlList = s3UploadService.listUploadProjectFiles(project.getId(), multipartFiles); + saveImgList(project.getId(), imgUrlList.get(0), imgUrlList); + } + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java index 2acfe69e..da395554 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java @@ -9,7 +9,6 @@ import com.example.matchcommon.constants.enums.FILTER; import com.example.matchapi.user.helper.AuthHelper; import com.example.matchcommon.exception.BadRequestException; -import com.example.matchcommon.exception.NotFoundException; import com.example.matchcommon.reponse.PageResponse; import com.example.matchdomain.common.model.Status; import com.example.matchdomain.donation.adaptor.DonationAdaptor; @@ -20,11 +19,9 @@ import com.example.matchdomain.project.adaptor.AttentionAdaptor; import com.example.matchdomain.project.adaptor.ProjectAdaptor; import com.example.matchdomain.project.adaptor.ProjectImgAdaptor; -import com.example.matchdomain.project.dto.ProjectDto; import com.example.matchdomain.project.entity.*; import com.example.matchdomain.project.entity.enums.ProjectKind; import com.example.matchdomain.project.entity.enums.ProjectStatus; -import com.example.matchdomain.project.entity.enums.ReportReason; import com.example.matchdomain.project.entity.pk.ProjectUserAttentionPk; import com.example.matchdomain.project.repository.*; import com.example.matchdomain.user.entity.User; @@ -38,18 +35,12 @@ import org.springframework.web.multipart.MultipartFile; import javax.transaction.Transactional; -import java.time.LocalDateTime; + import java.util.ArrayList; import java.util.List; import static com.example.matchcommon.constants.MatchAlertStatic.PROJECT_UPLOAD_BODY; import static com.example.matchdomain.common.model.Status.ACTIVE; -import static com.example.matchdomain.common.model.Status.INACTIVE; -import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.NORMAL; -import static com.example.matchdomain.project.entity.enums.ImageRepresentStatus.REPRESENT; -import static com.example.matchdomain.project.entity.enums.ProjectStatus.PROCEEDING; -import static com.example.matchdomain.project.exception.CommentDeleteErrorCode.COMMENT_DELETE_ERROR_CODE; -import static com.example.matchdomain.project.exception.CommentGetErrorCode.COMMENT_NOT_EXIST; import static com.example.matchdomain.project.exception.PatchProjectImageErrorCode.PROJECT_NOT_CORRECT_IMAGE; import static com.example.matchdomain.project.exception.ProjectGetErrorCode.PROJECT_NOT_EXIST; @@ -161,11 +152,14 @@ public void deleteProject(Long projectId) { } @Transactional - public void patchProject(Long projectId, ProjectReq.ModifyProject modifyProject) { + public void patchProject(Long projectId, ProjectReq.ModifyProject modifyProject, MultipartFile presentFile, + List multipartFiles) { Project project = projectAdaptor.findById(projectId); project.modifyProject(modifyProject.getProjectName(), modifyProject.getUsages(), modifyProject.getDetail(), modifyProject.getRegularStatus(), modifyProject.getStartDate(), modifyProject.getEndDate(), modifyProject.getProjectKind(), modifyProject.getSearchKeyword()); + projectImgService.updateImageLists(project, modifyProject.getDeleteImageList(), presentFile, multipartFiles); + projectAdaptor.save(project); } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java index 68459fdb..f3f32b4d 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectImgAdaptor.java @@ -37,4 +37,16 @@ public void saveAll(List projectImages) { public ProjectImage save(ProjectImage projectImage) { return projectImageRepository.save(projectImage); } + + public void deleteImgList(List deleteImageList) { + projectImageRepository.deleteAllByIdIn(deleteImageList); + } + + public List findByIdIn(List deleteImageList) { + return projectImageRepository.findAllById(deleteImageList); + } + + public void deletePresentImg(Long id) { + projectImageRepository.deleteByIdAndImageRepresentStatus(id, ImageRepresentStatus.REPRESENT); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectImageRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectImageRepository.java index e9c6300d..02fdd46a 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectImageRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectImageRepository.java @@ -18,4 +18,8 @@ public interface ProjectImageRepository extends JpaRepository findByProjectIdAndImageRepresentStatusAndProject_StatusOrderBySequenceAsc(@Param("projectId") Long projectId, @Param("imageRepresentStatus") ImageRepresentStatus imageRepresentStatus,@Param("status") Status status); List findByProjectIdOrderBySequenceAsc(Long projectId); + + void deleteAllByIdIn(List deleteImageList); + + void deleteByIdAndImageRepresentStatus(Long id, ImageRepresentStatus imageRepresentStatus); }