package sample.model.master; import java.util.*; import javax.persistence.*; import org.hibernate.criterion.MatchMode; import org.springframework.security.crypto.password.PasswordEncoder; import lombok.*; import sample.ValidationException.ErrorKeys; import sample.context.Dto; import sample.context.actor.Actor; import sample.context.actor.Actor.ActorRoleType; import sample.context.orm.*; import sample.model.constraints.*; import sample.util.Validator; /** * 社員を表現します。 */ @Entity @Data @ToString(callSuper = false, exclude = { "password" }) @EqualsAndHashCode(callSuper = false) public class Staff extends OrmActiveRecord<Staff> { private static final long serialVersionUID = 1l; /** ID */ @Id @IdStr private String id; /** 名前 */ @Name private String name; /** パスワード(暗号化済) */ @Password private String password; public Actor actor() { return new Actor(id, name, ActorRoleType.Internal); } /** パスワードを変更します。 */ public Staff change(final OrmRepository rep, final PasswordEncoder encoder, final ChgPassword p) { return p.bind(this, encoder.encode(p.plainPassword)).update(rep); } /** 社員情報を変更します。 */ public Staff change(final OrmRepository rep, ChgStaff p) { return p.bind(this).update(rep); } /** 社員を取得します。 */ public static Optional<Staff> get(final OrmRepository rep, final String id) { return rep.get(Staff.class, id); } /** 社員を取得します。(例外付) */ public static Staff load(final OrmRepository rep, final String id) { return rep.load(Staff.class, id); } /** 社員を検索します。 */ public static List<Staff> find(final OrmRepository rep, final FindStaff p) { return rep.tmpl().find(Staff.class, (criteria) -> criteria.like(new String[] { "id", "name" }, p.keyword, MatchMode.ANYWHERE) .sort("id").result()); } /** 社員の登録を行います。 */ public static Staff register(final OrmRepository rep, final PasswordEncoder encoder, RegStaff p) { Validator.validate((v) -> v.checkField(!get(rep, p.id).isPresent(), "id", ErrorKeys.DuplicateId)); return p.create(encoder.encode(p.plainPassword)).save(rep); } /** 検索パラメタ */ @Data @NoArgsConstructor @AllArgsConstructor public static class FindStaff implements Dto { private static final long serialVersionUID = 1l; @OutlineEmpty private String keyword; } /** 登録パラメタ */ @Data @NoArgsConstructor @AllArgsConstructor public static class RegStaff implements Dto { private static final long serialVersionUID = 1l; @IdStr private String id; @Name private String name; /** パスワード(未ハッシュ) */ @Password private String plainPassword; public Staff create(String password) { Staff m = new Staff(); m.setId(id); m.setName(name); m.setPassword(password); return m; } } /** 変更パラメタ */ @Data @NoArgsConstructor @AllArgsConstructor public static class ChgStaff implements Dto { private static final long serialVersionUID = 1l; @Name private String name; public Staff bind(final Staff m) { m.setName(name); return m; } } /** パスワード変更パラメタ */ @Value public static class ChgPassword implements Dto { private static final long serialVersionUID = 1l; @Password private String plainPassword; public Staff bind(final Staff m, String password) { m.setPassword(password); return m; } } }