368 lines
9.5 KiB
Bash
Executable File
368 lines
9.5 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Script untuk generate seeder dari SQL migration files
|
||
# Usage: ./scripts/generate_seeder.sh [OPTIONS]
|
||
# Examples:
|
||
# ./scripts/generate_seeder.sh --sql=internal/infrastructure/database/sql/20260127064613_create_ethnic_table.sql
|
||
# ./scripts/generate_seeder.sh --sql-dir=internal/infrastructure/database/sql/
|
||
# ./scripts/generate_seeder.sh --all
|
||
|
||
set -e # Exit immediately if a command exits with a non-zero status
|
||
|
||
echo "🔧 Seeder Generator Script"
|
||
|
||
# Warna untuk output
|
||
GREEN='\033[0;32m'
|
||
RED='\033[0;31m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Default values
|
||
SQL_FILE=""
|
||
SQL_DIR=""
|
||
GENERATE_ALL=false
|
||
OUTPUT_DIR="internal/infrastructure/database/seeders"
|
||
CSV_DIR="internal/infrastructure/database/csv"
|
||
BATCH_SIZE=100
|
||
GENERATE_CSV=true
|
||
VERBOSE=false
|
||
DRY_RUN=false
|
||
|
||
# Fungsi untuk menampilkan usage
|
||
show_usage() {
|
||
echo "Usage: $0 [OPTIONS]"
|
||
echo ""
|
||
echo "Generate seeder from SQL migration files"
|
||
echo ""
|
||
echo "Options:"
|
||
echo " --sql=FILE Path to specific SQL file"
|
||
echo " --sql-dir=DIR Process all SQL files in directory"
|
||
echo " --all Process all SQL files in default migrations directory"
|
||
echo " --output=DIR Output directory for generated seeders (default: $OUTPUT_DIR)"
|
||
echo " --csv-dir=DIR CSV output directory (default: $CSV_DIR)"
|
||
echo " --batch-size=NUM Batch size for seeding (default: $BATCH_SIZE)"
|
||
echo " --no-csv Don't generate CSV templates"
|
||
echo " --verbose, -v Verbose output"
|
||
echo " --dry-run Show what would be generated without creating files"
|
||
echo " --help, -h Show this help message"
|
||
echo ""
|
||
echo "Examples:"
|
||
echo " $0 --sql=internal/infrastructure/database/sql/20260127064613_create_ethnic_table.sql"
|
||
echo " $0 --sql-dir=internal/infrastructure/database/sql/"
|
||
echo " $0 --all"
|
||
echo " $0 --sql=sql/create_table.sql --output=custom/seeders --batch-size=50"
|
||
echo " $0 --all --dry-run --verbose"
|
||
}
|
||
|
||
# Fungsi untuk logging
|
||
log_info() {
|
||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
log_verbose() {
|
||
if [ "$VERBOSE" = true ]; then
|
||
echo -e "${BLUE}🔍 $1${NC}"
|
||
fi
|
||
}
|
||
|
||
# Parse command line arguments
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--sql=*)
|
||
SQL_FILE="${1#*=}"
|
||
shift
|
||
;;
|
||
--sql-dir=*)
|
||
SQL_DIR="${1#*=}"
|
||
shift
|
||
;;
|
||
--all)
|
||
GENERATE_ALL=true
|
||
shift
|
||
;;
|
||
--output=*)
|
||
OUTPUT_DIR="${1#*=}"
|
||
shift
|
||
;;
|
||
--csv-dir=*)
|
||
CSV_DIR="${1#*=}"
|
||
shift
|
||
;;
|
||
--batch-size=*)
|
||
BATCH_SIZE="${1#*=}"
|
||
shift
|
||
;;
|
||
--no-csv)
|
||
GENERATE_CSV=false
|
||
shift
|
||
;;
|
||
--verbose|-v)
|
||
VERBOSE=true
|
||
shift
|
||
;;
|
||
--dry-run)
|
||
DRY_RUN=true
|
||
shift
|
||
;;
|
||
--help|-h)
|
||
show_usage
|
||
exit 0
|
||
;;
|
||
*)
|
||
log_error "Unknown option: $1"
|
||
show_usage
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# Validasi input
|
||
if [ "$GENERATE_ALL" = true ] && [ -n "$SQL_FILE" ]; then
|
||
log_error "Cannot use --all with --sql option"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$GENERATE_ALL" = true ] && [ -n "$SQL_DIR" ]; then
|
||
log_error "Cannot use --all with --sql-dir option"
|
||
exit 1
|
||
fi
|
||
|
||
if [ -n "$SQL_FILE" ] && [ -n "$SQL_DIR" ]; then
|
||
log_error "Cannot use --sql with --sql-dir option"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$GENERATE_ALL" = false ] && [ -z "$SQL_FILE" ] && [ -z "$SQL_DIR" ]; then
|
||
log_error "Must specify either --sql, --sql-dir, or --all"
|
||
show_usage
|
||
exit 1
|
||
fi
|
||
|
||
# Set default SQL directory jika menggunakan --all
|
||
if [ "$GENERATE_ALL" = true ]; then
|
||
SQL_DIR="internal/infrastructure/database/sql"
|
||
fi
|
||
|
||
# Fungsi untuk cek apakah file SQL valid
|
||
validate_sql_file() {
|
||
local file="$1"
|
||
|
||
if [ ! -f "$file" ]; then
|
||
log_error "SQL file not found: $file"
|
||
return 1
|
||
fi
|
||
|
||
if ! grep -q "CREATE TABLE" "$file"; then
|
||
log_warning "File does not contain CREATE TABLE statement: $file"
|
||
return 1
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# Fungsi untuk extract table name dari SQL file
|
||
extract_table_name() {
|
||
local sql_file="$1"
|
||
local filename=$(basename "$sql_file" .sql)
|
||
|
||
# Pattern: YYYYMMDDHHMMSS_create_tablename.sql
|
||
if [[ "$filename" =~ ^[0-9]{14}_create_(.+)$ ]]; then
|
||
echo "${BASH_REMATCH[1]}"
|
||
else
|
||
# Fallback: extract dari CREATE TABLE statement
|
||
grep -i "CREATE TABLE" "$sql_file" | head -1 | sed -n 's/.*CREATE TABLE[[:space:]]*["\`]\?\([^"\`[:space:]]*\)["\`]\?.*/\1/ip' | tr '[:upper:]' '[:lower:]'
|
||
fi
|
||
}
|
||
|
||
# Fungsi untuk generate seeder dari single SQL file
|
||
generate_seeder_from_file() {
|
||
local sql_file="$1"
|
||
|
||
log_info "Processing SQL file: $sql_file"
|
||
|
||
if ! validate_sql_file "$sql_file"; then
|
||
return 1
|
||
fi
|
||
|
||
local table_name=$(extract_table_name "$sql_file")
|
||
if [ -z "$table_name" ]; then
|
||
log_error "Could not extract table name from: $sql_file"
|
||
return 1
|
||
fi
|
||
|
||
log_verbose "Extracted table name: $table_name"
|
||
|
||
local seeder_filename="seeder_${table_name}.go"
|
||
local seeder_path="$OUTPUT_DIR/$seeder_filename"
|
||
local csv_filename="${table_name}.csv"
|
||
local csv_path="$CSV_DIR/$csv_filename"
|
||
|
||
if [ "$DRY_RUN" = true ]; then
|
||
log_info "[DRY RUN] Would generate:"
|
||
log_info " Seeder: $seeder_path"
|
||
if [ "$GENERATE_CSV" = true ]; then
|
||
log_info " CSV: $csv_path"
|
||
fi
|
||
return 0
|
||
fi
|
||
|
||
# Create directories if they don't exist
|
||
mkdir -p "$OUTPUT_DIR"
|
||
mkdir -p "$CSV_DIR"
|
||
|
||
# Generate seeder using Go program
|
||
log_info "Generating seeder for table: $table_name"
|
||
|
||
local csv_flag=""
|
||
if [ "$GENERATE_CSV" = true ]; then
|
||
csv_flag="-csv-template"
|
||
fi
|
||
|
||
local verbose_flag=""
|
||
if [ "$VERBOSE" = true ]; then
|
||
verbose_flag="-v"
|
||
fi
|
||
|
||
if go run cmd/seeder-generator/main.go \
|
||
-sql="$sql_file" \
|
||
-output="$OUTPUT_DIR" \
|
||
-csv-dir="$CSV_DIR" \
|
||
-batch="$BATCH_SIZE" \
|
||
$csv_flag $verbose_flag; then
|
||
|
||
log_success "Generated seeder: $seeder_path"
|
||
if [ "$GENERATE_CSV" = true ] && [ -f "$csv_path" ]; then
|
||
log_success "Generated CSV: $csv_path"
|
||
fi
|
||
else
|
||
log_error "Failed to generate seeder for: $table_name"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Fungsi untuk process semua SQL files di directory
|
||
process_sql_directory() {
|
||
local dir="$1"
|
||
|
||
if [ ! -d "$dir" ]; then
|
||
log_error "Directory not found: $dir"
|
||
return 1
|
||
fi
|
||
|
||
log_info "Processing SQL files in directory: $dir"
|
||
|
||
local sql_files=()
|
||
while IFS= read -r -d $'\0' file; do
|
||
sql_files+=("$file")
|
||
done < <(find "$dir" -name "*.sql" -type f -print0 | sort -z)
|
||
|
||
if [ ${#sql_files[@]} -eq 0 ]; then
|
||
log_warning "No SQL files found in directory: $dir"
|
||
return 1
|
||
fi
|
||
|
||
log_info "Found ${#sql_files[@]} SQL files to process"
|
||
|
||
local success_count=0
|
||
local failed_count=0
|
||
|
||
for sql_file in "${sql_files[@]}"; do
|
||
if generate_seeder_from_file "$sql_file"; then
|
||
((success_count++))
|
||
else
|
||
((failed_count++))
|
||
fi
|
||
done
|
||
|
||
log_info "Processing complete: $success_count successful, $failed_count failed"
|
||
|
||
if [ $failed_count -gt 0 ]; then
|
||
return 1
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# Fungsi untuk update seeder registry
|
||
update_registry() {
|
||
local registry_file="$OUTPUT_DIR/seeder_registry.go"
|
||
|
||
log_info "Updating seeder registry: $registry_file"
|
||
|
||
# TODO: Implement registry update logic
|
||
# For now, just show instructions
|
||
log_info "Don't forget to add generated seeders to your seeder registry!"
|
||
}
|
||
|
||
# Fungsi untuk test database connection
|
||
test_db_connection() {
|
||
log_info "Testing database connection..."
|
||
|
||
if go run scripts/test_db_connection.go; then
|
||
log_success "Database connection successful"
|
||
return 0
|
||
else
|
||
log_error "Database connection failed"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Main execution
|
||
main() {
|
||
log_info "Starting seeder generation..."
|
||
|
||
if [ "$VERBOSE" = true ]; then
|
||
log_verbose "Configuration:"
|
||
log_verbose " SQL_FILE: $SQL_FILE"
|
||
log_verbose " SQL_DIR: $SQL_DIR"
|
||
log_verbose " OUTPUT_DIR: $OUTPUT_DIR"
|
||
log_verbose " CSV_DIR: $CSV_DIR"
|
||
log_verbose " BATCH_SIZE: $BATCH_SIZE"
|
||
log_verbose " GENERATE_CSV: $GENERATE_CSV"
|
||
log_verbose " DRY_RUN: $DRY_RUN"
|
||
fi
|
||
|
||
# Test database connection (optional)
|
||
# test_db_connection || true
|
||
|
||
# Process SQL files
|
||
if [ -n "$SQL_FILE" ]; then
|
||
if ! generate_seeder_from_file "$SQL_FILE"; then
|
||
exit 1
|
||
fi
|
||
elif [ -n "$SQL_DIR" ]; then
|
||
if ! process_sql_directory "$SQL_DIR"; then
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# Update registry
|
||
update_registry
|
||
|
||
log_success "Seeder generation completed!"
|
||
|
||
if [ "$DRY_RUN" = true ]; then
|
||
log_info "This was a dry run. No files were created."
|
||
else
|
||
log_info "Next steps:"
|
||
log_info "1. Review generated seeders in: $OUTPUT_DIR"
|
||
log_info "2. Add seeders to your registry"
|
||
log_info "3. Run: make seeder-seed-all"
|
||
fi
|
||
}
|
||
|
||
# Run main function
|
||
main "$@" |