#!/bin/bash # GoChat Database Seed Script # Reference: Chatwoot db:seed pattern — creates super admin + test account + test inbox # # Usage: # ./scripts/seed.sh # Seed with defaults # ./scripts/seed.sh --clean # Clean all data before seeding (DANGEROUS in production) # # Environment variables: # GOCHAT_SEED_ADMIN_EMAIL — admin user email (default: admin@gochat.local) # GOCHAT_SEED_ADMIN_PASSWORD — admin user password (default: changeme) # GOCHAT_SEED_ADMIN_NAME — admin display name (default: Super Admin) # GOCHAT_SEED_ACCOUNT_NAME — test account name (default: Test Account) # GOCHAT_SEED_INBOX_NAME — test inbox name (default: Test Website Inbox) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # --- Defaults --- ADMIN_EMAIL="${GOCHAT_SEED_ADMIN_EMAIL:-admin@gochat.local}" ADMIN_PASSWORD="${GOCHAT_SEED_ADMIN_PASSWORD:-changeme}" ADMIN_NAME="${GOCHAT_SEED_ADMIN_NAME:-Super Admin}" ACCOUNT_NAME="${GOCHAT_SEED_ACCOUNT_NAME:-Test Account}" INBOX_NAME="${GOCHAT_SEED_INBOX_NAME:-Test Website Inbox}" ENV="${GOCHAT_ENV:-development}" # --- Colors --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[SEED]${NC} $1"; } log_warn() { echo -e "${YELLOW}[SEED]${NC} $1"; } log_error() { echo -e "${RED}[SEED]${NC} $1"; } # --- Clean mode --- if [[ "${1:-}" == "--clean" ]]; then if [[ "$ENV" == "production" ]]; then log_error "Cannot use --clean in production environment!" exit 1 fi log_warn "Cleaning all data before seeding..." # Truncate tables in safe order (preserve migrations/schema) psql_cmd="psql -h ${POSTGRES_HOST:-localhost} -p ${POSTGRES_PORT:-5432} -U ${POSTGRES_USER:-gochat} -d ${POSTGRES_DB:-gochat_dev}" $psql_cmd -c " TRUNCATE TABLE messages, conversations, contacts, contact_inboxes, inboxes, inbox_members, users, accounts, attachments, reporting_events, reporting_events_rollups, dashboard_apps, captain_assistants, captain_documents, captain_scenarios, captain_custom_tools, notifications, notification_preferences CASCADE; " log_info "All data cleaned." fi # --- Seed via GoChat CLI --- # The seed command is built into the GoChat binary to avoid raw SQL maintenance. # It creates: # 1. Super Admin user (role=super_admin) # 2. Test Account owned by the admin # 3. Test Website Inbox under the account # 4. Agent user (role=agent) in the account BINARY="${PROJECT_ROOT}/bin/gochat" if [[ ! -f "$BINARY" ]]; then log_warn "GoChat binary not found at $BINARY, building..." cd "$PROJECT_ROOT" make build fi log_info "Seeding GoChat database (env=$ENV)..." log_info " Admin: $ADMIN_EMAIL / $ADMIN_PASSWORD" log_info " Account: $ACCOUNT_NAME" log_info " Inbox: $INBOX_NAME" cd "$PROJECT_ROOT" GOCHAT_ENV="$ENV" \ GOCHAT_SEED_ADMIN_EMAIL="$ADMIN_EMAIL" \ GOCHAT_SEED_ADMIN_PASSWORD="$ADMIN_PASSWORD" \ GOCHAT_SEED_ADMIN_NAME="$ADMIN_NAME" \ GOCHAT_SEED_ACCOUNT_NAME="$ACCOUNT_NAME" \ GOCHAT_SEED_INBOX_NAME="$INBOX_NAME" \ "$BINARY" seed if [[ $? -eq 0 ]]; then log_info "Seeding completed successfully!" log_info "" log_info "Created resources:" log_info " ✅ Super Admin: $ADMIN_EMAIL" log_info " ✅ Account: $ACCOUNT_NAME" log_info " ✅ Inbox: $INBOX_NAME (web_widget channel)" log_info "" log_info "You can now log in at: http://localhost:3000" log_info " Email: $ADMIN_EMAIL" log_info " Password: $ADMIN_PASSWORD" else log_error "Seeding failed! Check the logs above." exit 1 fi