From 9ba94f9f4bcebf5184f74a4f8ac589a06620f93e Mon Sep 17 00:00:00 2001 From: Emi Matchu Date: Sun, 2 Nov 2025 07:02:43 +0000 Subject: [PATCH] chore: document legacy openneo_id migrations and update references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit completes the database consolidation cleanup by documenting the historical migrations and updating all references to reflect the single-database architecture. Changes: - db/openneo_id_migrate/README.md: Created comprehensive documentation explaining the history of the separate database and why these migrations are preserved but no longer runnable - db/openneo_id_schema.rb: Deleted (no longer needed) - README.md: Updated to reflect single-database architecture - Removed mentions of "two databases" - Updated "OpenNeo ID Database" section to "Authentication Architecture" - Added reference to historical context in db/openneo_id_migrate/README.md - deploy/setup.yml: Removed openneo_id database creation and privileges for future deployments - db/migrate/20240401124200_increase_username_length.rb: Updated comment to note this was historically paired with an openneo_id migration The codebase now fully reflects the consolidated single-database architecture. The legacy migration files in db/openneo_id_migrate/ are preserved for historical reference only. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- README.md | 16 +++++--- ...20240401124200_increase_username_length.rb | 4 +- db/openneo_id_migrate/README.md | 35 ++++++++++++++++ db/openneo_id_schema.rb | 40 ------------------- deploy/setup.yml | 5 +-- 5 files changed, 50 insertions(+), 50 deletions(-) create mode 100644 db/openneo_id_migrate/README.md delete mode 100644 db/openneo_id_schema.rb diff --git a/README.md b/README.md index 2eba3144..bea80955 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ DTI is a Rails application with a React-based outfit editor, backed by MySQL dat ### Core Components - **Rails backend** (Ruby 3.4, Rails 8.0): Serves web pages, API endpoints, and manages data -- **MySQL databases**: Primary database (`openneo_impress`) + legacy auth database (`openneo_id`) +- **MySQL database**: Single database (`openneo_impress`) containing all application and authentication data - **React outfit editor**: Embedded in `app/javascript/wardrobe-2020/`, provides the main customization UI - **Modeling system**: Crowdsources pet/item appearance data by fetching from Neopets APIs when users load their pets @@ -98,7 +98,7 @@ app/ ``` config/ β”œβ”€β”€ routes.rb # All Rails routes -β”œβ”€β”€ database.yml # Multi-database setup (main + openneo_id) +β”œβ”€β”€ database.yml # Database configuration └── environments/ └── *.rb # Env-specific config (incl. impress_2020_origin) ``` @@ -117,7 +117,7 @@ config/ - **Backend**: Ruby on Rails (Ruby 3.4, Rails 8.0) - **Frontend**: Mix of Rails views (Turbo/HAML) and React (for outfit editor) -- **Database**: MySQL (two databases: `openneo_impress`, `openneo_id`) +- **Database**: MySQL (`openneo_impress`) - **Styling**: CSS, Sass (moving toward modern Rails conventions) - **External Integrations**: - **Neopets.com**: Legacy Flash/AMF protocol for pet appearance data (modeling) @@ -129,11 +129,15 @@ config/ ## Development Notes -### OpenNeo ID Database +### Authentication Architecture -The `openneo_id` database is a legacy from when authentication was a separate service ("OpenNeo ID") meant to unify auth across multiple OpenNeo projects. DTI was the only project that succeeded, so the apps were mergedβ€”but the database split remains for now. +Authentication data lives in the `auth_users` table (managed by the `AuthUser` model). This was historically in a separate `openneo_id` database (a legacy from when "OpenNeo ID" was envisioned as a service to unify auth across multiple OpenNeo projects). As of November 2025, the databases have been consolidated into a single database for simplicity. -**Implication**: Rails is configured for multi-database mode. User auth models live in `auth_user.rb` and connect to `openneo_id`. +User accounts are split across two related tables: +- `auth_users` - Authentication data (passwords, email, OAuth connections) via Devise +- `users` - Application data (points, closet settings, etc.) + +These are linked via `User.remote_id` β†’ `AuthUser.id`. See `db/openneo_id_migrate/README.md` for the historical context. ### Rails/React Hybrid diff --git a/db/migrate/20240401124200_increase_username_length.rb b/db/migrate/20240401124200_increase_username_length.rb index 670649bd..13db266e 100644 --- a/db/migrate/20240401124200_increase_username_length.rb +++ b/db/migrate/20240401124200_increase_username_length.rb @@ -1,6 +1,8 @@ class IncreaseUsernameLength < ActiveRecord::Migration[7.1] def change - # NOTE: This is paired with a migration to the `openneo_id` database, too! + # NOTE: This was originally paired with a migration to the legacy `openneo_id` + # database (see db/openneo_id_migrate/20240401124406_increase_username_length.rb). + # As of November 2025, the databases have been consolidated. reversible do |direction| direction.up { change_column :users, :name, :string, limit: 30, null: false diff --git a/db/openneo_id_migrate/README.md b/db/openneo_id_migrate/README.md new file mode 100644 index 00000000..c25d85ec --- /dev/null +++ b/db/openneo_id_migrate/README.md @@ -0,0 +1,35 @@ +# Legacy openneo_id Database Migrations + +These migrations are kept for historical reference only. They were applied to the separate `openneo_id` database before it was consolidated into the main `openneo_impress` database in November 2025. + +## What happened? + +Originally, Dress to Impress used two separate MySQL databases: +- `openneo_impress` - Main application data (items, outfits, closets, etc.) +- `openneo_id` - Authentication data (user accounts, passwords, OAuth) + +This split was a legacy from when "OpenNeo ID" was envisioned as a separate authentication service that would unify login across multiple OpenNeo projects. Since DTI was the only successful project, we consolidated the databases. + +## Migration details + +On **November 2, 2025**, the `openneo_id.users` table was copied to `openneo_impress.auth_users`, preserving all data and IDs. The `openneo_id` database was then removed from production. + +See the main migrations directory for: +- `20251102064247_copy_auth_users_table_to_main_database.rb` - The migration that copied the data + +## Can these migrations be run? + +**No.** These migrations reference the `openneo_id` database which no longer exists. They are preserved purely as documentation of how the authentication schema evolved over time. + +## Migration history + +1. `20230807005748_add_remember_created_at_to_users.rb` - Added Devise rememberable feature +2. `20240313200849_add_omniauth_fields_to_users.rb` - Added NeoPass OAuth support +3. `20240315020053_allow_null_email_and_password_for_users.rb` - Made email/password optional for OAuth users +4. `20240401124406_increase_username_length.rb` - Increased username limit from 20 to 30 chars +5. `20240407135246_add_neo_pass_email_to_users.rb` - Added neopass_email field +6. `20240408120359_add_unique_index_for_omniauth_to_users.rb` - Added unique constraint for provider+uid + +--- + +For current authentication schema, see `db/schema.rb` and look for the `auth_users` table. diff --git a/db/openneo_id_schema.rb b/db/openneo_id_schema.rb deleted file mode 100644 index 250d7a4d..00000000 --- a/db/openneo_id_schema.rb +++ /dev/null @@ -1,40 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# This file is the source Rails uses to define your schema when running `bin/rails -# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to -# be faster and is potentially less error prone than running all of your -# migrations from scratch. Old migrations may fail to apply correctly if those -# migrations use external dependencies or application code. -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema[8.0].define(version: 2024_04_08_120359) do - create_table "users", id: { type: :integer, unsigned: true }, charset: "utf8mb3", collation: "utf8mb3_general_ci", force: :cascade do |t| - t.string "name", limit: 30, null: false - t.string "encrypted_password", limit: 64 - t.string "email", limit: 50 - t.string "password_salt", limit: 32 - t.string "reset_password_token" - t.integer "sign_in_count", default: 0 - t.datetime "current_sign_in_at", precision: nil - t.datetime "last_sign_in_at", precision: nil - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" - t.integer "failed_attempts", default: 0 - t.string "unlock_token" - t.datetime "locked_at", precision: nil - t.datetime "created_at", precision: nil - t.datetime "updated_at", precision: nil - t.datetime "reset_password_sent_at", precision: nil - t.datetime "remember_created_at" - t.string "provider" - t.string "uid" - t.string "neopass_email" - t.index ["email"], name: "index_users_on_email", unique: true - t.index ["provider", "uid"], name: "index_users_on_provider_and_uid", unique: true - t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true - t.index ["unlock_token"], name: "index_users_on_unlock_token", unique: true - end -end diff --git a/deploy/setup.yml b/deploy/setup.yml index d6b59878..7840e685 100644 --- a/deploy/setup.yml +++ b/deploy/setup.yml @@ -419,19 +419,18 @@ community.mysql.mysql_db: name: - openneo_impress - - openneo_id - name: Create MySQL user openneo_impress community.mysql.mysql_user: name: openneo_impress password: "{{ mysql_user_password }}" - priv: "openneo_impress.*:ALL,openneo_id.*:ALL" + priv: "openneo_impress.*:ALL" - name: Create MySQL user impress2020 community.mysql.mysql_user: name: impress2020 password: "{{ mysql_user_password_2020 }}" - priv: "openneo_impress.*:ALL,openneo_id.*:ALL" + priv: "openneo_impress.*:ALL" - name: Create the Neopets Media Archive data directory file: