Packages
phoenix_kit
1.6.8
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
Current section
Files
lib/phoenix_kit/storage/file_location.ex
defmodule PhoenixKit.Storage.FileLocation do
@moduledoc """
Schema for physical storage locations (redundancy tracking).
Tracks where each file instance is physically stored. Each instance can have
multiple locations for redundancy (1-5 copies across different buckets).
## Redundancy Example
If `storage_redundancy_copies = 2`, each file instance will have 2 location records:
# Location 1: Backblaze B2
%FileLocation{
path: "/uploads/018e3c4a-9f6b-7890-thumbnail.jpg",
status: "active",
priority: 0,
file_instance_id: "...",
bucket_id: "b2_bucket_id"
}
# Location 2: Cloudflare R2
%FileLocation{
path: "/uploads/018e3c4a-9f6b-7890-thumbnail.jpg",
status: "active",
priority: 0,
file_instance_id: "...",
bucket_id: "r2_bucket_id"
}
## Status Flow
- `active` - File is available at this location
- `syncing` - File is being uploaded/copied
- `failed` - Upload or sync failed
- `deleted` - File has been removed from this location
## Fields
- `path` - Full path within the bucket
- `status` - Current state of this location
- `priority` - Retrieval priority (0 = lowest, higher = preferred)
- `last_verified_at` - Last health check timestamp
- `file_instance_id` - Which instance this location stores
- `bucket_id` - Which bucket this file is stored in
## Examples
# Active location on local storage
%FileLocation{
path: "/var/uploads/018e3c4a-9f6b-7890-large.jpg",
status: "active",
priority: 0,
last_verified_at: ~N[2025-10-28 10:00:00],
file_instance_id: "...",
bucket_id: "local_bucket_id"
}
# Syncing to cloud backup
%FileLocation{
path: "/uploads/018e3c4a-9f6b-7890-large.jpg",
status: "syncing",
priority: 0,
file_instance_id: "...",
bucket_id: "s3_bucket_id"
}
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, UUIDv7, autogenerate: true}
@foreign_key_type UUIDv7
@type t :: %__MODULE__{
id: UUIDv7.t() | nil,
path: String.t(),
status: String.t(),
priority: integer(),
last_verified_at: NaiveDateTime.t() | nil,
file_instance_id: UUIDv7.t() | nil,
bucket_id: UUIDv7.t() | nil,
file_instance: PhoenixKit.Storage.FileInstance.t() | Ecto.Association.NotLoaded.t(),
bucket: PhoenixKit.Storage.Bucket.t() | Ecto.Association.NotLoaded.t(),
inserted_at: NaiveDateTime.t() | nil,
updated_at: NaiveDateTime.t() | nil
}
schema "phoenix_kit_file_locations" do
field :path, :string
field :status, :string, default: "active"
field :priority, :integer, default: 0
field :last_verified_at, :naive_datetime
belongs_to :file_instance, PhoenixKit.Storage.FileInstance
belongs_to :bucket, PhoenixKit.Storage.Bucket
timestamps(type: :naive_datetime)
end
@doc """
Changeset for creating or updating a file location.
## Required Fields
- `path`
- `file_instance_id`
- `bucket_id`
## Validation Rules
- Status must be valid (active, syncing, failed, deleted)
- Priority must be >= 0
"""
def changeset(location, attrs) do
location
|> cast(attrs, [
:path,
:status,
:priority,
:last_verified_at,
:file_instance_id,
:bucket_id
])
|> validate_required([:path, :file_instance_id, :bucket_id])
|> validate_inclusion(:status, ["active", "syncing", "failed", "deleted"])
|> validate_number(:priority, greater_than_or_equal_to: 0)
|> foreign_key_constraint(:file_instance_id)
|> foreign_key_constraint(:bucket_id)
end
@doc """
Returns whether this location is active and available.
"""
def active?(%__MODULE__{status: "active"}), do: true
def active?(_), do: false
@doc """
Returns whether this location is currently syncing.
"""
def syncing?(%__MODULE__{status: "syncing"}), do: true
def syncing?(_), do: false
@doc """
Returns whether this location has failed.
"""
def failed?(%__MODULE__{status: "failed"}), do: true
def failed?(_), do: false
@doc """
Returns whether this location has been deleted.
"""
def deleted?(%__MODULE__{status: "deleted"}), do: true
def deleted?(_), do: false
end