- restructure routes: read via /users/:id/collection/*, write via /collection/*
- add user lookup + privacy check to collection_characters_controller
- add race, proficiency, gender scopes to model
- delete old collection_controller
Add PATCH/PUT update actions to all three entity controllers with
editor role authorization. Routes updated to include :update action.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add weapon entity creation API following the established pattern from
characters and summons controllers.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- validate granblue_id via HEAD request to GBF CDN
- create characters with editor role check (role >= 7)
- async image download job with Redis status polling
- download_status endpoint for progress tracking
- Change response view from :nested/:full to :uncap for update_uncap_level
- Add default value of 0 for transcendence_step when not provided
- Fix max_uncap_level method call in GridSummonsController
The total_pages method was using the hardcoded SEARCH_PER_PAGE constant
instead of the dynamic search_page_size value from the X-Per-Page header.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Allow search endpoints to work without the 'search' key in the request body.
When no search key is provided, return an empty hash to show all items.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The render_unprocessable_entity_response method was calling to_hash
on all exceptions, but ActionController::ParameterMissing doesn't
have that method. Updated to handle different exception types properly.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add page_size helper method to read from X-Per-Page header
- Set min (1) and max (100) bounds for page sizes
- Update all paginated endpoints to use dynamic page size
- Maintain backward compatibility with default sizes
- POST /parties/:id/grid_update for atomic multi-operations
- Support move, swap, and remove operations
- Validate all operations before executing
- Use transaction for atomicity
- Optional character sequence maintenance
- PUT /parties/:party_id/grid_summons/:id/position
- POST /parties/:party_id/grid_summons/swap
- Restrict main and friend summon positions
- Validate sub/subaura slot transitions
- PUT /parties/:party_id/grid_characters/:id/position
- POST /parties/:party_id/grid_characters/swap
- Auto-compact main slots to maintain sequential filling
- Handle main/extra slot transitions
- PUT /parties/:party_id/grid_weapons/:id/position
- POST /parties/:party_id/grid_weapons/swap
- Validate positions and handle mainhand/extra slots
- Use transactions for atomic swaps
- Create IdResolvable concern for flexible ID lookups
- Update character/summon/weapon controllers to use concern
- Support both UUID and granblue_id in API calls
* First pass at dataminer service
* Got output printing from dataminer
* Fetches summons, characters and weapons
* Can loop over objects
* Finish dataminer
Adds logger and continuing downloads
* Update schema.rb
* Add endpoints for importing game data
This lets privileged users import canonical data for characters, weapons and summons directly from the game
* Update weapon series migration
This update fixes MigrateWeaponSeries from 20250218 such that it can be run on an empty database without throwing errors.
* Update .gitignore
Hide backups and logs directories, since we’ll be storing these in the project folder. Also hide mise’s .local directory.
* Change NewRelic log directory
Moved from log/ to logs/
* Add rake task for backing up/restoring prod db
* Rubocop fixes
* Fix error where :preview_state didn’t have an attribute
* Add supervisord ini
This uses my local paths, so we should try to abstract that away later.
* Ignore mise.toml
* Update test csvs
* Fix count filters and refactor apply_filters
* Update party_querying_concern.rb
* +tests/-debug logs
* Make party association optional in Job
* Updates for weapon series
- Change to new series numbers
- Add static method for querying whether the weapon's element is changeable
- Add a new method to return a text slug for the weapon's series
* Add and update test data
- Updates canonical.rb for loading multiple types of data with multiple types of associations
- Adds test data for Guidebooks, Job Accessories, Job Skills, and Jobs
- Updates test data for Weapons and Summons
* Migrations
- Adds series of migrations for changing the weapon's series to the values used by Cygames
- Shuffled around some foreign keys
* Implement BaseProcessor
Processors are in charge of processing deck data straight from Granblue.
* Implement CharacterProcessor
Process character data from deck
* Implement WeaponProcessor
Process weapon data from deck
* Implement JobProcessor
Process job, job skill, and job accessory data from deck
* Implement SummonProcessor
Process summon data from deck
* Update SummonProcessor to work like the others
* ImportController should use processors
* Process element for changeable weapons
* Moved queries into PartyQueryBuilder service
PartyQueryBuilder supersedes PartyQueryingConcern as it is also used for UsersController (and is our fix for profiles being broken)
* Implement PartyQueryBuilder in controllers
* Update summon_transformer.rb
This should fix the transformer so that we properly capture summons and subaura summons
* Update parties_controller_spec.rb
* Add NewRelic license key
* Add Sentry
Why not?
* Install Rspec
* Create .aidigestignore
* Update rails_helper
- Added sections and comments
- Add support for loading via canonical.rb
- Add FactoryBot syntax methods
- Disable SQL logging in test environment
* Move gems around
* Add canonical.rb and test env CSVs
We load these CSVs via canonical.rb when we run tests as a data source for canonical objects.
* Remove RBS for now
This is too much and we need to find the right solution
* Refactor GridSummonsController and add tests
* Create GridSummon factory
* Refactor GridSummon and add documentation and tests
* Create have_error_on.rb
* Update .aidigestignore
* Fix warnings
* Add GridWeapons and Parties factories
* Refactor GridWeapon and add documentation and tests
* Create .rubocop.yml
* Create no_weapon_provided_error.rb
* Refactor GridWeaponsController
- Refactors controller
- Adds YARD documentation
- Adds Rspec tests
* Refactor GridSummonsController
- Refactors controller
- Adds YARD documentation
- Adds Rspec tests
* Enable shoulda/matchers
* Update User factory
* Update party.rb
We moved updating the party's element and extra flag to inside the party. We use an after_commit hook to minimize the amount of queries we're running to do this.
* Update party.rb
We change setting the edit key to use the conditional assignment operator so that it doesn't get overridden when we're running tests. This shouldn't have an effect in production.
* Update api_controller.rb
Change render_unprocessable_entity_response to render the errors hash instead of the exception so that we get more helpful errors.
* Add new errors
Added NoCharacterProvidedError and NoSummonProvidedError
* Add tests and docs to GridCharacter
We added a factory, spec and documentation to the GridCharacter model
* Ensure numericality
* Move enums into GranblueEnums
We don't use these yet, but it gives us a structured place to pull them from.
* Refactor GridCharactersController
- Refactors controller
- Adds YARD documentation
- Adds Rspec tests
* Add debug hook and other small changes
* Update grid_characters_controller.rb
Removes logs
* Update .gitignore
* Update .aidigestignore
* Refactored PartiesController
- Split PartiesController into three concerns
- Implemented testing for PartiesController and two concerns
- Implemented fixes across other files to ensure PartiesController tests pass
- Added Favorites factory
* Implement SimpleCov
* Refactor Party model
- Refactors Party model
- Adds tests
- Adds documentation
* Update granblue_enums.rb
Remove included block