Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,5 @@ out/
### VS Code ###
.vscode/

application.yml
**/src/main/resources/application.yml
logs
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ dependencies {

testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'com.squareup.okhttp3:mockwebserver'
testImplementation 'org.testcontainers:testcontainers:1.19.3'
testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
testImplementation 'org.testcontainers:mysql'
}

clean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import java.util.List;
import java.util.Optional;

import in.koreatech.koin.domain.order.cart.exception.CartAccessDeniedException;
import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenu;
import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenuOption;
import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenuPrice;
import in.koreatech.koin.domain.order.shop.model.entity.shop.OrderableShop;
import in.koreatech.koin.domain.user.model.User;
import in.koreatech.payment.common.model.BaseEntity;
Expand All @@ -22,6 +24,7 @@
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

Expand All @@ -47,9 +50,45 @@ public class Cart extends BaseEntity {
@OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, orphanRemoval = true)
List<CartMenuItem> cartMenuItems = new ArrayList<>();

@Builder
private Cart(
User user,
OrderableShop orderableShop
) {
this.user = user;
this.orderableShop = orderableShop;
}

public Integer calculateItemsAmount() {
return this.cartMenuItems.stream()
.mapToInt(CartMenuItem::calculateTotalAmount)
.sum();
}

// TODO. 코인 서버와 동일 로직으로 변경
public void addItem(OrderableShopMenu menu, OrderableShopMenuPrice price, List<OrderableShopMenuOption> options,
Integer quantity) {
// 장바구니에 옵션 까지 전부 동일한 메뉴가 이미 존재 하는 경우, 담긴 상품 수량 증가
Optional<CartMenuItem> existingItem = findSameItem(menu, price, options);

if (existingItem.isPresent()) {
existingItem.get().increaseQuantity(quantity);
} else {
this.cartMenuItems.add(CartMenuItem.builder()
.cart(this)
.orderableShopMenu(menu)
.orderableShopMenuPrice(price)
.quantity(quantity)
.isModified(false)
.build()
);
}
}

private Optional<CartMenuItem> findSameItem(OrderableShopMenu menu, OrderableShopMenuPrice price,
List<OrderableShopMenuOption> options) {
return this.cartMenuItems.stream()
.filter(item -> item.isSameItem(menu, price, options))
.findFirst();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.List;

import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenu;
import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenuOption;
import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenuPrice;
import in.koreatech.payment.common.model.BaseEntity;
import jakarta.persistence.CascadeType;
Expand Down Expand Up @@ -55,11 +56,55 @@ public class CartMenuItem extends BaseEntity {
@OneToMany(mappedBy = "cartMenuItem", cascade = CascadeType.ALL, orphanRemoval = true)
private List<CartMenuItemOption> cartMenuItemOptions = new ArrayList<>();

@Builder
private CartMenuItem(
Cart cart,
OrderableShopMenu orderableShopMenu,
OrderableShopMenuPrice orderableShopMenuPrice,
Integer quantity,
Boolean isModified
) {
this.cart = cart;
this.orderableShopMenu = orderableShopMenu;
this.orderableShopMenuPrice = orderableShopMenuPrice;
this.quantity = quantity;
this.isModified = isModified;
}

public Integer calculateTotalAmount() {
int totalOptionPrice = this.cartMenuItemOptions.stream()
.mapToInt(CartMenuItemOption::getOptionPrice)
.sum();

return (this.orderableShopMenuPrice.getPrice() + totalOptionPrice) * this.quantity;
}

public void increaseQuantity(Integer amount) {
this.quantity += amount;
}

public boolean isSameItem(OrderableShopMenu menu, OrderableShopMenuPrice price, List<OrderableShopMenuOption> options) {
// 메뉴와 가격 ID가 다른 경우
if (!this.orderableShopMenu.getId().equals(menu.getId()) || !this.orderableShopMenuPrice.getId().equals(price.getId())) {
return false;
}

// 선택한 옵션의 개수가 다른 경우
if (this.cartMenuItemOptions.size() != options.size()) {
return false;
}

// 선택한 옵션의 구성이 다른 경우 (정렬 후 비교)
List<Integer> existingOptionIds = this.cartMenuItemOptions.stream()
.map(opt -> opt.getOrderableShopMenuOption().getId())
.sorted()
.toList();

List<Integer> newOptionIds = options.stream()
.map(OrderableShopMenuOption::getId)
.sorted()
.toList();

return existingOptionIds.equals(newOptionIds);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@ default Cart getCartByUserId(Integer userId) {
}

void deleteByUserId(Integer userId);

Cart save(Cart cart);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package in.koreatech.koin.domain.order.repository;

import java.util.List;

import org.springframework.data.repository.Repository;

import in.koreatech.koin.domain.order.model.PaymentCancel;

public interface PaymentCancelRepository extends Repository<PaymentCancel, Integer> {

void saveAll(Iterable<PaymentCancel> paymentCancels);

List<PaymentCancel> findAllByPaymentId(Integer paymentId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,25 @@ public class OrderableShopMenu extends BaseEntity {

@OneToMany(mappedBy = "menu", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderableShopMenuImage> menuImages = new ArrayList<>();

@Builder
private OrderableShopMenu(
OrderableShop orderableShop,
String name,
String description,
Boolean isSoldOut,
Boolean isDeleted,
List<OrderableShopMenuOptionGroupMap> menuOptionGroupMap,
List<OrderableShopMenuPrice> menuPrices,
List<OrderableShopMenuImage> menuImages
) {
this.orderableShop = orderableShop;
this.name = name;
this.description = description;
this.isSoldOut = isSoldOut;
this.isDeleted = isDeleted;
this.menuOptionGroupMap = menuOptionGroupMap;
this.menuPrices = menuPrices;
this.menuImages = menuImages;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

Expand Down Expand Up @@ -41,4 +42,17 @@ public class OrderableShopMenuPrice extends BaseEntity {

@Column(name = "is_deleted", nullable = false)
private Boolean isDeleted = false;

@Builder
private OrderableShopMenuPrice(
OrderableShopMenu menu,
String name,
Integer price,
Boolean isDeleted
) {
this.menu = menu;
this.name = name;
this.price = price;
this.isDeleted = isDeleted;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,23 @@ public class OrderableShop extends BaseEntity {
public Integer calculateDeliveryFee(Integer orderAmount) {
return this.shop.getBaseDeliveryTips().calculateDeliveryTip(orderAmount);
}

@Builder
private OrderableShop(
Shop shop,
boolean delivery,
boolean takeout,
boolean serviceEvent,
Integer minimumOrderAmount,
boolean isDeleted,
List<OrderableShopMenuGroup> menuGroups
) {
this.shop = shop;
this.delivery = delivery;
this.takeout = takeout;
this.serviceEvent = serviceEvent;
this.minimumOrderAmount = minimumOrderAmount;
this.isDeleted = isDeleted;
this.menuGroups = menuGroups;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

Expand All @@ -38,4 +39,15 @@ public class ShopOperation {

@Column(name = "is_deleted", nullable = false)
private boolean isDeleted = false;

@Builder
private ShopOperation(
Shop shop,
boolean isOpen,
boolean isDeleted
) {
this.shop = shop;
this.isOpen = isOpen;
this.isDeleted = isDeleted;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package in.koreatech.koin.domain.order.shop.repository.menu;

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

import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenuPrice;

public interface OrderableShopMenuPriceRepository extends JpaRepository<OrderableShopMenuPrice, Integer> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package in.koreatech.koin.domain.order.shop.repository.menu;

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

import in.koreatech.koin.domain.order.shop.model.entity.menu.OrderableShopMenu;

public interface OrderableShopMenuRepository extends JpaRepository<OrderableShopMenu, Integer> {
}
78 changes: 78 additions & 0 deletions src/main/java/in/koreatech/koin/domain/owner/model/Owner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package in.koreatech.koin.domain.owner.model;

import static jakarta.persistence.CascadeType.ALL;
import static jakarta.persistence.CascadeType.MERGE;
import static jakarta.persistence.CascadeType.PERSIST;
import static jakarta.persistence.CascadeType.REMOVE;
import static lombok.AccessLevel.PROTECTED;

import java.util.ArrayList;
import java.util.List;

import in.koreatech.koin.domain.user.model.User;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.MapsId;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@NoArgsConstructor(access = PROTECTED)
@Table(name = "owners")
public class Owner {

@Id
@Column(name = "user_id", nullable = false)
private Integer id;

@MapsId
@OneToOne(cascade = ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;

@NotNull
@Size(max = 12)
@Column(name = "company_registration_number", nullable = false, unique = true, length = 12)
private String companyRegistrationNumber;

@Column(name = "grant_shop", columnDefinition = "TINYINT")
private boolean grantShop;

@Column(name = "grant_event", columnDefinition = "TINYINT")
private boolean grantEvent;

@NotNull
@Size(max = 11)
@Column(name = "account", nullable = false, unique = true, length = 11)
private String account;

@OneToMany(cascade = {PERSIST, MERGE, REMOVE}, orphanRemoval = true)
@JoinColumn(name = "owner_id", updatable = false)
private List<OwnerAttachment> attachments = new ArrayList<>();

@Builder
private Owner(
User user,
String companyRegistrationNumber,
List<OwnerAttachment> attachments,
Boolean grantShop,
Boolean grantEvent,
String account
) {
this.user = user;
this.companyRegistrationNumber = companyRegistrationNumber;
this.attachments = attachments;
this.grantShop = grantShop;
this.grantEvent = grantEvent;
this.account = account;
}
}
Loading
Loading