#!/bin/bash # ============================================================================ # EF Core Scaffolding Script for StellaOps Modules # ============================================================================ # Usage: ./scaffold-module.sh [Schema] [ConnectionString] # # Examples: # ./scaffold-module.sh Unknowns # ./scaffold-module.sh Unknowns unknowns # ./scaffold-module.sh PacksRegistry packs "Host=localhost;..." # ============================================================================ set -e MODULE=$1 SCHEMA=${2:-$(echo "$MODULE" | tr '[:upper:]' '[:lower:]')} CONNECTION_STRING=$3 if [ -z "$MODULE" ]; then echo "Usage: $0 [Schema] [ConnectionString]" echo "" echo "Examples:" echo " $0 Unknowns" echo " $0 Unknowns unknowns" echo " $0 PacksRegistry packs \"Host=localhost;Database=stellaops_platform;Username=packs_user;Password=packs_dev\"" exit 1 fi # Resolve repository root SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" # Default connection string if [ -z "$CONNECTION_STRING" ]; then USER="${SCHEMA}_user" PASSWORD="${SCHEMA}_dev" CONNECTION_STRING="Host=localhost;Port=5432;Database=stellaops_platform;Username=$USER;Password=$PASSWORD;SearchPath=$SCHEMA" fi PROJECT_DIR="$REPO_ROOT/src/$MODULE/__Libraries/StellaOps.$MODULE.Persistence.EfCore" CONTEXT_DIR="Context" ENTITIES_DIR="Entities" COMPILED_DIR="CompiledModels" echo "" echo "============================================================================" echo " EF Core Scaffolding for Module: $MODULE" echo "============================================================================" echo " Schema: $SCHEMA" echo " Project: $PROJECT_DIR" echo " Connection: Host=localhost;Database=stellaops_platform;Username=${SCHEMA}_user;..." echo "" # Verify project exists if [ ! -f "$PROJECT_DIR"/*.csproj ]; then echo "ERROR: Project not found at: $PROJECT_DIR" echo "Create the project first with: dotnet new classlib -n StellaOps.$MODULE.Persistence.EfCore" exit 1 fi # Step 1: Clean existing generated files echo "[1/4] Cleaning existing generated files..." rm -rf "$PROJECT_DIR/$ENTITIES_DIR" rm -rf "$PROJECT_DIR/$COMPILED_DIR" rm -f "$PROJECT_DIR/$CONTEXT_DIR/${MODULE}DbContext.cs" mkdir -p "$PROJECT_DIR/$ENTITIES_DIR" mkdir -p "$PROJECT_DIR/$COMPILED_DIR" mkdir -p "$PROJECT_DIR/$CONTEXT_DIR" echo " Cleaned: $ENTITIES_DIR, $COMPILED_DIR, ${MODULE}DbContext.cs" # Step 2: Scaffold DbContext and entities echo "[2/4] Scaffolding DbContext and entities from schema '$SCHEMA'..." dotnet ef dbcontext scaffold \ "$CONNECTION_STRING" \ Npgsql.EntityFrameworkCore.PostgreSQL \ --project "$PROJECT_DIR" \ --schema "$SCHEMA" \ --context "${MODULE}DbContext" \ --context-dir "$CONTEXT_DIR" \ --output-dir "$ENTITIES_DIR" \ --namespace "StellaOps.$MODULE.Persistence.EfCore.Entities" \ --context-namespace "StellaOps.$MODULE.Persistence.EfCore.Context" \ --data-annotations \ --no-onconfiguring \ --force echo " Scaffolded entities to: $ENTITIES_DIR" # Step 3: Generate compiled models echo "[3/4] Generating compiled models..." dotnet ef dbcontext optimize \ --project "$PROJECT_DIR" \ --context "StellaOps.$MODULE.Persistence.EfCore.Context.${MODULE}DbContext" \ --output-dir "$COMPILED_DIR" \ --namespace "StellaOps.$MODULE.Persistence.EfCore.CompiledModels" echo " Generated compiled models to: $COMPILED_DIR" # Step 4: Summary echo "[4/4] Scaffolding complete!" echo "" echo "Generated files:" echo " Context: $PROJECT_DIR/$CONTEXT_DIR/${MODULE}DbContext.cs" echo " Entities: $(ls -1 "$PROJECT_DIR/$ENTITIES_DIR"/*.cs 2>/dev/null | wc -l) files" echo " Compiled Models: $(ls -1 "$PROJECT_DIR/$COMPILED_DIR"/*.cs 2>/dev/null | wc -l) files" echo "" echo "Next steps:" echo " 1. Review generated entities for any customization needs" echo " 2. Create repository implementations in Repositories/" echo " 3. Add DI registration in Extensions/" echo ""