major-domo-database/CUSTOM_COMMANDS_MIGRATION.md
Cal Corum 57c943e340 CLAUDE: Add custom commands system with migration from legacy database
- Add CustomCommandCreator and CustomCommand models to db_engine.py
- Add comprehensive custom commands API router with full CRUD operations
- Include migration script for transferring 140 commands from sba_is_fun.db
- Add FastAPI integration for /api/v3/custom_commands endpoints
- Implement usage tracking, search, autocomplete, and statistics features
- Add grace period handling for unused commands to prevent deletion
- Include comprehensive documentation for migration process

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-17 16:31:39 -05:00

265 lines
9.7 KiB
Markdown

# Custom Commands Migration Documentation
## Overview
This document provides complete instructions for migrating existing custom commands from the old `sba_is_fun.db` database to the new custom_commands schema in the Major Domo system. This migration has been developed and tested successfully on local containers and is ready for production deployment.
## Background
### What We're Migrating
- **Source**: `/mnt/NV2/Development/major-domo/sba_is_fun.db` - Contains 140 custom commands and 30 creators
- **Target**: Production `sba_master.db` with new custom_commands schema
- **Scope**: Complete migration of commands, creators, usage statistics, and metadata
### Project Context
The Major Domo system consists of:
- **Discord Bot** - Uses custom commands for user interactions
- **Database API** - FastAPI backend with new custom_commands endpoints
- **Website** - Vue.js frontend (future integration)
## Database Schema Changes
### Old Schema (sba_is_fun.db)
```sql
-- creator table
CREATE TABLE creator (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
discordid INTEGER NOT NULL
);
-- command table
CREATE TABLE command (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
message VARCHAR(255) NOT NULL,
creator_id INTEGER NOT NULL,
createtime DATETIME NOT NULL,
last_used DATETIME NULL,
sent_warns DATETIME NULL
);
```
### New Schema (sba_master.db)
```sql
-- custom_command_creators table
CREATE TABLE custom_command_creators (
id INTEGER PRIMARY KEY AUTOINCREMENT,
discord_id INTEGER UNIQUE NOT NULL,
username TEXT(32) NOT NULL,
display_name TEXT(32),
created_at TIMESTAMP NOT NULL,
total_commands INTEGER DEFAULT 0,
active_commands INTEGER DEFAULT 0
);
-- custom_commands table
CREATE TABLE custom_commands (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT(32) UNIQUE NOT NULL,
content TEXT NOT NULL,
creator_id INTEGER NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP,
last_used TIMESTAMP,
use_count INTEGER DEFAULT 0,
warning_sent BOOLEAN DEFAULT 0,
is_active BOOLEAN DEFAULT 1,
tags TEXT,
FOREIGN KEY (creator_id) REFERENCES custom_command_creators (id)
);
```
## Code Changes Made
### 1. Database Schema Setup
Tables were created in production using SSH:
```bash
ssh sba-database "docker exec sba_database python -c \"
import sqlite3
conn = sqlite3.connect('/usr/src/app/storage/sba_master.db')
cursor = conn.cursor()
# [Table creation SQL - see above schemas]
\""
```
### 2. FastAPI Integration
**File**: `/mnt/NV2/Development/major-domo/database/app/main.py`
**Changes Made**:
- Line 15: Added `custom_commands` to router imports
- Line 71: Added `app.include_router(custom_commands.router)`
**Fixed Issues**:
- Route ordering: Moved `/{command_id}` route after specific string routes
- SQL result handling: Converted Peewee tuple results to dictionaries
- Peewee model: Removed invalid `max_length` from `TextField` in `db_engine.py:2222`
### 3. Custom Commands Module
**File**: `/mnt/NV2/Development/major-domo/database/app/routers_v3/custom_commands.py`
**Available Endpoints**:
- `GET /api/v3/custom_commands` - List commands with pagination/filtering
- `GET /api/v3/custom_commands/stats` - Command statistics
- `GET /api/v3/custom_commands/autocomplete` - Command name autocomplete
- `GET /api/v3/custom_commands/by_name/{name}` - Get command by name
- `GET /api/v3/custom_commands/{id}` - Get command by ID
- `POST /api/v3/custom_commands/creators` - Create creator (auth required)
- `POST /api/v3/custom_commands` - Create command (auth required)
- `PATCH /api/v3/custom_commands/{id}` - Update command (auth required)
- `PATCH /api/v3/custom_commands/by_name/{name}/execute` - Execute command (auth required)
- `DELETE /api/v3/custom_commands/{id}` - Delete command (auth required)
## Migration Script
### Location
`/mnt/NV2/Development/major-domo/database/migrate_custom_commands.py`
### Key Features
1. **Validation**: Checks source and target database schemas
2. **Data Mapping**: Maps old schema fields to new schema
3. **Conflict Resolution**: Handles existing data gracefully
4. **Statistics Updates**: Maintains creator command counts
5. **Logging**: Comprehensive logging with timestamps
6. **Dry Run Mode**: Test migrations without making changes
7. **Grace Period**: Updates `last_used` dates to prevent immediate deletion
8. **Migration Tags**: Marks migrated commands with `["migrated"]` tag
### Usage
```bash
# Dry run (recommended first)
python migrate_custom_commands.py \
--source /path/to/sba_is_fun.db \
--target /path/to/sba_master.db \
--dry-run
# Actual migration
python migrate_custom_commands.py \
--source /path/to/sba_is_fun.db \
--target /path/to/sba_master.db
```
### Data Transformations
- `creator.name``custom_command_creators.username`
- `creator.discordid``custom_command_creators.discord_id`
- `command.message``custom_commands.content`
- `command.createtime``custom_commands.created_at`
- `command.sent_warns``custom_commands.warning_sent` (boolean)
- Commands older than 60 days get `last_used` updated to migration date
- All migrated commands get `tags = ["migrated"]`
## Testing Results
### Local Testing Environment
- **Container**: `test-sba-database-v3:local` on port 8001
- **Database**: SQLite with volume mounts
- **API**: http://localhost:8001/api/v3/custom_commands
### Migration Test Results
**Source Data**: 30 creators, 140 commands
**Migration Success**: 30 creators → 31 total, 140 commands → 141 total
**Data Integrity**: All relationships preserved
**API Functionality**: All endpoints working
**Sample Commands**: `yeli`, `thedata`, `momma`, `charlieblackmon` verified
### API Test Results
**GET /custom_commands** - Lists all commands with pagination
**GET /custom_commands/stats** - Shows correct counts and statistics
**GET /custom_commands/by_name/yeli** - Returns correct command data
**GET /custom_commands/autocomplete?partial_name=mom** - Returns `["momma"]`
**Authentication** - Properly blocks unauthorized requests
## Production Deployment Status
### Completed Steps
1.**Database Tables Created** - Production tables exist and are functional
2.**API Endpoints Working** - All custom_commands endpoints operational
3.**Code Deployed** - FastAPI integration complete
4.**Migration Script Ready** - Tested and validated locally
### Ready for Production Migration
- [x] Source database accessible: `/mnt/NV2/Development/major-domo/sba_is_fun.db`
- [x] Target database ready: Production `sba_master.db`
- [x] Migration script tested: `migrate_custom_commands.py`
- [x] API endpoints verified: https://sba.manticorum.com/api/v3/custom_commands
- [x] Error handling confirmed: Proper 404s, authentication, validation
## Production Migration Checklist
### Pre-Migration
- [ ] Copy source database to production server
- [ ] Copy migration script to production server
- [ ] Verify production API is accessible
- [ ] Run migration in dry-run mode first
### Migration Commands
```bash
# 1. Copy files to production
scp /mnt/NV2/Development/major-domo/sba_is_fun.db sba-database:/tmp/
scp migrate_custom_commands.py sba-database:/tmp/
# 2. SSH to production and copy to container
ssh sba-database
docker cp /tmp/sba_is_fun.db sba_database:/usr/src/app/storage/
docker cp /tmp/migrate_custom_commands.py sba_database:/usr/src/app/storage/
# 3. Run dry-run migration
docker exec sba_database python /usr/src/app/storage/migrate_custom_commands.py \
--source /usr/src/app/storage/sba_is_fun.db \
--target /usr/src/app/storage/sba_master.db \
--dry-run
# 4. Run actual migration
docker exec sba_database python /usr/src/app/storage/migrate_custom_commands.py \
--source /usr/src/app/storage/sba_is_fun.db \
--target /usr/src/app/storage/sba_master.db
```
### Post-Migration Validation
- [ ] Check API stats: https://sba.manticorum.com/api/v3/custom_commands/stats
- [ ] Test command lookup: https://sba.manticorum.com/api/v3/custom_commands/by_name/yeli
- [ ] Verify autocomplete: https://sba.manticorum.com/api/v3/custom_commands/autocomplete
- [ ] Check creator statistics in database
- [ ] Test Discord bot integration (if applicable)
## Known Issues & Considerations
### Grace Period Implementation
- Commands not used in 60+ days get `last_used` updated to migration date
- Prevents mass deletion of historical commands
- Gives commands a grace period to be discovered/used again
### Duplicate Handling
- Migration script checks for existing creators by `discord_id`
- Migration script checks for existing commands by `name`
- Existing entries are skipped with warnings logged
### Performance
- 140 commands migrate in ~1 second
- No performance impact on API during migration
- Indexes created for optimal query performance
### Rollback Plan
If migration issues occur:
1. Delete migrated entries: `DELETE FROM custom_commands WHERE tags LIKE '%migrated%'`
2. Delete migrated creators: `DELETE FROM custom_command_creators WHERE id > [original_max_id]`
3. Re-run migration after fixing issues
## Contact Information
**Development Team**: Claude Code AI Assistant
**Migration Date**: August 17, 2025
**Production URL**: https://sba.manticorum.com/api/v3/custom_commands
**Local Test URL**: http://localhost:8001/api/v3/custom_commands
## File Locations
- **Migration Script**: `/mnt/NV2/Development/major-domo/database/migrate_custom_commands.py`
- **Source Database**: `/mnt/NV2/Development/major-domo/sba_is_fun.db`
- **Custom Commands Module**: `/mnt/NV2/Development/major-domo/database/app/routers_v3/custom_commands.py`
- **Main API File**: `/mnt/NV2/Development/major-domo/database/app/main.py`
- **Database Models**: `/mnt/NV2/Development/major-domo/database/app/db_engine.py`
---
**Status**: Ready for production migration. All testing completed successfully.