Skip to content

Commit

Permalink
Merge pull request #218 from kakao-tech-campus-2nd-step3/feature/ISSU…
Browse files Browse the repository at this point in the history
…E-216

멤버 프로필 id도 반환 및 이미지 Response 생성
  • Loading branch information
jjt4515 authored Nov 14, 2024
2 parents 738bfd9 + f5f585d commit b4dcd1d
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 43 deletions.
35 changes: 10 additions & 25 deletions src/main/java/poomasi/domain/image/controller/ImageController.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,17 @@
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import poomasi.domain.auth.security.userdetail.UserDetailsImpl;
import poomasi.domain.image.dto.ImageRequest;
import poomasi.domain.image.dto.ImageResponse;
import poomasi.domain.image.entity.Image;
import poomasi.domain.image.dto.request.ImageRequest;
import poomasi.domain.image.dto.response.ImageResponse;
import poomasi.domain.image.entity.ImageType;
import poomasi.domain.image.service.ImageService;
import poomasi.domain.member.entity.Member;

import java.util.List;

import static poomasi.domain.image.dto.ImageResponse.fromEntity;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/images")
@RequestMapping("/api/image")
public class ImageController {
private final ImageService imageService;

Expand All @@ -30,8 +27,7 @@ public class ImageController {
public ResponseEntity<?> saveImageInfo(@AuthenticationPrincipal UserDetailsImpl userDetails,
@Valid @RequestBody ImageRequest imageRequest) {
Member member = userDetails.getMember();
Image savedImage = imageService.saveImage(member.getId(), imageRequest);
ImageResponse imageResponse = fromEntity(savedImage);
ImageResponse imageResponse = imageService.saveImage(member.getId(), imageRequest);
return ResponseEntity.ok(imageResponse);
}

Expand All @@ -41,12 +37,7 @@ public ResponseEntity<?> saveImageInfo(@AuthenticationPrincipal UserDetailsImpl
public ResponseEntity<List<ImageResponse>> saveMultipleImages(@AuthenticationPrincipal UserDetailsImpl userDetails,
@Valid @RequestBody List<ImageRequest> imageRequests) {
Member member = userDetails.getMember();
List<Image> savedImages = imageService.saveMultipleImages(member.getId(), imageRequests);

List<ImageResponse> imageResponses = savedImages.stream()
.map(ImageResponse::fromEntity)
.toList();

List<ImageResponse> imageResponses = imageService.saveMultipleImages(member.getId(), imageRequests);
return ResponseEntity.ok(imageResponses);
}

Expand All @@ -63,20 +54,15 @@ public ResponseEntity<Void> deleteImage(@AuthenticationPrincipal UserDetailsImpl
// 특정 이미지 조회
@GetMapping("/{id}")
public ResponseEntity<ImageResponse> getImage(@PathVariable Long id) {
return ResponseEntity.ok(fromEntity(imageService.getImageById(id)));
return ResponseEntity.ok(imageService.getImageById(id));
}

// 모든 이미지 조회 (특정 referenceId에 따라)
@GetMapping("/reference/{type}/{referenceId}")
public ResponseEntity<List<ImageResponse>> getImagesByTypeAndReference(@PathVariable ImageType type,
@PathVariable Long referenceId) {
List<Image> images = imageService.getImagesByTypeAndReferenceId(type, referenceId);

List<ImageResponse> imageResponses = images.stream()
.map(ImageResponse::fromEntity)
.toList();

return ResponseEntity.ok(imageResponses);
List<ImageResponse> images = imageService.getImagesByTypeAndReferenceId(type, referenceId);
return ResponseEntity.ok(images);
}

// 이미지 정보 수정
Expand All @@ -86,9 +72,8 @@ public ResponseEntity<?> updateImageInfo(@AuthenticationPrincipal UserDetailsImp
@PathVariable Long id,
@Valid @RequestBody ImageRequest imageRequest) {
Member member = userDetails.getMember();
Image updatedImage = imageService.updateImage(member.getId(), id, imageRequest);
ImageResponse imageResponse = fromEntity(updatedImage);
return ResponseEntity.ok(imageResponse);
ImageResponse updatedImage = imageService.updateImage(member.getId(), id, imageRequest);
return ResponseEntity.ok(updatedImage);
}

@PutMapping("/recover/{id}")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package poomasi.domain.image.dto;
package poomasi.domain.image.dto.request;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package poomasi.domain.image.dto;
package poomasi.domain.image.dto.response;

import poomasi.domain.image.entity.Image;
import poomasi.domain.image.entity.ImageType;
Expand All @@ -25,4 +25,4 @@ public static ImageResponse fromEntity(Image image) {
image.getDeletedAt()
);
}
}
}
27 changes: 26 additions & 1 deletion src/main/java/poomasi/domain/image/entity/Image.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.SQLDelete;
import poomasi.domain.image.dto.ImageRequest;
import poomasi.domain.image.dto.request.ImageRequest;
import poomasi.domain.image.dto.response.ImageResponse;

import java.time.LocalDateTime;

Expand Down Expand Up @@ -46,6 +47,18 @@ public Image(String objectKey, String imageUrl, ImageType type, Long referenceId
this.referenceId = referenceId;
}

@Builder
public Image(Long id, String objectKey, String imageUrl, ImageType type, Long referenceId, LocalDateTime createdAt, LocalDateTime deletedAt) {
this.id = id;
this.objectKey = objectKey;
this.imageUrl = imageUrl;
this.type = type;
this.referenceId = referenceId;
this.createdAt = createdAt;
this.deletedAt = deletedAt;
}


public void update(ImageRequest request) {
this.objectKey = request.objectKey();
this.imageUrl = request.imageUrl();
Expand All @@ -61,4 +74,16 @@ public ImageRequest toRequest(Image image){
image.referenceId
);
}

public static Image fromResponse(ImageResponse imageResponse) {
return new Image(
imageResponse.id(),
imageResponse.objectKey(),
imageResponse.imageUrl(),
imageResponse.type(),
imageResponse.referenceId(),
imageResponse.createdAt(),
imageResponse.deletedAt()
);
}
}
39 changes: 25 additions & 14 deletions src/main/java/poomasi/domain/image/service/ImageService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import org.springframework.transaction.annotation.Transactional;
import poomasi.domain.image.deleteLinker.ImageDeleteFactory;
import poomasi.domain.image.deleteLinker.ImageDeleteLinker;
import poomasi.domain.image.dto.ImageRequest;
import poomasi.domain.image.dto.request.ImageRequest;
import poomasi.domain.image.dto.response.ImageResponse;
import poomasi.domain.image.entity.Image;
import poomasi.domain.image.entity.ImageType;
import poomasi.domain.image.linker.ImageLinker;
Expand Down Expand Up @@ -42,7 +43,7 @@ public class ImageService {
// 이미지 타입에 맞게 link, deleteLink, 개수 제한, ownerValidate

@Transactional
public Image saveImage(Long memberId, ImageRequest imageRequest) {
public ImageResponse saveImage(Long memberId, ImageRequest imageRequest) {
// 기존 이미지가 있는 경우 복구 또는 예외 처리 (실제 복구 로직과는 차이가 있음)
validateImageOwner(memberId, imageRequest.type(), imageRequest.referenceId());
validateImageLimit(imageRequest);
Expand All @@ -53,7 +54,7 @@ public Image saveImage(Long memberId, ImageRequest imageRequest) {

imageLink(image);

return imageRepository.save(image);
return ImageResponse.fromEntity(imageRepository.save(image));
}

// 이미지 주인이 맞는지 검증
Expand Down Expand Up @@ -108,34 +109,42 @@ private int determineImageLimit(ImageType imageType) {

// 여러 이미지 저장
@Transactional
public List<Image> saveMultipleImages(Long memberId, List<ImageRequest> imageRequests) {
public List<ImageResponse> saveMultipleImages(Long memberId, List<ImageRequest> imageRequests) {
return imageRequests.stream()
.map(imageRequest -> saveImage(memberId, imageRequest))
.collect(Collectors.toList());
}

@Transactional
public void deleteImage(Long memberId, Long id) {
Image image = getImageById(id);
validateImageOwner(memberId, image.getType(), image.getReferenceId());
ImageResponse imageResponse = getImageById(id);
validateImageOwner(memberId, imageResponse.type(), imageResponse.referenceId());

Image image = Image.fromResponse(imageResponse);
imageRepository.delete(image);

imageDeleteLink(image);
}

public Image getImageById(Long id) {
return imageRepository.findByIdAndDeletedAtIsNull(id)
public ImageResponse getImageById(Long id) {
Image image = imageRepository.findByIdAndDeletedAtIsNull(id)
.orElseThrow(() -> new BusinessException(IMAGE_NOT_FOUND));
return ImageResponse.fromEntity(image);
}

public List<Image> getImagesByTypeAndReferenceId(ImageType type, Long referenceId) {
return imageRepository.findByTypeAndReferenceIdAndDeletedAtIsNull(type, referenceId);
public List<ImageResponse> getImagesByTypeAndReferenceId(ImageType type, Long referenceId) {
return imageRepository.findByTypeAndReferenceIdAndDeletedAtIsNull(type, referenceId)
.stream()
.map(ImageResponse::fromEntity)
.collect(Collectors.toList());
}

// 이미지 수정
@Transactional
public Image updateImage(Long memberId, Long id, ImageRequest imageRequest) {
Image image = getImageById(id);
public ImageResponse updateImage(Long memberId, Long id, ImageRequest imageRequest) {
ImageResponse imageResponse = getImageById(id);
Image image = Image.fromResponse(imageResponse);

validateImageOwner(memberId, image.getType(), image.getReferenceId());

if (!image.getType().equals(imageRequest.type()) ||
Expand All @@ -154,12 +163,14 @@ public Image updateImage(Long memberId, Long id, ImageRequest imageRequest) {
}


return imageRepository.save(image);
return ImageResponse.fromEntity(imageRepository.save(image));
}

@Transactional
public void recoverImage(Long memberId, Long id) {
Image image = getImageById(id);
ImageResponse imageResponse = getImageById(id);
Image image = Image.fromResponse(imageResponse);

validateImageOwner(memberId, image.getType(), image.getReferenceId());

if (image.getDeletedAt() == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.time.LocalDateTime;

public record MemberProfileResponse(
Long id,
String phoneNumber,
String defaultAddress,
String addressDetail,
Expand All @@ -18,6 +19,7 @@ public record MemberProfileResponse(

public static MemberProfileResponse fromEntity(MemberProfile profile) {
return new MemberProfileResponse(
profile.getId(),
profile.getPhoneNumber(),
profile.getDefaultAddress(),
profile.getAddressDetail(),
Expand Down

0 comments on commit b4dcd1d

Please sign in to comment.