legendary-doc-site/apps/content/lib/content/sitemap_storage.ex

69 lines
1.9 KiB
Elixir

defmodule Legendary.Content.SitemapStorage do
@moduledoc """
This module serves as a storage adapter for the Sitemap package. It writes
the sitemap as an attachment post into the system, so that the CMS will
serve it up.
"""
alias Legendary.Content.{Endpoint, Post, Repo, Router.Helpers}
alias Ecto.Changeset
alias Sitemap.{Location}
import Ecto.Query
@behaviour Sitemap.Adapters.Behaviour
def write(name, data) do
path = Location.filename(name)
existing_post = Post |> from() |> where([name: ^path]) |> Repo.one()
gzip? = Regex.match?(~r/.gz$/, path)
mime = case gzip? do
true ->
"application/gzip"
false ->
"application/xml"
end
data_processed = data |> :zlib.gzip() |> Base.encode64
post_params = %{
date: NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second),
date_gmt: NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second),
content: data_processed,
title: path,
excerpt: "",
status: "publish",
comment_status: "closed",
ping_status: "closed",
password: "",
name: path,
to_ping: "",
pinged: "",
modified: NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second),
modified_gmt: NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second),
content_filtered: "",
parent: 0,
guid: Helpers.posts_url(Endpoint, :show, path),
menu_order: 0,
type: "attachment",
mime_type: mime,
comment_count: 0,
sticky: 0,
}
case existing_post do
nil ->
%Post{}
|> Changeset.change(post_params)
|> (fn (post) ->
try do
post |> Repo.insert!()
rescue
Ecto.ConstraintError -> post |> Repo.update!()
end
end).()
post ->
post |> Changeset.change(post_params) |> Repo.update!()
end
end
end