Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 점주 음식 상품 게시 #51

Merged
merged 78 commits into from
Aug 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
c487fd5
[feat] 기능 요구사항에 맞게 Store 도메인 엔티티의 인스턴스 필드 반영
june-777 Aug 11, 2024
5daebb3
[feat] 가게 이름 검증 기능
june-777 Aug 11, 2024
f86bafe
[feat] 가게 주소 검증 기능
june-777 Aug 11, 2024
999e0f4
[feat] 가게 최소 주문 금액 검증 기능
june-777 Aug 11, 2024
a962988
[feat] 가게 이용 시간 검증 기능
june-777 Aug 11, 2024
328e78f
[feat] 가게 주소 임베디드 타입 정의
june-777 Aug 11, 2024
48c2e7f
[feat] 가게 이용 시간 임베디드 타입 정의
june-777 Aug 11, 2024
d3a40f4
[feat] 가게 카테고리 도메인 엔티티 정의
june-777 Aug 11, 2024
6df364c
[feat] 시간 정보를 제공하는 DateTimeProvider 인터페이스 정의
june-777 Aug 11, 2024
4a7be13
[feat] 고정 시간을 반환하는 DateTimeProvider 테스트용 구현체
june-777 Aug 11, 2024
835ad62
[feat] 현재 시간을 반환하는 DateTimeProvider 프로덕션용 구현체
june-777 Aug 11, 2024
fe3110f
[feat] DateTimeProvider 구현체인 CurrentDateTime 를 Bean 객체로 설정
june-777 Aug 11, 2024
1e8885a
[test] Store 도메인 객체 생성 테스트 - 가게 최소 주문 가격
june-777 Aug 11, 2024
aa47da4
[test] Store 도메인 객체 생성 테스트 - 가게 이용 시간
june-777 Aug 11, 2024
7791f9a
[test] Store 도메인 객체 생성 테스트 - 가게 이름
june-777 Aug 11, 2024
2999605
[feat] Store (가게) 도메인 관련 커스텀 예외 정의
june-777 Aug 11, 2024
6a4f101
[feat] 가게 카테고리 생성자 추가
june-777 Aug 11, 2024
c766739
[feat] StoreRepository JPA 인터페이스 정의
june-777 Aug 11, 2024
bc5b954
[test] StoreRepository 가게 저장 기능 테스트
june-777 Aug 11, 2024
bdef77a
[feat] StoreCategoryRepository JPA 인터페이스 정의
june-777 Aug 11, 2024
3575f1d
[test] 가게 카테고리 이름으로 조회하는 기능 테스트
june-777 Aug 11, 2024
df6a123
[feat] VendorRepository JPA 인터페이스 정의
june-777 Aug 11, 2024
3f2609e
[feat] 가게 생성을 담당하는 서비스 클래스 구현
june-777 Aug 11, 2024
3224a6d
[feat] 가게 등록 요청 DTO
june-777 Aug 11, 2024
9b7911c
[test] 가게 등록 서비스 메서드 단위 테스트
june-777 Aug 11, 2024
790b465
[fix] Order 엔티티의 테이블 이름을 Orders 로 명시
june-777 Aug 11, 2024
9c4a77d
[feat] 인메모리 H2 DB 및 jpa yaml 설정
june-777 Aug 11, 2024
680283f
[refactor] 불필요한 static 키워드 제거
june-777 Aug 11, 2024
876e3fb
[refactor] 가게 등록 요청 DTO 패키지 이동
june-777 Aug 11, 2024
020ffbf
[feat] 가게와 관련된 예외를 명시하는 ErrorCode Enum 정의
june-777 Aug 11, 2024
1f697f5
[refactor] StoreException 을 생성할 때, 가게 관련 ErrorCode Enum 을 생성자 매개변수로 사…
june-777 Aug 11, 2024
3e5a748
[test] 가게 등록 서비스 예외 검증을 예외 메시지로 구체적인 검증
june-777 Aug 11, 2024
bd08a15
[test] 가게 생성 예외 검증을 예외 메시지로 구체적인 검증
june-777 Aug 11, 2024
4160efd
[fix] Long, LocalDateTime 데이터 타입에 대한 Bean Validation 수정
june-777 Aug 11, 2024
fc53788
[feat] Store 가게 API 컨트롤러 구현
june-777 Aug 11, 2024
6ae068b
[feat] Store 예외 핸들러 구현
june-777 Aug 11, 2024
8822290
[test] Store 가게 API 컨트롤러 단위 테스트
june-777 Aug 11, 2024
03dd390
[feat] 메뉴카테고리 엔티티 설계
june-777 Aug 12, 2024
5c9e3db
[feat] 음식 상품이 이미지를 반드시 갖도록 Nullable 제약조건 false 로 변경
june-777 Aug 12, 2024
eb2b17d
[feat] 메뉴 도메인 Null 값 검증 기능
june-777 Aug 13, 2024
66284d7
[feat] 메뉴 도메인 빈 문자열, 공백 문자열 검증 기능
june-777 Aug 13, 2024
2333c79
[feat] 메뉴 이름 길이 검증 기능
june-777 Aug 13, 2024
f1adbff
[feat] 메뉴 가격 검증 기능
june-777 Aug 13, 2024
122b5e7
[feat] 메뉴 도메인 생성자 및 검증 기능 추가
june-777 Aug 13, 2024
211b1ab
[test] Menu 도메인 객체 생성 테스트 - 가게 Null 값
june-777 Aug 13, 2024
3ecd00f
[test] Menu 도메인 객체 생성 테스트 - 메뉴카테고리 Null 값
june-777 Aug 13, 2024
c0025dd
[test] Menu 도메인 객체 생성 테스트 - 메뉴 이름
june-777 Aug 13, 2024
b6976d4
[test] Menu 도메인 객체 생성 테스트 - 메뉴 가격
june-777 Aug 13, 2024
976227b
[test] Menu 도메인 객체 생성 테스트 - 메뉴 사진 url
june-777 Aug 13, 2024
8862d1a
[feat] 메뉴카테고리 도메인 Null 값 검증 기능
june-777 Aug 13, 2024
4b15f8a
[feat] 메뉴카테고리 도메인 빈 문자열, 공백 문자열 검증 기능
june-777 Aug 13, 2024
5ac5d9a
[feat] 메뉴카테고리 이름 길이 검증 기능
june-777 Aug 13, 2024
5303c20
[feat] 메뉴카테고리 생성자에 검증 기능 추가
june-777 Aug 13, 2024
e24502d
[feat] 메뉴카테고리 객체 생성 실패 커스텀 예외
june-777 Aug 13, 2024
0b17749
[feat] 메뉴 객체 생성 실패 커스텀 예외
june-777 Aug 13, 2024
7e8e953
[test] MenuCategory 도메인 객체 생성 테스트 - 가게 Null 값
june-777 Aug 13, 2024
b4b3151
[test] MenuCategory 도메인 객체 생성 테스트 - 이름
june-777 Aug 13, 2024
f941ff9
[feat] 점주 ID 기반으로 매장을 조회하는 시그니쳐 추가
june-777 Aug 13, 2024
41ffcc2
[test] 점주 ID 기반으로 매장을 조회하는 기능 테스트
june-777 Aug 13, 2024
afee60d
[feat] MenuCategoryRepository JPA 인터페이스 정의
june-777 Aug 13, 2024
c2a035e
[test] 가게ID와 메뉴카테고리 이름으로 메뉴카테고리를 조회하는 기능 테스트
june-777 Aug 13, 2024
c430e05
[feat] MenuRepository JPA 인터페이스 정의
june-777 Aug 13, 2024
6190a3e
[feat] 메뉴 카테고리를 찾을 수 없는 커스텀 예외
june-777 Aug 13, 2024
febd529
[feat] 가게를 찾을 수 없는 커스텀 예외
june-777 Aug 13, 2024
ab5a12d
[feat] @Getter 롬복 추가
june-777 Aug 13, 2024
29f410a
[feat] 가게 메뉴 등록 요청 DTO
june-777 Aug 13, 2024
6b0236f
[feat] 가게 메뉴 등록 서비스
june-777 Aug 13, 2024
8173034
[test] 가게 메뉴 등록 서비스 테스트
june-777 Aug 13, 2024
7e60602
[feat] Vendor @Getter 롬복 추가 및 라인 정리
june-777 Aug 13, 2024
2f11b07
Merge remote-tracking branch 'origin/main' into feature/june-777_점주음식…
june-777 Aug 14, 2024
d88f38c
[test] merge 과정에서 깨지는 테스트코드 수정 및 테스트
june-777 Aug 14, 2024
f2de80c
[feat] 가게 메뉴 등록 요청 Bean Validation 예외 메시지 구체화
june-777 Aug 14, 2024
3c1ef85
[feat] Store 객체 생성 검증 조건 추가 - Null 체크
june-777 Aug 14, 2024
70f5dfe
[test] 기존 테스트 코드의 Store 객체 생성자에 null 제거 및 테스트
june-777 Aug 14, 2024
6af2250
[feat] 가게 메뉴 등록 요청 DTO에 가게 ID 추가
june-777 Aug 14, 2024
a8fc0a8
[fix] 가게 ID로 가게를 조회하도록 수정
june-777 Aug 14, 2024
c7eb036
[feat] 가게의 점주와 동일한지 검증하는 기능
june-777 Aug 14, 2024
d3ec39c
[feat] 가게의 점주와 동일하지 않을 때 발생하는 커스텀 예외
june-777 Aug 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions src/main/java/camp/woowak/lab/menu/domain/Menu.java
june-777 marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,18 +1,49 @@
package camp.woowak.lab.menu.domain;

import camp.woowak.lab.store.domain.Store;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Menu {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "store_id", nullable = false)
private Store store;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "menu_category_id", nullable = false)
private MenuCategory menuCategory;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private Integer price;

@Column(nullable = false)
private String imageUrl;

public Menu(Store store, MenuCategory menuCategory, String name, Integer price, String imageUrl) {
MenuValidator.validate(store, menuCategory, name, price, imageUrl);
this.store = store;
this.menuCategory = menuCategory;
this.name = name;
this.price = price;
this.imageUrl = imageUrl;
}

}
36 changes: 36 additions & 0 deletions src/main/java/camp/woowak/lab/menu/domain/MenuCategory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package camp.woowak.lab.menu.domain;

import camp.woowak.lab.store.domain.Store;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class MenuCategory {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "store_id", nullable = false)
private Store store;

@Column(nullable = false)
private String name;

public MenuCategory(Store store, String name) {
MenuCategoryValidator.validate(store, name);
this.store = store;
this.name = name;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package camp.woowak.lab.menu.domain;

import camp.woowak.lab.menu.exception.InvalidMenuCategoryCreationException;
import camp.woowak.lab.store.domain.Store;

public class MenuCategoryValidator {

private static final int MAX_NAME_LENGTH = 10;

public static void validate(final Store store, final String name) {
validateNotNull(store, name);
validateNotBlank(name);
validateNameLength(name);
}

private static void validateNotNull(final Object... targets) {
for (Object target : targets) {
if (target == null) {
throw new InvalidMenuCategoryCreationException(target + "은 Null 이 될 수 없습니다.");
}
}
}

private static void validateNotBlank(final String... targets) {
for (String target : targets) {
if (target.isBlank()) {
throw new InvalidMenuCategoryCreationException(target + "은 빈 문자열이거나 공백 문자열이 포함될 수 없습니다.");
}
}
}

private static void validateNameLength(final String name) {
if (name.length() > MAX_NAME_LENGTH) {
throw new InvalidMenuCategoryCreationException("메뉴 카테고리 이름은 " + MAX_NAME_LENGTH + "글자까지 가능합니다.");
}
}

}
46 changes: 46 additions & 0 deletions src/main/java/camp/woowak/lab/menu/domain/MenuValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package camp.woowak.lab.menu.domain;

import camp.woowak.lab.menu.exception.InvalidMenuCreationException;
import camp.woowak.lab.store.domain.Store;

public class MenuValidator {

private static final int MAX_NAME_LENGTH = 10;

public static void validate(final Store store, final MenuCategory menuCategory, final String name,
final Integer price, final String imageUrl) {
validateNotNull(store, menuCategory, name, price, imageUrl);
validateNotBlank(name, imageUrl);
validateNameLength(name);
validatePriceNegative(price);
}

private static void validateNotNull(final Object... targets) {
for (Object target : targets) {
if (target == null) {
throw new InvalidMenuCreationException(target + "은 Null 이 될 수 없습니다.");
}
}
}

private static void validateNotBlank(final String... targets) {
for (String target : targets) {
if (target.isBlank()) {
throw new InvalidMenuCreationException(target + "은 빈 문자열이거나 공백 문자열이 포함될 수 없습니다.");
}
}
}

private static void validateNameLength(final String name) {
if (name.length() > MAX_NAME_LENGTH) {
throw new InvalidMenuCreationException("메뉴 이름은 " + MAX_NAME_LENGTH + "글자까지 가능합니다.");
}
}

private static void validatePriceNegative(final Integer price) {
if (price <= 0) {
throw new InvalidMenuCreationException("메뉴의 가격은 양수만 가능합니다");
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package camp.woowak.lab.menu.exception;

// TODO: extends CustomException
public class InvalidMenuCategoryCreationException extends RuntimeException {

public InvalidMenuCategoryCreationException(String message) {
super(message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package camp.woowak.lab.menu.exception;

// TODO: extends CustomException
public class InvalidMenuCreationException extends RuntimeException {

public InvalidMenuCreationException(String message) {
super(message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package camp.woowak.lab.menu.exception;

// TODO: extends CustomException
public class NotFoundMenuCategoryException extends RuntimeException {

public NotFoundMenuCategoryException(String message) {
super(message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package camp.woowak.lab.menu.repository;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;

import camp.woowak.lab.menu.domain.MenuCategory;

public interface MenuCategoryRepository extends JpaRepository<MenuCategory, Long> {

Optional<MenuCategory> findByStoreIdAndName(Long storeId, String name);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package camp.woowak.lab.menu.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import camp.woowak.lab.menu.domain.Menu;

public interface MenuRepository extends JpaRepository<Menu, Long> {
}
13 changes: 10 additions & 3 deletions src/main/java/camp/woowak/lab/store/domain/Store.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.time.LocalDateTime;

import camp.woowak.lab.store.exception.NotEqualsOwnerException;
import camp.woowak.lab.vendor.domain.Vendor;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
Expand All @@ -14,10 +15,12 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToOne;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Store {

@Id
Expand All @@ -35,8 +38,6 @@ public class Store {
@Column(nullable = false)
private String name;

// TODO: 위치 정보에 대한 요구사항 논의 후 수정 예정.
// i.g) 송파구로 특정, 도시 정보로 특정 등 요구사항이 정의되어야 엔티티 설계를 진행할 수 있음
@Embedded
private StoreAddress storeAddress;

Expand All @@ -52,7 +53,7 @@ public class Store {
public Store(Vendor owner, StoreCategory storeCategory, String name, String address, String phoneNumber,
Integer minOrderPrice, LocalDateTime startTime, LocalDateTime endTime
) {
StoreValidator.validate(name, address, minOrderPrice, startTime, endTime);
StoreValidator.validate(owner, storeCategory, name, address, minOrderPrice, startTime, endTime);
this.owner = owner;
this.storeCategory = storeCategory;
this.name = name;
Expand All @@ -62,4 +63,10 @@ public Store(Vendor owner, StoreCategory storeCategory, String name, String addr
this.storeTime = new StoreTime(startTime, endTime);
}

public void validateOwner(Vendor owner) {
if (!this.owner.equals(owner)) {
throw new NotEqualsOwnerException("가게의 점주가 일치하지 않습니다." + this.owner + ", " + owner);
}
}

}
14 changes: 12 additions & 2 deletions src/main/java/camp/woowak/lab/store/domain/StoreValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.time.LocalDateTime;

import camp.woowak.lab.store.exception.StoreException;
import camp.woowak.lab.vendor.domain.Vendor;

public class StoreValidator {

Expand All @@ -15,24 +16,33 @@ public class StoreValidator {
private static final int MIN_NAME_LENGTH = 2;
private static final int MAX_NAME_LENGTH = 10;

public static void validate(final String name, final String address, final Integer minOrderPrice,
public static void validate(final Vendor owner, StoreCategory storeCategory, final String name,
final String address, final Integer minOrderPrice,
final LocalDateTime startTime, final LocalDateTime endTime
) {
validateNotNull(owner, storeCategory, name, address, minOrderPrice, startTime, endTime);
validateName(name);
validateAddress(address);
validateMinOrderPrice(minOrderPrice);
validateUnitOrderPrice(minOrderPrice);
validateTime(startTime, endTime);
}

private static void validateNotNull(Object... targets) {
for (Object target : targets) {
if (target == null) {
throw new StoreException(NULL_EXIST);
}
}
}

private static void validateName(final String name) {
if (MIN_NAME_LENGTH <= name.length() && name.length() <= MAX_NAME_LENGTH) {
return;
}
throw new StoreException(INVALID_NAME_RANGE);
}

// TODO: 가게 위치 비즈니스 요구사항 구체화하면, 주소 검증 로직 수정 예정
private static void validateAddress(final String address) {
if (StoreAddress.DEFAULT_DISTRICT.equals(address)) {
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package camp.woowak.lab.store.exception;

public class NotEqualsOwnerException extends RuntimeException {

public NotEqualsOwnerException(String message) {
super(message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package camp.woowak.lab.store.exception;

// TODO: 404Exception 상속하도록 수정
public class NotFoundStoreException extends RuntimeException {

public NotFoundStoreException(String message) {
super(message);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public StoreException(final ErrorCode errorCode) {
@Getter
public enum ErrorCode {

NULL_EXIST("NULL 값이 존재합니다."),
INVALID_NAME_RANGE("가게 이름은 2글자 ~ 10글자 이어야합니다."),

INVALID_ADDRESS("가게 주소는 송파구만 가능합니다."),
Expand Down
Loading