Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions config/runtime.exs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ if config_env() == :prod do
typesense_collection: System.fetch_env!("HEXDOCS_TYPESENSE_COLLECTION"),
fastly_key: System.fetch_env!("HEXDOCS_FASTLY_KEY"),
fastly_hexdocs: System.fetch_env!("HEXDOCS_FASTLY_HEXDOCS"),
fastly_hexdocs_private: System.fetch_env!("HEXDOCS_FASTLY_HEXDOCS_PRIVATE"),
queue_id: System.fetch_env!("HEXDOCS_QUEUE_ID"),
session_key_base: System.fetch_env!("HEXDOCS_SESSION_KEY_BASE"),
session_signing_salt: System.fetch_env!("HEXDOCS_SESSION_SIGNING_SALT"),
Expand Down
28 changes: 12 additions & 16 deletions lib/hexdocs/bucket.ex
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ defmodule Hexdocs.Bucket do
:ok
end

purge([key])
purge("hexpm", [key])
end

def upload(repository, package, version, all_versions, retired_versions, dir, files) do
Expand Down Expand Up @@ -67,7 +67,7 @@ defmodule Hexdocs.Bucket do
)

purge_hexdocs_cache(repository, package, [version], upload_type)
purge([docs_config_cdn_key(repository, package)])
purge(repository, [docs_config_cdn_key(repository, package)])
end

# For Elixir and Hex we use the docs_config.js included in the tarball
Expand Down Expand Up @@ -331,19 +331,14 @@ defmodule Hexdocs.Bucket do
# Don't use Path.join as it removes trailing / which is needed for bucket listing
defp repository_path(repository, path), do: Enum.join([repository, "/", path])

defp purge_hexdocs_cache("hexpm", package, versions, :both) do
keys = Enum.map(versions, &docspage_versioned_cdn_key("hexpm", package, &1))
purge([docspage_unversioned_cdn_key("hexpm", package)] ++ keys)
defp purge_hexdocs_cache(repository, package, versions, :both) do
keys = Enum.map(versions, &docspage_versioned_cdn_key(repository, package, &1))
purge(repository, [docspage_unversioned_cdn_key(repository, package)] ++ keys)
end

defp purge_hexdocs_cache("hexpm", package, versions, :versioned) do
versions
|> Enum.map(&docspage_versioned_cdn_key("hexpm", package, &1))
|> purge()
end

defp purge_hexdocs_cache(_repository, _package, _version, _publish_unversioned?) do
:ok
defp purge_hexdocs_cache(repository, package, versions, :versioned) do
keys = Enum.map(versions, &docspage_versioned_cdn_key(repository, package, &1))
purge(repository, keys)
end

defp docspage_versioned_cdn_key(repository, package, version) do
Expand All @@ -363,9 +358,10 @@ defmodule Hexdocs.Bucket do
defp public?("hexpm"), do: true
defp public?(_), do: false

defp purge(keys) do
Logger.info("Purging fastly_hexdocs #{Enum.join(keys, " ")}")
Hexdocs.CDN.purge_key(:fastly_hexdocs, keys)
defp purge(repository, keys) do
service = if public?(repository), do: :fastly_hexdocs, else: :fastly_hexdocs_private
Logger.info("Purging #{service} #{Enum.join(keys, " ")}")
Hexdocs.CDN.purge_key(service, keys)
end

defp put(bucket, key, data, opts) do
Expand Down
5 changes: 4 additions & 1 deletion lib/hexdocs/cdn/local.ex
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
defmodule Hexdocs.CDN.Local do
@behaviour Hexdocs.CDN

def purge_key(_service, _key), do: :ok
def purge_key(service, key) do
send(self(), {:purge, service, key})
:ok
end
end
20 changes: 20 additions & 0 deletions test/hexdocs/bucket_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,26 @@ defmodule Hexdocs.BucketTest do
assert Store.get(@bucket, "buckettest/#{test}/index.html") == "2.0.0-beta"
end

test "publishing docs for a private repository purges the private docs service", %{test: test} do
version = Version.parse!("0.0.1")
{dir, files} = create_files([{"index.html", "0.0.1"}])
Bucket.upload("buckettest", "#{test}", version, [], MapSet.new(), dir, files)

assert_receive {:purge, :fastly_hexdocs_private, keys}
assert "docspage/buckettest-#{test}" in keys
refute_receive {:purge, :fastly_hexdocs, _keys}
end

test "publishing docs for the hexpm repository purges the public docs service", %{test: test} do
version = Version.parse!("0.0.1")
{dir, files} = create_files([{"index.html", "0.0.1"}])
Bucket.upload("hexpm", "#{test}", version, [], MapSet.new(), dir, files)

assert_receive {:purge, :fastly_hexdocs, keys}
assert "docspage/#{test}" in keys
refute_receive {:purge, :fastly_hexdocs_private, _keys}
end

test "upload docs_config.js", %{test: test} do
version = "1.0.0"
all_versions = []
Expand Down