package jace.shim.springcamp2017.member.model;
import jace.shim.springcamp2017.core.domain.AggregateRoot;
import jace.shim.springcamp2017.member.exception.NotMatchPasswordException;
import jace.shim.springcamp2017.member.model.command.MemberCommand;
import jace.shim.springcamp2017.member.model.event.*;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
/**
* Created by jaceshim on 2017. 3. 22..
*/
@Getter
@Slf4j
public class Member extends AggregateRoot<String> {
/** 회원 아이디 */
private String id;
/** 회원 명 */
private String name;
/** 회원 이메일 */
private String email;
/** 회원 비밀번호 */
private String password;
/** 회원 주소 */
private String address;
/** 회원 탈퇴여부 */
private boolean withdrawal;
/** 가입일시 */
private LocalDateTime created;
/** 수정일시 */
private LocalDateTime updated;
/** 로그인일시 */
private LocalDateTime logined;
/** 로그아웃일시 */
private LocalDateTime logouted;
Member() {
super();
}
Member(String id) {
super(id);
this.id = id;
}
Member(String id, String name, String email, String password, String address) {
super(id);
applyChange(new MemberCreated(id, name, email, password, address));
}
public Member(String id, String name, String email, String address) {
super(id);
this.id = id;
this.name = name;
this.email = email;
this.address = address;
}
/**
* 회원 등록
*
* @param memberCreateCommand
* @return
*/
public static Member create(MemberCommand.CreateMember memberCreateCommand) {
Member member = new Member(memberCreateCommand.getId(),
memberCreateCommand.getName(),
memberCreateCommand.getEmail(),
memberCreateCommand.getPassword(),
memberCreateCommand.getAddress());
return member;
}
/**
* 회원 등록 이벤트 반영
* @param event
*/
public void apply(MemberCreated event) {
this.id = event.getId();
this.name = event.getName();
this.email = event.getEmail();
this.password = event.getPassword();
this.address = event.getAddress();
this.created = LocalDateTime.now();
}
/**
* 회원 비밀번호 변경
* @param memberChangePasswordCommand
*/
public void changePassword(MemberCommand.ChangePassword memberChangePasswordCommand) {
if (!this.getPassword().equals(memberChangePasswordCommand.getPassword())) {
throw new NotMatchPasswordException("memer id : " + this.getId() + " is not match password!");
}
applyChange(new MemberPasswordChanged(this.getId(), memberChangePasswordCommand.getPassword(), memberChangePasswordCommand.getNewPassword()));
}
/**
* 회원 비밀번호 변경 이벤트 반영
* @param event
*/
public void apply(MemberPasswordChanged event) {
this.password = event.getNewPassword();
this.updated = event.getUpdated();
}
/**
* 회원 탈퇴 여부 변경
* @param memberChangeWithdrawalCommand
*/
public void changeWithdrawal(MemberCommand.ChangeWithdrawal memberChangeWithdrawalCommand) {
applyChange(new MemberWithdrawalChanged(this.getId(), memberChangeWithdrawalCommand.isWithdrawal()));
}
/**
* 회원 탈퇴 여부 변경 반영
* @param event
*/
public void apply(MemberWithdrawalChanged event) {
this.withdrawal = event.isWithdrawal();
this.updated = event.getUpdated();
}
/**
* 회원정보 변경
* @param memberChangeProfileCommand
*/
public void changeProfile(MemberCommand.ChangeProfile memberChangeProfileCommand) {
applyChange(new MemberProfileChanged(this.getId(), memberChangeProfileCommand.getName(), memberChangeProfileCommand.getEmail(),
memberChangeProfileCommand.getAddress()));
}
/**
* 회원정보 변경 이벤트 반영
* @param event
*/
public void apply(MemberProfileChanged event) {
this.name = event.getName();
this.email = event.getEmail();
this.address = event.getAddress();
}
/**
* 회원 로그인
*/
public void login() {
applyChange(new MemberLogined(this.getId()));
}
/**
* 회원 로그인 이벤트 반영
* @param event
*/
public void apply(MemberLogined event) {
this.logined = event.getLogined();
}
/**
* 회원 로그아웃
*/
public void logout() {
applyChange(new MemberLogouted(this.getId()));
}
/**
* 회원 로그아웃 이벤트 반영
* @param event
*/
public void apply(MemberLogouted event) {
this.logouted = event.getLogouted();
}
}