Compare commits

...
4 Commits
5 changed files with 51 additions and 38 deletions
+6
View File
@@ -26,4 +26,10 @@
** 0.4.3 <2023-07-31 Mon> ** 0.4.3 <2023-07-31 Mon>
Rename the controller and the view names to "Link". Rename the controller and the view names to "Link".
Move Links to the Links context. Move Links to the Links context.
Refactor to split the Links to a Link model and a Links logic.
Update the controller and the view for updated Link model.
** 0.4.4 <2023-08-01 Tue>
Fix Links.update_one/2.
** 0.4.5 <2023-08-01 Tue>
Fix the route path in LinkController.create/2.
+21
View File
@@ -0,0 +1,21 @@
defmodule LinkShortener.Links.Link do
use Ecto.Schema
import Ecto.Changeset
import Ecto.Query
schema "links" do
field :name, :string
field :url, :string
field :shorten, :string
timestamps()
end
@doc false
def changeset(link, attrs) do
link
|> cast(attrs, [:name, :url, :shorten])
|> validate_required([:url, :shorten])
|> unique_constraint(:shorten)
end
end
+15 -31
View File
@@ -1,28 +1,12 @@
defmodule LinkShortener.Links do defmodule LinkShortener.Links.Links do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
import Ecto.Query import Ecto.Query
alias LinkShortener.Repo alias LinkShortener.Repo
alias LinkShortener.Links alias LinkShortener.Links.Link
alias LinkShortener.Generators.SafeString alias LinkShortener.Generators.SafeString
schema "links" do def new_one(), do: Link.changeset(%Link{})
field :name, :string
field :url, :string
field :shorten, :string
timestamps()
end
@doc false
def changeset(link, attrs) do
link
|> cast(attrs, [:name, :url, :shorten])
|> validate_required([:url, :shorten])
|> unique_constraint(:shorten)
end
def new_one(), do: Links.changeset(%Links{})
def create_one(attrs, length \\ 10, generator \\ SafeString) do def create_one(attrs, length \\ 10, generator \\ SafeString) do
shorten = generator.generate(length) shorten = generator.generate(length)
@@ -30,32 +14,32 @@ defmodule LinkShortener.Links do
end end
def insert_one(attrs) do def insert_one(attrs) do
%Links{} %Link{}
|> Links.changeset(attrs) |> Link.changeset(attrs)
|> Repo.insert() |> Repo.insert()
end end
def edit_one(id) do def edit_one(id) do
get_one(id) get_one(id)
|> Links.changeset() |> Link.changeset()
end end
def update_one(%Links{} = Links, changes) do def update_one(%Link{} = link, changes) do
Links link
|> Links.changeset(changes) |> Link.changeset(changes)
|> Repo.update() |> Repo.update()
end end
def insert_one(attrs) do def insert_one(attrs) do
%Links{} %Link{}
|> Links.changeset(attrs) |> Link.changeset(attrs)
|> Repo.insert() |> Repo.insert()
end end
def delete_one(%Links{} = Links), do: Repo.delete(Links) def delete_one(%Link{} = link), do: Repo.delete(link)
def get_one_by(attrs) do def get_one_by(attrs) do
Repo.get_by(Links, attrs) Repo.get_by(Link, attrs)
end end
def get_one_by_shorten(shorten) do def get_one_by_shorten(shorten) do
@@ -63,11 +47,11 @@ defmodule LinkShortener.Links do
end end
def get_one(id) do def get_one(id) do
Repo.get!(Links, id) Repo.get!(Link, id)
end end
def get_all(opts) do def get_all(opts) do
from(Links) from(Link)
|> Repo.all() |> Repo.all()
end end
end end
@@ -1,7 +1,8 @@
defmodule LinkShortenerWeb.Api.V1.LinkController do defmodule LinkShortenerWeb.Api.V1.LinkController do
use LinkShortenerWeb, :controller use LinkShortenerWeb, :controller
alias LinkShortener.Links alias LinkShortener.Links.Links
alias LinkShortener.Links.Link
action_fallback LinkShortenerWeb.FallbackController action_fallback LinkShortenerWeb.FallbackController
@@ -11,17 +12,18 @@ defmodule LinkShortenerWeb.Api.V1.LinkController do
end end
def create(conn, %{"link" => link_params}) do def create(conn, %{"link" => link_params}) do
with {:ok, %Links{} = link} <- Links.insert_one(link_params) do with {:ok, %Link{} = link} <- Links.insert_one(link_params) do
conn conn
|> put_status(:created) |> put_status(:created)
|> put_resp_header("location", Routes.links_path(conn, :show, link)) |> put_resp_header("location", Routes.v1_link_path(conn, :show, link))
|> render("show.json", links: link) |> render("show.json", link: link)
end end
end end
def show(conn, %{"id" => id}) do def show(conn, %{"id" => id}) do
link = Links.get_one(id) link = Links.get_one(id)
render(conn, "show.json", links: link) render(conn, "show.json", link: link)
end
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id}) do
@@ -6,11 +6,11 @@ defmodule LinkShortenerWeb.Api.V1.LinkView do
%{data: render_many(links, LinkView, "link.json")} %{data: render_many(links, LinkView, "link.json")}
end end
def render("show.json", %{links: link}) do def render("show.json", %{link: link}) do
%{data: render_one(link, LinkView, "link.json")} %{data: render_one(link, LinkView, "link.json")}
end end
def render("link.json", %{links: link}) do def render("link.json", %{link: link}) do
%{ %{
id: link.id, id: link.id,
name: link.name, name: link.name,