-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #24 from beamkenya/23-create-events-and-tickets
23 create events and tickets
- Loading branch information
Showing
27 changed files
with
1,488 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
elixir 1.15.4 | ||
elixir 1.15.4-otp-26 | ||
erlang 26.0 | ||
postgres 15.3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
defmodule ElixirConfAfrica.Events do | ||
@moduledoc """ | ||
The Events context. | ||
""" | ||
|
||
import Ecto.Query, warn: false | ||
alias ElixirConfAfrica.Repo | ||
|
||
alias ElixirConfAfrica.Events.Event | ||
|
||
@doc """ | ||
Returns the list of events. | ||
## Examples | ||
iex> list_events() | ||
[%Event{}, ...] | ||
""" | ||
def list_events do | ||
Repo.all(from e in Event, order_by: [desc: e.id]) | ||
end | ||
|
||
@doc """ | ||
Gets a single event. | ||
Raises `Ecto.NoResultsError` if the Event does not exist. | ||
## Examples | ||
iex> get_event!(123) | ||
%Event{} | ||
iex> get_event!(456) | ||
** (Ecto.NoResultsError) | ||
""" | ||
def get_event!(id), do: Repo.get!(Event, id) | ||
|
||
@doc """ | ||
Creates a event. | ||
## Examples | ||
iex> create_event(%{field: value}) | ||
{:ok, %Event{}} | ||
iex> create_event(%{field: bad_value}) | ||
{:error, %Ecto.Changeset{}} | ||
""" | ||
def create_event(attrs \\ %{}) do | ||
%Event{} | ||
|> Event.changeset(attrs) | ||
|> Repo.insert() | ||
end | ||
|
||
@doc """ | ||
Updates a event. | ||
## Examples | ||
iex> update_event(event, %{field: new_value}) | ||
{:ok, %Event{}} | ||
iex> update_event(event, %{field: bad_value}) | ||
{:error, %Ecto.Changeset{}} | ||
""" | ||
def update_event(%Event{} = event, attrs) do | ||
event | ||
|> Event.changeset(attrs) | ||
|> Repo.update() | ||
end | ||
|
||
@doc """ | ||
Deletes a event. | ||
## Examples | ||
iex> delete_event(event) | ||
{:ok, %Event{}} | ||
iex> delete_event(event) | ||
{:error, %Ecto.Changeset{}} | ||
""" | ||
def delete_event(%Event{} = event) do | ||
Repo.delete(event) | ||
end | ||
|
||
@doc """ | ||
Returns an `%Ecto.Changeset{}` for tracking event changes. | ||
## Examples | ||
iex> change_event(event) | ||
%Ecto.Changeset{data: %Event{}} | ||
""" | ||
def change_event(%Event{} = event, attrs \\ %{}) do | ||
Event.changeset(event, attrs) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
defmodule ElixirConfAfrica.Events.Event do | ||
@moduledoc false | ||
|
||
use Ecto.Schema | ||
import Ecto.Changeset | ||
|
||
schema "events" do | ||
field :name, :string | ||
field :description, :string | ||
field :location, :string | ||
field :event_type, :string | ||
field :start_date, :naive_datetime | ||
field :end_date, :naive_datetime | ||
has_many :ticket_types, ElixirConfAfrica.TicketTypes.TicketType | ||
|
||
timestamps() | ||
end | ||
|
||
@doc false | ||
def changeset(event, attrs) do | ||
event | ||
|> cast(attrs, [:name, :event_type, :location, :description, :start_date, :end_date]) | ||
|> validate_required([:name, :event_type, :location, :description, :start_date, :end_date]) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
defmodule ElixirConfAfrica.TicketTypes do | ||
@moduledoc """ | ||
The TicketTypes context. | ||
""" | ||
|
||
import Ecto.Query, warn: false | ||
alias ElixirConfAfrica.Repo | ||
|
||
alias ElixirConfAfrica.TicketTypes.TicketType | ||
|
||
@doc """ | ||
Returns the list of ticket_types. | ||
## Examples | ||
iex> list_ticket_types() | ||
[%TicketType{}, ...] | ||
""" | ||
def list_ticket_types do | ||
Repo.all(TicketType) | ||
end | ||
|
||
@doc """ | ||
Gets a single ticket_type. | ||
Raises `Ecto.NoResultsError` if the Ticket type does not exist. | ||
## Examples | ||
iex> get_ticket_type!(123) | ||
%TicketType{} | ||
iex> get_ticket_type!(456) | ||
** (Ecto.NoResultsError) | ||
""" | ||
def get_ticket_type!(id), do: Repo.get!(TicketType, id) | ||
|
||
@doc """ | ||
Creates a ticket_type. | ||
## Examples | ||
iex> create_ticket_type(%{field: value}) | ||
{:ok, %TicketType{}} | ||
iex> create_ticket_type(%{field: bad_value}) | ||
{:error, %Ecto.Changeset{}} | ||
""" | ||
def create_ticket_type(attrs \\ %{}) do | ||
%TicketType{} | ||
|> TicketType.changeset(attrs) | ||
|> Repo.insert() | ||
end | ||
|
||
@doc """ | ||
Updates a ticket_type. | ||
## Examples | ||
iex> update_ticket_type(ticket_type, %{field: new_value}) | ||
{:ok, %TicketType{}} | ||
iex> update_ticket_type(ticket_type, %{field: bad_value}) | ||
{:error, %Ecto.Changeset{}} | ||
""" | ||
def update_ticket_type(%TicketType{} = ticket_type, attrs) do | ||
ticket_type | ||
|> TicketType.changeset(attrs) | ||
|> Repo.update() | ||
end | ||
|
||
@doc """ | ||
Deletes a ticket_type. | ||
## Examples | ||
iex> delete_ticket_type(ticket_type) | ||
{:ok, %TicketType{}} | ||
iex> delete_ticket_type(ticket_type) | ||
{:error, %Ecto.Changeset{}} | ||
""" | ||
def delete_ticket_type(%TicketType{} = ticket_type) do | ||
Repo.delete(ticket_type) | ||
end | ||
|
||
@doc """ | ||
Returns an `%Ecto.Changeset{}` for tracking ticket_type changes. | ||
## Examples | ||
iex> change_ticket_type(ticket_type) | ||
%Ecto.Changeset{data: %TicketType{}} | ||
""" | ||
def change_ticket_type(%TicketType{} = ticket_type, attrs \\ %{}) do | ||
TicketType.changeset(ticket_type, attrs) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
defmodule ElixirConfAfrica.TicketTypes.TicketType do | ||
@moduledoc false | ||
|
||
use Ecto.Schema | ||
import Ecto.Changeset | ||
|
||
schema "ticket_types" do | ||
field :name, :string | ||
field :description, :string | ||
field :price, :decimal | ||
field :number, :integer | ||
belongs_to :event, ElixirConfAfrica.Events.Event | ||
|
||
timestamps() | ||
end | ||
|
||
@doc false | ||
def changeset(ticket_type, attrs) do | ||
ticket_type | ||
|> cast(attrs, [:event_id, :name, :description, :price, :number]) | ||
|> validate_required([:event_id, :name, :description, :price, :number]) | ||
|> foreign_key_constraint(:event_id) | ||
end | ||
end |
95 changes: 95 additions & 0 deletions
95
lib/elixir_conf_africa_web/live/event_live/form_component.ex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
defmodule ElixirConfAfricaWeb.EventLive.FormComponent do | ||
use ElixirConfAfricaWeb, :live_component | ||
|
||
alias ElixirConfAfrica.Events | ||
|
||
@impl true | ||
def render(assigns) do | ||
~H""" | ||
<div> | ||
<.header> | ||
<%= @title %> | ||
<:subtitle>Use this form to manage event records in your database.</:subtitle> | ||
</.header> | ||
<.simple_form | ||
for={@form} | ||
id="event-form" | ||
phx-target={@myself} | ||
phx-change="validate" | ||
phx-submit="save" | ||
> | ||
<.input field={@form[:name]} type="text" label="Name" /> | ||
<.input field={@form[:event_type]} type="text" label="Event type" /> | ||
<.input field={@form[:location]} type="text" label="Location" /> | ||
<.input field={@form[:description]} type="text" label="Description" /> | ||
<.input field={@form[:start_date]} type="datetime-local" label="Start date" /> | ||
<.input field={@form[:end_date]} type="datetime-local" label="End date" /> | ||
<:actions> | ||
<.button phx-disable-with="Saving...">Save Event</.button> | ||
</:actions> | ||
</.simple_form> | ||
</div> | ||
""" | ||
end | ||
|
||
@impl true | ||
def update(%{event: event} = assigns, socket) do | ||
changeset = Events.change_event(event) | ||
|
||
{:ok, | ||
socket | ||
|> assign(assigns) | ||
|> assign_form(changeset)} | ||
end | ||
|
||
@impl true | ||
def handle_event("validate", %{"event" => event_params}, socket) do | ||
changeset = | ||
socket.assigns.event | ||
|> Events.change_event(event_params) | ||
|> Map.put(:action, :validate) | ||
|
||
{:noreply, assign_form(socket, changeset)} | ||
end | ||
|
||
def handle_event("save", %{"event" => event_params}, socket) do | ||
save_event(socket, socket.assigns.action, event_params) | ||
end | ||
|
||
defp save_event(socket, :edit, event_params) do | ||
case Events.update_event(socket.assigns.event, event_params) do | ||
{:ok, event} -> | ||
notify_parent({:saved, event}) | ||
|
||
{:noreply, | ||
socket | ||
|> put_flash(:info, "Event updated successfully") | ||
|> push_patch(to: socket.assigns.patch)} | ||
|
||
{:error, %Ecto.Changeset{} = changeset} -> | ||
{:noreply, assign_form(socket, changeset)} | ||
end | ||
end | ||
|
||
defp save_event(socket, :new, event_params) do | ||
case Events.create_event(event_params) do | ||
{:ok, event} -> | ||
notify_parent({:saved, event}) | ||
|
||
{:noreply, | ||
socket | ||
|> put_flash(:info, "Event created successfully") | ||
|> push_patch(to: socket.assigns.patch)} | ||
|
||
{:error, %Ecto.Changeset{} = changeset} -> | ||
{:noreply, assign_form(socket, changeset)} | ||
end | ||
end | ||
|
||
defp assign_form(socket, %Ecto.Changeset{} = changeset) do | ||
assign(socket, :form, to_form(changeset)) | ||
end | ||
|
||
defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) | ||
end |
Oops, something went wrong.