package com.hithomelabs.cftunnels.Entity; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import java.util.UUID; /** * JPA Entity representing a mapping change request in the approval workflow. * *
This entity tracks requests to add or modify tunnel ingress mappings. * It implements an approval workflow where:
*Database Table: {@code requests}
* *Workflow:
** 1. User submits mapping request via REST API * 2. Request is created with PENDING status * 3. APPROVER role reviews the request * 4. If approved: mapping is applied to Cloudflare tunnel * 5. If rejected: request is marked REJECTED ** * @see Mapping * @see User * @see RequestStatus */ @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Table(name = "requests") public class Request { /** * Unique identifier for this request (auto-generated UUID). */ @Id @GeneratedValue @Column(columnDefinition = "uuid", unique = true, nullable = false) private UUID id; /** * The mapping configuration being requested. * *
This is a one-to-one relationship - each request * contains exactly one mapping configuration.
* * @see Mapping */ @OneToOne @JoinColumn(name = "mapping_id", unique = true, nullable = false) private Mapping mapping; /** * User who created this request. * *This field is required and tracks accountability.
* * @see User */ @ManyToOne @JoinColumn(name = "created_by", nullable = false) private User createdBy; /** * User who approved or rejected this request. * *This is null until the request is processed.
* * @see User */ @ManyToOne @JoinColumn(name = "accepted_by") private User acceptedBy; /** * Status of the mapping request in the workflow. * * @see RequestStatus */ public enum RequestStatus { /** * Request is waiting for approval. */ PENDING, /** * Request has been approved. * The mapping should now be applied to the tunnel. */ APPROVED, /** * Request has been rejected. * No changes will be made to the tunnel. */ REJECTED } /** * Current status of this request. * *Initially set to PENDING when created.
* * @see RequestStatus */ @Enumerated(EnumType.STRING) @Column(length = 10, nullable = false) private RequestStatus status; }