first commit

This commit is contained in:
meninjar
2026-04-14 01:23:34 +00:00
commit edfaa886ff
443 changed files with 1245931 additions and 0 deletions
+368
View File
@@ -0,0 +1,368 @@
#!/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 "$@"