initial shift template migration & schema working with user field/assoc for default shift template

This commit is contained in:
Adam Piontek 2021-03-06 13:48:13 -05:00
commit a151bfcee7
16 changed files with 665 additions and 4 deletions
lib/shift73k

View file

@ -3,6 +3,8 @@ defmodule Shift73k.Accounts.User do
import Ecto.Changeset
import EctoEnum
alias Shift73k.ShiftTemplates.ShiftTemplate
@roles [
user: "Basic user level",
manager: "Can create users, update user emails & passwords",
@ -25,6 +27,11 @@ defmodule Shift73k.Accounts.User do
field(:confirmed_at, :naive_datetime)
field(:role, RolesEnum, default: :user)
has_many(:shift_templates, ShiftTemplate)
# has_one(:default_shift_template, ShiftTemplate, references: :default_shift_template_id)
belongs_to(:default_shift_template, ShiftTemplate)
timestamps()
end

View file

@ -0,0 +1,104 @@
defmodule Shift73k.ShiftTemplates do
@moduledoc """
The ShiftTemplates context.
"""
import Ecto.Query, warn: false
alias Shift73k.Repo
alias Shift73k.ShiftTemplates.ShiftTemplate
@doc """
Returns the list of shift_templates.
## Examples
iex> list_shift_templates()
[%ShiftTemplate{}, ...]
"""
def list_shift_templates do
Repo.all(ShiftTemplate)
end
@doc """
Gets a single shift_template.
Raises `Ecto.NoResultsError` if the Shift template does not exist.
## Examples
iex> get_shift_template!(123)
%ShiftTemplate{}
iex> get_shift_template!(456)
** (Ecto.NoResultsError)
"""
def get_shift_template!(id), do: Repo.get!(ShiftTemplate, id)
@doc """
Creates a shift_template.
## Examples
iex> create_shift_template(%{field: value})
{:ok, %ShiftTemplate{}}
iex> create_shift_template(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_shift_template(attrs \\ %{}) do
%ShiftTemplate{}
|> ShiftTemplate.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a shift_template.
## Examples
iex> update_shift_template(shift_template, %{field: new_value})
{:ok, %ShiftTemplate{}}
iex> update_shift_template(shift_template, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_shift_template(%ShiftTemplate{} = shift_template, attrs) do
shift_template
|> ShiftTemplate.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a shift_template.
## Examples
iex> delete_shift_template(shift_template)
{:ok, %ShiftTemplate{}}
iex> delete_shift_template(shift_template)
{:error, %Ecto.Changeset{}}
"""
def delete_shift_template(%ShiftTemplate{} = shift_template) do
Repo.delete(shift_template)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking shift_template changes.
## Examples
iex> change_shift_template(shift_template)
%Ecto.Changeset{data: %ShiftTemplate{}}
"""
def change_shift_template(%ShiftTemplate{} = shift_template, attrs \\ %{}) do
ShiftTemplate.changeset(shift_template, attrs)
end
end

View file

@ -0,0 +1,46 @@
defmodule Shift73k.ShiftTemplates.ShiftTemplate do
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "shift_templates" do
field :label, :string
field :subject, :string
field :description, :string
field :location, :string
field :timezone, :string
field :start_time, :time
field :length_hours, :integer
field :length_minutes, :integer
belongs_to(:user, Shift73k.Accounts.User)
timestamps()
end
@doc false
def changeset(shift_template, attrs) do
shift_template
|> cast(attrs, [
:label,
:subject,
:description,
:location,
:timezone,
:start_time,
:length_hours,
:length_minutes,
:user_id
])
|> validate_required([
:subject,
:timezone,
:start_time,
:length_hours
])
|> validate_number(:length_hours, greater_than_or_equal_to: 0, less_than_or_equal_to: 24)
|> validate_number(:length_minutes, greater_than_or_equal_to: 0, less_than: 60)
|> validate_inclusion(:timezone, Tzdata.zone_list())
end
end