Packages
phoenix_kit
1.7.79
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/migrations/postgres/v26.ex
defmodule PhoenixKit.Migrations.Postgres.V26 do
@moduledoc """
Migration V26: Rename checksum fields and add per-user deduplication.
This migration renames checksum fields for clarity and adds per-user file deduplication
while preserving the ability to query for popular files across all users.
## Changes
- Enables `pgcrypto` extension for cryptographic functions
- Renames `checksum` column to `file_checksum` (for clarity)
- Drops unique index on `file_checksum` (allows same file from different users)
- Adds `user_file_checksum` column (SHA256 of user_id + file_checksum)
- Creates unique index on `user_file_checksum` to enforce per-user uniqueness
- Backfills existing records with calculated user_file_checksum values
## Requirements
- PostgreSQL with `pgcrypto` extension support (enabled automatically)
## Purpose
- Same user cannot upload the same file twice (duplicate prevention via user_file_checksum)
- Different users CAN upload the same file (no unique constraint on file_checksum)
- Original `file_checksum` field preserved for finding most popular images across all users
- Clearer naming: file_checksum vs user_file_checksum
"""
use Ecto.Migration
def up(%{prefix: prefix} = _opts) do
# Enable pgcrypto extension for digest function
execute "CREATE EXTENSION IF NOT EXISTS pgcrypto"
# Drop the unique index on checksum (from V24)
drop_if_exists unique_index(:phoenix_kit_files, [:checksum], prefix: prefix)
# Rename checksum to file_checksum for clarity
rename table(:phoenix_kit_files, prefix: prefix), :checksum, to: :file_checksum
# Add user_file_checksum column
alter table(:phoenix_kit_files, prefix: prefix) do
add :user_file_checksum, :string
end
# Backfill existing records with user_file_checksum
execute """
UPDATE #{prefix}.phoenix_kit_files
SET user_file_checksum = encode(digest(CAST(user_id AS text) || file_checksum, 'sha256'), 'hex')
WHERE user_file_checksum IS NULL
"""
# Make the column NOT NULL after backfill
alter table(:phoenix_kit_files, prefix: prefix) do
modify :user_file_checksum, :string, null: false
end
# Create unique index on user_file_checksum for fast per-user duplicate detection
create unique_index(:phoenix_kit_files, [:user_file_checksum],
prefix: prefix,
name: "#{prefix}_phoenix_kit_files_user_file_checksum_index"
)
# Set version comment on phoenix_kit table for version tracking
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '26'"
end
def down(%{prefix: prefix} = _opts) do
# Drop the user_file_checksum unique index
drop_if_exists unique_index(:phoenix_kit_files, [:user_file_checksum],
prefix: prefix,
name: "#{prefix}_phoenix_kit_files_user_file_checksum_index"
)
# Remove user_file_checksum column
alter table(:phoenix_kit_files, prefix: prefix) do
remove :user_file_checksum
end
# Rename file_checksum back to checksum
rename table(:phoenix_kit_files, prefix: prefix), :file_checksum, to: :checksum
# Restore the unique index on checksum (from V24)
create_if_not_exists unique_index(:phoenix_kit_files, [:checksum], prefix: prefix)
# Update version comment on phoenix_kit table to previous version
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '25'"
end
# Helper functions
defp prefix_table_name(table_name, nil), do: table_name
defp prefix_table_name(table_name, prefix), do: "#{prefix}.#{table_name}"
end