major-domo-database/.claude/CUSTOM_COMMANDS_FIX.md
2025-10-25 20:17:02 -05:00

97 lines
4.4 KiB
Markdown

# Custom Commands Fix Summary
**Date**: 2025-10-19
**Issue**: Custom commands endpoint failing with "relation 'customcommand' does not exist" and "'creator_id' not defined" errors
## Problems Fixed
### 1. Peewee Table Name Mismatch
**Problem**: Peewee was auto-generating table names as `customcommand` and `customcommandcreator` (lowercase, no underscores), but PostgreSQL tables were named `custom_commands` and `custom_command_creators`.
**Fix**: Added `Meta` classes to both models in `app/db_engine.py`:
```python
class CustomCommandCreator(BaseModel):
# ... fields ...
class Meta:
table_name = 'custom_command_creators'
class CustomCommand(BaseModel):
# ... fields ...
class Meta:
table_name = 'custom_commands'
```
### 2. Missing Helper Functions
**Problem**: `app/routers_v3/custom_commands.py` was calling undefined functions like `get_custom_command_by_name()`, `create_custom_command()`, etc.
**Fix**: Implemented all helper functions using Peewee ORM (lines 95-185):
- `get_custom_command_by_name(name: str)` - Case-insensitive lookup with creator info
- `get_custom_command_by_id(command_id: int)` - Full command with all creator fields
- `create_custom_command(command_data: dict)` - Create new command
- `update_custom_command(command_id: int, update_data: dict)` - Update command
- `delete_custom_command(command_id: int)` - Delete command
- `get_creator_by_discord_id(discord_id: int)` - Lookup creator
- `create_creator(creator_data: dict)` - Create new creator
### 3. DATABASE_TYPE References
**Problem**: Code referenced `DATABASE_TYPE` for conditional SQL (SQLite vs PostgreSQL), but variable wasn't imported.
**Fix**: Removed all `DATABASE_TYPE` checks and use PostgreSQL-specific syntax (`ILIKE`) directly since migration is complete.
### 4. Missing creator_id in execute_custom_command
**Problem**: `execute_custom_command()` was failing because `get_custom_command_by_name()` didn't return `creator_id` field.
**Fix**: Updated `get_custom_command_by_name()` to explicitly include `creator_id` in returned dict (line 109).
## Files Modified
1. **app/db_engine.py**
- Added `Meta.table_name = 'custom_command_creators'` to `CustomCommandCreator`
- Added `Meta.table_name = 'custom_commands'` to `CustomCommand`
2. **app/routers_v3/custom_commands.py**
- Added 7 helper functions using Peewee ORM (lines 95-185)
- Removed `DATABASE_TYPE` checks (lines 206, 951-956)
- Simplified `execute_custom_command()` to use helper functions (lines 894-922)
- Added `creator_id` to return value of `get_custom_command_by_name()` (line 109)
3. **CLAUDE.md**
- Updated Database Configuration section
- Removed DATABASE_TYPE from environment variables
- Added Custom Commands to Key Data Models
- Updated Important Notes to reflect PostgreSQL migration completion
## Endpoints Now Working
All custom commands endpoints are now functional:
**Public Endpoints**:
- `GET /api/v3/custom_commands` - List/search commands with pagination
- `GET /api/v3/custom_commands/{command_id}` - Get command by ID
- `GET /api/v3/custom_commands/by_name/{command_name}` - Get command by name
- `GET /api/v3/custom_commands/autocomplete` - Autocomplete for Discord
- `GET /api/v3/custom_commands/stats` - Command statistics
- `GET /api/v3/custom_commands/creators` - List creators
**Private Endpoints** (require API token):
- `POST /api/v3/custom_commands` - Create new command
- `PUT /api/v3/custom_commands/{command_id}` - Update command
- `PATCH /api/v3/custom_commands/{command_id}` - Partially update command
- `PATCH /api/v3/custom_commands/by_name/{name}/execute` - Execute and track usage
- `DELETE /api/v3/custom_commands/{command_id}` - Delete command
- `POST /api/v3/custom_commands/creators` - Create new creator
## Testing Results
✅ Successfully retrieved creator by Discord ID
✅ Command creation returns proper 409 conflict for existing commands
✅ Command execution successfully updates usage statistics
✅ All endpoints return properly formatted JSON responses
## Key Learnings
1. **Always specify table names in Peewee models** - Peewee's auto-generated names don't match PostgreSQL naming conventions
2. **Use Peewee ORM over raw SQL** - Better type safety, maintainability, and less error-prone
3. **PostgreSQL migration complete** - No need for DATABASE_TYPE conditionals anymore
4. **Helper functions should return all necessary fields** - Including foreign key IDs, not just related object data