defmodule DaProductApp.RiskManagement.RiskAuditLog do use Ecto.Schema import Ecto.Changeset @derive {Jason.Encoder, only: [ :id, :event_type, :user_id, :resource_type, :resource_id, :action, :old_values, :new_values, :ip_address, :user_agent, :notes, :metadata, :inserted_at, :updated_at ]} schema "risk_audit_log" do field :event_type, :string field :user_id, :integer field :resource_type, :string field :resource_id, :integer field :action, :string field :old_values, :map field :new_values, :map field :ip_address, :string field :user_agent, :string field :notes, :string field :metadata, :map timestamps(type: :utc_datetime) end @required_fields [:event_type, :action] @optional_fields [:user_id, :resource_type, :resource_id, :old_values, :new_values, :ip_address, :user_agent, :notes, :metadata] @all_fields @required_fields ++ @optional_fields @valid_event_types ["supervisor_action", "rule_updated", "system_event", "rule_created", "rule_deleted"] @valid_resource_types ["risk_rule_hit", "risk_rule", "supervisor_session"] def changeset(audit_log, attrs) do audit_log |> cast(attrs, @all_fields) |> validate_required(@required_fields) |> validate_inclusion(:event_type, @valid_event_types) |> validate_inclusion(:resource_type, @valid_resource_types) |> validate_length(:action, min: 1, max: 100) |> validate_length(:notes, max: 2000) end def valid_event_types, do: @valid_event_types def valid_resource_types, do: @valid_resource_types end