Skip to content

Commit

Permalink
Merge pull request #95 from dev-hooon/feat/#86
Browse files Browse the repository at this point in the history
feat : Shop 등록 & 조회
  • Loading branch information
kkangh00n authored Jan 13, 2024
2 parents c99d105 + 9a2218e commit 7edfca4
Show file tree
Hide file tree
Showing 35 changed files with 1,007 additions and 15 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ out/
### VS Code ###
.vscode/
application.yaml
.DS_Store
.DS_Store
src/main/generated/**
21 changes: 21 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,30 @@ dependencies {

implementation group: 'org.json', name: 'json', version: '20231013'

//Query Dsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'

annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

//Query Dsl
def querydslDir = "src/main/generated"

sourceSets {
main.java.srcDirs += [querydslDir]
}

tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

clean.doLast {
file(querydslDir).deleteDir()
}
//Query Dsl

tasks.named('test') {
useJUnitPlatform()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public enum ErrorCode {

ALREADY_EXIST_OWNER("이미 존재하는 점주입니다"),
INVALID_EMAIL_OR_PASSWORD("이메일 혹은 비밀번호를 확인해주세요"),
INVALID_INPUT_TYPE("성별 타입을 양식대로 입력해주세요");
INVALID_INPUT_TYPE("입력 값을 양식대로 입력해주세요");

private final String message;
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,12 @@
@Slf4j
public class NotificationService {

@Value("${slack.token}")
private String slackToken;

private final NotificationMemberRepository notificationMemberRepository;
private final NotificationOwnerRepository notificationOwnerRepository;
private final MemberRepository memberRepository; // 추후 삭제 예정
private final OwnerRepository ownerRepository; // 추후 삭제 예정
@Value("${slack.token}")
private String slackToken;
private JSONObject jsonObject;

public void sendMessageAndSave(Member member, String content) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.prgrms.catchtable.reservation.repository;

import com.prgrms.catchtable.reservation.domain.ReservationTime;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -15,4 +16,7 @@ public interface ReservationTimeRepository extends JpaRepository<ReservationTime
@Query("select rt from ReservationTime rt where rt.id = :reservationTimeId and rt.shop.id = :shopId")
Optional<ReservationTime> findByIdAndShopId(@Param("reservationTimeId") Long reservationTimeId,
@Param("shopId") Long shopId);

@Query("select rt from ReservationTime rt where rt.shop.id = :shopId")
List<ReservationTime> findByShopId(@Param("shopId") Long shopId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.prgrms.catchtable.shop.controller;

import com.prgrms.catchtable.shop.dto.request.ShopSearchCondition;
import com.prgrms.catchtable.shop.dto.response.GetAllShopResponses;
import com.prgrms.catchtable.shop.dto.response.GetShopResponse;
import com.prgrms.catchtable.shop.service.MemberShopService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/shops")
public class MemberShopController {

private final MemberShopService memberShopService;

@GetMapping
public ResponseEntity<GetAllShopResponses> getAll() {
return ResponseEntity.ok(memberShopService.getAll());
}

@GetMapping("/{shopId}")
public ResponseEntity<GetShopResponse> getById(@PathVariable("shopId") Long id) {
return ResponseEntity.ok(memberShopService.getById(id));
}

@GetMapping("/search")
public ResponseEntity<GetAllShopResponses> getBySearch(
@ModelAttribute ShopSearchCondition condition) {
return ResponseEntity.ok(memberShopService.getBySearch(condition));
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.prgrms.catchtable.shop.controller;

import com.prgrms.catchtable.common.login.LogIn;
import com.prgrms.catchtable.owner.domain.Owner;
import com.prgrms.catchtable.shop.dto.request.RegisterShopRequest;
import com.prgrms.catchtable.shop.dto.response.RegisterShopResponse;
import com.prgrms.catchtable.shop.service.OwnerShopService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/owners")
public class OwnerShopController {

private final OwnerShopService shopService;

@PostMapping("/shops")
public ResponseEntity<RegisterShopResponse> registerShop(
@Valid @RequestBody RegisterShopRequest request, @LogIn
Owner owner) {
RegisterShopResponse registerShopResponse = shopService.registerShop(request, owner);
return ResponseEntity.status(HttpStatus.CREATED).body(registerShopResponse);
}

}
17 changes: 16 additions & 1 deletion src/main/java/com/prgrms/catchtable/shop/domain/Category.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.prgrms.catchtable.shop.domain;

import static com.prgrms.catchtable.common.exception.ErrorCode.*;

import com.prgrms.catchtable.common.exception.ErrorCode;
import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException;
import java.util.Arrays;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

Expand All @@ -11,6 +16,16 @@ public enum Category {
CHINESE_FOOD("중식"),
WESTERN_FOOD("양식");

private final String description;
private final String type;

public static Category of(String input) {
return Arrays.stream(values())
.filter(category -> category.isEqual(input))
.findAny()
.orElseThrow(() -> new BadRequestCustomException(INVALID_INPUT_TYPE));
}

private boolean isEqual(String input) {
return type.equals(input);
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/prgrms/catchtable/shop/domain/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,8 @@ public Menu(String name, int price, String description) {
this.price = price;
this.description = description;
}

public void insertShop(Shop shop) {
this.shop = shop;
}
}
15 changes: 15 additions & 0 deletions src/main/java/com/prgrms/catchtable/shop/domain/Shop.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,30 @@
package com.prgrms.catchtable.shop.domain;

import static com.prgrms.catchtable.common.exception.ErrorCode.SHOP_NOT_RUNNING;
import static jakarta.persistence.CascadeType.*;
import static jakarta.persistence.EnumType.STRING;
import static jakarta.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;

import com.prgrms.catchtable.common.BaseEntity;
import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException;
import com.prgrms.catchtable.reservation.domain.ReservationTime;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.BatchSize;

@Getter
@NoArgsConstructor(access = PROTECTED)
Expand Down Expand Up @@ -51,6 +58,9 @@ public class Shop extends BaseEntity {
@Column(name = "closing_time")
private LocalTime closingTime;

@BatchSize(size = 30)
@OneToMany(mappedBy = "shop", cascade = ALL, orphanRemoval = true)
List<Menu> menuList = new ArrayList<>();

@Builder
public Shop(String name, BigDecimal rating, Category category, Address address, int capacity,
Expand All @@ -64,6 +74,11 @@ public Shop(String name, BigDecimal rating, Category category, Address address,
this.closingTime = closingTime;
}

public void updateMenuList(List<Menu> menuList){
this.menuList.addAll(menuList);
this.menuList.forEach(menu -> menu.insertShop(this));
}

public void validateIfShopOpened(LocalTime localTime) {
if (localTime.isBefore(openingTime) || localTime.isAfter(closingTime)) {
throw new BadRequestCustomException(SHOP_NOT_RUNNING);
Expand Down
129 changes: 129 additions & 0 deletions src/main/java/com/prgrms/catchtable/shop/dto/ShopMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package com.prgrms.catchtable.shop.dto;

import com.prgrms.catchtable.reservation.domain.ReservationTime;
import com.prgrms.catchtable.shop.domain.Address;
import com.prgrms.catchtable.shop.domain.Category;
import com.prgrms.catchtable.shop.domain.Menu;
import com.prgrms.catchtable.shop.domain.Shop;
import com.prgrms.catchtable.shop.dto.request.RegisterShopRequest;
import com.prgrms.catchtable.shop.dto.response.GetAllShopResponse;
import com.prgrms.catchtable.shop.dto.response.GetAllShopResponses;
import com.prgrms.catchtable.shop.dto.response.GetShopResponse;
import com.prgrms.catchtable.shop.dto.response.MenuResponse;
import com.prgrms.catchtable.shop.dto.response.RegisterShopResponse;
import com.prgrms.catchtable.shop.dto.response.ReservationTimeResponse;
import java.util.List;

public class ShopMapper {

public static Shop toEntity(RegisterShopRequest registerShopRequest) {
List<Menu> menuList = registerShopRequest.menuRequestList()
.stream()
.map(menu -> Menu.builder()
.name(menu.name())
.price(menu.price())
.description(menu.description())
.build())
.toList();

Shop registerShop = Shop.builder()
.name(registerShopRequest.name())
.rating(registerShopRequest.rating())
.category(Category.of(registerShopRequest.category()))
.address(Address.builder()
.city(registerShopRequest.city())
.district(registerShopRequest.district())
.build())
.capacity(registerShopRequest.capacity())
.openingTime(registerShopRequest.openingTime())
.closingTime(registerShopRequest.closingTime())
.build();
registerShop.updateMenuList(menuList);
return registerShop;
}

public static RegisterShopResponse toRegisterShopResponse(Shop shop,
List<ReservationTime> reservationTimeList) {

List<ReservationTimeResponse> timeResponses = reservationTimeList.stream()
.map(time -> ReservationTimeResponse.builder()
.id(time.getId())
.reservationTime(time.getTime())
.build())
.toList();

List<MenuResponse> menuResponses = shop.getMenuList()
.stream()
.map(menu -> MenuResponse.builder()
.id(menu.getId())
.name(menu.getName())
.price(menu.getPrice())
.description(menu.getDescription())
.build()
)
.toList();

return RegisterShopResponse.builder()
.id(shop.getId())
.name(shop.getName())
.rating(shop.getRating())
.category(shop.getCategory().getType())
.city(shop.getAddress().getCity())
.district(shop.getAddress().getDistrict())
.capacity(shop.getCapacity())
.openingTime(shop.getOpeningTime())
.closingTime(shop.getClosingTime())
.reservationTimeResponseList(timeResponses)
.menuResponseList(menuResponses)
.build();
}

public static GetAllShopResponses toGetAllShopResponses(List<Shop> shops) {
return new GetAllShopResponses(shops.stream()
.map(ShopMapper::toGetAllShopResponse)
.toList());
}

private static GetAllShopResponse toGetAllShopResponse(Shop shop) {
return GetAllShopResponse.builder()
.id(shop.getId())
.name(shop.getName())
.openingTime(shop.getOpeningTime())
.closingTime(shop.getClosingTime())
.build();
}

public static GetShopResponse toGetShopResponse(Shop shop, List<ReservationTime> reservationTimeList) {

List<MenuResponse> menuResponses = shop.getMenuList().stream()
.map(menu -> MenuResponse.builder()
.id(menu.getId())
.name(menu.getName())
.price(menu.getPrice())
.description(menu.getDescription())
.build())
.toList();

List<ReservationTimeResponse> timeResponses = reservationTimeList.stream()
.map(time -> ReservationTimeResponse.builder()
.id(time.getId())
.reservationTime(time.getTime())
.build())
.toList();

return GetShopResponse.builder()
.id(shop.getId())
.name(shop.getName())
.rating(shop.getRating())
.category(shop.getCategory().getType())
.city(shop.getAddress().getCity())
.district(shop.getAddress().getDistrict())
.capacity(shop.getCapacity())
.openingTime(shop.getOpeningTime())
.closingTime(shop.getClosingTime())
.reservationTimeResponseList(timeResponses)
.menuResponseList(menuResponses)
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.prgrms.catchtable.shop.dto.request;

public record RegisterMenuRequest(
String name,
int price,
String description
) {

}
Loading

0 comments on commit 7edfca4

Please sign in to comment.