From 38e35826898eefb020fda8564f527de4f70e6d1c Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Mon, 9 Jun 2025 12:38:10 +0200 Subject: [PATCH] Basic foundation for public collections --- app/models/collection.rb | 2 +- app/models/collection/publication.rb | 5 ++ app/models/collection/publishable.rb | 20 +++++++ ...09102553_create_collection_publications.rb | 10 ++++ db/schema.rb | 12 ++++- db/schema_cache.yml | 52 ++++++++++++++++++- 6 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 app/models/collection/publication.rb create mode 100644 app/models/collection/publishable.rb create mode 100644 db/migrate/20250609102553_create_collection_publications.rb diff --git a/app/models/collection.rb b/app/models/collection.rb index 105cd6eed..f341eeb40 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -1,5 +1,5 @@ class Collection < ApplicationRecord - include AutoClosing, Accessible, Broadcastable, Entropic, Filterable, Workflowing + include AutoClosing, Accessible, Broadcastable, Entropic, Filterable, Publishable, Workflowing belongs_to :creator, class_name: "User", default: -> { Current.user } diff --git a/app/models/collection/publication.rb b/app/models/collection/publication.rb new file mode 100644 index 000000000..fbbc68741 --- /dev/null +++ b/app/models/collection/publication.rb @@ -0,0 +1,5 @@ +class Collection::Publication < ApplicationRecord + belongs_to :collection + + has_secure_token :key +end diff --git a/app/models/collection/publishable.rb b/app/models/collection/publishable.rb new file mode 100644 index 000000000..373ca4a21 --- /dev/null +++ b/app/models/collection/publishable.rb @@ -0,0 +1,20 @@ +module Collection::Publishable + extend ActiveSupport::Concern + + included do + has_one :publication, class_name: "Collection::Publication", dependent: :destroy + scope :published, ->{ joins(:publication) } + end + + def published? + publication.present? + end + + def publish + create_publication! unless published? + end + + def unpublish + publication&.destroy + end +end diff --git a/db/migrate/20250609102553_create_collection_publications.rb b/db/migrate/20250609102553_create_collection_publications.rb new file mode 100644 index 000000000..fba3255a6 --- /dev/null +++ b/db/migrate/20250609102553_create_collection_publications.rb @@ -0,0 +1,10 @@ +class CreateCollectionPublications < ActiveRecord::Migration[8.1] + def change + create_table :collection_publications do |t| + t.references :collection, null: false, foreign_key: true, index: true + t.string :key, index: { unique: true } + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index ecffc5579..d27ab0295 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2025_06_04_120033) do +ActiveRecord::Schema[8.1].define(version: 2025_06_09_102553) do create_table "accesses", force: :cascade do |t| t.integer "collection_id", null: false t.datetime "created_at", null: false @@ -146,6 +146,15 @@ ActiveRecord::Schema[8.1].define(version: 2025_06_04_120033) do t.index ["user_id"], name: "index_closures_on_user_id" end + create_table "collection_publications", force: :cascade do |t| + t.integer "collection_id", null: false + t.datetime "created_at", null: false + t.string "key" + t.datetime "updated_at", null: false + t.index ["collection_id"], name: "index_collection_publications_on_collection_id" + t.index ["key"], name: "index_collection_publications_on_key", unique: true + end + create_table "collections", force: :cascade do |t| t.boolean "all_access", default: false, null: false t.datetime "created_at", null: false @@ -361,6 +370,7 @@ ActiveRecord::Schema[8.1].define(version: 2025_06_04_120033) do add_foreign_key "cards", "workflow_stages", column: "stage_id" add_foreign_key "closures", "cards" add_foreign_key "closures", "users" + add_foreign_key "collection_publications", "collections" add_foreign_key "collections", "workflows" add_foreign_key "commands", "commands", column: "parent_id" add_foreign_key "commands", "users" diff --git a/db/schema_cache.yml b/db/schema_cache.yml index 73911606c..479604bf0 100644 --- a/db/schema_cache.yml +++ b/db/schema_cache.yml @@ -481,6 +481,21 @@ columns: default_function: collation: comment: + collection_publications: + - *23 + - *5 + - *6 + - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column + auto_increment: + name: key + cast_type: *7 + sql_type_metadata: *8 + 'null': true + default: + default_function: + collation: + comment: + - *9 collections: - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: @@ -1032,6 +1047,7 @@ primary_keys: cards: id closure_reasons: id closures: id + collection_publications: id collections: id collections_filters: commands: id @@ -1072,6 +1088,7 @@ data_sources: cards: true closure_reasons: true closures: true + collection_publications: true collections: true collections_filters: true commands: true @@ -1506,6 +1523,39 @@ indexes: nulls_not_distinct: comment: valid: true + collection_publications: + - !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition + table: collection_publications + name: index_collection_publications_on_collection_id + unique: false + columns: + - collection_id + lengths: {} + orders: {} + opclasses: {} + where: + type: + using: + include: + nulls_not_distinct: + comment: + valid: true + - !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition + table: collection_publications + name: index_collection_publications_on_key + unique: true + columns: + - key + lengths: {} + orders: {} + opclasses: {} + where: + type: + using: + include: + nulls_not_distinct: + comment: + valid: true collections: - !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition table: collections @@ -2235,4 +2285,4 @@ indexes: comment: valid: true workflows: [] -version: 20250604120033 +version: 20250609102553