diff --git a/lib/link_shortener/links/links.ex b/lib/link_shortener/links/links.ex index e5b301a..53a0555 100644 --- a/lib/link_shortener/links/links.ex +++ b/lib/link_shortener/links/links.ex @@ -23,6 +23,14 @@ defmodule LinkShortener.Links do Repo.get!(Link, id) end + def get_one_by!(attrs) do + Repo.get_by!(Link, attrs) + end + + def get_one_by_shorten!(shorten) do + get_one_by!(%{shorten: shorten}) + end + def get_one_by(attrs) do Repo.get_by(Link, attrs) end diff --git a/lib/link_shortener_web/controllers/redirection_controller.ex b/lib/link_shortener_web/controllers/redirection_controller.ex new file mode 100644 index 0000000..6b72fcf --- /dev/null +++ b/lib/link_shortener_web/controllers/redirection_controller.ex @@ -0,0 +1,10 @@ +defmodule LinkShortenerWeb.RedirectionController do + use LinkShortenerWeb, :controller + + alias LinkShortener.Links + + def show(conn, %{"shorten" => shorten}) do + %{url: url} = Links.get_one_by_shorten!(shorten) + redirect(conn, external: url) + end +end diff --git a/lib/link_shortener_web/router.ex b/lib/link_shortener_web/router.ex index 14b27bb..354ffab 100644 --- a/lib/link_shortener_web/router.ex +++ b/lib/link_shortener_web/router.ex @@ -18,6 +18,7 @@ defmodule LinkShortenerWeb.Router do pipe_through :browser get "/", PageController, :home + get "/u/:shorten", RedirectionController, :show end scope "/api", LinkShortenerWeb do diff --git a/test/link_shortener_web/controllers/redirection_controller_test.ex b/test/link_shortener_web/controllers/redirection_controller_test.ex new file mode 100644 index 0000000..f30d809 --- /dev/null +++ b/test/link_shortener_web/controllers/redirection_controller_test.ex @@ -0,0 +1,30 @@ +defmodule LinkShortenerWeb.RedirectionControllerTest do + use LinkShortenerWeb.ConnCase + + import LinkShortener.LinksFixtures + + alias LinkShortener.Links.Link + alias LinkShortener.Links + + @invalid_shorten "invalid_shorten" + + describe "redirection via a link" do + setup [:create_link] + + test "redirected via the shorten", %{conn: conn, link: %Link{shorten: shorten} = link} do + conn = get(conn, ~p"/u/#{shorten}") + assert response(conn, 302) + end + + test "no redirection if a shorten is not found", %{conn: conn, link: link} do + assert_error_sent 404, fn -> + conn = get(conn, ~p"/u/#{@invalid_shorten}") + end + end + end + + defp create_link(_) do + link = link_fixture() + %{link: link} + end +end