User.java

package cz.vsb.crm.model;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Index;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@Entity
@Table(name = "users", indexes = {
        @Index(name = "idx_user_username", columnList = "username"),
        @Index(name = "idx_user_email", columnList = "email")
})
public class User extends BaseEntity {

    @NotBlank
    @Size(min = 3, max = 255)
    @Column(unique = true, nullable = false)
    private String username;

    @NotBlank
    @Pattern(regexp = "Admin|Manager|User", message = "role must be one of: Admin, Manager, User")
    @Column(nullable = false)
    private String role = "User";

    @NotBlank
    @Email
    @Column(unique = true, nullable = false)
    private String email;

    @NotBlank
    @Size(min = 8, max = 255)
    @Column(nullable = false)
    private String password;

    @OneToMany(mappedBy = "assignedTo", cascade = CascadeType.PERSIST)
    private List<Lead> assignedLeads = new ArrayList<>();

    @OneToMany(mappedBy = "createdBy", cascade = CascadeType.PERSIST)
    private List<Order> createdOrders = new ArrayList<>();
}