Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add base resources #501

Merged
merged 1 commit into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
293 changes: 293 additions & 0 deletions lib/radiator/podcast.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
defmodule Radiator.Podcast do
@moduledoc """
The Podcasts context.
Handles repo operations for networks, shows and episodes.
"""

import Ecto.Query, warn: false
alias Radiator.Repo

alias Radiator.Podcast.{Episode, Network, Show}

@doc """
Returns the list of networks.

## Examples

iex> list_networks()
[%Network{}, ...]

"""
def list_networks do
Repo.all(Network)
end

@doc """
Gets a single network.

Raises `Ecto.NoResultsError` if the Network does not exist.

## Examples

iex> get_network!(123)
%Network{}

iex> get_network!(456)
** (Ecto.NoResultsError)

"""
def get_network!(id), do: Repo.get!(Network, id)

@doc """
Creates a network.

## Examples

iex> create_network(%{field: value})
{:ok, %Network{}}

iex> create_network(%{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def create_network(attrs \\ %{}) do
%Network{}
|> Network.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a network.

## Examples

iex> update_network(network, %{field: new_value})
{:ok, %Network{}}

iex> update_network(network, %{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def update_network(%Network{} = network, attrs) do
network
|> Network.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a network.

## Examples

iex> delete_network(network)
{:ok, %Network{}}

iex> delete_network(network)
{:error, %Ecto.Changeset{}}

"""
def delete_network(%Network{} = network) do
Repo.delete(network)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking network changes.

## Examples

iex> change_network(network)
%Ecto.Changeset{data: %Network{}}

"""
def change_network(%Network{} = network, attrs \\ %{}) do
Network.changeset(network, attrs)
end

@doc """
Returns the list of shows.

## Examples

iex> list_shows()
[%Show{}, ...]

"""
def list_shows do
Repo.all(Show)
end

@doc """
Gets a single show.

Raises `Ecto.NoResultsError` if the Show does not exist.

## Examples

iex> get_show!(123)
%Show{}

iex> get_show!(456)
** (Ecto.NoResultsError)

"""
def get_show!(id), do: Repo.get!(Show, id)

@doc """
Creates a show.

## Examples

iex> create_show(%{field: value})
{:ok, %Show{}}

iex> create_show(%{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def create_show(attrs \\ %{}) do
%Show{}
|> Show.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a show.

## Examples

iex> update_show(show, %{field: new_value})
{:ok, %Show{}}

iex> update_show(show, %{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def update_show(%Show{} = show, attrs) do
show
|> Show.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a show.

## Examples

iex> delete_show(show)
{:ok, %Show{}}

iex> delete_show(show)
{:error, %Ecto.Changeset{}}

"""
def delete_show(%Show{} = show) do
Repo.delete(show)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking show changes.

## Examples

iex> change_show(show)
%Ecto.Changeset{data: %Show{}}

"""
def change_show(%Show{} = show, attrs \\ %{}) do
Show.changeset(show, attrs)
end

@doc """
Returns the list of episodes.

## Examples

iex> list_episodes()
[%Episode{}, ...]

"""
def list_episodes do
Repo.all(Episode)
end

@doc """
Gets a single episode.

Raises `Ecto.NoResultsError` if the Episode does not exist.

## Examples

iex> get_episode!(123)
%Episode{}

iex> get_episode!(456)
** (Ecto.NoResultsError)

"""
def get_episode!(id), do: Repo.get!(Episode, id)

@doc """
Creates a episode.

## Examples

iex> create_episode(%{field: value})
{:ok, %Episode{}}

iex> create_episode(%{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def create_episode(attrs \\ %{}) do
%Episode{}
|> Episode.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a episode.

## Examples

iex> update_episode(episode, %{field: new_value})
{:ok, %Episode{}}

iex> update_episode(episode, %{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def update_episode(%Episode{} = episode, attrs) do
episode
|> Episode.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a episode.

## Examples

iex> delete_episode(episode)
{:ok, %Episode{}}

iex> delete_episode(episode)
{:error, %Ecto.Changeset{}}

"""
def delete_episode(%Episode{} = episode) do
Repo.delete(episode)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking episode changes.

## Examples

iex> change_episode(episode)
%Ecto.Changeset{data: %Episode{}}

"""
def change_episode(%Episode{} = episode, attrs \\ %{}) do
Episode.changeset(episode, attrs)
end
end
23 changes: 23 additions & 0 deletions lib/radiator/podcast/episode.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
defmodule Radiator.Podcast.Episode do
@moduledoc """
Represents the Episode model.
TODO: Episodes should be numbered and ordered inside a show.
"""
use Ecto.Schema
import Ecto.Changeset

alias Radiator.Podcast.Show

schema "episodes" do
field :title, :string
belongs_to :show, Show
timestamps(type: :utc_datetime)
end

@doc false
def changeset(episode, attrs) do
episode
|> cast(attrs, [:title, :show_id])
|> validate_required([:title, :show_id])
end
end
24 changes: 24 additions & 0 deletions lib/radiator/podcast/network.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
defmodule Radiator.Podcast.Network do
@moduledoc """
Represents the network model.
A network can host many shows.
"""
use Ecto.Schema
import Ecto.Changeset

alias Radiator.Podcast.Show

schema "networks" do
field :title, :string

has_many(:shows, Show)
timestamps(type: :utc_datetime)
end

@doc false
def changeset(network, attrs) do
network
|> cast(attrs, [:title])
|> validate_required([:title])
end
end
23 changes: 23 additions & 0 deletions lib/radiator/podcast/show.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
defmodule Radiator.Podcast.Show do
@moduledoc """
Represents the show model.
A show can have many episodes.
"""
use Ecto.Schema
import Ecto.Changeset
alias Radiator.Podcast.{Episode, Network}

schema "shows" do
field :title, :string
belongs_to :network, Network
has_many(:episodes, Episode)
timestamps(type: :utc_datetime)
end

@doc false
def changeset(show, attrs) do
show
|> cast(attrs, [:title, :network_id])
|> validate_required([:title])
end
end
11 changes: 11 additions & 0 deletions priv/repo/migrations/20231124220144_create_networks.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
defmodule Radiator.Repo.Migrations.CreateNetworks do
use Ecto.Migration

def change do
create table(:networks) do
add :title, :string

timestamps(type: :utc_datetime)
end
end
end
14 changes: 14 additions & 0 deletions priv/repo/migrations/20231127182625_create_shows.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
defmodule Radiator.Repo.Migrations.CreateShows do
use Ecto.Migration

def change do
create table(:shows) do
add :title, :string
add :network_id, references(:networks, on_delete: :nothing)

timestamps(type: :utc_datetime)
end

create index(:shows, [:network_id])
end
end
Loading