1 package io.extact.rms.application.domain;
2
3 import static jakarta.persistence.AccessType.*;
4
5 import jakarta.persistence.Access;
6 import jakarta.persistence.Entity;
7 import jakarta.persistence.EnumType;
8 import jakarta.persistence.Enumerated;
9 import jakarta.persistence.GeneratedValue;
10 import jakarta.persistence.GenerationType;
11 import jakarta.persistence.Id;
12 import jakarta.persistence.Transient;
13
14 import org.apache.commons.lang3.builder.ToStringBuilder;
15 import org.apache.commons.lang3.builder.ToStringStyle;
16
17 import lombok.AllArgsConstructor;
18 import lombok.Getter;
19 import lombok.NoArgsConstructor;
20 import lombok.Setter;
21
22 import io.extact.rms.application.domain.constraint.Contact;
23 import io.extact.rms.application.domain.constraint.LoginId;
24 import io.extact.rms.application.domain.constraint.Passowrd;
25 import io.extact.rms.application.domain.constraint.PhoneNumber;
26 import io.extact.rms.application.domain.constraint.RmsId;
27 import io.extact.rms.application.domain.constraint.UserName;
28 import io.extact.rms.application.domain.constraint.UserTypeConstraint;
29 import io.extact.rms.application.domain.constraint.ValidationGroups.Update;
30
31 @Access(FIELD)
32 @Entity
33 @Getter
34 @Setter
35 @NoArgsConstructor
36 @AllArgsConstructor(staticName = "of")
37 public class UserAccount implements Transformable, IdAccessable {
38
39
40 public enum UserType {
41
42 ADMIN(true),
43 MEMBER(false);
44
45 boolean admin;
46 private UserType(boolean admin) {
47 this.admin = admin;
48 }
49 public boolean isAdmin() {
50 return admin;
51 }
52 }
53
54
55 @Id
56 @GeneratedValue(strategy = GenerationType.IDENTITY)
57 @RmsId(groups = Update.class)
58 private Integer id;
59
60
61 @LoginId
62 private String loginId;
63
64
65 @Passowrd
66 private String password;
67
68
69 @UserName
70 private String userName;
71
72
73 @PhoneNumber
74 private String phoneNumber;
75
76
77 @Contact
78 private String contact;
79
80
81 @Enumerated(EnumType.STRING)
82 @UserTypeConstraint
83 private UserType userType;
84
85
86
87
88 public static UserAccount ofTransient(String loginId, String password, String userName, String phoneNumber, String contact, UserType userType) {
89 return of(null, loginId, password, userName, phoneNumber, contact, userType);
90 }
91
92
93
94 @Transient
95 public boolean isAdmin() {
96 return this.userType == UserType.ADMIN;
97 }
98
99 public void setAdmin(boolean isAdmin) {
100 this.userType = isAdmin ? UserType.ADMIN : UserType.MEMBER;
101 }
102
103
104
105 @Override
106 public String toString() {
107 return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
108 }
109 }