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, autor_name: 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 # for /autoren/ def list_autoren do Repo.all(Author) end def get_autor!(id) do Repo.get!(Author, id) |> Repo.preload([articles: [:translations]]) end end