Skip to content

Commit a0ede33

Browse files
Merge pull request #501 from podlove/add-base-resources
Add base resources
2 parents ae45e57 + 5fc3df2 commit a0ede33

File tree

9 files changed

+624
-0
lines changed

9 files changed

+624
-0
lines changed

lib/radiator/podcast.ex

+293
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
defmodule Radiator.Podcast do
2+
@moduledoc """
3+
The Podcasts context.
4+
Handles repo operations for networks, shows and episodes.
5+
"""
6+
7+
import Ecto.Query, warn: false
8+
alias Radiator.Repo
9+
10+
alias Radiator.Podcast.{Episode, Network, Show}
11+
12+
@doc """
13+
Returns the list of networks.
14+
15+
## Examples
16+
17+
iex> list_networks()
18+
[%Network{}, ...]
19+
20+
"""
21+
def list_networks do
22+
Repo.all(Network)
23+
end
24+
25+
@doc """
26+
Gets a single network.
27+
28+
Raises `Ecto.NoResultsError` if the Network does not exist.
29+
30+
## Examples
31+
32+
iex> get_network!(123)
33+
%Network{}
34+
35+
iex> get_network!(456)
36+
** (Ecto.NoResultsError)
37+
38+
"""
39+
def get_network!(id), do: Repo.get!(Network, id)
40+
41+
@doc """
42+
Creates a network.
43+
44+
## Examples
45+
46+
iex> create_network(%{field: value})
47+
{:ok, %Network{}}
48+
49+
iex> create_network(%{field: bad_value})
50+
{:error, %Ecto.Changeset{}}
51+
52+
"""
53+
def create_network(attrs \\ %{}) do
54+
%Network{}
55+
|> Network.changeset(attrs)
56+
|> Repo.insert()
57+
end
58+
59+
@doc """
60+
Updates a network.
61+
62+
## Examples
63+
64+
iex> update_network(network, %{field: new_value})
65+
{:ok, %Network{}}
66+
67+
iex> update_network(network, %{field: bad_value})
68+
{:error, %Ecto.Changeset{}}
69+
70+
"""
71+
def update_network(%Network{} = network, attrs) do
72+
network
73+
|> Network.changeset(attrs)
74+
|> Repo.update()
75+
end
76+
77+
@doc """
78+
Deletes a network.
79+
80+
## Examples
81+
82+
iex> delete_network(network)
83+
{:ok, %Network{}}
84+
85+
iex> delete_network(network)
86+
{:error, %Ecto.Changeset{}}
87+
88+
"""
89+
def delete_network(%Network{} = network) do
90+
Repo.delete(network)
91+
end
92+
93+
@doc """
94+
Returns an `%Ecto.Changeset{}` for tracking network changes.
95+
96+
## Examples
97+
98+
iex> change_network(network)
99+
%Ecto.Changeset{data: %Network{}}
100+
101+
"""
102+
def change_network(%Network{} = network, attrs \\ %{}) do
103+
Network.changeset(network, attrs)
104+
end
105+
106+
@doc """
107+
Returns the list of shows.
108+
109+
## Examples
110+
111+
iex> list_shows()
112+
[%Show{}, ...]
113+
114+
"""
115+
def list_shows do
116+
Repo.all(Show)
117+
end
118+
119+
@doc """
120+
Gets a single show.
121+
122+
Raises `Ecto.NoResultsError` if the Show does not exist.
123+
124+
## Examples
125+
126+
iex> get_show!(123)
127+
%Show{}
128+
129+
iex> get_show!(456)
130+
** (Ecto.NoResultsError)
131+
132+
"""
133+
def get_show!(id), do: Repo.get!(Show, id)
134+
135+
@doc """
136+
Creates a show.
137+
138+
## Examples
139+
140+
iex> create_show(%{field: value})
141+
{:ok, %Show{}}
142+
143+
iex> create_show(%{field: bad_value})
144+
{:error, %Ecto.Changeset{}}
145+
146+
"""
147+
def create_show(attrs \\ %{}) do
148+
%Show{}
149+
|> Show.changeset(attrs)
150+
|> Repo.insert()
151+
end
152+
153+
@doc """
154+
Updates a show.
155+
156+
## Examples
157+
158+
iex> update_show(show, %{field: new_value})
159+
{:ok, %Show{}}
160+
161+
iex> update_show(show, %{field: bad_value})
162+
{:error, %Ecto.Changeset{}}
163+
164+
"""
165+
def update_show(%Show{} = show, attrs) do
166+
show
167+
|> Show.changeset(attrs)
168+
|> Repo.update()
169+
end
170+
171+
@doc """
172+
Deletes a show.
173+
174+
## Examples
175+
176+
iex> delete_show(show)
177+
{:ok, %Show{}}
178+
179+
iex> delete_show(show)
180+
{:error, %Ecto.Changeset{}}
181+
182+
"""
183+
def delete_show(%Show{} = show) do
184+
Repo.delete(show)
185+
end
186+
187+
@doc """
188+
Returns an `%Ecto.Changeset{}` for tracking show changes.
189+
190+
## Examples
191+
192+
iex> change_show(show)
193+
%Ecto.Changeset{data: %Show{}}
194+
195+
"""
196+
def change_show(%Show{} = show, attrs \\ %{}) do
197+
Show.changeset(show, attrs)
198+
end
199+
200+
@doc """
201+
Returns the list of episodes.
202+
203+
## Examples
204+
205+
iex> list_episodes()
206+
[%Episode{}, ...]
207+
208+
"""
209+
def list_episodes do
210+
Repo.all(Episode)
211+
end
212+
213+
@doc """
214+
Gets a single episode.
215+
216+
Raises `Ecto.NoResultsError` if the Episode does not exist.
217+
218+
## Examples
219+
220+
iex> get_episode!(123)
221+
%Episode{}
222+
223+
iex> get_episode!(456)
224+
** (Ecto.NoResultsError)
225+
226+
"""
227+
def get_episode!(id), do: Repo.get!(Episode, id)
228+
229+
@doc """
230+
Creates a episode.
231+
232+
## Examples
233+
234+
iex> create_episode(%{field: value})
235+
{:ok, %Episode{}}
236+
237+
iex> create_episode(%{field: bad_value})
238+
{:error, %Ecto.Changeset{}}
239+
240+
"""
241+
def create_episode(attrs \\ %{}) do
242+
%Episode{}
243+
|> Episode.changeset(attrs)
244+
|> Repo.insert()
245+
end
246+
247+
@doc """
248+
Updates a episode.
249+
250+
## Examples
251+
252+
iex> update_episode(episode, %{field: new_value})
253+
{:ok, %Episode{}}
254+
255+
iex> update_episode(episode, %{field: bad_value})
256+
{:error, %Ecto.Changeset{}}
257+
258+
"""
259+
def update_episode(%Episode{} = episode, attrs) do
260+
episode
261+
|> Episode.changeset(attrs)
262+
|> Repo.update()
263+
end
264+
265+
@doc """
266+
Deletes a episode.
267+
268+
## Examples
269+
270+
iex> delete_episode(episode)
271+
{:ok, %Episode{}}
272+
273+
iex> delete_episode(episode)
274+
{:error, %Ecto.Changeset{}}
275+
276+
"""
277+
def delete_episode(%Episode{} = episode) do
278+
Repo.delete(episode)
279+
end
280+
281+
@doc """
282+
Returns an `%Ecto.Changeset{}` for tracking episode changes.
283+
284+
## Examples
285+
286+
iex> change_episode(episode)
287+
%Ecto.Changeset{data: %Episode{}}
288+
289+
"""
290+
def change_episode(%Episode{} = episode, attrs \\ %{}) do
291+
Episode.changeset(episode, attrs)
292+
end
293+
end

lib/radiator/podcast/episode.ex

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule Radiator.Podcast.Episode do
2+
@moduledoc """
3+
Represents the Episode model.
4+
TODO: Episodes should be numbered and ordered inside a show.
5+
"""
6+
use Ecto.Schema
7+
import Ecto.Changeset
8+
9+
alias Radiator.Podcast.Show
10+
11+
schema "episodes" do
12+
field :title, :string
13+
belongs_to :show, Show
14+
timestamps(type: :utc_datetime)
15+
end
16+
17+
@doc false
18+
def changeset(episode, attrs) do
19+
episode
20+
|> cast(attrs, [:title, :show_id])
21+
|> validate_required([:title, :show_id])
22+
end
23+
end

lib/radiator/podcast/network.ex

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
defmodule Radiator.Podcast.Network do
2+
@moduledoc """
3+
Represents the network model.
4+
A network can host many shows.
5+
"""
6+
use Ecto.Schema
7+
import Ecto.Changeset
8+
9+
alias Radiator.Podcast.Show
10+
11+
schema "networks" do
12+
field :title, :string
13+
14+
has_many(:shows, Show)
15+
timestamps(type: :utc_datetime)
16+
end
17+
18+
@doc false
19+
def changeset(network, attrs) do
20+
network
21+
|> cast(attrs, [:title])
22+
|> validate_required([:title])
23+
end
24+
end

lib/radiator/podcast/show.ex

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule Radiator.Podcast.Show do
2+
@moduledoc """
3+
Represents the show model.
4+
A show can have many episodes.
5+
"""
6+
use Ecto.Schema
7+
import Ecto.Changeset
8+
alias Radiator.Podcast.{Episode, Network}
9+
10+
schema "shows" do
11+
field :title, :string
12+
belongs_to :network, Network
13+
has_many(:episodes, Episode)
14+
timestamps(type: :utc_datetime)
15+
end
16+
17+
@doc false
18+
def changeset(show, attrs) do
19+
show
20+
|> cast(attrs, [:title, :network_id])
21+
|> validate_required([:title])
22+
end
23+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
defmodule Radiator.Repo.Migrations.CreateNetworks do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:networks) do
6+
add :title, :string
7+
8+
timestamps(type: :utc_datetime)
9+
end
10+
end
11+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule Radiator.Repo.Migrations.CreateShows do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:shows) do
6+
add :title, :string
7+
add :network_id, references(:networks, on_delete: :nothing)
8+
9+
timestamps(type: :utc_datetime)
10+
end
11+
12+
create index(:shows, [:network_id])
13+
end
14+
end

0 commit comments

Comments
 (0)