lib/openagents/stacks/idempotency_request.ex

main at 58e6347eeb72 · 1 KB

defmodule OpenAgents.Stacks.IdempotencyRequest 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 "pull_request_stack_idempotency_requests" do
    field :operation, :string
    field :idempotency_key, :string
    field :request_digest, :string

    belongs_to :user, OpenAgents.Accounts.User
    belongs_to :stack, OpenAgents.Stacks.Stack
    timestamps()
  end

  def changeset(request, user_id, operation, idempotency_key, request_digest, stack_id) do
    request
    |> change()
    |> put_change(:user_id, user_id)
    |> put_change(:operation, operation)
    |> put_change(:idempotency_key, idempotency_key)
    |> put_change(:request_digest, request_digest)
    |> put_change(:stack_id, stack_id)
    |> validate_required([:user_id, :operation, :idempotency_key, :request_digest, :stack_id])
    |> validate_length(:operation, min: 1, max: 40)
    |> validate_length(:idempotency_key, min: 1, max: 255)
    |> validate_format(:request_digest, ~r/\A[0-9a-f]{64}\z/)
    |> unique_constraint([:user_id, :operation, :idempotency_key])
    |> check_constraint(:request_digest, name: :pull_request_stack_idempotency_digest_check)
    |> foreign_key_constraint(:user_id)
    |> foreign_key_constraint(:stack_id)
  end
end