package sample.model.account; import java.util.Optional; import javax.persistence.*; import org.springframework.security.crypto.password.PasswordEncoder; import lombok.*; import sample.ValidationException.ErrorKeys; import sample.context.Dto; import sample.context.orm.*; import sample.model.constraints.*; /** * 口座ログインを表現します。 * low: サンプル用に必要最低限の項目だけ */ @Entity @Data @ToString(callSuper = false, exclude = { "password" }) @EqualsAndHashCode(callSuper = false) public class Login extends OrmActiveRecord<Login> { private static final long serialVersionUID = 1L; /** 口座ID */ @Id @IdStr private String id; /** ログインID */ private String loginId; /** パスワード(暗号化済) */ @Password private String password; /** ログインIDを変更します。 */ public Login change(final OrmRepository rep, final ChgLoginId p) { boolean exists = rep.tmpl().get("from Login where id<>?1 and loginId=?2", id, p.loginId).isPresent(); validate((v) -> v.checkField(!exists, "loginId", ErrorKeys.DuplicateId)); return p.bind(this).update(rep); } /** パスワードを変更します。 */ public Login change(final OrmRepository rep, final PasswordEncoder encoder, final ChgPassword p) { return p.bind(this, encoder.encode(p.plainPassword)).update(rep); } /** ログイン情報を取得します。 */ public static Optional<Login> get(final OrmRepository rep, String id) { return rep.get(Login.class, id); } /** ログイン情報を取得します。 */ public static Optional<Login> getByLoginId(final OrmRepository rep, String loginId) { return Optional.ofNullable(loginId).flatMap(lid -> rep.tmpl().get("from Login where loginId=?1", lid)); } /** ログイン情報を取得します。(例外付) */ public static Login load(final OrmRepository rep, String id) { return rep.load(Login.class, id); } /** ログインID変更パラメタ low: 基本はユースケース単位で切り出す */ @Value public static class ChgLoginId implements Dto { private static final long serialVersionUID = 1l; @IdStr private String loginId; public Login bind(final Login m) { m.setLoginId(loginId); return m; } } /** パスワード変更パラメタ */ @Value public static class ChgPassword implements Dto { private static final long serialVersionUID = 1l; @Password private String plainPassword; public Login bind(final Login m, String password) { m.setPassword(password); return m; } } }