AppUser.java
package com.smartsupplypro.inventory.model;
import java.time.LocalDateTime;
import java.util.UUID;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import lombok.Getter;
import lombok.Setter;
/**
* User entity for OAuth2 authentication and role-based access control.
* Persisted in users_app table with Google email as unique identifier.
*
* <p><strong>Purpose</strong>: Tracks registered users, their roles (USER/ADMIN), and registration timestamps.
*
* <p><strong>Usage</strong>: Spring Security role checks, audit trails, API personalization.
*
* @see Role
* @see <a href="../../../../../docs/architecture/patterns/model-patterns.md">Model Patterns</a>
*/
@Getter
@Setter
@Entity(name = "UsersApp")
@Table(name = "users_app",
uniqueConstraints = @UniqueConstraint(name= "uk_users_email", columnNames = "email")
)
public class AppUser {
/** Unique user ID (UUID format). */
@Id
@Column(length = 36)
private String id = UUID.randomUUID().toString();
/** Google email address (login ID). */
@Column(unique = true, nullable = false)
private String email;
/** Full name from OAuth2 provider. */
@Column(nullable = false)
private String name;
/** User role: USER or ADMIN (stored as STRING). */
@Enumerated(EnumType.STRING)
@Column(name = "ROLE", nullable = false, length = 16)
private Role role = Role.USER;
/** Registration timestamp. */
private LocalDateTime createdAt = LocalDateTime.now();
/**
* Creates new OAuth2 user with email and name.
*
* @param email Google email
* @param name full name
*/
public AppUser(String email, String name) {
this.id = UUID.randomUUID().toString();
this.email = email;
this.name = name;
this.createdAt = LocalDateTime.now();
}
/**
* No-arg constructor for JPA.
*/
public AppUser() {
this.id = UUID.randomUUID().toString();
}
/**
* Returns user's role enum.
*
* @return assigned role
*/
public Role getRoleEnum() {
return this.role;
}
}