Skip to content

Commit

Permalink
Merge pull request #24 from beamkenya/23-create-events-and-tickets
Browse files Browse the repository at this point in the history
23 create events and tickets
  • Loading branch information
MICHAELMUNAVU83 authored Oct 11, 2023
2 parents 5f6e2a4 + 2e55d86 commit d011a1e
Show file tree
Hide file tree
Showing 27 changed files with 1,488 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .tool-versions
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
104 changes: 104 additions & 0 deletions lib/elixir_conf_africa/events.ex
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
25 changes: 25 additions & 0 deletions lib/elixir_conf_africa/events/event.ex
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
104 changes: 104 additions & 0 deletions lib/elixir_conf_africa/ticket_types.ex
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
24 changes: 24 additions & 0 deletions lib/elixir_conf_africa/ticket_types/ticket_type.ex
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 lib/elixir_conf_africa_web/live/event_live/form_component.ex
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
Loading

0 comments on commit d011a1e

Please sign in to comment.