Skip to content

Commit

Permalink
[hotfix]: 자료집 수정 api 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
qogustj committed Oct 13, 2024
1 parent d99b1c9 commit 278140b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,24 +102,37 @@ public ResponseEntity<ApiResponse<?>> createDataPost(@Parameter(hidden = true) @
@RequestBody PostCreateRequest postCreateRequest) {
return ApiResponse.success(postManageService.createDataPost(userId, fileCategory, postCreateRequest));
}

@Operation(summary = "게시물 생성 시 파일 및 이미지 저장 api", description = """
게시물 생성 시 파일 및 이미지 저장하는 api입니다.
우선 이 api는 게시물 생성 api를 사용전 미리 호출하여야 합니다. 기본적으로 반환값이 저장된 파일 및 사진의 url이기 때문에
이 반환값을 가지고 게시물 생성 api에 있는 dto의 List에 url를 보내주어야 합니다.
기본적으로 액세스 토큰을 필요로 합니다.
PathVariable로 노션에 있는 boardCode중 하나를 적습니다.
s3에 저장할 MultipartFile 형식을 fileType에 담아주시면 됩니다.
s3에 저장할 MultipartFile 형식의 파라미터를 2개 두었습니다.
첫번째 파라미터는 files라는 key값으로 보내주면 됩니다.
두번째 파라미터는 images라는 key값으로 보내주면 됩니다.
이미지와 파일을 경로를 구분하여 저장하기 위해 이러한 방식을 선택했습니다.
기본적인 api로직은 받은 파라미터를 통해 파일들을 먼저 s3에 저장하고 db에 순차적으로 생성된 id와 url을 하나의 dto로 이를 List로 반환합니다.
""")
@PostMapping(value = "/{boardCode}/files/{fileType}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
@PostMapping(value = "/{boardCode}/files", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ApiResponse<?>> createBoardPostFile(@Parameter(hidden = true) @UserId Long userId,
@PathVariable(name = "boardCode") String boardCode,
@RequestPart(value = "files", required = false) MultipartFile[] files,
@RequestPart(value = "images", required = false) MultipartFile[] images) {
return ApiResponse.success(postManageService.createBoardPostFile(userId, boardCode, files, images));
}

@Operation(summary = "자료집 게시물 생성 시 파일 및 이미지 저장 api", description = """
자료집 게시물 생성 시 파일 및 이미지 저장하는 api입니다.
""")
@PostMapping(value = "/{boardCode}/files/{fileType}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ApiResponse<?>> createBoardDataPostFile(@Parameter(hidden = true) @UserId Long userId,
@PathVariable(name = "boardCode") String boardCode,
@RequestPart(value = "files", required = false) MultipartFile[] files,
@PathVariable(name = "fileType") String fileType) {
return ApiResponse.success(postManageService.createBoardPostFile(userId, boardCode, files, fileType));
return ApiResponse.success(postManageService.createBoardDataPostFile(userId, boardCode, files, fileType));
}

@Operation(summary = "게시물 단건 조회 후 파일 혹은 이미지 삭제 api", description = """
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package ussum.homepage.application.post.service;

import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import ussum.homepage.application.comment.service.dto.response.PostOfficialCommentResponse;
import ussum.homepage.application.post.service.dto.request.PostCreateRequest;
Expand Down Expand Up @@ -40,6 +43,7 @@
import ussum.homepage.domain.user.User;
import ussum.homepage.domain.user.service.UserReader;
import ussum.homepage.global.common.PageInfo;
import ussum.homepage.global.config.auth.UserId;
import ussum.homepage.global.error.exception.GeneralException;
import ussum.homepage.global.error.status.ErrorStatus;
import ussum.homepage.infra.jpa.group.entity.GroupCode;
Expand Down Expand Up @@ -120,7 +124,7 @@ public PostListRes<?> getDataList(Long userId, int page, int take, String majorC
);
PageInfo pageInfo = PageInfo.of(postList);

PostListResponseFactory factory = PostResponseFactoryProvider.getFactory("자료집게시판");
PostListResponseFactory factory = PostResponseFactoryProvider.getFactory(BoardCode.DATA.getStringBoardCode());

List<? extends PostListResDto> responseList = postList.getContent().stream()
.map(post -> {
Expand Down Expand Up @@ -184,9 +188,32 @@ public PostCreateResponse createDataPost(Long userId, String fileCategory, PostC
return PostCreateResponse.of(post.getId(), BoardCode.DATA.getStringBoardCode());
}

//이거 두개 api 합쳐야댐!!!!
@Transactional
public PostFileListResponse createBoardPostFile(Long userId, String boardCode, MultipartFile[] files, MultipartFile[] images){
PostFileMediatorResponse response = s3utils.uploadFileWithPath(userId, boardCode, files, images);
List<PostFile> postFiles = convertUrlsToPostFiles(response);
List<PostFile> afterSaveList = postFileAppender.saveAllPostFile(postFiles);

String thumbnailUrl = afterSaveList.stream()
.filter(postFile -> postFile.getTypeName().equals("images"))
.min(Comparator.comparing(PostFile::getId))
.map(PostFile::getUrl)
.orElse(null);

AtomicInteger index = new AtomicInteger(0);
List<PostFileResponse> postFileResponses = afterSaveList.stream()
.map(postFile -> {
int currentIndex = index.getAndIncrement();
return PostFileResponse.of(postFile.getId(), postFile.getUrl(), response.originalFileNames().get(currentIndex));
})
.collect(Collectors.toList());

return PostFileListResponse.of(thumbnailUrl, postFileResponses);
}
@Transactional
public PostFileListResponse createBoardPostFile(Long userId, String boardCode, MultipartFile[] files, String fileType){
PostFileMediatorResponse response = s3utils.uploadFileWithPath(userId, boardCode, files, fileType);
public PostFileListResponse createBoardDataPostFile(Long userId, String boardCode, MultipartFile[] files, String fileType){
PostFileMediatorResponse response = s3utils.uploadDataFileWithPath(userId, boardCode, files, fileType);
List<PostFile> postFiles = convertUrlsToPostFiles(response);
List<PostFile> afterSaveList = postFileAppender.saveAllPostFile(postFiles);

Expand Down
22 changes: 20 additions & 2 deletions src/main/java/ussum/homepage/infra/utils/S3utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@ public String uploadFile(MultipartFile file) {
}
return amazonS3.getUrl(bucket, originalFilename).toString();
}

public PostFileMediatorResponse uploadFileWithPath(Long userId, String boardCode, MultipartFile[] files, String fileType) {
public PostFileMediatorResponse uploadDataFileWithPath(Long userId, String boardCode, MultipartFile[] files, String fileType) {
List<Map<String, String>> uploadedFileUrls = new ArrayList<>();
List<String> originalFileNames = new ArrayList<>();

Expand All @@ -70,6 +69,25 @@ public PostFileMediatorResponse uploadFileWithPath(Long userId, String boardCode

return PostFileMediatorResponse.of(originalFileNames, uploadedFileUrls);
}

public PostFileMediatorResponse uploadFileWithPath(Long userId, String boardCode, MultipartFile[] files, MultipartFile[] images) {
List<Map<String, String>> uploadedFileUrls = new ArrayList<>();
List<String> originalFileNames = new ArrayList<>();

if (images != null && images.length > 0) {
PostFileMediatorResponse imageResponse = uploadFiles(userId, boardCode, files, "images");
uploadedFileUrls.addAll(imageResponse.urlList());
originalFileNames.addAll(formatOriginalFileNames(imageResponse.originalFileNames()));
}

if (files != null && files.length > 0) {
PostFileMediatorResponse fileResponse = uploadFiles(userId, boardCode, files, "files");
uploadedFileUrls.addAll(fileResponse.urlList());
originalFileNames.addAll(formatOriginalFileNames(fileResponse.originalFileNames()));
}

return PostFileMediatorResponse.of(originalFileNames, uploadedFileUrls);
}
public List<String> formatOriginalFileNames(List<String> originalFileNames) {
return originalFileNames.stream()
.map(this::formatSingleFileName)
Expand Down

0 comments on commit 278140b

Please sign in to comment.