package jace.shim.springcamp2017.member.infra;
import jace.shim.springcamp2017.core.event.AbstractEventProjector;
import jace.shim.springcamp2017.member.model.event.*;
import jace.shim.springcamp2017.order.model.OrderItem;
import jace.shim.springcamp2017.order.model.event.OrderCreated;
import jace.shim.springcamp2017.product.model.event.ProductCreated;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.Set;
/**
* Created by jaceshim on 2017. 4. 19..
*/
@Component
@Slf4j
public class MemberEventProjector extends AbstractEventProjector {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 상품주문 projection
* @param event
*/
public void execute(ProductCreated event) {
// query모델은 발생한 이벤트를 선택적으로 취해서 마음데로 query전용 table을 구성하고 관리할 수 있다.
// 즉 실제 product 도메인의 모든정보를 관리할 필요가 없고 ( 이유도 없다 ) member 도메인에서 필요한 정보만 선택해서 테이블로 관리하면 된다
StringBuilder query = new StringBuilder();
query.append("INSERT INTO product (");
query.append(" productId, name, price, imagePath, description ");
query.append(") VALUES ( ");
query.append(" ?, ?, ?, ?, ?) ");
jdbcTemplate.update(query.toString(),
event.getProductId(),
event.getName(),
event.getPrice(),
event.getImagePath(),
event.getDescription());
}
/**
* 상품주문 projection
* @param event
*/
public void execute(OrderCreated event) {
StringBuilder query = new StringBuilder();
query.append("INSERT INTO `order` (");
query.append(" orderId, created ");
query.append(") VALUES ( ");
query.append(" ?, ?) ");
jdbcTemplate.update(query.toString(),
event.getOrderId(),
convertLocalDateTimeToTimestamp(event.getCreated()));
query.setLength(0);
query.append("INSERT INTO order_member (");
query.append(" orderId, memberId ");
query.append(") VALUES ( ");
query.append(" ?, ?) ");
jdbcTemplate.update(query.toString(),
event.getOrderId(),
event.getOrderMember().getId());
query.setLength(0);
query.append("INSERT INTO order_delivery (");
query.append(" orderId, address, phone, deliveryMessage ");
query.append(") VALUES ( ");
query.append(" ?, ?, ?, ?) ");
jdbcTemplate.update(query.toString(),
event.getOrderId(),
event.getDelivery().getAddress(),
event.getDelivery().getPhone(),
event.getDelivery().getDeliveryMessage());
query.setLength(0);
query.append("INSERT INTO order_items (");
query.append(" orderId, productId, price, quantity ");
query.append(") VALUES ( ");
query.append(" ?, ?, ?, ?) ");
final Set<OrderItem> orderItems = event.getOrderItems();
for (OrderItem orderItem : orderItems) {
jdbcTemplate.update(query.toString(),
event.getOrderId(),
orderItem.getProduct().getProductId(),
orderItem.getProduct().getPrice(),
orderItem.getQuantity());
}
}
/**
* 회원 등록 projection
* @param event
*/
public void execute(MemberCreated event) {
StringBuilder query = new StringBuilder();
query.append("INSERT INTO member (");
query.append(" id, name, email, password, address, created ");
query.append(") VALUES ( ");
query.append(" ?, ?, ?, ?, ?, ? ) ");
jdbcTemplate.update(query.toString(),
event.getId(),
event.getName(),
event.getEmail(),
event.getPassword(),
event.getAddress(),
convertLocalDateTimeToTimestamp(event.getCreated()));
}
/**
* 회원정보 변경 projection
*
* @param event
*/
public void execute(MemberProfileChanged event) {
StringBuilder query = new StringBuilder();
query.append("UPDATE member ");
query.append(" SET name = ? ");
query.append(" , email = ? ");
query.append(" , address = ? ");
query.append(" , updated = ?");
query.append("WHERE id = ?");
jdbcTemplate.update(query.toString(), event.getName(), event.getEmail(), event.getAddress(),
convertLocalDateTimeToTimestamp(event.getUpdated()), event.getId());
}
/**
* 회원 비밀번호 변경 projection
*
* @param event
*/
public void execute(MemberPasswordChanged event) {
StringBuilder query = new StringBuilder();
query.append("UPDATE member ");
query.append(" SET password = ? ");
query.append(" ,updated = ?");
query.append("WHERE id = ?");
jdbcTemplate.update(query.toString(), event.getNewPassword(), convertLocalDateTimeToTimestamp(event.getUpdated()), event.getId());
}
/**
* 회원 탈퇴여부 변경 projection
*
* @param event
*/
public void execute(MemberWithdrawalChanged event) {
StringBuilder query = new StringBuilder();
query.append("UPDATE member ");
query.append(" SET withdrawal = ? ");
query.append(" ,updated = ?");
query.append("WHERE id = ?");
jdbcTemplate.update(query.toString(), event.isWithdrawal(), convertLocalDateTimeToTimestamp(event.getUpdated()), event.getId());
}
/**
* 회원 로그인 projection
*
* @param event
*/
public void execute(MemberLogined event) {
StringBuilder query = new StringBuilder();
query.append("UPDATE member ");
query.append(" SET logined = ? ");
query.append("WHERE id = ?");
jdbcTemplate.update(query.toString(), convertLocalDateTimeToTimestamp(event.getLogined()), event.getId());
}
}