Compare commits
1 Commits
feature/de
...
312ad5899e
| Author | SHA1 | Date | |
|---|---|---|---|
| 312ad5899e |
64
lib/outlook/public.ex
Normal file
64
lib/outlook/public.ex
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
defmodule Outlook.Public do
|
||||||
|
@moduledoc """
|
||||||
|
This should replace Outlook.Artikel and Outlook.Autoren for
|
||||||
|
both of which embedded schemas should be created, for Artikel the schema should
|
||||||
|
implement to_param protocol (no more needed for Outlook.Translations.Translation then).
|
||||||
|
"""
|
||||||
|
|
||||||
|
alias Outlook.Translations.Translation
|
||||||
|
alias Outlook.Articles.Article
|
||||||
|
alias Outlook.Authors.Author
|
||||||
|
alias Outlook.Public.Artikel
|
||||||
|
|
||||||
|
import Ecto.Query, warn: false
|
||||||
|
alias Outlook.Repo
|
||||||
|
|
||||||
|
def list_artikel(language \\ "DE") do
|
||||||
|
q = from t in Translation,
|
||||||
|
join: a in Article, on: t.article_id == a.id,
|
||||||
|
join: au in Author, on: a.author_id == au.id,
|
||||||
|
select: [
|
||||||
|
title: t.title,
|
||||||
|
date: t.date,
|
||||||
|
teaser: t.teaser,
|
||||||
|
id: t.id,
|
||||||
|
date_org: a.date,
|
||||||
|
autor_name: au.name,
|
||||||
|
],
|
||||||
|
where: t.public == true and t.language == ^language,
|
||||||
|
order_by: [desc: t.date]
|
||||||
|
Repo.all(q)
|
||||||
|
|> Enum.map(fn rec -> Enum.into(rec, %{}) end)
|
||||||
|
|> Enum.map(fn map -> struct(Artikel, map) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_artikel!(artikel) when is_struct(artikel), do: get_artikel!(artikel.id)
|
||||||
|
def get_artikel!(id) do
|
||||||
|
q = from t in Translation,
|
||||||
|
join: a in Article, on: t.article_id == a.id,
|
||||||
|
join: au in Author, on: a.author_id == au.id,
|
||||||
|
select: [
|
||||||
|
title: t.title,
|
||||||
|
date: t.date,
|
||||||
|
public_content: t.public_content,
|
||||||
|
title_org: a.title,
|
||||||
|
url_org: a.url,
|
||||||
|
date_org: a.date,
|
||||||
|
author: au.name,
|
||||||
|
author_id: au.id
|
||||||
|
],
|
||||||
|
where: t.id == ^id and t.public == true
|
||||||
|
case Repo.one(q) do
|
||||||
|
nil -> {:error, "Artikel does not exist, or isn't public."}
|
||||||
|
artikel -> {:ok, struct(Artikel, artikel |> Enum.into(%{}))}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_artikel_by_tid(tid) do
|
||||||
|
tid
|
||||||
|
|> String.split(~r/--(?=[0-9A-Za-z])/)
|
||||||
|
|> List.last()
|
||||||
|
|> String.to_integer(36)
|
||||||
|
|> get_artikel!()
|
||||||
|
end
|
||||||
|
end
|
||||||
43
lib/outlook/public/artikel.ex
Normal file
43
lib/outlook/public/artikel.ex
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
defmodule Outlook.Public.Artikel do
|
||||||
|
use Ecto.Schema
|
||||||
|
|
||||||
|
alias Outlook.Public.Artikel
|
||||||
|
|
||||||
|
embedded_schema do
|
||||||
|
field :title, :string
|
||||||
|
field :date, :utc_datetime
|
||||||
|
field :public_content, :string
|
||||||
|
field :title_org, :string
|
||||||
|
field :url_org, :string
|
||||||
|
field :date_org, :utc_datetime
|
||||||
|
field :autor_name, :string
|
||||||
|
field :author_id, :integer
|
||||||
|
field :teaser, :string
|
||||||
|
# field :autor, Autor
|
||||||
|
end
|
||||||
|
|
||||||
|
def translate_unicode(str) do
|
||||||
|
mapping = %{"Ä" => "Ae",
|
||||||
|
"Ö" => "Oe",
|
||||||
|
"Ü" => "Ue",
|
||||||
|
"ä" => "ae",
|
||||||
|
"ö" => "oe",
|
||||||
|
"ü" => "ue",
|
||||||
|
"ß" => "ss"}
|
||||||
|
{:ok, re} = "[#{Map.keys(mapping) |> Enum.join}]" |> Regex.compile("u")
|
||||||
|
Regex.replace(re, str, fn(c) -> mapping[c] end)
|
||||||
|
end
|
||||||
|
|
||||||
|
def spit_title(title) do
|
||||||
|
title
|
||||||
|
|> translate_unicode()
|
||||||
|
|> String.replace(~r/[^\w\s-]/u, "")
|
||||||
|
|> String.replace(~r/(\s|-)+/u, "-")
|
||||||
|
end
|
||||||
|
|
||||||
|
defimpl Phoenix.Param, for: Artikel do
|
||||||
|
def to_param(%{id: id, title: title}) do
|
||||||
|
"#{Artikel.spit_title(title)}--#{Integer.to_string(id, 36) |> String.downcase()}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -23,14 +23,14 @@ defmodule OutlookWeb.PublicComponents do
|
|||||||
end
|
end
|
||||||
|
|
||||||
attr :artikel, :any, required: true
|
attr :artikel, :any, required: true
|
||||||
attr :show_author, :boolean, default: true
|
attr :show_autor, :boolean, default: true
|
||||||
|
|
||||||
def artikel(assigns) do
|
def artikel(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<.link navigate={~p"/artikel/#{@artikel}"}>
|
<.link navigate={~p"/artikel/#{@artikel}"}>
|
||||||
<div class="my-2 px-2 rounded border-2 border-solid border-gray-300 dark:border-stone-800">
|
<div class="my-2 px-2 rounded border-2 border-solid border-gray-300 dark:border-stone-800">
|
||||||
<h4 class="font-bold text-stone-800 dark:text-stone-300 py-2"><%= @artikel.title %></h4>
|
<h4 class="font-bold text-stone-800 dark:text-stone-300 py-2"><%= @artikel.title %></h4>
|
||||||
<div :if={@show_author}><small><%= @artikel.article.author.name %></small></div>
|
<div :if={@show_autor}><small><%= @artikel.autor_name %></small></div>
|
||||||
<div><small><%= @artikel.date |> Calendar.strftime("%d.%m.%Y") %></small></div>
|
<div><small><%= @artikel.date |> Calendar.strftime("%d.%m.%Y") %></small></div>
|
||||||
<div><%= @artikel.teaser |> tidy_raw %></div>
|
<div><%= @artikel.teaser |> tidy_raw %></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
defmodule OutlookWeb.ArtikelController do
|
defmodule OutlookWeb.ArtikelController do
|
||||||
use OutlookWeb, :controller
|
use OutlookWeb, :controller
|
||||||
|
|
||||||
alias Outlook.Artikel
|
alias Outlook.Public
|
||||||
|
|
||||||
def index(conn, _params) do
|
def index(conn, _params) do
|
||||||
artikel = Artikel.list_artikel()
|
artikel = Public.list_artikel()
|
||||||
render(conn, :index, artikel: artikel, page_title: "Artikel")
|
render(conn, :index, artikel: artikel, page_title: "Artikel")
|
||||||
end
|
end
|
||||||
|
|
||||||
def show(conn, %{"tid" => tid} = params) do
|
def show(conn, %{"tid" => tid} = params) do
|
||||||
case Artikel.get_artikel_by_tid(tid) do
|
case Public.get_artikel_by_tid(tid) do
|
||||||
{:ok, artikel} -> render(conn, :show, artikel: artikel, page_title: artikel.title)
|
{:ok, artikel} -> render(conn, :show, artikel: artikel, page_title: artikel.title)
|
||||||
{:error, message} -> conn
|
{:error, message} -> conn
|
||||||
|> put_status(404)
|
|> put_status(404)
|
||||||
|
|||||||
Reference in New Issue
Block a user