11 KiB
TurboVault - Project Summary
Overview
TurboVault is a comprehensive video game collection tracker built with Rails 8.1.2. It allows users to manage both physical and digital game collections, organize them into collections, track gameplay progress, and view detailed statistics.
What's Been Built
✅ Phase 1 - MVP Features (COMPLETED)
1. Database & Models
-
9 models with complete associations and validations:
- User (with has_secure_password)
- Platform (31 platforms seeded)
- Genre (30 genres seeded)
- Game (with physical/digital fields)
- GameGenre (join table)
- Collection (with subcollections)
- CollectionGame (join table)
- Item (consoles, controllers, accessories)
- ApiToken
-
Row Level Security (RLS) implemented on all user-scoped tables
-
Proper indexes on all foreign keys and commonly queried fields
-
Enums for format, completion_status, condition, and item_type
-
Seed data with 31 platforms and 30 genres
2. Authentication System
- Email/password authentication with bcrypt
- Session-based authentication for web users
- API token authentication for API access
- Password reset functionality (controllers ready, email sending needs configuration)
- User profile management
- Public/private profile toggle
- RLS integration with authentication
3. Game Management
- Full CRUD operations for games
- Physical game fields: condition, price_paid, location
- Digital game fields: digital_store
- Multiple genre assignment
- Completion status tracking (backlog, currently_playing, completed, on_hold, not_playing)
- 5-star rating system
- Notes field for personal observations
- Date tracking (auto-set, editable)
4. Collections & Organization
- Create multiple collections
- Subcollections (one level deep)
- Games can belong to multiple collections
- Collection statistics (game count)
- Root collections view
5. Search, Filter & Sort
- Search by game title
- Filter by: platform, genre, format, completion status
- Sort by: alphabetical, recently added, highest rated
- Pagination with Kaminari (25 games per page)
6. Bulk Import
- CSV upload for multiple games
- Validation and error reporting
- Example CSV format provided
- Genre assignment via pipe-separated values
- Platform lookup by name or abbreviation
7. Dashboard & Statistics
- Total games count
- Physical vs Digital breakdown
- Completion statistics
- Total spent calculation
- Top 5 platforms by game count
- Top 5 genres by game count
- Recently added games (last 5)
- Currently playing games (last 5)
8. RESTful API (v1)
- Complete CRUD for Games
- Complete CRUD for Collections
- Read-only for Platforms and Genres
- Bulk game creation endpoint
- API Token management
- Token-based authentication
- Per-user data isolation
- JSON responses with error handling
9. User Interface
- Tailwind CSS styling
- Responsive design (mobile-first)
- Clean, modern interface
- Navigation with authentication state
- Flash messages for user feedback
- Form validations with error display
- Dynamic form fields (physical vs digital)
10. Views Created
- Homepage/Landing page
- Login/Signup forms
- Dashboard with statistics
- Games index (with filters)
- Game show/detail page
- Game new/edit forms
- CSV import page
- Collections index
- User settings page
- Navigation partial
- Flash messages partial
Technical Stack
- Framework: Rails 8.1.2
- Database: PostgreSQL with Row Level Security
- Frontend: Hotwire (Turbo + Stimulus)
- Styling: Tailwind CSS 4.2
- Authentication: has_secure_password (bcrypt)
- Pagination: Kaminari
- Development: Docker Compose for PostgreSQL
- Task Runner: Taskfile for common operations
File Structure
turbovault-web/
├── app/
│ ├── controllers/
│ │ ├── concerns/
│ │ │ └── authentication.rb (RLS + session management)
│ │ ├── api/
│ │ │ └── v1/
│ │ │ ├── base_controller.rb
│ │ │ ├── games_controller.rb
│ │ │ ├── collections_controller.rb
│ │ │ ├── platforms_controller.rb
│ │ │ └── genres_controller.rb
│ │ ├── dashboard_controller.rb
│ │ ├── games_controller.rb
│ │ ├── collections_controller.rb
│ │ ├── items_controller.rb
│ │ ├── api_tokens_controller.rb
│ │ ├── sessions_controller.rb
│ │ ├── users_controller.rb
│ │ ├── password_resets_controller.rb
│ │ ├── profiles_controller.rb
│ │ └── pages_controller.rb
│ ├── models/
│ │ ├── user.rb
│ │ ├── game.rb
│ │ ├── platform.rb
│ │ ├── genre.rb
│ │ ├── collection.rb
│ │ ├── item.rb
│ │ ├── api_token.rb
│ │ └── (join models)
│ └── views/
│ ├── layouts/
│ ├── pages/
│ ├── dashboard/
│ ├── games/
│ ├── collections/
│ ├── sessions/
│ └── users/
├── db/
│ ├── migrate/ (10 migrations with RLS)
│ └── seeds.rb (platforms & genres)
├── config/
│ ├── routes.rb (comprehensive routing)
│ └── database.yml (PostgreSQL config)
├── docker-compose.yml
├── Taskfile.yml
├── REQUIREMENTS.md
├── API_DOCUMENTATION.md
└── PROJECT_SUMMARY.md (this file)
What's NOT Yet Implemented
Testing
- ❌ Unit tests for models
- ❌ Controller tests
- ❌ System tests
- ❌ API endpoint tests
- ❌ RLS policy tests
Status: Tests will be implemented in the next phase per your request.
Additional Views Needed
- ❌ Collection show page (games within collection)
- ❌ Collection new/edit forms
- ❌ Items CRUD views
- ❌ API tokens management page
- ❌ Public profile view
- ❌ Password reset email templates
Features Not in Phase 1 MVP
- ❌ Images/cover art
- ❌ Wishlist functionality
- ❌ Digital library auto-import (Steam, PlayStation, etc.)
- ❌ SSO/OAuth
- ❌ IGDB API integration
- ❌ Market value tracking
- ❌ Social features
Database Schema
Users Table
- email, username, encrypted_password
- bio, profile_public
- password_reset_token, password_reset_sent_at
- RLS enabled
Games Table
- user_id, platform_id, title, format
- date_added, completion_status, user_rating, notes
- Physical: condition, price_paid, location
- Digital: digital_store
- custom_entry, igdb_id
- RLS enabled
Collections Table
- user_id, parent_collection_id
- name, description
- RLS enabled
Items Table
- user_id, platform_id (optional)
- name, item_type, condition
- price_paid, location, date_added, notes
- RLS enabled
API Tokens Table
- user_id, token, name
- last_used_at, expires_at
- RLS enabled
Platforms & Genres Tables
- Read-only reference data
- No RLS (public data)
How to Get Started
1. Start PostgreSQL
task docker:up
2. Setup Database
task db:setup
# or individually:
task db:create
task db:migrate
task db:seed
3. Start Server
task server
# or
rails server
4. Create Your First User
- Visit http://localhost:3000
- Click "Sign Up"
- Fill in username, email, password
- You'll be redirected to your dashboard
5. Add Games
- Click "Add Game" from dashboard
- Or use "Import CSV" to bulk add games
- Check
games/import.html.erbfor CSV format
6. Create API Token
- Go to Settings → API Tokens
- Click "Create New Token"
- Copy the token (you won't see it again!)
- Use in API requests
API Usage Example
# Get your games
curl -H "Authorization: Bearer YOUR_TOKEN" \
http://localhost:3000/api/v1/games
# Add a game via API
curl -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"game":{"title":"Elden Ring","platform_id":17,"format":"digital"}}' \
http://localhost:3000/api/v1/games
See API_DOCUMENTATION.md for complete API reference.
CSV Import Format
title,platform,format,genres,completion_status,user_rating,condition,price_paid,location,digital_store,date_added,notes
The Legend of Zelda: Ocarina of Time,N64,physical,Action|Adventure,completed,5,cib,45.00,Shelf A,,2024-01-15,Best game ever
Elden Ring,PS5,digital,Action|RPG,currently_playing,5,,,,PlayStation Store,2024-03-01,Amazing
Security Features
-
Row Level Security (RLS)
- Enabled on all user-scoped tables
- Database-level isolation
- Protection even if application logic fails
-
Defense in Depth
- Controllers filter by
current_user - RLS as additional security layer
- API tokens scoped to user
- Controllers filter by
-
Password Security
- Bcrypt hashing
- Minimum 8 character requirement
- Password confirmation on signup
-
CSRF Protection
- Rails default CSRF tokens
- API uses token authentication
Known Issues & Limitations
-
Email Sending - FULLY FUNCTIONAL in Development! ✅
- Password reset emails work perfectly with Mailpit
- View all emails at http://localhost:8025
- Production will need real SMTP configuration
-
No Pagination UI
- Kaminari gem installed
- Backend pagination works
- Need to add pagination links to views
-
No Image Support
- No cover art for games
- No user avatars
- Planned for Phase 2
-
Basic Error Handling
- Works but could be more user-friendly
- Could add better validation messages
- Could add client-side validation
-
No Tests Yet
- Will be added in next phase
- All models and controllers ready for testing
Next Steps
Immediate (Required for MVP)
- ✅ Create remaining views (collection forms, items CRUD)
- ✅ Write comprehensive tests
- ✅ Add pagination UI
- ✅ Configure email sending (optional but recommended)
Short Term Enhancements
- Add client-side validation
- Improve error messages
- Add loading states
- Implement soft deletes
- Add export functionality (CSV, JSON)
- Add activity feed/history
Future Features (Phase 2)
- Image uploads (ActiveStorage)
- IGDB API integration
- Wishlist management
- Digital library auto-import
- SSO/OAuth
- Social features
- Market value tracking
- Mobile native apps
Performance Considerations
- Database indexes on all foreign keys
- Eager loading with
includes()to avoid N+1 queries - Pagination limits query size
- RLS adds minimal overhead
- Consider caching for stats/public profiles
Deployment Notes
- Use Kamal for deployment (already configured)
- Or deploy to Railway/Render/Heroku
- PostgreSQL required (RLS support)
- Set environment variables for:
- DATABASE_URL
- SECRET_KEY_BASE
- SMTP settings (if using email)
- Run migrations:
rails db:migrate - Run seeds:
rails db:seed
Credits
Built following the requirements in REQUIREMENTS.md.
Key Technologies:
- Ruby 3.3.10
- Rails 8.1.2
- PostgreSQL 16
- Tailwind CSS 4.2
- Hotwire (Turbo + Stimulus)
Questions?
Refer to:
REQUIREMENTS.md- Original project requirementsAPI_DOCUMENTATION.md- Complete API referenceTaskfile.yml- Available development tasks- Rails guides at https://guides.rubyonrails.org/