defmodule BerrypodWeb.SeoController do use BerrypodWeb, :controller alias Berrypod.{Pages, Products} alias BerrypodWeb.R def robots(conn, _params) do base = BerrypodWeb.Endpoint.url() content = """ User-agent: * Allow: / Disallow: /admin/ Disallow: /api/ Disallow: /users/ Disallow: /webhooks/ Disallow: /checkout/ Sitemap: #{base}/sitemap.xml """ conn |> put_resp_content_type("text/plain") |> send_resp(200, content) end def sitemap(conn, _params) do base = BerrypodWeb.Endpoint.url() products = Products.list_visible_products() categories = Products.list_categories() static_pages = [ {R.home(), "daily", "1.0"}, {R.collection("all"), "daily", "0.9"}, {R.about(), "monthly", "0.5"}, {R.contact(), "monthly", "0.5"}, {R.delivery(), "monthly", "0.5"}, {R.privacy(), "monthly", "0.3"}, {R.terms(), "monthly", "0.3"} ] category_pages = Enum.map(categories, fn cat -> {R.collection(cat.slug), "daily", "0.8"} end) product_pages = Enum.map(products, fn product -> {R.product(product.slug), "weekly", "0.9"} end) custom_pages = Pages.list_custom_pages() |> Enum.filter(& &1.published) |> Enum.map(fn page -> {"/#{page.slug}", "weekly", "0.6"} end) all_pages = static_pages ++ category_pages ++ product_pages ++ custom_pages entries = Enum.map_join(all_pages, "\n", fn {path, changefreq, priority} -> " \n" <> " #{base}#{path}\n" <> " #{changefreq}\n" <> " #{priority}\n" <> " " end) xml = """ #{entries} """ conn |> put_resp_content_type("application/xml") |> send_resp(200, xml) end end