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

WMS-2 | 입고 등록 API 개발 #2

Merged
merged 9 commits into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
3.inner class to upper level.
  • Loading branch information
이중석/백엔드개발팀 committed Jul 31, 2023
commit e4a95f17cd7f44f38cba44f0d1bb2435b33cacc5
55 changes: 55 additions & 0 deletions src/main/java/com/ejoongseok/wmslive/inbound/domain/Inbound.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.ejoongseok.wmslive.inbound.domain;

import lombok.Getter;
import org.springframework.util.Assert;

import java.time.LocalDateTime;
import java.util.List;

public class Inbound {
private final String title;
private final String description;
private final LocalDateTime orderRequestedAt;
private final LocalDateTime estimatedArrivalAt;
private final List<InboundItem> inboundItems;

@Getter
private Long id;

public Inbound(
final String title,
final String description,
final LocalDateTime orderRequestedAt,
final LocalDateTime estimatedArrivalAt,
final List<InboundItem> inboundItems) {
validateConstructor(
title,
description,
orderRequestedAt,
estimatedArrivalAt,
inboundItems);
this.title = title;
this.description = description;
this.orderRequestedAt = orderRequestedAt;
this.estimatedArrivalAt = estimatedArrivalAt;
this.inboundItems = inboundItems;
}

private void validateConstructor(
final String title,
final String description,
final LocalDateTime orderRequestedAt,
final LocalDateTime estimatedArrivalAt,
final List<InboundItem> inboundItems) {
Assert.hasText(title, "입고 제목은 필수입니다.");
Assert.hasText(description, "입고 설명은 필수입니다.");
Assert.notNull(orderRequestedAt, "입고 요청일은 필수입니다.");
Assert.notNull(estimatedArrivalAt, "입고 예정일은 필수입니다.");
Assert.notEmpty(inboundItems, "입고 품목은 필수입니다.");
}

public void assignId(final Long id) {
this.id = id;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.ejoongseok.wmslive.inbound.domain;

import com.ejoongseok.wmslive.product.domain.Product;
import org.springframework.util.Assert;

public class InboundItem {
private final Product product;
private final Long quantity;
private final Long unitPrice;
private final String description;

public InboundItem(
final Product product,
final Long quantity,
final Long unitPrice,
final String description) {
validateConstructor(product, quantity, unitPrice, description);
this.product = product;
this.quantity = quantity;
this.unitPrice = unitPrice;
this.description = description;
}

private void validateConstructor(
final Product product,
final Long quantity,
final Long unitPrice,
final String description) {
Assert.notNull(product, "상품은 필수입니다.");
Assert.notNull(quantity, "수량은 필수입니다.");
if (1 > quantity) {
throw new IllegalArgumentException("수량은 1개 이상이어야 합니다.");
}
Assert.notNull(unitPrice, "단가는 필수입니다.");
if (0 > unitPrice) {
throw new IllegalArgumentException("단가는 0원 이상이어야 합니다.");
}
Assert.hasText(description, "품목 설명은 필수입니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.ejoongseok.wmslive.inbound.domain;

import java.util.HashMap;
import java.util.Map;

public class InboundRepository {
private final Map<Long, Inbound> inbounds = new HashMap<>();
private Long sequence = 1L;


public void save(final Inbound inbound) {
inbound.assignId(sequence);
sequence++;
inbounds.put(inbound.getId(), inbound);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.ejoongseok.wmslive.inbound.feature;

import com.ejoongseok.wmslive.inbound.domain.Inbound;
import com.ejoongseok.wmslive.inbound.domain.InboundItem;
import com.ejoongseok.wmslive.inbound.domain.InboundRepository;
import com.ejoongseok.wmslive.product.domain.ProductRepository;
import org.springframework.util.Assert;

import java.time.LocalDateTime;
import java.util.List;

class RegisterInbound {
private final ProductRepository productRepository;
private final InboundRepository inboundRepository;

RegisterInbound(final ProductRepository productRepository, final InboundRepository inboundRepository) {
this.productRepository = productRepository;
this.inboundRepository = inboundRepository;
}

public void request(final Request request) {
// TODO 요청을 도메인으로 변경해서 도메인을 저장한다.
final List<InboundItem> inboundItems = request.inboundItems.stream()
.map(item ->
new InboundItem(
productRepository.findById(item.productNo).orElseThrow(),
item.quantity,
item.unitPrice,
item.description
))
.toList();
final Inbound inbound = new Inbound(
request.title,
request.description,
request.orderRequestedAt,
request.estimatedArrivalAt,
inboundItems
);
inboundRepository.save(inbound);
}

public record Request(
String title,
String description,
LocalDateTime orderRequestedAt,
LocalDateTime estimatedArrivalAt,
List<Request.Item> inboundItems) {
public Request {
Assert.hasText(title, "입고 제목은 필수입니다.");
Assert.hasText(description, "입고 설명은 필수입니다.");
Assert.notNull(orderRequestedAt, "입고 요청일은 필수입니다.");
Assert.notNull(estimatedArrivalAt, "입고 예정일은 필수입니다.");
Assert.notEmpty(inboundItems, "입고 품목은 필수입니다.");
}

public record Item(
Long productNo,
Long quantity,
Long unitPrice,
String description) {

public Item {
Assert.notNull(productNo, "상품 번호는 필수입니다.");
Assert.notNull(quantity, "수량은 필수입니다.");
if (1 > quantity) {
throw new IllegalArgumentException("수량은 1개 이상이어야 합니다.");
}
Assert.notNull(unitPrice, "단가는 필수입니다.");
if (0 > unitPrice) {
throw new IllegalArgumentException("단가는 0원 이상이어야 합니다.");
}
Assert.hasText(description, "품목 설명은 필수입니다.");
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.ejoongseok.wmslive.inbound.feature;

import com.ejoongseok.wmslive.inbound.domain.InboundRepository;
import com.ejoongseok.wmslive.product.domain.Category;
import com.ejoongseok.wmslive.product.domain.Product;
import com.ejoongseok.wmslive.product.domain.ProductRepository;
Expand All @@ -10,12 +11,9 @@
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.springframework.util.Assert;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

class RegisterInboundTest {
Expand Down Expand Up @@ -77,164 +75,4 @@ void registerInbound() {
registerInbound.request(request);
}

private class RegisterInbound {
private final ProductRepository productRepository;
private final InboundRepository inboundRepository;

private RegisterInbound(final ProductRepository productRepository, final InboundRepository inboundRepository) {
this.productRepository = productRepository;
this.inboundRepository = inboundRepository;
}

public void request(final Request request) {
// TODO 요청을 도메인으로 변경해서 도메인을 저장한다.
final List<InboundItem> inboundItems = request.inboundItems.stream()
.map(item ->
new InboundItem(
productRepository.findById(item.productNo).orElseThrow(),
item.quantity,
item.unitPrice,
item.description
))
.toList();
final Inbound inbound = new Inbound(
request.title,
request.description,
request.orderRequestedAt,
request.estimatedArrivalAt,
inboundItems
);
inboundRepository.save(inbound);
}

public record Request(
String title,
String description,
LocalDateTime orderRequestedAt,
LocalDateTime estimatedArrivalAt,
List<Item> inboundItems) {
public Request {
Assert.hasText(title, "입고 제목은 필수입니다.");
Assert.hasText(description, "입고 설명은 필수입니다.");
Assert.notNull(orderRequestedAt, "입고 요청일은 필수입니다.");
Assert.notNull(estimatedArrivalAt, "입고 예정일은 필수입니다.");
Assert.notEmpty(inboundItems, "입고 품목은 필수입니다.");
}

public record Item(
Long productNo,
Long quantity,
Long unitPrice,
String description) {

public Item {
Assert.notNull(productNo, "상품 번호는 필수입니다.");
Assert.notNull(quantity, "수량은 필수입니다.");
if (1 > quantity) {
throw new IllegalArgumentException("수량은 1개 이상이어야 합니다.");
}
Assert.notNull(unitPrice, "단가는 필수입니다.");
if (0 > unitPrice) {
throw new IllegalArgumentException("단가는 0원 이상이어야 합니다.");
}
Assert.hasText(description, "품목 설명은 필수입니다.");
}
}
}
}

private class InboundItem {
private final Product product;
private final Long quantity;
private final Long unitPrice;
private final String description;

public InboundItem(
final Product product,
final Long quantity,
final Long unitPrice,
final String description) {
validateConstructor(product, quantity, unitPrice, description);
this.product = product;
this.quantity = quantity;
this.unitPrice = unitPrice;
this.description = description;
}

private void validateConstructor(
final Product product,
final Long quantity,
final Long unitPrice,
final String description) {
Assert.notNull(product, "상품은 필수입니다.");
Assert.notNull(quantity, "수량은 필수입니다.");
if (1 > quantity) {
throw new IllegalArgumentException("수량은 1개 이상이어야 합니다.");
}
Assert.notNull(unitPrice, "단가는 필수입니다.");
if (0 > unitPrice) {
throw new IllegalArgumentException("단가는 0원 이상이어야 합니다.");
}
Assert.hasText(description, "품목 설명은 필수입니다.");
}
}

private class Inbound {
private final String title;
private final String description;
private final LocalDateTime orderRequestedAt;
private final LocalDateTime estimatedArrivalAt;
private final List<InboundItem> inboundItems;
@lombok.Getter
private Long id;

public Inbound(
final String title,
final String description,
final LocalDateTime orderRequestedAt,
final LocalDateTime estimatedArrivalAt,
final List<InboundItem> inboundItems) {
validateConstructor(
title,
description,
orderRequestedAt,
estimatedArrivalAt,
inboundItems);
this.title = title;
this.description = description;
this.orderRequestedAt = orderRequestedAt;
this.estimatedArrivalAt = estimatedArrivalAt;
this.inboundItems = inboundItems;
}

private void validateConstructor(
final String title,
final String description,
final LocalDateTime orderRequestedAt,
final LocalDateTime estimatedArrivalAt,
final List<InboundItem> inboundItems) {
Assert.hasText(title, "입고 제목은 필수입니다.");
Assert.hasText(description, "입고 설명은 필수입니다.");
Assert.notNull(orderRequestedAt, "입고 요청일은 필수입니다.");
Assert.notNull(estimatedArrivalAt, "입고 예정일은 필수입니다.");
Assert.notEmpty(inboundItems, "입고 품목은 필수입니다.");
}

public void assignId(final Long id) {
this.id = id;
}

}

private class InboundRepository {
private final Map<Long, Inbound> inbounds = new HashMap<>();
private Long sequence = 1L;


public void save(final Inbound inbound) {
inbound.assignId(sequence);
sequence++;
inbounds.put(inbound.getId(), inbound);
}
}
}