Packages
phoenix_kit
1.7.152
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/v48.ex
defmodule PhoenixKit.Migrations.Postgres.V48 do
@moduledoc """
V48: Post and Comment Dislikes
Adds dislike functionality to the blogging module for both posts and comments.
## Changes
- Creates `phoenix_kit_post_dislikes` table for post dislikes
- Creates `phoenix_kit_comment_likes` table for comment likes
- Creates `phoenix_kit_comment_dislikes` table for comment dislikes
- Adds `dislike_count` column to `phoenix_kit_posts`
- Adds `dislike_count` column to `phoenix_kit_post_comments`
## Usage
Frontend developers can choose to display:
- Likes only
- Dislikes only
- Both likes and dislikes
- Net score (likes - dislikes)
"""
use Ecto.Migration
def up(%{prefix: prefix} = _opts) do
# Create post dislikes table
create_post_dislikes_table(prefix)
# Create comment likes table
create_comment_likes_table(prefix)
# Create comment dislikes table
create_comment_dislikes_table(prefix)
# Add dislike_count to posts
add_dislike_count_to_posts(prefix)
# Add dislike_count to comments
add_dislike_count_to_comments(prefix)
# Record migration version
prefix_str = if prefix && prefix != "public", do: "#{prefix}.", else: ""
execute "COMMENT ON TABLE #{prefix_str}phoenix_kit IS '48'"
end
def down(%{prefix: prefix} = _opts) do
prefix_str = if prefix && prefix != "public", do: "#{prefix}.", else: ""
# Remove dislike_count from comments
execute """
ALTER TABLE #{prefix_str}phoenix_kit_post_comments
DROP COLUMN IF EXISTS dislike_count
"""
# Remove dislike_count from posts
execute """
ALTER TABLE #{prefix_str}phoenix_kit_posts
DROP COLUMN IF EXISTS dislike_count
"""
# Drop comment dislikes table
drop_if_exists table(:phoenix_kit_comment_dislikes, prefix: prefix)
# Drop comment likes table
drop_if_exists table(:phoenix_kit_comment_likes, prefix: prefix)
# Drop post dislikes table
drop_if_exists table(:phoenix_kit_post_dislikes, prefix: prefix)
# Record migration version
execute "COMMENT ON TABLE #{prefix_str}phoenix_kit IS '47'"
end
defp create_post_dislikes_table(prefix) do
create_if_not_exists table(:phoenix_kit_post_dislikes, primary_key: false, prefix: prefix) do
add :id, :uuid, primary_key: true
add :post_id,
references(:phoenix_kit_posts, on_delete: :delete_all, prefix: prefix, type: :uuid),
null: false
add :user_id,
references(:phoenix_kit_users, on_delete: :delete_all, prefix: prefix, type: :bigint),
null: false
timestamps(type: :naive_datetime)
end
create_if_not_exists index(:phoenix_kit_post_dislikes, [:post_id], prefix: prefix)
create_if_not_exists index(:phoenix_kit_post_dislikes, [:user_id], prefix: prefix)
# Unique constraint: one dislike per user per post
create_if_not_exists unique_index(:phoenix_kit_post_dislikes, [:post_id, :user_id],
prefix: prefix
)
execute """
COMMENT ON TABLE #{prefix_table_name("phoenix_kit_post_dislikes", prefix)} IS
'User dislikes on posts (unique per user/post pair)'
"""
end
defp create_comment_likes_table(prefix) do
create_if_not_exists table(:phoenix_kit_comment_likes, primary_key: false, prefix: prefix) do
add :id, :uuid, primary_key: true
add :comment_id,
references(:phoenix_kit_post_comments,
on_delete: :delete_all,
prefix: prefix,
type: :uuid
),
null: false
add :user_id,
references(:phoenix_kit_users, on_delete: :delete_all, prefix: prefix, type: :bigint),
null: false
timestamps(type: :naive_datetime)
end
create_if_not_exists index(:phoenix_kit_comment_likes, [:comment_id], prefix: prefix)
create_if_not_exists index(:phoenix_kit_comment_likes, [:user_id], prefix: prefix)
# Unique constraint: one like per user per comment
create_if_not_exists unique_index(:phoenix_kit_comment_likes, [:comment_id, :user_id],
prefix: prefix
)
execute """
COMMENT ON TABLE #{prefix_table_name("phoenix_kit_comment_likes", prefix)} IS
'User likes on comments (unique per user/comment pair)'
"""
end
defp create_comment_dislikes_table(prefix) do
create_if_not_exists table(:phoenix_kit_comment_dislikes, primary_key: false, prefix: prefix) do
add :id, :uuid, primary_key: true
add :comment_id,
references(:phoenix_kit_post_comments,
on_delete: :delete_all,
prefix: prefix,
type: :uuid
),
null: false
add :user_id,
references(:phoenix_kit_users, on_delete: :delete_all, prefix: prefix, type: :bigint),
null: false
timestamps(type: :naive_datetime)
end
create_if_not_exists index(:phoenix_kit_comment_dislikes, [:comment_id], prefix: prefix)
create_if_not_exists index(:phoenix_kit_comment_dislikes, [:user_id], prefix: prefix)
# Unique constraint: one dislike per user per comment
create_if_not_exists unique_index(:phoenix_kit_comment_dislikes, [:comment_id, :user_id],
prefix: prefix
)
execute """
COMMENT ON TABLE #{prefix_table_name("phoenix_kit_comment_dislikes", prefix)} IS
'User dislikes on comments (unique per user/comment pair)'
"""
end
defp add_dislike_count_to_posts(prefix) do
prefix_str = if prefix && prefix != "public", do: "#{prefix}.", else: ""
execute """
ALTER TABLE #{prefix_str}phoenix_kit_posts
ADD COLUMN IF NOT EXISTS dislike_count INTEGER DEFAULT 0 NOT NULL
"""
end
defp add_dislike_count_to_comments(prefix) do
prefix_str = if prefix && prefix != "public", do: "#{prefix}.", else: ""
execute """
ALTER TABLE #{prefix_str}phoenix_kit_post_comments
ADD COLUMN IF NOT EXISTS dislike_count INTEGER DEFAULT 0 NOT NULL
"""
end
defp prefix_table_name(table_name, nil), do: table_name
defp prefix_table_name(table_name, "public"), do: table_name
defp prefix_table_name(table_name, prefix), do: "#{prefix}.#{table_name}"
end