1 package pk.lucidxpo.ynami.persistence.model.security;
2
3 import jakarta.persistence.Entity;
4 import jakarta.persistence.JoinColumn;
5 import jakarta.persistence.JoinTable;
6 import jakarta.persistence.ManyToMany;
7 import jakarta.persistence.Table;
8 import jakarta.persistence.UniqueConstraint;
9 import jakarta.validation.constraints.Email;
10 import jakarta.validation.constraints.NotBlank;
11 import jakarta.validation.constraints.Size;
12 import lombok.Data;
13 import lombok.EqualsAndHashCode;
14 import lombok.NoArgsConstructor;
15 import lombok.ToString;
16 import org.hibernate.annotations.NaturalId;
17 import pk.lucidxpo.ynami.persistence.model.Auditable;
18
19 import java.util.Set;
20
21 import static com.google.common.collect.Sets.newHashSet;
22 import static jakarta.persistence.FetchType.LAZY;
23 import static lombok.AccessLevel.PACKAGE;
24
25 @Data
26 @Entity
27 @ToString(callSuper = true)
28 @EqualsAndHashCode(callSuper = true)
29 @Table(name = "Users", uniqueConstraints = {
30 @UniqueConstraint(columnNames = {
31 "username"
32 }),
33 @UniqueConstraint(columnNames = {
34 "email"
35 })
36 })
37
38 @NoArgsConstructor(access = PACKAGE)
39 public class User extends Auditable<String> {
40
41 @NotBlank
42 @Size(max = 40)
43 private String name;
44
45 @NotBlank
46 @Size(max = 40)
47 private String username;
48
49 @NaturalId
50 @NotBlank
51 @Size(max = 40)
52 @Email
53 private String email;
54
55 @NotBlank
56 @Size(max = 100)
57 private String password;
58
59 @ManyToMany(fetch = LAZY)
60 @JoinTable(name = "UserRoles",
61 joinColumns = @JoinColumn(name = "userId"),
62 inverseJoinColumns = @JoinColumn(name = "roleId"))
63 private Set<Role> roles = newHashSet();
64
65 public User(final String name,
66 final String username,
67 final String email,
68 final String password) {
69 this.name = name;
70 this.username = username;
71 this.email = email;
72 this.password = password;
73 }
74 }