Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.cherrypic.global.pagination.SliceResponse;
import org.cherrypic.global.pagination.SortDirection;
import org.cherrypic.global.pagination.SortParameter;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
Expand All @@ -28,38 +29,56 @@ public class ImageController {
@Operation(
summary = "회원 프로필 이미지 Presigned URL 생성",
description = "회원 프로필 이미지 업로드를 위한 Presigned URL을 생성합니다.")
public PresignedUrlResponse memberProfileImageUploadUrlCreate(
@Valid @RequestBody ImageUploadRequest request) {
public ImagePresignedUrlResponse memberProfileImageUploadUrlCreate(
@Valid @RequestBody ImageUploadUrlRequest request) {
return imageService.createMemberProfileImageUploadUrl(request);
}

@PostMapping("/albums/cover-upload-url")
@Operation(
summary = "앨범 커버 이미지 Presigned URL 생성",
description = "앨범 커버 이미지 업로드를 위한 Presigned URL을 생성합니다.")
public PresignedUrlResponse albumCoverImageUploadUrlCreate(
@Valid @RequestBody ImageUploadRequest request) {
public ImagePresignedUrlResponse albumCoverImageUploadUrlCreate(
@Valid @RequestBody ImageUploadUrlRequest request) {
return imageService.createAlbumCoverImageUploadUrl(request);
}

@PostMapping("/events/cover-upload-url")
@Operation(
summary = "이벤트 커버 이미지 Presigned URL 생성",
description = "이벤트 커버 이미지 업로드를 위한 Presigned URL을 생성합니다.")
public PresignedUrlResponse eventCoverImageUploadUrlCreate(
@Valid @RequestBody ImageUploadRequest request) {
public ImagePresignedUrlResponse eventCoverImageUploadUrlCreate(
@Valid @RequestBody ImageUploadUrlRequest request) {
return imageService.createEventCoverImageUploadUrl(request);
}

@PostMapping("/albums/{albumId}/images")
@PostMapping("/images/upload-complete")
@Operation(summary = "앨범 사진 외 이미지 업로드 완료", description = "프로필, 커버 사진 등의 이미지 업로드를 완료합니다.")
public ResponseEntity<Void> nonAlbumImageUploadComplete(
@Valid @RequestBody ImageUploadCompleteRequest request) {
imageService.completeNonAlbumImageUpload(request);
return ResponseEntity.noContent().build();
}

@PostMapping("/albums/{albumId}/upload-url")
@Operation(
summary = "앨범 이미지 업로드 Presigned URL들 생성",
description = "앨범 이미지 업로드를 위한 Presigned URL들을 생성합니다.")
public ImageUploadListResponse albumImageUploadUrlsCreate(
@PathVariable Long albumId, @Valid @RequestBody AlbumImageUploadRequest request) {
public AlbumImagesPresignedUrlResponse albumImageUploadUrlsCreate(
@PathVariable Long albumId, @Valid @RequestBody AlbumImagesUploadUrlRequest request) {
return imageService.createAlbumImageUploadUrls(albumId, request);
}

@PostMapping("/albums/{albumId}/upload-complete")
@Operation(summary = "앨범 이미지들 업로드 완료", description = "앨범 이미지들의 업로드를 완료합니다.")
public ResponseEntity<AlbumImagesUploadCompleteResponse> albumImagesUploadComplete(
@PathVariable Long albumId,
@Valid @RequestBody AlbumImagesUploadCompleteRequest request) {
AlbumImagesUploadCompleteResponse response =
imageService.completeAlbumImagesUpload(albumId, request);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}

@GetMapping("/albums/{albumId}/images")
@Operation(summary = "앨범 이미지 목록 조회", description = "앨범의 이미지 목록을 조회합니다.")
public SliceResponse<AlbumImageListResponse> albumImagesGet(
Expand Down Expand Up @@ -102,16 +121,26 @@ public ResponseEntity<Void> albumImageDelete(
return ResponseEntity.noContent().build();
}

@PostMapping("temp-albums/{tempAlbumId}/images")
@PostMapping("temp-albums/{tempAlbumId}/upload-url")
@Operation(
summary = "임시 앨범 이미지 업로드 Presigned URL들 생성",
description = "임시 앨범 이미지 업로드를 위한 Presigned URL들을 생성합니다.")
public TempAlbumImageUploadListResponse tempAlbumImageUploadUrlsCreate(
summary = "임시 앨범 이미지들 업로드 Presigned URL들 생성",
description = "임시 앨범 이미지들 업로드를 위한 Presigned URL들을 생성합니다.")
public TempAlbumImagesPresignedUrlResponse tempAlbumImageUploadUrlsCreate(
@PathVariable Long tempAlbumId,
@Valid @RequestBody TempAlbumImageUploadRequest request) {
@Valid @RequestBody TempAlbumImagesUploadUrlRequest request) {
return imageService.createTempAlbumImageUploadUrls(tempAlbumId, request);
}

@PostMapping("/temp-albums/{tempAlbumId}/upload-complete")
@Operation(summary = "임시 앨범 이미지들 업로드 완료", description = "임시 앨범 이미지들의 업로드를 완료합니다.")
public ResponseEntity<TempAlbumImagesUploadCompleteResponse> tempAlbumImagesUploadComplete(
@PathVariable Long tempAlbumId,
@Valid @RequestBody TempAlbumImagesUploadCompleteRequest request) {
TempAlbumImagesUploadCompleteResponse response =
imageService.completeTempAlbumImagesUpload(tempAlbumId, request);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}

@DeleteMapping("temp-albums/{tempAlbumId}/images")
@Operation(summary = "임시 앨범 이미지 삭제", description = "임시 앨범의 이미지를 삭제합니다.")
public ResponseEntity<Void> tempAlbumImageDelete(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.cherrypic.domain.image.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

public record AlbumImagesUploadCompleteRequest(
@NotEmpty(message = "업로드 완료 하는 이미지들의 정보들은 비워둘 수 없습니다.")
@Valid
@Schema(description = "업로드 완료 요청 리스트")
List<Payload> payloads) {
@Schema(name = "AlbumImagesUploadCompletePayload")
public record Payload(
@Schema(description = "파일이 찍힌 시간, 정보가 없다면 null을 넣어주세요.") LocalDateTime generatedAt,
@NotNull(message = "파일의 용량은 비워둘 수 없습니다.")
@Schema(description = "업로드 하는 파일의 용량(MB), 소수점 2자리 까지", example = "0.04")
BigDecimal capacityMb,
@NotBlank(message = "업로드 완료 하고자 하는 imageUrl은 비워둘 수 없습니다.")
@Valid
@Schema(description = "엄로드 완료 요청 이미지 Url")
String imageUrl) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import org.cherrypic.global.annotation.Enum;
import org.cherrypic.s3.enums.FileExtension;

public record AlbumImageUploadRequest(
public record AlbumImagesUploadUrlRequest(
@NotEmpty(message = "업로드할 피일들의 정보는 비워둘 수 없습니다.") @Valid @Schema(description = "업로드 요청 리스트")
List<Payload> payloads) {
@Schema(name = "AlbumImageUploadRequestPayload")
Expand All @@ -25,7 +24,6 @@ public record Payload(
@NotBlank(message = "MD5 해시값은 비워둘 수 없습니다.")
@Schema(description = "S3 업로드시 파일의 변형을 확인하기 위한 md5 해시")
String md5Hashes,
@Schema(description = "파일이 찍힌 시간, 정보가 없다면 null을 넣어주세요.") LocalDateTime generatedAt,
@NotNull(message = "파일의 용량은 비워둘 수 없습니다.")
@Schema(description = "업로드 하는 파일의 용량(MB), 소수점 2자리 까지", example = "0.04")
BigDecimal capacityMb) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.cherrypic.domain.image.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

public record ImageUploadCompleteRequest(
@NotBlank(message = "이미지 url을 비워둘 수 없습니다.")
@Schema(description = "업로드 완료 하고자 하는 이미지 url", example = "https://example.jpg")
String imageUrl) {}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import org.cherrypic.global.annotation.Enum;
import org.cherrypic.s3.enums.FileExtension;

public record ImageUploadRequest(
public record ImageUploadUrlRequest(
@Enum(message = "이미지 파일의 확장자는 비워둘 수 없으며, PNG, JPG, JPEG, WEBP, HEIC, HEIF만 지원됩니다.")
@Schema(description = "이미지 파일의 확장자", defaultValue = "JPEG")
FileExtension fileExtension,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.cherrypic.domain.image.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;

public record TempAlbumImagesUploadCompleteRequest(
@NotEmpty(message = "업로드 완료 하고자 하는 임시 앨범 이미지들의 정보들은 비워둘 수 없습니다.")
@Valid
@Schema(description = "업로드 완료 요청 리스트")
List<Payload> payloads) {
@Schema(name = "TempAlbumImagesUploadCompletePayload")
public record Payload(
@NotNull(message = "파일의 용량은 비워둘 수 없습니다.")
@Schema(description = "업로드 하는 파일의 용량(MB), 소수점 2자리 까지", example = "0.04")
BigDecimal capacityMb,
@NotBlank(message = "업로드 완료 하고자 하는 tempAlbumImageUrl은 비워둘 수 없습니다.")
@Valid
@Schema(description = "업로드 완료 요청 임시 앨범 이미지 Url")
String tempAlbumImageUrl) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import org.cherrypic.global.annotation.Enum;
import org.cherrypic.s3.enums.FileExtension;

public record TempAlbumImageUploadRequest(
public record TempAlbumImagesUploadUrlRequest(
@NotEmpty(message = "업로드할 피일들의 정보는 비워둘 수 없습니다.") @Valid @Schema(description = "업로드 요청 리스트")
List<Payload> payloads) {
@Schema(name = "TempAlbumImageUploadRequestPayload")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.cherrypic.domain.image.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;

public record AlbumImagesPresignedUrlResponse(
@Schema(description = "생성된 presigned url 리스트") List<String> urls) {
public static AlbumImagesPresignedUrlResponse of(List<String> urls) {
return new AlbumImagesPresignedUrlResponse(urls);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.cherrypic.domain.image.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;

public record AlbumImagesUploadCompleteResponse(
@Schema(description = "생성된 이미지들의 ID 리스트") List<Long> imageIds) {
public static AlbumImagesUploadCompleteResponse of(List<Long> imageIds) {
return new AlbumImagesUploadCompleteResponse(imageIds);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.cherrypic.domain.image.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

public record ImagePresignedUrlResponse(
@Schema(description = "Presigned URL") String presignedUrl) {
public static ImagePresignedUrlResponse of(String presignedUrl) {
return new ImagePresignedUrlResponse(presignedUrl);
}
}

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.cherrypic.domain.image.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;

public record TempAlbumImagesPresignedUrlResponse(
@Schema(description = "생성된 presigned url 리스트") List<String> urls) {
public static TempAlbumImagesPresignedUrlResponse of(List<String> urls) {
return new TempAlbumImagesPresignedUrlResponse(urls);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.cherrypic.domain.image.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;

public record TempAlbumImagesUploadCompleteResponse(
@Schema(description = "생성된 임시 앨범 이미지들의 ID 리스트") List<Long> tempAlbumImageIds) {
public static TempAlbumImagesUploadCompleteResponse of(List<Long> tempAlbumImageIds) {
return new TempAlbumImagesUploadCompleteResponse(tempAlbumImageIds);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public enum ImageErrorCode implements BaseErrorCode {
IMAGE_DELETED(409, "이미지 관련 작업 중 이미지가 삭제되었습니다."),
IMAGE_CONFLICT(409, "예상치 못한 이미지 무결성 오류"),
NOT_IMAGE_EXTENSION(400, "프로필과 커버에는 이미지 파일만 업로드 가능합니다."),
IMAGE_UPLOAD_FAIL(400, "이미지가 성공적으로 업로드 되지 못했습니다."),

PRESIGNED_IMAGES_NOT_MINE(403, "본인이 업로드하지 않은 Presigned Image는 삭제할 수 없습니다."),
DUPLICATE_HASHES(400, "중복되는 md5 해시값이 존재합니다.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
import org.cherrypic.global.pagination.SortParameter;

public interface ImageService {
PresignedUrlResponse createMemberProfileImageUploadUrl(ImageUploadRequest request);
ImagePresignedUrlResponse createMemberProfileImageUploadUrl(ImageUploadUrlRequest request);

PresignedUrlResponse createAlbumCoverImageUploadUrl(ImageUploadRequest request);
ImagePresignedUrlResponse createAlbumCoverImageUploadUrl(ImageUploadUrlRequest request);

PresignedUrlResponse createEventCoverImageUploadUrl(ImageUploadRequest request);
ImagePresignedUrlResponse createEventCoverImageUploadUrl(ImageUploadUrlRequest request);

ImageUploadListResponse createAlbumImageUploadUrls(
Long albumId, AlbumImageUploadRequest request);
AlbumImagesPresignedUrlResponse createAlbumImageUploadUrls(
Long albumId, AlbumImagesUploadUrlRequest request);

SliceResponse<AlbumImageListResponse> getAlbumImages(
Long albumId,
Expand All @@ -32,8 +32,16 @@ SliceResponse<EventImageListResponse> getEventImages(

void deleteAlbumImage(Long albumId, AlbumImageDeleteRequest request);

TempAlbumImageUploadListResponse createTempAlbumImageUploadUrls(
Long tempAlbumId, TempAlbumImageUploadRequest request);
TempAlbumImagesPresignedUrlResponse createTempAlbumImageUploadUrls(
Long tempAlbumId, TempAlbumImagesUploadUrlRequest request);

void deleteTempAlbumImage(Long tempAlbumId, TempAlbumImageDeleteRequest request);

void completeNonAlbumImageUpload(ImageUploadCompleteRequest request);

AlbumImagesUploadCompleteResponse completeAlbumImagesUpload(
Long albumId, AlbumImagesUploadCompleteRequest request);

TempAlbumImagesUploadCompleteResponse completeTempAlbumImagesUpload(
Long tempAlbumId, TempAlbumImagesUploadCompleteRequest request);
}
Loading