cannery/lib/cannery/ammo/ammo_type.ex

126 lines
3.3 KiB
Elixir
Raw Normal View History

2021-09-02 23:31:14 -04:00
defmodule Cannery.Ammo.AmmoType do
2022-01-22 21:40:29 -05:00
@moduledoc """
An ammunition type.
Contains statistical information about the ammunition.
"""
2021-09-02 23:31:14 -04:00
use Ecto.Schema
import Ecto.Changeset
alias Cannery.Accounts.User
2022-02-05 01:59:09 -05:00
alias Cannery.Ammo.{AmmoGroup, AmmoType}
2022-01-31 20:08:01 -05:00
alias Ecto.{Changeset, UUID}
2021-09-02 23:31:14 -04:00
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "ammo_types" do
2022-02-05 16:22:02 -05:00
field :name, :string
field :desc, :string
# https://en.wikipedia.org/wiki/Bullet#Abbreviations
2021-09-02 23:31:14 -04:00
field :bullet_type, :string
2022-02-05 16:22:02 -05:00
field :bullet_core, :string
field :cartridge, :string
field :caliber, :string
2021-09-02 23:31:14 -04:00
field :case_material, :string
field :jacket_type, :string
field :muzzle_velocity, :integer
field :powder_type, :string
field :powder_grains_per_charge, :integer
2022-02-05 16:22:02 -05:00
field :grains, :integer
field :pressure, :string
field :primer_type, :string
2022-02-16 00:10:18 -05:00
field :firing_type, :string
2022-05-06 22:54:05 -04:00
field :tracer, :boolean, default: false
field :incendiary, :boolean, default: false
field :blank, :boolean, default: false
field :corrosive, :boolean, default: false
2022-02-05 16:22:02 -05:00
2021-09-02 23:31:14 -04:00
field :manufacturer, :string
field :upc, :string
2021-09-02 23:31:14 -04:00
belongs_to :user, User
2022-02-05 01:59:09 -05:00
has_many :ammo_groups, AmmoGroup
2021-09-02 23:31:14 -04:00
timestamps()
end
2022-01-31 20:08:01 -05:00
@type t :: %AmmoType{
id: id(),
2022-02-05 16:22:02 -05:00
name: String.t(),
desc: String.t() | nil,
bullet_type: String.t() | nil,
bullet_core: String.t() | nil,
cartridge: String.t() | nil,
caliber: String.t() | nil,
case_material: String.t() | nil,
jacket_type: String.t() | nil,
muzzle_velocity: integer() | nil,
powder_type: String.t() | nil,
powder_grains_per_charge: integer() | nil,
grains: integer() | nil,
pressure: String.t() | nil,
primer_type: String.t() | nil,
2022-02-16 00:10:18 -05:00
firing_type: String.t() | nil,
2022-02-05 16:22:02 -05:00
tracer: boolean(),
incendiary: boolean(),
blank: boolean(),
corrosive: boolean(),
manufacturer: String.t() | nil,
upc: String.t() | nil,
user_id: User.id(),
user: User.t() | nil,
2022-02-05 01:59:09 -05:00
ammo_groups: [AmmoGroup.t()] | nil,
2022-01-31 20:08:01 -05:00
inserted_at: NaiveDateTime.t(),
updated_at: NaiveDateTime.t()
}
@type new_ammo_type :: %AmmoType{}
@type id :: UUID.t()
@spec changeset_fields() :: [atom()]
defp changeset_fields,
do: [
2022-02-05 16:22:02 -05:00
:name,
:desc,
:bullet_type,
:bullet_core,
:cartridge,
:caliber,
:case_material,
:jacket_type,
:muzzle_velocity,
:powder_type,
:powder_grains_per_charge,
2022-02-05 16:22:02 -05:00
:grains,
:pressure,
:primer_type,
2022-02-16 00:10:18 -05:00
:firing_type,
2022-02-05 16:22:02 -05:00
:tracer,
:incendiary,
:blank,
:corrosive,
:manufacturer,
:upc
]
@doc false
2022-07-04 20:22:39 -04:00
@spec create_changeset(new_ammo_type(), User.t(), attrs :: map()) ::
Changeset.t(new_ammo_type())
def create_changeset(ammo_type, %User{id: user_id}, attrs) do
ammo_type
2022-07-04 20:22:39 -04:00
|> change(user_id: user_id)
|> cast(attrs, changeset_fields())
|> validate_required([:name, :user_id])
end
@doc false
@spec update_changeset(t() | new_ammo_type(), attrs :: map()) ::
Changeset.t(t() | new_ammo_type())
def update_changeset(ammo_type, attrs) do
ammo_type
|> cast(attrs, changeset_fields())
2022-07-01 19:53:44 -04:00
|> validate_required(:name)
2021-09-02 23:31:14 -04:00
end
end