Skip to content

Commit

Permalink
🔀merge: [BE] sprint2 (#92)
Browse files Browse the repository at this point in the history
* ✨feat: 스프린트2 구조 나누기

* ✨ feat #50: 결제 entity 구조 설정

* 🔀merge: [BE] 컴포넌트 추가 (OrderProduct, Orders, OrderLog 관련) (#62)

* ✨ feat: 객체 추가

Entity:
- Orders
- OrderProduct
- OrderLog

Repository:
- OrdersRepository
- JdbcOrdersRepositoryImple
- OrderProductRepository
- JdbcOrderProductRepository
- OrderLogRepository
- JdbcOrderLogRepository

Service:
- OrderLogService

Dto:
- OrderProductResponseDto

* 🎨 style : 오타 수정

변수명 소문자로 변경

* feat: orderProduct에 productName 추가

* [BE] 상품 테스트 코드 구현 (#60)

* 🐛 fix #51: h2 의존성 중복 제거

* ✨ test #51: findAll 테스트 코드 추가

* ✨ test #51: products 테스트 코드 추가

클라이언트에서 `/products` 호출시 응답받는 테스트 추가

* ✨ chore #51: h2 추가

테스트 코드에서 사용하기 위해서 추가하였습니다.

* ✨ test #51: h2 스키마 및 샘플 데이터 스크립트 추가로 인한 테스트 코드 변경

* ✨ test #51: h2 schema.sql, data.sql, h2 데이터 소스 추가

- 프로파일은 test입니다.

* ✨ test #51: findAll 검증문 추가

- 카테고리가 제대로 들어있는지 확인합니다.

* ✨ test #51: /products api 테스트 코드 수정

* ✨ test #51: beforeEach 구현하여 중복되는 설정 및 데이터 초기화 제거

* ✨ test #51: JdbcProductRepository가 DataJpaTest를 하도록 변경

* ✨ test #51: assertAll 추가

- assertAll 메소드 호출을 추가하여 중간에 테스트가 실패해도 모든 테스트를 실행할 수 있도록 합니다.

* ✨ fix #51: 테스트코드에서만 사용하는 공백 생성자를 제거

* ✨feat: Order 관련 클래스 디렉토리 변경 및 OrderProductRepository 기능 구현

* ✨ test #51: products 테스트 코드 추가

클라이언트에서 `/products` 호출시 응답받는 테스트 추가

* ✨ fix #51: 테스트코드에서만 사용하는 공백 생성자를 제거

* 🔀merge: [BE] �결제 관련 레포지토리, 비지니스 구현 (#69)

* ✨ feat #50: 결제 레포지토리 구현

- queryForObject로 1:1 관계
- 구현체가 한 개인데 인터페이스 사용하는 게 맞는가?

* ✨ feat #50: 결제 관련 DTO 생성

- 현금, 캐시, 장바구니 관련 DTO를 INNER CLASS로 생성

* ✨ refactor #50: 타입, 네이밍 수정

* ✨ feat #50: 현금, 카드 결제 컨트롤러 생성

* ✨ comment #50: ResponseDTO TODO 기록

* ✨ comment #50: ResponseDTO TODO

* ✨ fix #50: EOL 추가

* ✨ fix #50: eol 추가

* 🔀merge: [BE] OrdersRepository 기능 구현, PaymentRepository 변경 (#72)

* ✨ feat #50: 결제 레포지토리 구현

- queryForObject로 1:1 관계
- 구현체가 한 개인데 인터페이스 사용하는 게 맞는가?

* ✨ feat #50: 결제 관련 DTO 생성

- 현금, 캐시, 장바구니 관련 DTO를 INNER CLASS로 생성

* ✨ refactor #50: 타입, 네이밍 수정

* ✨ feat #50: 현금, 카드 결제 컨트롤러 생성

* ✨ comment #50: ResponseDTO TODO 기록

* ✨ comment #50: ResponseDTO TODO

* ✨ fix #50: EOL 추가

* ✨ fix #50: eol 추가

* ♻️ refactor(Orders) #71: 데이터 타입, 네이밍 수정

* ✨️ feat(OrdersRepository) #71: orderId에 따른 Orders 객체 반환 메서드 구현

* ✨️ refactor(PaymentRepository) #71: 메서드 네이밍, 칼럼 네이밍 수정

* ♻️ refactor(PaymentRepository) #71: 네이밍 수정, EOL 추가

* ♻️ refactor(PaymentRepository) #71: 네이밍 재수정

---------

Co-authored-by: JeeIn Lee <jinny.l.dev@gmail.com>

* [BE] 영수증 API 개발 (#74)

* ✨feat #50: 영수증 API 개발을 위한 OrdersResponseDto 구현

* ♻️refactor #50: 영수증 API 개발을 위해 OrderProductResponseDto를 ERD에 맞게 수정

* ♻️refactor #50: API에 맞게 OrderProduct 필드를 amount로 수정

* ✨feat #50: 영수증 API 개발을 위한 PaymentResponseDto 구현

* ♻️refactor #50: API에 맞게 OrderProduct 필드를 amount로 수정

* ✨feat #50: OrdersResponseDto에 @builder 추가

* ✨feat #50: Receipt 객체 구현

* ✨feat #50: ReceiptController 구현

* ✨feat #50: ReceiptResponseDto 구현

* ✨feat #50: ReceiptService 구현

* ♻️refactor #50: API에 맞게 CartInDto 필드를 amount로 수정

* ✨feat #50: 필드를 소문자로 수정

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ✅  test #51: 카드 결제 테스트 코드 추가

* ✨ feat #51: PaymentController handle 메소드 추가

* 📝 docs #51: 데이터 소스 mysql로 설정

* ✅  test #51: 현금 결제 테스트 추가

* ✅  test #51: 결제 저장 테스트 코드 추가

* 🐛 fix #51: 결제 저장 코드 수정

- enum 타입이 저장되도록 변경

* ✅ test #51: "/api/receipt" api 테스트 코드 추가

* 🐛  fix #51: orderDateTime -> orderDatetime으로 api에 맞게 변경

* 🐛  fix #51: product_image_url -> product_img_url로 변경

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ✅ test #51: 통합 테스트 추가

- 통합 테스트는 주문 서비스가 구현되지 않아 런타임 오류가 발생합니다.

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor #50: imageUrl -> imgUrl

* ♻️ feat #50: order_number 증가 기능 추가

- rowMapper 오류
  - 기존 도메인에서 담당하던 스케줄러를 레포지토리로 옮겨서 해결

* ♻️ feat #50: 페어 프로그래밍 Jinny 파트 추가

* 🔀 [BE] order_number에 필요한 로직 구현 (#82)

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor #50: imageUrl -> imgUrl

* ♻️ feat #50: order_number 증가 기능 추가

- rowMapper 오류
  - 기존 도메인에서 담당하던 스케줄러를 레포지토리로 옮겨서 해결

* ♻️ feat #50: 페어 프로그래밍 Jinny 파트 추가

* 🔀merge: [BE] dailyActions, dailyReset 테스트 코드 구현 (#85)

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor #50: imageUrl -> imgUrl

* ♻️ feat #50: order_number 증가 기능 추가

- rowMapper 오류
  - 기존 도메인에서 담당하던 스케줄러를 레포지토리로 옮겨서 해결

* ♻️ feat #50: 페어 프로그래밍 Jinny 파트 추가

* ✅ test #8: dailyAction 테스트 코드 추가

- OrderLog 테이블에 데이터가 저장되는지 테스트
- isBest 컬럼값이 갱신되는지 테스트

* 🎨  style #8: 코드 정리

* ✨  feat #8: OrderLog toString 추가

* ✨  feat #8: OrderLog findAllByDate 구현

- findAllByDate는 특정 날짜에 대한 OrderLog 테이블의 데이터를 가져오는 쿼리입니다.

* 🐛 fix #8: 주문 저장 로직 문제 해결

- 쿼리에 들어갈 네임드 파라미터 설정값 추가

* ✅ feat #8: dailyActions 테스트를 위한 데이터베이스에 넣을 샘플 데이터 추가

* 🐛   fix #8: dailyActions 테스트가 통과하도록 코드 수정

* ✅  test #8: dailyActions에 String 날짜 대신 LocalDatetime을 사용하도록 변경

* ✅  test #8: dailyReset 테스트 코드 추가

* 🐛 fix #8: 쿼리 문제 해결

* 🐛 fix #8: dailyReset, setToday 순서 변경

---------

Co-authored-by: Sully <2dcoder@naver.com>

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* 🚚rename: 디렉토리 구조 전반적으로 변경

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ✨ feat #50: Orders 관련 비즈니스 로직 구현

* ✨ feat #50: OrdersService 이용하여 Payment 로직 구현

* ♻️ refactor #50: 시퀀스 코드 삭제

* ♻️ fix #50: 거스름돈 로직 수정

* 🔀merge: [BE] Orders, Payment 비즈니스 로직 구현 (#88)

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ refactor(PaymentController) #71: DB 네이밍 변경

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor #50: imageUrl -> imgUrl

* ♻️ feat #50: order_number 증가 기능 추가

- rowMapper 오류
  - 기존 도메인에서 담당하던 스케줄러를 레포지토리로 옮겨서 해결

* ♻️ feat #50: 페어 프로그래밍 Jinny 파트 추가

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ✨ feat #50: Orders 관련 비즈니스 로직 구현

* ✨ feat #50: OrdersService 이용하여 Payment 로직 구현

* ♻️ refactor #50: 시퀀스 코드 삭제

* ♻️ fix #50: 거스름돈 로직 수정

* Revert "🔀merge: [BE] Orders, Payment 비즈니스 로직 구현 (#88)" (#89)

This reverts commit 8601530.

* 🔀merge: [BE] 테스트 코드 작성 및 리팩토링 (#90)

* ♻️refactor: 생성자를 @requiredargsconstructor로 생성하는 것으로 수정

* ♻️refactor: api 변경에 따라 orders를 묶어서 보내는 것으로 수정

* 🎨style: import문 정렬

* ♻️refactor: OrdersRepository save 메서드에서 리턴값을 PK로 수정

* ✅test: orderDateTime을 oderDatetime으로 수정

* ✅test: Receipt 생성자 수정

* 🎨style: import문 정렬

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: ProductRepository update 관련 메서드 추가

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ feat #50: order_number 증가 기능 추가

- rowMapper 오류
  - 기존 도메인에서 담당하던 스케줄러를 레포지토리로 옮겨서 해결

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ♻️ refactor(PaymentController) #50: 컨트롤러와 서비스 분리

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ feat #50: Order Log 테이블 구현을 위한 기능 작성

* ♻️ refactor #50: Order 관련 메서드 분리 후 변수명 수정

* ♻️ refactor #50: import문 추가 후 코드 정렬

* ♻️ refactor #50: Delete sequence code

* ✨ feat #50: Orders 관련 비즈니스 로직 구현

* ✨ feat #50: OrdersService 이용하여 Payment 로직 구현

* ♻️ refactor #50: 시퀀스 코드 삭제

* ♻️ fix #50: 거스름돈 로직 수정

* 🐛 fix #8: 코드 정리

---------

Co-authored-by: Sully <2dcoder@naver.com>
Co-authored-by: HyowonSin <48724199+HyowonSin@users.noreply.github.com>
Co-authored-by: YongHwan Kim <yonghwankim.dev@gmail.com>
  • Loading branch information
4 people authored Jun 29, 2023
1 parent 3abfbe2 commit 9a86577
Show file tree
Hide file tree
Showing 53 changed files with 2,075 additions and 162 deletions.
3 changes: 1 addition & 2 deletions be/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,9 @@ configurations {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.h2database:h2'
implementation 'mysql:mysql-connector-java:8.0.26'
implementation 'com.h2database:h2'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.kiosk.api.order.domain.dto;

import com.kiosk.api.order.domain.entity.OrderProduct;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@AllArgsConstructor
@Builder
@Getter
public class OrderProductResponseDto {
private String name;
private Integer amount;
private String size;
private String temperature;

public static OrderProductResponseDto from(OrderProduct orderProduct) {
return OrderProductResponseDto.builder()
.name(orderProduct.getName())
.amount(orderProduct.getAmount())
.size(orderProduct.getSize())
.temperature(orderProduct.getTemperature())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.kiosk.api.order.domain.dto;

import com.kiosk.api.order.domain.entity.Orders;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@AllArgsConstructor
@Builder
@Getter
public class OrdersResponseDto {

private Long orderId;
private String orderDatetime;
private Long orderNumber;

public static OrdersResponseDto from(Orders orders) {
return OrdersResponseDto.builder()
.orderId(orders.getOrderId())
.orderDatetime(orders.getOrderDatetime())
.orderNumber(orders.getOrderNumber())
.build();
}

}
15 changes: 15 additions & 0 deletions be/src/main/java/com/kiosk/api/order/domain/entity/OrderLog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.kiosk.api.order.domain.entity;

import lombok.Builder;
import lombok.Getter;
import lombok.ToString;

@Builder
@Getter
@ToString
public class OrderLog {
private String salesDate;
private Long categoryId;
private Long productId;
private Long salesAmount;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.kiosk.api.order.domain.entity;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class OrderProduct {
private Long orderProductId;
private Long orderId;
private Long productId;

private String name;
private Integer amount;
private String size;
private String temperature;
}
18 changes: 18 additions & 0 deletions be/src/main/java/com/kiosk/api/order/domain/entity/Orders.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.kiosk.api.order.domain.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
@AllArgsConstructor
public class Orders {

private Long orderId;
private Long orderNumber;
private String orderDatetime;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.kiosk.api.order.domain.repository;

import com.kiosk.api.order.domain.entity.OrderLog;
import java.time.LocalDate;
import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

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

@Repository
@RequiredArgsConstructor
public class JdbcOrderLogRepositoryImpl implements OrderLogRepository {

private final NamedParameterJdbcTemplate template;

@Override
public Map<Long, Long> saveAll(List<OrderLog> orderLogs) {
Map<Long, Long> sales = new HashMap<>();

for (OrderLog orderLog : orderLogs) {
Long[] savedOrderLog = save(orderLog);
sales.put(savedOrderLog[0], savedOrderLog[1]);
}

return sales;
}

private Long[] save(OrderLog orderLog) {
String sql = "INSERT INTO order_log (sales_date, category_id, product_id, sales_amount) " // amount로 db 수정
+ "values (:salesDate, :categoryId, :productId, :salesAmount)";

SqlParameterSource param = new BeanPropertySqlParameterSource(orderLog);

template.update(sql, param);

return new Long[]{orderLog.getProductId(), orderLog.getSalesAmount()};
}

@Override
public List<OrderLog> findAllByDate(final LocalDate date) {
String sql = "SELECT product_id, category_id, sales_amount, sales_date " +
"FROM order_log " +
"WHERE DATE(sales_date) = STR_TO_DATE(:date, '%Y-%m-%d')";

SqlParameterSource param = new MapSqlParameterSource("date", date.toString());

return template.query(sql, param, rowMapper());
}

private RowMapper<OrderLog> rowMapper() {
return (rs, rowNum) -> OrderLog.builder()
.productId(rs.getLong("product_id"))
.categoryId(rs.getLong("category_id"))
.salesAmount(rs.getLong("sales_amount"))
.salesDate(rs.getDate("sales_date").toString())
.build();
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.kiosk.api.order.domain.repository;

import com.kiosk.api.order.domain.entity.OrderLog;
import com.kiosk.api.order.domain.entity.OrderProduct;

import java.time.LocalDate;
import java.util.List;
import java.util.Objects;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcOrderProductRepositoryImpl implements OrderProductRepository {

private final NamedParameterJdbcTemplate template;

public JdbcOrderProductRepositoryImpl(NamedParameterJdbcTemplate template) {
this.template = template;
}

@Override
public Long save(OrderProduct orderProduct) {
String sql =
"INSERT INTO order_product (order_product_name, order_product_amount, order_product_size, order_product_temperature, order_id, product_id) "
+ "values (:name, :amount, :size, :temperature, :orderId, :productId)";
SqlParameterSource param = new BeanPropertySqlParameterSource(orderProduct);
KeyHolder keyHolder = new GeneratedKeyHolder();

template.update(sql, param, keyHolder);
return Objects.requireNonNull(keyHolder.getKey()).longValue();
}

@Override
public List<OrderProduct> findAllBy(Long orderId) {
String sql = "SELECT order_product_name, order_product_size, order_product_temperature, order_product_amount "
+ "FROM order_product "
+ "WHERE order_id = :orderId";
SqlParameterSource param = new MapSqlParameterSource("orderId", orderId);
return template.query(sql, param, orderProductRowMapper());
}

private RowMapper<OrderProduct> orderProductRowMapper() {
return (resultSet, rowNumber) -> OrderProduct.builder()
.name(resultSet.getString("order_product_name"))
.amount(resultSet.getInt("order_product_amount"))
.size(resultSet.getString("order_product_size"))
.temperature(resultSet.getString("order_product_temperature"))
.build();
}


@Override
public List<OrderLog> findByDate(LocalDate date) {
String sql =
"SELECT op.product_id, p.category_id, o.order_datetime, SUM(op.order_product_amount) AS sales_amount " +
"FROM order_product op " +
"JOIN orders o ON op.order_id = o.order_id " +
"JOIN product p on op.product_id = p.product_id " +
"WHERE DATE(o.order_datetime) = STR_TO_DATE(:date, '%Y-%m-%d') " +
"GROUP BY op.product_id, p.category_id, o.order_datetime";

SqlParameterSource param = new MapSqlParameterSource("date", date.toString());

return template.query(sql, param, rowMapper());
}

private RowMapper<OrderLog> rowMapper() {
return (rs, rowNum) -> OrderLog.builder()
.productId(rs.getLong("product_id"))
.categoryId(rs.getLong("category_id"))
.salesDate(rs.getDate("order_datetime").toString())
.salesAmount(rs.getLong("sales_amount"))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.kiosk.api.order.domain.repository;

import com.kiosk.api.order.domain.entity.Orders;
import java.time.LocalDate;
import java.time.ZonedDateTime;
import java.util.Optional;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcOrdersRepositoryImpl implements OrdersRepository {

private static int today;
private static Long orderNumber = 0L;

private final NamedParameterJdbcTemplate template;

public JdbcOrdersRepositoryImpl(NamedParameterJdbcTemplate template) {
this.template = template;
}

static {
dailyReset();
setToday();
}

@Scheduled(cron = "0 0 0 * * *", zone = "Asia/Seoul")
public static void setToday() {
today = ZonedDateTime.now().toLocalDate().getDayOfMonth();
}

@Scheduled(cron = "0 0 0 * * *", zone = "Asia/Seoul")
public static void dailyReset() {
LocalDate current = ZonedDateTime.now().toLocalDate();
if (current.getDayOfMonth() - today >= 1) {
orderNumber = 0L;
}
}

@Override
public Integer save(Orders orders) {
orders.setOrderNumber(orderNumber++);
String sql = "INSERT INTO orders (order_number, order_datetime) "
+ "values (:orderNumber, :orderDatetime)";

SqlParameterSource param = new BeanPropertySqlParameterSource(orders);
KeyHolder keyHolder = new GeneratedKeyHolder();
template.update(sql, param, keyHolder);
return keyHolder.getKey().intValue();
}

@Override
public Optional<Orders> findBy(Long orderId) {
String sql = "SELECT order_id, order_number, order_datetime "
+ "FROM orders "
+ "WHERE order_id = :orderId";

SqlParameterSource param = new MapSqlParameterSource("orderId", orderId);

return template.query(sql, param, rowMapper()).stream().findAny();
}

private RowMapper<Orders> rowMapper() {
return (rs, rowNum) -> new Orders(
rs.getLong("order_id"),
rs.getLong("order_number"),
rs.getString("order_datetime")
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.kiosk.api.order.domain.repository;

import com.kiosk.api.order.domain.entity.OrderLog;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public interface OrderLogRepository {

Map<Long, Long> saveAll(List<OrderLog> orderLogs);

List<OrderLog> findAllByDate(LocalDate localDate);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.kiosk.api.order.domain.repository;

import com.kiosk.api.order.domain.entity.OrderLog;
import com.kiosk.api.order.domain.entity.OrderProduct;

import java.time.LocalDate;
import java.util.List;

public interface OrderProductRepository {

Long save(OrderProduct orderProduct);

List<OrderProduct> findAllBy(Long orderId);

List<OrderLog> findByDate(LocalDate date);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.kiosk.api.order.domain.repository;

import com.kiosk.api.order.domain.entity.Orders;

import java.util.Optional;

public interface OrdersRepository {
Integer save(Orders orders);

Optional<Orders> findBy(Long orderId);
}
Loading

0 comments on commit 9a86577

Please sign in to comment.