package com.gcsc.guide.entity; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.util.HashSet; import java.util.Set; @Entity @Table(name = "users") @Getter @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, unique = true) private String email; @Column(nullable = false, length = 100) private String name; @Column(name = "avatar_url", length = 500) private String avatarUrl; @Enumerated(EnumType.STRING) @Column(nullable = false, length = 20) private UserStatus status = UserStatus.PENDING; @Column(name = "is_admin", nullable = false) private boolean isAdmin = false; @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt; @Column(name = "updated_at", nullable = false) private LocalDateTime updatedAt; @Column(name = "last_login_at") private LocalDateTime lastLoginAt; @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id") ) private Set roles = new HashSet<>(); public User(String email, String name, String avatarUrl) { this.email = email; this.name = name; this.avatarUrl = avatarUrl; } public void activate() { this.status = UserStatus.ACTIVE; } public void reject() { this.status = UserStatus.REJECTED; } public void disable() { this.status = UserStatus.DISABLED; } public void grantAdmin() { this.isAdmin = true; } public void revokeAdmin() { this.isAdmin = false; } public void updateLastLogin() { this.lastLoginAt = LocalDateTime.now(); } public void updateProfile(String name, String avatarUrl) { this.name = name; this.avatarUrl = avatarUrl; } public void updateRoles(Set roles) { this.roles = roles; } @PrePersist protected void onCreate() { this.createdAt = LocalDateTime.now(); this.updatedAt = LocalDateTime.now(); } @PreUpdate protected void onUpdate() { this.updatedAt = LocalDateTime.now(); } }