lib/openagents/audit_event.ex

main at 58e6347eeb72 · 1 KB

defmodule OpenAgents.AuditEvent do
  @moduledoc false

  use Ecto.Schema
  import Ecto.Changeset

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id
  @timestamps_opts [type: :utc_datetime_usec]

  schema "audit_events" do
    field :event_type, :string
    field :actor_type, :string
    field :actor_id, :string
    field :subject_type, :string
    field :subject_id, :string
    field :metadata, :map, default: %{}
    belongs_to :repository, OpenAgents.Repositories.Repository

    timestamps(updated_at: false)
  end

  def changeset(event, attrs) do
    event
    |> cast(attrs, [
      :event_type,
      :actor_type,
      :actor_id,
      :subject_type,
      :subject_id,
      :repository_id,
      :metadata
    ])
    |> validate_required([:event_type, :actor_type, :subject_type, :subject_id, :metadata])
    |> validate_inclusion(:actor_type, OpenAgents.Audit.actor_kinds())
    |> validate_length(:event_type, min: 1, max: 100)
    |> validate_length(:actor_id, max: 200)
    |> validate_length(:subject_type, min: 1, max: 80)
    |> validate_length(:subject_id, min: 1, max: 200)
    |> check_constraint(:actor_type, name: :audit_events_actor_type_allowed)
    |> check_constraint(:metadata, name: :audit_events_metadata_object)
    |> foreign_key_constraint(:repository_id)
  end
end