diff --git a/dateroad-api/src/main/java/org/dateroad/advertisment/api/AdvertismentController.java b/dateroad-api/src/main/java/org/dateroad/advertisment/api/AdvertismentController.java index 6f0cf247..1cd47c94 100644 --- a/dateroad-api/src/main/java/org/dateroad/advertisment/api/AdvertismentController.java +++ b/dateroad-api/src/main/java/org/dateroad/advertisment/api/AdvertismentController.java @@ -2,10 +2,13 @@ import lombok.RequiredArgsConstructor; import org.dateroad.advertisment.dto.response.AdvGetAllRes; +import org.dateroad.advertisment.dto.response.AdvGetDetailRes; import org.dateroad.advertisment.service.AdvertismentService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,8 +20,13 @@ public class AdvertismentController { @GetMapping public ResponseEntity getAllAdvertisments(){ - return ResponseEntity - .status(HttpStatus.OK) - .body(advertismentService.getAllAdvertisments()); + return ResponseEntity.ok(advertismentService.getAllAdvertisments()); + } + + @GetMapping("{advId}") + public ResponseEntity getAllAdvertisments( + final @PathVariable Long advId + ){ + return ResponseEntity.ok(advertismentService.getAdvertismentsDetail(advId)); } } diff --git a/dateroad-api/src/main/java/org/dateroad/advertisment/dto/response/AdvGetDetailRes.java b/dateroad-api/src/main/java/org/dateroad/advertisment/dto/response/AdvGetDetailRes.java new file mode 100644 index 00000000..c86bf000 --- /dev/null +++ b/dateroad-api/src/main/java/org/dateroad/advertisment/dto/response/AdvGetDetailRes.java @@ -0,0 +1,39 @@ +package org.dateroad.advertisment.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import lombok.AccessLevel; +import lombok.Builder; + +@Builder(access = AccessLevel.PROTECTED) +public record AdvGetDetailRes( + List images, + String title, + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd", timezone = "Asia/Seoul") + LocalDate createAt, + String description +) { + public static AdvGetDetailRes of(List images, String title, LocalDate createAt, String description) { + return AdvGetDetailRes.builder() + .images(images) + .title(title) + .createAt(createAt) + .description(description) + .build(); + } + + @Builder(access = AccessLevel.PROTECTED) + public record AdvImagesRes( + String imagesUrl, + int sequence + ) { + public static AdvImagesRes of(String imagesUrl, int sequence) { + return AdvImagesRes.builder() + .imagesUrl(imagesUrl) + .sequence(sequence) + .build(); + } + } +} diff --git a/dateroad-api/src/main/java/org/dateroad/advertisment/service/AdvertismentService.java b/dateroad-api/src/main/java/org/dateroad/advertisment/service/AdvertismentService.java index 2e38968f..b32f6476 100644 --- a/dateroad-api/src/main/java/org/dateroad/advertisment/service/AdvertismentService.java +++ b/dateroad-api/src/main/java/org/dateroad/advertisment/service/AdvertismentService.java @@ -1,18 +1,37 @@ package org.dateroad.advertisment.service; +import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import org.dateroad.adImage.domain.AdImage; +import org.dateroad.adImage.repository.AdImageRepository; +import org.dateroad.advertisement.domain.Advertisment; import org.dateroad.advertisement.repository.AdvertismentRepository; import org.dateroad.advertisment.dto.response.AdvGetAllRes; import org.dateroad.advertisment.dto.response.AdvGetAllRes.AdvertismentDtoRes; +import org.dateroad.advertisment.dto.response.AdvGetDetailRes; +import org.dateroad.advertisment.dto.response.AdvGetDetailRes.AdvImagesRes; +import org.dateroad.code.FailureCode; +import org.dateroad.exception.EntityNotFoundException; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class AdvertismentService { private final AdvertismentRepository advertismentRepository; + private final AdImageRepository adImageRepository; + + private static List getImages(final List adImages) { + return adImages.stream().map( + adImage -> AdvImagesRes.of(adImage.getImageUrl(), adImage.getSequence()) + ).toList(); + } + public AdvGetAllRes getAllAdvertisments() { Pageable topFive = PageRequest.of(0, 5); return AdvGetAllRes.of(advertismentRepository.findTop5ByOrderByCreatedDateDesc(topFive). @@ -20,4 +39,19 @@ public AdvGetAllRes getAllAdvertisments() { .map(AdvertismentDtoRes::of) .collect(Collectors.toList())); } + + public AdvGetDetailRes getAdvertismentsDetail(final Long advId) { + Advertisment advertisment = getAdvertisment(advId); + List adImages = adImageRepository.findAllById(advId); + return AdvGetDetailRes.of( + getImages(adImages), advertisment.getTitle(), advertisment.getCreatedAt().toLocalDate(), + advertisment.getTitle() + ); + } + + private Advertisment getAdvertisment(final Long advId) { + return advertismentRepository.findById(advId).orElseThrow( + () -> new EntityNotFoundException(FailureCode.ADVERTISMENT_NOT_FOUND) + ); + } } diff --git a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java index d3fe54ea..58c30f53 100644 --- a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java +++ b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java @@ -62,6 +62,7 @@ public enum FailureCode { COURSE_TAG_NOT_FOUND(HttpStatus.NOT_FOUND, "e40410", "데이트 태그를 찾을 수 없습니다."), NEAREST_DATE_NOT_FOUND(HttpStatus.NOT_FOUND, "e40411", "다가오는 데이트를 찾을 수 없습니다."), LIKE_NOT_FOUND(HttpStatus.NOT_FOUND, "e40412", "해당 데이트 코스에 좋아요를 찾을 수 없습니다."), + ADVERTISMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "e40413", "해당 광고를 찾을 수 없습니다."), INSUFFICIENT_USER_POINTS(HttpStatus.NOT_FOUND, "e4048", "유저의 포인트가 부족합니다."), /** @@ -78,6 +79,7 @@ public enum FailureCode { DUPLICATE_COURSE_LIKE(HttpStatus.CONFLICT, "e4093", "해당 데이트 코스에 좋아요가 이미 존재합니다."), INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "e5000", "서버 내부 오류입니다."); + /** * 500 Internal Server Error */ diff --git a/dateroad-domain/src/main/java/org/dateroad/adImage/repository/AdImageRepository.java b/dateroad-domain/src/main/java/org/dateroad/adImage/repository/AdImageRepository.java index 85eb284a..1e4b3a11 100644 --- a/dateroad-domain/src/main/java/org/dateroad/adImage/repository/AdImageRepository.java +++ b/dateroad-domain/src/main/java/org/dateroad/adImage/repository/AdImageRepository.java @@ -8,4 +8,5 @@ @Repository public interface AdImageRepository extends JpaRepository { + List findAllById(Long advertismentId); }