Skip to content

Commit

Permalink
[merge] 광고 상세 조회 API - #71
Browse files Browse the repository at this point in the history
[FEAT] 광고 상세 조회 API - #71
  • Loading branch information
rlarlgnszx authored Jul 11, 2024
2 parents d7c8410 + 10a539b commit 1431634
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -17,8 +20,13 @@ public class AdvertismentController {

@GetMapping
public ResponseEntity<AdvGetAllRes> getAllAdvertisments(){
return ResponseEntity
.status(HttpStatus.OK)
.body(advertismentService.getAllAdvertisments());
return ResponseEntity.ok(advertismentService.getAllAdvertisments());
}

@GetMapping("{advId}")
public ResponseEntity<AdvGetDetailRes> getAllAdvertisments(
final @PathVariable Long advId
){
return ResponseEntity.ok(advertismentService.getAdvertismentsDetail(advId));
}
}
Original file line number Diff line number Diff line change
@@ -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<AdvImagesRes> images,
String title,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd", timezone = "Asia/Seoul")
LocalDate createAt,
String description
) {
public static AdvGetDetailRes of(List<AdvImagesRes> 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();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,57 @@
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<AdvImagesRes> getImages(final List<AdImage> 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).
stream()
.map(AdvertismentDtoRes::of)
.collect(Collectors.toList()));
}

public AdvGetDetailRes getAdvertismentsDetail(final Long advId) {
Advertisment advertisment = getAdvertisment(advId);
List<AdImage> 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)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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", "유저의 포인트가 부족합니다."),
/**
Expand All @@ -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
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@

@Repository
public interface AdImageRepository extends JpaRepository<AdImage, Long> {
List<AdImage> findAllById(Long advertismentId);
}

0 comments on commit 1431634

Please sign in to comment.