package com.dalab.policyengine.model; import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import jakarta.persistence.*; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; @Entity @Table(name = "policies") public class Policy { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(columnDefinition = "UUID") private UUID id; @NotBlank @Size(max = 255) @Column(nullable = false, unique = true) private String name; @Size(max = 1000) private String description; @Enumerated(EnumType.STRING) @Column(nullable = false) private PolicyStatus status = PolicyStatus.DISABLED; // MVEL condition for the policy. If all rules pass, this condition is evaluated. // Could be null if policy relies solely on its individual rules. @Column(columnDefinition = "TEXT") private String conditionLogic; // e.g., "rule1 && (rule2 || rule3)" @OneToMany(mappedBy = "policy", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private List rules = new ArrayList<>(); @JdbcTypeCode(SqlTypes.JSON) @Column(columnDefinition = "jsonb") private Map actions; // e.g., { "notify": { "email": "admin@example.com" }, "addLabel": "Sensitive" } @Column(nullable = false, updatable = false) private Instant createdAt; private Instant updatedAt; @Column(columnDefinition = "UUID") private UUID createdByUserId; @Column(columnDefinition = "UUID") private UUID updatedByUserId; // Getters and Setters public UUID getId() { return id; } public void setId(UUID id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public PolicyStatus getStatus() { return status; } public void setStatus(PolicyStatus status) { this.status = status; } public String getConditionLogic() { return conditionLogic; } public void setConditionLogic(String conditionLogic) { this.conditionLogic = conditionLogic; } public List getRules() { return rules; } public void setRules(List rules) { this.rules = rules; this.rules.forEach(rule -> rule.setPolicy(this)); } public void addRule(PolicyRule rule) { this.rules.add(rule); rule.setPolicy(this); } public void removeRule(PolicyRule rule) { this.rules.remove(rule); rule.setPolicy(null); } public Map getActions() { return actions; } public void setActions(Map actions) { this.actions = actions; } public Instant getCreatedAt() { return createdAt; } public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; } public Instant getUpdatedAt() { return updatedAt; } public void setUpdatedAt(Instant updatedAt) { this.updatedAt = updatedAt; } public UUID getCreatedByUserId() { return createdByUserId; } public void setCreatedByUserId(UUID createdByUserId) { this.createdByUserId = createdByUserId; } public UUID getUpdatedByUserId() { return updatedByUserId; } public void setUpdatedByUserId(UUID updatedByUserId) { this.updatedByUserId = updatedByUserId; } @PrePersist protected void onCreate() { createdAt = Instant.now(); updatedAt = Instant.now(); } @PreUpdate protected void onUpdate() { updatedAt = Instant.now(); } }