package com.dalab.policyengine.model; import java.time.Instant; 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 = "policy_rules") public class PolicyRule { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(columnDefinition = "UUID") private UUID id; @NotBlank @Size(max = 255) @Column(nullable = false) private String name; // A unique name for the rule within the policy, e.g., "rule1", "checkPII" @Size(max = 1000) private String description; @NotBlank @Column(nullable = false, columnDefinition = "TEXT") private String condition; // MVEL expression, e.g., "asset.assetType == 'S3_BUCKET' && asset.tags.contains('PII')" // Rules with lower numbers have higher priority @Column(nullable = false) private int priority = 1; // Optional: Actions specific to this rule, if different from policy-level actions or to augment them @JdbcTypeCode(SqlTypes.JSON) @Column(columnDefinition = "jsonb") private Map actions; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "policy_id", nullable = false) private Policy policy; @Column(nullable = false, updatable = false) private Instant createdAt; private Instant updatedAt; // 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 String getCondition() { return condition; } public void setCondition(String condition) { this.condition = condition; } public int getPriority() { return priority; } public void setPriority(int priority) { this.priority = priority; } public Map getActions() { return actions; } public void setActions(Map actions) { this.actions = actions; } public Policy getPolicy() { return policy; } public void setPolicy(Policy policy) { this.policy = policy; } 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; } @PrePersist protected void onCreate() { createdAt = Instant.now(); updatedAt = Instant.now(); } @PreUpdate protected void onUpdate() { updatedAt = Instant.now(); } }