release assets

This commit is contained in:
2026-08-02 18:26:29 +02:00
parent 9db8ff189c
commit c630278e42
18 changed files with 223 additions and 53 deletions
@@ -0,0 +1,46 @@
class CreateReleaseAssetsAndBackfill < ActiveRecord::Migration[8.1]
COLUMN_KINDS = {
"cartridge_path" => "cartridge",
"source_path" => "source",
"html_folder_path" => "html",
"docs_folder_path" => "docs"
}.freeze
def up
create_table :release_assets, id: { type: :bigint, unsigned: true } do |t|
t.bigint :release_id, unsigned: true, null: false
t.string :kind, limit: 32, null: false
t.string :path, null: false
t.datetime :deleted_at, precision: 3
t.timestamps precision: 3
end
add_index :release_assets, [ :release_id, :kind ], unique: true, name: "idx_release_assets_release_kind"
add_index :release_assets, :deleted_at, name: "idx_release_assets_deleted_at"
add_index :release_assets, :path, name: "idx_release_assets_path"
add_foreign_key :release_assets, :releases, name: "fk_releases_release_assets", on_delete: :cascade
# A soft-deletelt release-ek asset sorai a release deleted_at-jét öröklik,
# így az unscoped alapú admin/updater logika konzisztens marad.
COLUMN_KINDS.each do |column, kind|
execute <<~SQL.squish
INSERT INTO release_assets (release_id, kind, path, deleted_at, created_at, updated_at)
SELECT id, '#{kind}', #{column}, deleted_at, NOW(3), NOW(3)
FROM releases
WHERE #{column} IS NOT NULL AND #{column} != ''
SQL
end
end
def down
COLUMN_KINDS.each do |column, kind|
execute <<~SQL.squish
UPDATE releases r
JOIN release_assets ra ON ra.release_id = r.id AND ra.kind = '#{kind}'
SET r.#{column} = ra.path
SQL
end
drop_table :release_assets
end
end
+14 -1
View File
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 2026_07_29_000001) do
ActiveRecord::Schema[8.1].define(version: 2026_08_02_000001) do
create_table "admin_users", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.datetime "created_at", null: false
t.string "email", default: "", null: false
@@ -170,6 +170,18 @@ ActiveRecord::Schema[8.1].define(version: 2026_07_29_000001) do
t.index ["image_id"], name: "index_members_on_image_id"
end
create_table "release_assets", id: { type: :bigint, unsigned: true }, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.datetime "created_at", precision: 3, null: false
t.datetime "deleted_at", precision: 3
t.string "kind", limit: 32, null: false
t.string "path", null: false
t.bigint "release_id", null: false, unsigned: true
t.datetime "updated_at", precision: 3, null: false
t.index ["deleted_at"], name: "idx_release_assets_deleted_at"
t.index ["path"], name: "idx_release_assets_path"
t.index ["release_id", "kind"], name: "idx_release_assets_release_kind", unique: true
end
create_table "releases", id: { type: :bigint, unsigned: true }, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "cartridge_path"
t.datetime "created_at", precision: 3
@@ -219,6 +231,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_07_29_000001) do
add_foreign_key "downloads", "releases", name: "fk_downloads_release", on_delete: :nullify
add_foreign_key "external_links", "softwares", name: "fk_softwares_external_links", on_delete: :cascade
add_foreign_key "members", "images"
add_foreign_key "release_assets", "releases", name: "fk_releases_release_assets", on_delete: :cascade
add_foreign_key "releases", "softwares", name: "fk_softwares_releases", on_delete: :cascade
add_foreign_key "software_images", "images"
add_foreign_key "software_images", "softwares", on_delete: :cascade