131 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| defmodule Legendary.Content.PostsController do
 | |
|   use Legendary.Content, :controller
 | |
| 
 | |
|   alias Legendary.Content.{Options, Posts}
 | |
| 
 | |
|   plug :put_layout, false when action in [:preview]
 | |
| 
 | |
|   def index(conn, %{"category" => _} = params) do
 | |
|     conn |> index_posts(params)
 | |
|   end
 | |
| 
 | |
|   def index(conn, params) do
 | |
|     show_on_front = Options.get_value("show_on_front") || "page"
 | |
| 
 | |
|     case show_on_front do
 | |
|       "posts" ->
 | |
|         conn |> index_posts(params)
 | |
|       "page" ->
 | |
|         conn |> index_page(params)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def index_posts(conn, params) do
 | |
|     page = params |> Map.get("page", "1")
 | |
|     params = params |> Map.merge(%{"page" => page})
 | |
|     category = params |> Map.get("category")
 | |
|     posts =  Posts.list_posts(params)
 | |
|     thumbs = posts |> Posts.thumbs_for_posts()
 | |
|     last_page = Posts.last_page(params)
 | |
| 
 | |
|     conn
 | |
|     |> render(
 | |
|       "index.html",
 | |
|       [
 | |
|         posts: posts,
 | |
|         page: String.to_integer(page),
 | |
|         last_page: last_page,
 | |
|         thumbs: thumbs,
 | |
|         category: category,
 | |
|       ]
 | |
|     )
 | |
|   end
 | |
| 
 | |
|   def index_page(conn, _params) do
 | |
|     page_id = Options.get_value("page_on_front") || "index"
 | |
| 
 | |
|     show(conn, %{"id" => page_id})
 | |
|   end
 | |
| 
 | |
|   def preview(conn, %{"post" => post_params}) do
 | |
|     post = Posts.preview_post(post_params)
 | |
| 
 | |
|     conn
 | |
|     |> render("show.html", post: post, page: 1, thumbs: [])
 | |
|   end
 | |
| 
 | |
|   def show(conn, %{"id" => "blog", "page" => page_string}) do
 | |
|     conn |> index_posts(%{"id" => "blog", "page" => page_string})
 | |
|   end
 | |
| 
 | |
|   def show(conn, %{"id" => id, "page" => page_string}) when is_binary(id) or is_integer(id) do
 | |
|     post = Posts.get_post(id)
 | |
| 
 | |
|     if is_nil(post) do
 | |
|       try_static_post(conn, id)
 | |
|     else
 | |
|       conn |> show_one(post, page_string)
 | |
|     end
 | |
|   end
 | |
|   def show(conn, %{"id" => id} = params) when is_list(id), do: show(conn, Map.merge(params, %{"id" => Enum.join(id, "/")}))
 | |
|   def show(conn, %{"id" => id}), do: show(conn, %{"id" => id, "page" => "1"})
 | |
| 
 | |
|   defp try_static_post(conn, id) do
 | |
|     path = "static_pages/#{id}.html"
 | |
|     try do
 | |
|       render(conn, path)
 | |
|     rescue
 | |
|       e in Phoenix.Template.UndefinedError ->
 | |
|         case e do
 | |
|           %{template: ^path} ->
 | |
|             router =
 | |
|               case conn do
 | |
|                 %{private: %{phoenix_router: router}} -> router
 | |
|                 _ -> Legendary.Content.Router
 | |
|               end
 | |
| 
 | |
|             # The static page we're looking for is missing, so this is just a 404
 | |
|             # credo:disable-for-next-line
 | |
|             raise Phoenix.Router.NoRouteError.exception(conn: conn, router: router)
 | |
|           _ ->
 | |
|             # We aren't missing the static page, we're missing a partial. This is probably
 | |
|             # a developer error, so bubble it up
 | |
|             reraise e, System.stacktrace
 | |
|         end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def show_one(conn, post, page_string) do
 | |
|     {front_page_id, _} = Options.get_value_as_int("page_on_front")
 | |
| 
 | |
|     template =
 | |
|       if post.id == front_page_id do
 | |
|         "front.html"
 | |
|       else
 | |
|         "show.html"
 | |
|       end
 | |
| 
 | |
|     page = String.to_integer(page_string)
 | |
|     thumbs = [post] |> Posts.thumbs_for_posts()
 | |
|     case post.type do
 | |
|       "attachment" ->
 | |
|         {:ok, decoded} = post.content |> Base.decode64
 | |
| 
 | |
|         conn
 | |
|         |> put_resp_content_type(post.mime_type, charset(post.mime_type))
 | |
|         |> send_resp(conn.status || 200, decoded)
 | |
|       _ ->
 | |
|         render(conn, template, post: post, page: page, thumbs: thumbs)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   defp charset(mime_type) do
 | |
|     do_charset(String.split(mime_type, "/"))
 | |
|   end
 | |
| 
 | |
|   defp do_charset(["application", _]), do: "binary"
 | |
|   defp do_charset(["video", _]), do: "binary"
 | |
|   defp do_charset(["audio", _]), do: "binary"
 | |
|   defp do_charset(["image", _]), do: "binary"
 | |
|   defp do_charset(_), do: "utf-8"
 | |
| end
 | 
