Packages

phoenix_kit

1.7.185
1.7.210 1.7.209 1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules storage tessera_adapter.ex
Raw

lib/modules/storage/tessera_adapter.ex

defmodule PhoenixKit.Modules.Storage.TesseraAdapter do
@moduledoc """
`Tessera.Storage` adapter that lands tile / manifest writes inside
PhoenixKit's storage pipeline:
* writes the binary into every configured bucket via
`PhoenixKit.Modules.Storage.Manager.store_file/2` under the
`_tiles/` prefix (multi-bucket redundancy applies)
* creates a system-managed `File` row + one `"original"`
`FileInstance` row for the chunk via `Storage.store_system_file/3`,
so the chunk is tracked in the DB and cascades away when the
source File is deleted
## Required `storage_opts`
Callers must pass the source image's UUID so the chunk knows its
parent:
Tessera.generate_tile(
original_path, {level, col, row}, "<uuid>/<uuid>",
image_width: w,
image_height: h,
storage: PhoenixKit.Modules.Storage.TesseraAdapter,
storage_opts: [
parent_file_uuid: source_file_uuid,
mime_type: "image/jpeg"
]
)
Reads, existence checks, and deletes happen from the consumer side
(see `PhoenixKitWeb.FileController.serve_tile/2` and the cascade FK
on `parent_file_uuid` in V112).
"""
@behaviour Tessera.Storage
alias PhoenixKit.Modules.Storage
@prefix "_tiles/"
@doc """
Persist `content_path` under `_tiles/<key>` in every configured bucket
*and* create a system-managed File + FileInstance pair in the DB.
Returns `:ok` or `{:error, reason}`. If the bucket write succeeded
but DB row creation failed, the bucket data is left in place
(orphaned) — the controller will treat the next request as a cache
miss and try again.
"""
@impl Tessera.Storage
def put(content_path, key, opts) do
parent_file_uuid = Keyword.fetch!(opts, :parent_file_uuid)
mime_type = Keyword.fetch!(opts, :mime_type)
destination = destination_for(key)
case Storage.store_system_file(content_path, destination,
parent_file_uuid: parent_file_uuid,
mime_type: mime_type,
file_type: "tile",
metadata: Keyword.get(opts, :metadata)
) do
{:ok, _} -> :ok
{:error, _} = err -> err
end
end
@doc """
Returns the storage-side destination path for a tile/manifest key
(prepends the `_tiles/` prefix this adapter uses for writes).
"""
def destination_for(key), do: @prefix <> key
end