Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: 프로젝트 디테일 이미지 업로드 기능 구현 #151

Merged
merged 8 commits into from
Sep 18, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public ResponseEntity<CreateProjectResponse> createProject(@RequestBody @Valid C
@PostMapping(value = "/images", consumes = "multipart/form-data")
public ResponseEntity<Void> createProjectImage(@ModelAttribute CreateProjectImageRequest request)
throws ImageException {
projectImageService.createProjectImage(request.projectId(), request.logoImage(), request.thumbNailImage());
projectImageService.createProjectImage(request.projectId(), request.logoImage(), request.thumbNailImage(), request.detailImages());
return ResponseEntity.status(HttpStatus.CREATED).build();
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package org.cotato.csquiz.api.project.dto;

import java.util.List;
import org.springframework.web.multipart.MultipartFile;

public record CreateProjectImageRequest(
Long projectId,
MultipartFile logoImage,
MultipartFile thumbNailImage
MultipartFile thumbNailImage,
List<MultipartFile> detailImages
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
public record ProjectImageInfoResponse(
Long imageId,
String imageUrl,
ProjectImageType projectImageType
ProjectImageType projectImageType,
Integer imageOrder
) {
public static ProjectImageInfoResponse from(ProjectImage projectImage) {
return new ProjectImageInfoResponse(
projectImage.getId(),
projectImage.getS3Info().getUrl(),
projectImage.getProjectImageType()
projectImage.getProjectImageType(),
projectImage.getImageOrder() != null ? projectImage.getImageOrder() : 0
yunhacandy marked this conversation as resolved.
Show resolved Hide resolved
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,41 @@ public class ProjectImage {
@Column(name = "project_id", nullable = false)
private Long projectId;

@Column(name = "project_image_order")
private Integer imageOrder;

@Builder
public ProjectImage(ProjectImageType projectImageType, S3Info s3Info, Long projectId) {
public ProjectImage(ProjectImageType projectImageType, S3Info s3Info, Long projectId, Integer imageOrder) {
this.projectImageType = projectImageType;
this.s3Info = s3Info;
this.projectId = projectId;
this.imageOrder = imageOrder;
}

public static ProjectImage logoImage(S3Info imageInfo, Long projectId) {
return new ProjectImage(
ProjectImageType.LOGO,
imageInfo,
projectId
projectId,
null
);
}

public static ProjectImage thumbNailImage(S3Info thumbNailInfo, Long projectId) {
return new ProjectImage(
ProjectImageType.THUMBNAIL,
thumbNailInfo,
projectId
projectId,
null
);
}
yunhacandy marked this conversation as resolved.
Show resolved Hide resolved

public static ProjectImage detailImage(S3Info detailImageInfo, Long projectId, Integer order) {
return new ProjectImage(
ProjectImageType.DETAIL,
detailImageInfo,
projectId,
order
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProjectImageRepository extends JpaRepository<ProjectImage, Long> {
List<ProjectImage> findAllByProjectId(Long projectId);
List<ProjectImage> findAllByProjectIdOrderByImageOrderAsc(Long projectId);
yunhacandy marked this conversation as resolved.
Show resolved Hide resolved
List<ProjectImage> findAllByProjectIdInAndProjectImageType(List<Long> projectIds, ProjectImageType projectImageType);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class ProjectImageService {
private final ProjectImageRepository projectImageRepository;

@Transactional
public void createProjectImage(Long projectId, MultipartFile logoImage, MultipartFile thumbNailImage)
public void createProjectImage(Long projectId, MultipartFile logoImage, MultipartFile thumbNailImage, List<MultipartFile> detailImages)
throws ImageException {
List<ProjectImage> newImages = new ArrayList<>();

Expand All @@ -36,6 +36,15 @@ public void createProjectImage(Long projectId, MultipartFile logoImage, Multipar
S3Info thumbNailInfo = s3Uploader.uploadFiles(webpThumbNailImage, PROJECT_IMAGE);
newImages.add(ProjectImage.thumbNailImage(thumbNailInfo, projectId));

if (detailImages != null && !detailImages.isEmpty()) {
for (int i = 0; i < detailImages.size(); i++) {
MultipartFile detailImage = detailImages.get(i);
File webpDetailImage = convertToWebp(convert(detailImage));
S3Info detailImageInfo = s3Uploader.uploadFiles(webpDetailImage, PROJECT_IMAGE);
newImages.add(ProjectImage.detailImage(detailImageInfo, projectId, i + 1));
}
yunhacandy marked this conversation as resolved.
Show resolved Hide resolved
}

projectImageRepository.saveAll(newImages);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
@RequiredArgsConstructor
public class ProjectService {

private final ProjectImageService projectImageService;
private final ProjectMemberService projectMemberService;
private final ProjectRepository projectRepository;
private final ProjectImageRepository projectImageRepository;
Expand All @@ -40,7 +39,7 @@ public ProjectDetailResponse getProjectDetail(Long projectId) {
Project project = projectRepository.findById(projectId)
.orElseThrow(() -> new EntityNotFoundException("찾으려는 프로젝트가 존재하지 않습니다."));

List<ProjectImage> images = projectImageRepository.findAllByProjectId(projectId);
List<ProjectImage> images = projectImageRepository.findAllByProjectIdOrderByImageOrderAsc(projectId);
List<ProjectMember> members = projectMemberRepository.findAllByProjectId(projectId);
Generation generation = generationRepository.findById(project.getGenerationId())
.orElseThrow(() -> new EntityNotFoundException("해당 기수를 찾을 수 없습니다."));
Expand Down
Loading