diff --git a/bin/setup b/bin/setup index 82c5dbe26..1c9c6ac61 100755 --- a/bin/setup +++ b/bin/setup @@ -77,6 +77,8 @@ if [ -e tmp/minio-dev.txt ]; then step "Configuring MinIO" bin/minio-setup fi +step "Starting mysql" bash -c "[ -d ~/Work/basecamp/docker-dev ] && git -C ~/Work/basecamp/docker-dev pull || gh repo clone basecamp/docker-dev ~/Work/basecamp/docker-dev && ~/Work/basecamp/docker-dev/setup mysql80" + if [[ $* == *--reset* ]]; then step "Resetting the database" rails db:reset else diff --git a/db/cable_schema.rb b/db/cable_schema.rb index 310946672..ce4b03e6a 100644 --- a/db/cable_schema.rb +++ b/db/cable_schema.rb @@ -10,14 +10,5 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.2].define(version: 1) do - create_table "solid_cable_messages", force: :cascade do |t| - t.binary "channel", limit: 1024, null: false - t.integer "channel_hash", limit: 8, null: false - t.datetime "created_at", null: false - t.binary "payload", limit: 536870912, null: false - t.index ["channel"], name: "index_solid_cable_messages_on_channel" - t.index ["channel_hash"], name: "index_solid_cable_messages_on_channel_hash" - t.index ["created_at"], name: "index_solid_cable_messages_on_created_at" - end +ActiveRecord::Schema[8.2].define(version: 0) do end diff --git a/db/cache_schema.rb b/db/cache_schema.rb index 3af459803..ce4b03e6a 100644 --- a/db/cache_schema.rb +++ b/db/cache_schema.rb @@ -10,15 +10,5 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.2].define(version: 1) do - create_table "solid_cache_entries", force: :cascade do |t| - t.integer "byte_size", limit: 4, null: false - t.datetime "created_at", null: false - t.binary "key", limit: 1024, null: false - t.integer "key_hash", limit: 8, null: false - t.binary "value", limit: 536870912, null: false - t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size" - t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size" - t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true - end +ActiveRecord::Schema[8.2].define(version: 0) do end diff --git a/db/migrate/20240621150944_create_sessions.rb b/db/migrate/20240621150944_create_sessions.rb deleted file mode 100644 index c80b2ca2d..000000000 --- a/db/migrate/20240621150944_create_sessions.rb +++ /dev/null @@ -1,13 +0,0 @@ -class CreateSessions < ActiveRecord::Migration[8.0] - def change - create_table :sessions do |t| - t.references :user, null: false, foreign_key: true - t.string :token, null: false, index: { unique: true } - t.string :ip_address - t.string :user_agent - t.datetime :last_active_at, null: false - - t.timestamps - end - end -end diff --git a/db/migrate/20240820170703_remove_unnecessary_columns_from_sessions.rb b/db/migrate/20240820170703_remove_unnecessary_columns_from_sessions.rb deleted file mode 100644 index c339bd6fb..000000000 --- a/db/migrate/20240820170703_remove_unnecessary_columns_from_sessions.rb +++ /dev/null @@ -1,8 +0,0 @@ -class RemoveUnnecessaryColumnsFromSessions < ActiveRecord::Migration[8.0] - def change - change_table :sessions do |t| - t.remove :last_active_at - t.remove :token - end - end -end diff --git a/db/migrate/20251024081104_create_sessions.rb b/db/migrate/20251024081104_create_identity_sessions.rb similarity index 86% rename from db/migrate/20251024081104_create_sessions.rb rename to db/migrate/20251024081104_create_identity_sessions.rb index 6c8b11ed9..8c81fdcd0 100644 --- a/db/migrate/20251024081104_create_sessions.rb +++ b/db/migrate/20251024081104_create_identity_sessions.rb @@ -1,4 +1,4 @@ -class CreateSessions < ActiveRecord::Migration[8.2] +class CreateIdentitySessions < ActiveRecord::Migration[8.2] def change create_table "sessions", force: :cascade do |t| t.datetime "created_at", null: false diff --git a/db/migrate/20251024081656_drop_sessions.rb b/db/migrate/20251024081656_drop_sessions.rb deleted file mode 100644 index 0c2f31601..000000000 --- a/db/migrate/20251024081656_drop_sessions.rb +++ /dev/null @@ -1,18 +0,0 @@ -class DropSessions < ActiveRecord::Migration[8.2] - def up - drop_table :sessions - end - - def down - create_table "sessions", force: :cascade do |t| - t.datetime "created_at", null: false - t.string "ip_address" - t.datetime "updated_at", null: false - t.string "user_agent" - t.integer "user_id", null: false - t.index [ "user_id" ], name: "index_sessions_on_user_id" - end - - add_foreign_key "sessions", "users" - end -end diff --git a/db/queue_schema.rb b/db/queue_schema.rb index dd046ba9b..ce4b03e6a 100644 --- a/db/queue_schema.rb +++ b/db/queue_schema.rb @@ -10,132 +10,5 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.2].define(version: 1) do - create_table "solid_queue_blocked_executions", force: :cascade do |t| - t.string "concurrency_key", null: false - t.datetime "created_at", null: false - t.datetime "expires_at", null: false - t.bigint "job_id", null: false - t.integer "priority", default: 0, null: false - t.string "queue_name", null: false - t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release" - t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance" - t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true - end - - create_table "solid_queue_claimed_executions", force: :cascade do |t| - t.datetime "created_at", null: false - t.bigint "job_id", null: false - t.bigint "process_id" - t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true - t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" - end - - create_table "solid_queue_failed_executions", force: :cascade do |t| - t.datetime "created_at", null: false - t.text "error" - t.bigint "job_id", null: false - t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true - end - - create_table "solid_queue_jobs", force: :cascade do |t| - t.string "active_job_id" - t.text "arguments" - t.string "class_name", null: false - t.string "concurrency_key" - t.datetime "created_at", null: false - t.datetime "finished_at" - t.integer "priority", default: 0, null: false - t.string "queue_name", null: false - t.datetime "scheduled_at" - t.datetime "updated_at", null: false - t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id" - t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name" - t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at" - t.index ["queue_name", "finished_at"], name: "index_solid_queue_jobs_for_filtering" - t.index ["scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting" - end - - create_table "solid_queue_pauses", force: :cascade do |t| - t.datetime "created_at", null: false - t.string "queue_name", null: false - t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true - end - - create_table "solid_queue_processes", force: :cascade do |t| - t.datetime "created_at", null: false - t.string "hostname" - t.string "kind", null: false - t.datetime "last_heartbeat_at", null: false - t.text "metadata" - t.string "name", null: false - t.integer "pid", null: false - t.bigint "supervisor_id" - t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at" - t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true - t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id" - end - - create_table "solid_queue_ready_executions", force: :cascade do |t| - t.datetime "created_at", null: false - t.bigint "job_id", null: false - t.integer "priority", default: 0, null: false - t.string "queue_name", null: false - t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true - t.index ["priority", "job_id"], name: "index_solid_queue_poll_all" - t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue" - end - - create_table "solid_queue_recurring_executions", force: :cascade do |t| - t.datetime "created_at", null: false - t.bigint "job_id", null: false - t.datetime "run_at", null: false - t.string "task_key", null: false - t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true - t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true - end - - create_table "solid_queue_recurring_tasks", force: :cascade do |t| - t.text "arguments" - t.string "class_name" - t.string "command", limit: 2048 - t.datetime "created_at", null: false - t.text "description" - t.string "key", null: false - t.integer "priority", default: 0 - t.string "queue_name" - t.string "schedule", null: false - t.boolean "static", default: true, null: false - t.datetime "updated_at", null: false - t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true - t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static" - end - - create_table "solid_queue_scheduled_executions", force: :cascade do |t| - t.datetime "created_at", null: false - t.bigint "job_id", null: false - t.integer "priority", default: 0, null: false - t.string "queue_name", null: false - t.datetime "scheduled_at", null: false - t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true - t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all" - end - - create_table "solid_queue_semaphores", force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "expires_at", null: false - t.string "key", null: false - t.datetime "updated_at", null: false - t.integer "value", default: 1, null: false - t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at" - t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value" - t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true - end - - add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade +ActiveRecord::Schema[8.2].define(version: 0) do end diff --git a/db/schema.rb b/db/schema.rb index 4086b41ba..b1119ac14 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -379,6 +379,15 @@ ActiveRecord::Schema[8.2].define(version: 2025_11_06_154151) do t.datetime "updated_at", null: false end + create_table "sessions", force: :cascade do |t| + t.datetime "created_at", null: false + t.integer "identity_id", null: false + t.string "ip_address" + t.datetime "updated_at", null: false + t.string "user_agent" + t.index ["identity_id"], name: "index_sessions_on_identity_id" + end + create_table "steps", force: :cascade do |t| t.integer "card_id", null: false t.boolean "completed", default: false, null: false @@ -495,6 +504,7 @@ ActiveRecord::Schema[8.2].define(version: 2025_11_06_154151) do add_foreign_key "pins", "users" add_foreign_key "push_subscriptions", "users" add_foreign_key "search_queries", "users" + add_foreign_key "sessions", "identities" add_foreign_key "steps", "cards" add_foreign_key "taggings", "cards" add_foreign_key "taggings", "tags" diff --git a/db/seeds.rb b/db/seeds.rb index 07be186f6..3f2e2c413 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -15,28 +15,25 @@ def create_tenant(signal_account_name) identity = Identity.find_or_create_by!(email_address: email_address) membership = identity.memberships.find_or_create_by!(tenant: tenant_id) - ApplicationRecord.destroy_tenant tenant_id - ApplicationRecord.create_tenant(tenant_id) do - account = Account.create_with_admin_user( - account: { - external_account_id: tenant_id, - name: signal_account_name - }, - owner: { - name: "David Heinemeier Hansson", - membership: membership - } - ) - Current.account = account - end + account = Account.create_with_admin_user( + account: { + external_account_id: tenant_id, + name: signal_account_name + }, + owner: { + name: "David Heinemeier Hansson", + membership: membership + } + ) + Current.account = account end def find_or_create_user(full_name, email_address) - if user = Identity.find_by(email_address: email_address)&.memberships&.find_by(tenant: ApplicationRecord.current_tenant)&.user + if user = Identity.find_by(email_address: email_address)&.memberships&.find_by(tenant: Current.account.id)&.user user else identity = Identity.find_or_create_by!(email_address: email_address) - membership = identity.memberships.find_or_create_by!(tenant: ApplicationRecord.current_tenant) + membership = identity.memberships.find_or_create_by!(tenant: Current.account.id) user = User.create! \ name: full_name, diff --git a/gems/fizzy-saas/app/models/signup.rb b/gems/fizzy-saas/app/models/signup.rb index b03ce730a..86123a2c3 100644 --- a/gems/fizzy-saas/app/models/signup.rb +++ b/gems/fizzy-saas/app/models/signup.rb @@ -98,27 +98,22 @@ class Signup end def create_tenant - ApplicationRecord.create_tenant(tenant) do - @account = Account.create_with_admin_user( - account: { - external_account_id: tenant, - name: account_name - }, - owner: { - name: full_name, - membership_id: membership.id - } - ) - @user = User.find_by!(role: :admin) - @account.setup_customer_template - end + @account = Account.create_with_admin_user( + account: { + external_account_id: tenant, + name: account_name + }, + owner: { + name: full_name, + membership_id: membership.id + } + ) + @user = User.find_by!(role: :admin) + @account.setup_customer_template end def destroy_tenant - if tenant.present? && ApplicationRecord.tenant_exist?(tenant) - ApplicationRecord.destroy_tenant(tenant) - end - + # # TODO:PLANB: need to destroy the account/user records properly @user = nil @account = nil @tenant = nil diff --git a/test/fixtures/memberships.yml b/test/fixtures/memberships.yml index 598f7374f..59433062d 100644 --- a/test/fixtures/memberships.yml +++ b/test/fixtures/memberships.yml @@ -1,11 +1,12 @@ +# TODO:PLANB: not sure what to set membership tenant to right now david_in_37signals: identity: david - tenant: <%= Rails.application.config.active_record_tenanted.default_tenant %> + tenant: 1 # <%# Rails.application.config.active_record_tenanted.default_tenant %> jz_in_37signals: identity: jz - tenant: <%= Rails.application.config.active_record_tenanted.default_tenant %> + tenant: 2 # <%# Rails.application.config.active_record_tenanted.default_tenant %> kevin_in_37signals: identity: kevin - tenant: <%= Rails.application.config.active_record_tenanted.default_tenant %> + tenant: 3 # <%# Rails.application.config.active_record_tenanted.default_tenant %> diff --git a/test/models/account_test.rb b/test/models/account_test.rb index c53ee0f45..d6fcb2448 100644 --- a/test/models/account_test.rb +++ b/test/models/account_test.rb @@ -8,39 +8,38 @@ class AccountTest < ActiveSupport::TestCase end test "slug" do + # # TODO:PLANB: not sure what this should actually do yet! account = Current.account - assert_equal "/#{ApplicationRecord.current_tenant}", account.slug + assert_equal "/#{account.id}", account.slug end test ".create_with_admin_user creates a new local account" do membership = memberships(:david_in_37signals) - ApplicationRecord.create_tenant("account-create-with-dependents") do - account = Account.create_with_admin_user( - account: { - external_account_id: ActiveRecord::FixtureSet.identify("account-create-with-admin-user-test"), - name: "Account Create With Admin" - }, - owner: { - name: "David", - membership: membership - } - ) - assert_not_nil account - assert account.persisted? - assert_equal 1, Account.count - assert_equal ActiveRecord::FixtureSet.identify("account-create-with-admin-user-test"), account.external_account_id - assert_equal "Account Create With Admin", account.name + account = Account.create_with_admin_user( + account: { + external_account_id: ActiveRecord::FixtureSet.identify("account-create-with-admin-user-test"), + name: "Account Create With Admin" + }, + owner: { + name: "David", + membership: membership + } + ) + assert_not_nil account + assert account.persisted? + assert_equal 1, Account.count + assert_equal ActiveRecord::FixtureSet.identify("account-create-with-admin-user-test"), account.external_account_id + assert_equal "Account Create With Admin", account.name - assert_equal 2, User.count + assert_equal 2, User.count - system = User.find_by(role: "system") - assert system + system = User.find_by(role: "system") + assert system - admin = User.find_by(role: "admin") - assert_equal "David", admin.name - assert_equal "david@37signals.com", admin.identity.email_address - assert_equal "admin", admin.role - end + admin = User.find_by(role: "admin") + assert_equal "David", admin.name + assert_equal "david@37signals.com", admin.identity.email_address + assert_equal "admin", admin.role end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 94949d567..9fc0f35b3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,9 +1,6 @@ ENV["RAILS_ENV"] ||= "test" require_relative "../config/environment" -# there's no fixture for this, we're just generating a stable integer -Rails.application.config.active_record_tenanted.default_tenant = ActiveRecord::FixtureSet.identify "37s_fizzy" - require "rails/test_help" require "webmock/minitest" require "vcr" @@ -50,17 +47,18 @@ module ActiveSupport end end -class ActionDispatch::IntegrationTest - setup do - integration_session.default_url_options[:script_name] = "/#{ApplicationRecord.current_tenant}" - end -end +# # TODO:PLANB: not sure if we need these anymore +# class ActionDispatch::IntegrationTest +# setup do +# integration_session.default_url_options[:script_name] = "/#{Current.account.slug}" +# end +# end -class ActionDispatch::SystemTestCase - setup do - self.default_url_options[:script_name] = "/#{ApplicationRecord.current_tenant}" - end -end +# class ActionDispatch::SystemTestCase +# setup do +# self.default_url_options[:script_name] = "/#{ApplicationRecord.current_tenant}" +# end +# end unless Rails.application.config.x.oss_config load File.expand_path("../gems/fizzy-saas/test/test_helper.rb", __dir__)