- 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>
9.7 KiB
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.dbwith 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)
-- 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)
-- 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:
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_commandsto 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_lengthfromTextFieldindb_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/filteringGET /api/v3/custom_commands/stats- Command statisticsGET /api/v3/custom_commands/autocomplete- Command name autocompleteGET /api/v3/custom_commands/by_name/{name}- Get command by nameGET /api/v3/custom_commands/{id}- Get command by IDPOST /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
- Validation: Checks source and target database schemas
- Data Mapping: Maps old schema fields to new schema
- Conflict Resolution: Handles existing data gracefully
- Statistics Updates: Maintains creator command counts
- Logging: Comprehensive logging with timestamps
- Dry Run Mode: Test migrations without making changes
- Grace Period: Updates
last_useddates to prevent immediate deletion - Migration Tags: Marks migrated commands with
["migrated"]tag
Usage
# 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.usernamecreator.discordid→custom_command_creators.discord_idcommand.message→custom_commands.contentcommand.createtime→custom_commands.created_atcommand.sent_warns→custom_commands.warning_sent(boolean)- Commands older than 60 days get
last_usedupdated to migration date - All migrated commands get
tags = ["migrated"]
Testing Results
Local Testing Environment
- Container:
test-sba-database-v3:localon 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
- ✅ Database Tables Created - Production tables exist and are functional
- ✅ API Endpoints Working - All custom_commands endpoints operational
- ✅ Code Deployed - FastAPI integration complete
- ✅ Migration Script Ready - Tested and validated locally
Ready for Production Migration
- Source database accessible:
/mnt/NV2/Development/major-domo/sba_is_fun.db - Target database ready: Production
sba_master.db - Migration script tested:
migrate_custom_commands.py - API endpoints verified: https://sba.manticorum.com/api/v3/custom_commands
- 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
# 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_usedupdated 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:
- Delete migrated entries:
DELETE FROM custom_commands WHERE tags LIKE '%migrated%' - Delete migrated creators:
DELETE FROM custom_command_creators WHERE id > [original_max_id] - 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.