Skip to content

Commit

Permalink
[feat] 족보 상세 조회 API 생성 (#38)
Browse files Browse the repository at this point in the history
* [feat] add @onetomany and apply @batchsize

* [feat] setting reponse dto

* [feat] implements service

* [feat] implements controller

* [feat] add fetchType Lazy and Batch

* [refac] long to Long

* [feat] add heartCount response

* [refac] reflect the code review
  • Loading branch information
PicturePark1101 authored Jul 13, 2024
1 parent 9801db5 commit 52d2097
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 3 deletions.
2 changes: 1 addition & 1 deletion server-yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,18 @@
import org.hankki.hankkiserver.api.dto.HankkiResponse;
import org.hankki.hankkiserver.api.favorite.controller.request.FavoriteDeleteRequest;
import org.hankki.hankkiserver.api.favorite.service.FavoriteCommandService;
import org.hankki.hankkiserver.api.favorite.service.command.FavoriteGetCommand;
import org.hankki.hankkiserver.api.favorite.service.command.FavoritePostCommand;
import org.hankki.hankkiserver.api.favorite.controller.request.FavoritePostRequest;
import org.hankki.hankkiserver.api.favorite.service.command.FavoritesDeleteCommand;
import org.hankki.hankkiserver.auth.UserId;
import org.hankki.hankkiserver.common.code.CommonSuccessCode;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.hankki.hankkiserver.api.favorite.service.FavoriteQueryService;
import org.hankki.hankkiserver.api.favorite.service.response.FavoriteFindResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

Expand All @@ -21,6 +26,7 @@
public class FavoriteController {

private final FavoriteCommandService favoriteCommandService;
private final FavoriteQueryService favoriteQueryService;

@PostMapping("/favorites")
public HankkiResponse<Void> createFavorite(@UserId final Long userId, @RequestBody @Valid final FavoritePostRequest request) {
Expand All @@ -35,4 +41,9 @@ public HankkiResponse<Void> deleteFavorite(@UserId final Long userId, @RequestBo
favoriteCommandService.deleteFavorites(FavoritesDeleteCommand.of(userId, request));
return HankkiResponse.success(CommonSuccessCode.NO_CONTENT);
}

@GetMapping("/favorites/{favoriteId}")
public HankkiResponse<FavoriteFindResponse> getFavorite(@UserId final Long userId, @PathVariable(name = "favoriteId") final Long favoriteId) {
return HankkiResponse.success(CommonSuccessCode.OK, favoriteQueryService.findFavorite(FavoriteGetCommand.of(userId, favoriteId)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.hankki.hankkiserver.api.favorite.service;

import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.api.auth.service.UserFinder;
import org.hankki.hankkiserver.api.favorite.service.command.FavoriteGetCommand;
import org.hankki.hankkiserver.api.favorite.service.response.FavoriteFindResponse;
import org.hankki.hankkiserver.common.code.UserErrorCode;
import org.hankki.hankkiserver.common.exception.UnauthorizedException;
import org.hankki.hankkiserver.domain.favorite.model.Favorite;
import org.hankki.hankkiserver.domain.favoritestore.model.FavoriteStore;
import org.hankki.hankkiserver.domain.user.model.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class FavoriteQueryService {

private final FavoriteFinder favoriteFinder;

@Transactional(readOnly = true)
public FavoriteFindResponse findFavorite(final FavoriteGetCommand command) {
Favorite favorite = favoriteFinder.findById(command.favoriteId());
return FavoriteFindResponse.of(favorite, favorite.getFavoriteStores().stream().map(FavoriteStore::getStore).toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.hankki.hankkiserver.api.favorite.service.command;

public record FavoriteGetCommand(
Long userId,
Long favoriteId
) {
public static FavoriteGetCommand of(final Long userId, final Long favoriteId) {
return new FavoriteGetCommand(userId, favoriteId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.hankki.hankkiserver.api.favorite.service.response;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.hankki.hankkiserver.domain.favorite.model.Favorite;
import org.hankki.hankkiserver.domain.store.model.Store;

public record FavoriteFindResponse(
String title,
List<String> details,
List<FavoriteStoreFindResponse> stores
) {

public static FavoriteFindResponse of(final Favorite favorite, final List<Store> stores) {

List<String> details = new ArrayList<>();
if (!isDetailNull(favorite.getDetail())) {
details = Arrays.asList(favorite.getDetail().split(" "));
}

return new FavoriteFindResponse(
favorite.getName(),
details,
stores.stream().map(FavoriteStoreFindResponse::of).toList());
}

public static boolean isDetailNull(String detail) {
return detail == null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.hankki.hankkiserver.api.favorite.service.response;

import org.hankki.hankkiserver.domain.store.model.Store;
import org.hankki.hankkiserver.domain.store.model.StoreCategory;

public record FavoriteStoreFindResponse(
Long id,
String name,
String imageUrl,
String category,
int lowestPrice,
int heartCount
) {

public static FavoriteStoreFindResponse of(Store store) {

return new FavoriteStoreFindResponse(
store.getId(),
store.getName(),
store.getImage(),
store.getCategory().getName(),
store.getLowestPrice(),
store.getHeartCount());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hankki.hankkiserver.domain.common.BaseTimeEntity;
import org.hankki.hankkiserver.domain.favoritestore.model.FavoriteStore;
import org.hankki.hankkiserver.domain.user.model.User;
import org.hibernate.annotations.BatchSize;

@Entity
@Getter
Expand All @@ -34,6 +35,7 @@ public class Favorite extends BaseTimeEntity {
private String image_url;

@OneToMany(mappedBy = "favorite")
@BatchSize(size = 100)
private List<FavoriteStore> favoriteStores = new ArrayList<>();

public static Favorite create(User user, String name, String detail) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package org.hankki.hankkiserver.domain.store.model;

import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hankki.hankkiserver.domain.common.BaseTimeEntity;
import org.hankki.hankkiserver.domain.common.Point;
import org.hankki.hankkiserver.domain.heart.model.Heart;

import java.util.List;
import org.hibernate.annotations.BatchSize;

@Entity
@Getter
@BatchSize(size = 100)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Store extends BaseTimeEntity {

Expand Down Expand Up @@ -45,6 +47,17 @@ public class Store extends BaseTimeEntity {
@Column(nullable = false)
private boolean isDeleted;

@OneToMany(mappedBy = "store")
@BatchSize(size = 100)
private List<StoreImage> storeImages = new ArrayList<>();

public String getImage() {
if (storeImages.isEmpty()) {
return "default.com";
}
return storeImages.get(0).getImageUrl();
}

public void decreaseHeartCount() {
this.heartCount--;
}
Expand Down

0 comments on commit 52d2097

Please sign in to comment.