feat: Runtime configuration and Docker deployment improvements
Frontend: - Add runtime configuration service for deployment-time API URL injection - Create docker-entrypoint.sh to generate config.json from environment variables - Update ApiService, ApprovalService, and DocumentViewer to use RuntimeConfigService - Add APP_INITIALIZER to load runtime config before app starts Backend: - Fix init-blockchain.js to properly quote mnemonic phrases in .env file - Improve docker-entrypoint.sh with health checks and better error handling Docker: - Add API_BASE_URL environment variable to frontend container - Update docker-compose.yml with clear documentation for remote deployment - Reorganize .env.example with clear categories (REQUIRED FOR REMOTE, PRODUCTION, AUTO-GENERATED) Workflow fixes: - Fix DepartmentApproval interface to match backend schema - Fix stage transformation for 0-indexed stageOrder - Fix workflow list to show correct stage count from definition.stages Cleanup: - Move development artifacts to .trash directory - Remove root-level package.json (was only for utility scripts) - Add .trash/ to .gitignore
This commit is contained in:
214
backend/scripts/seed-demo-applications.sh
Executable file
214
backend/scripts/seed-demo-applications.sh
Executable file
@@ -0,0 +1,214 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Seed Demo License Applications"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# Check if running in Docker or locally
|
||||
if [ -z "$DATABASE_HOST" ]; then
|
||||
# Load from .env file if not in Docker
|
||||
if [ -f ".env" ]; then
|
||||
set -a
|
||||
source .env
|
||||
set +a
|
||||
fi
|
||||
|
||||
DATABASE_HOST=${DATABASE_HOST:-localhost}
|
||||
DATABASE_PORT=${DATABASE_PORT:-5432}
|
||||
DATABASE_NAME=${DATABASE_NAME:-goa_gel_platform}
|
||||
DATABASE_USER=${DATABASE_USER:-postgres}
|
||||
DATABASE_PASSWORD=${DATABASE_PASSWORD:-postgres}
|
||||
fi
|
||||
|
||||
echo "Adding demo license applications..."
|
||||
|
||||
# Get citizen ID
|
||||
CITIZEN_ID=$(PGPASSWORD=$DATABASE_PASSWORD psql -h "$DATABASE_HOST" -U "$DATABASE_USER" -d "$DATABASE_NAME" -tAc "SELECT id FROM applicants WHERE digilocker_id = 'DL-GOA-CITIZEN-001' LIMIT 1;" 2>/dev/null)
|
||||
|
||||
if [ -z "$CITIZEN_ID" ] || [ "$CITIZEN_ID" = "" ]; then
|
||||
echo "ERROR: Could not find citizen applicant. Run seeds first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CITIZEN_ID=$(echo $CITIZEN_ID | xargs) # Trim whitespace
|
||||
|
||||
# Get workflow ID
|
||||
WORKFLOW_ID=$(PGPASSWORD=$DATABASE_PASSWORD psql -h "$DATABASE_HOST" -U "$DATABASE_USER" -d "$DATABASE_NAME" -tAc "SELECT id FROM workflows WHERE workflow_type = 'RESORT_LICENSE' LIMIT 1;" 2>/dev/null)
|
||||
WORKFLOW_ID=$(echo $WORKFLOW_ID | xargs)
|
||||
|
||||
# Get department IDs
|
||||
FIRE_DEPT_ID=$(PGPASSWORD=$DATABASE_PASSWORD psql -h "$DATABASE_HOST" -U "$DATABASE_USER" -d "$DATABASE_NAME" -tAc "SELECT id FROM departments WHERE code = 'FIRE_DEPT' LIMIT 1;" 2>/dev/null)
|
||||
FIRE_DEPT_ID=$(echo $FIRE_DEPT_ID | xargs)
|
||||
|
||||
TOURISM_DEPT_ID=$(PGPASSWORD=$DATABASE_PASSWORD psql -h "$DATABASE_HOST" -U "$DATABASE_USER" -d "$DATABASE_NAME" -tAc "SELECT id FROM departments WHERE code = 'TOURISM_DEPT' LIMIT 1;" 2>/dev/null)
|
||||
TOURISM_DEPT_ID=$(echo $TOURISM_DEPT_ID | xargs)
|
||||
|
||||
echo " - Found applicant: $CITIZEN_ID"
|
||||
echo " - Found workflow: $WORKFLOW_ID"
|
||||
|
||||
# Insert demo license applications
|
||||
PGPASSWORD=$DATABASE_PASSWORD psql -h "$DATABASE_HOST" -U "$DATABASE_USER" -d "$DATABASE_NAME" <<EOF
|
||||
|
||||
-- Demo Application 1: Draft status
|
||||
INSERT INTO license_requests (id, request_number, applicant_id, request_type, workflow_id, status, metadata, current_stage_id, created_at, updated_at)
|
||||
VALUES (
|
||||
'demo1111-1111-1111-1111-111111111111',
|
||||
'GOA-2024-RESORT-001',
|
||||
'$CITIZEN_ID',
|
||||
'RESORT_LICENSE',
|
||||
'$WORKFLOW_ID',
|
||||
'DRAFT',
|
||||
'{"businessName": "Paradise Beach Resort", "location": "Calangute Beach", "type": "Beach Resort", "capacity": 50}',
|
||||
NULL,
|
||||
CURRENT_TIMESTAMP - INTERVAL '5 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '5 days'
|
||||
) ON CONFLICT (request_number) DO NOTHING;
|
||||
|
||||
-- Demo Application 2: Pending - waiting for Fire Dept
|
||||
INSERT INTO license_requests (id, request_number, applicant_id, request_type, workflow_id, status, metadata, current_stage_id, submitted_at, created_at, updated_at)
|
||||
VALUES (
|
||||
'demo2222-2222-2222-2222-222222222222',
|
||||
'GOA-2024-RESORT-002',
|
||||
'$CITIZEN_ID',
|
||||
'RESORT_LICENSE',
|
||||
'$WORKFLOW_ID',
|
||||
'PENDING',
|
||||
'{"businessName": "Sunset View Resort", "location": "Baga Beach", "type": "Boutique Resort", "capacity": 30}',
|
||||
'stage_1_fire',
|
||||
CURRENT_TIMESTAMP - INTERVAL '3 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '4 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '3 days'
|
||||
) ON CONFLICT (request_number) DO NOTHING;
|
||||
|
||||
-- Create pending approval for Application 2
|
||||
INSERT INTO approvals (id, request_id, department_id, status, created_at, updated_at)
|
||||
SELECT
|
||||
'appr2222-2222-2222-2222-222222222222',
|
||||
'demo2222-2222-2222-2222-222222222222',
|
||||
'$FIRE_DEPT_ID',
|
||||
'PENDING',
|
||||
CURRENT_TIMESTAMP - INTERVAL '3 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '3 days'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM approvals WHERE id = 'appr2222-2222-2222-2222-222222222222'
|
||||
);
|
||||
|
||||
-- Create workflow state for Application 2
|
||||
INSERT INTO workflow_states (id, request_id, current_stage_id, completed_stages, pending_approvals, execution_log, stage_started_at, created_at, updated_at)
|
||||
SELECT
|
||||
'wfst2222-2222-2222-2222-222222222222',
|
||||
'demo2222-2222-2222-2222-222222222222',
|
||||
'stage_1_fire',
|
||||
'[]',
|
||||
'["$FIRE_DEPT_ID"]',
|
||||
'[{"action": "SUBMITTED", "timestamp": "' || (CURRENT_TIMESTAMP - INTERVAL '3 days')::text || '"}]',
|
||||
CURRENT_TIMESTAMP - INTERVAL '3 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '3 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '3 days'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM workflow_states WHERE request_id = 'demo2222-2222-2222-2222-222222222222'
|
||||
);
|
||||
|
||||
-- Demo Application 3: In Review - Fire approved, Tourism/Municipality pending
|
||||
INSERT INTO license_requests (id, request_number, applicant_id, request_type, workflow_id, status, metadata, current_stage_id, submitted_at, created_at, updated_at)
|
||||
VALUES (
|
||||
'demo3333-3333-3333-3333-333333333333',
|
||||
'GOA-2024-RESORT-003',
|
||||
'$CITIZEN_ID',
|
||||
'RESORT_LICENSE',
|
||||
'$WORKFLOW_ID',
|
||||
'IN_REVIEW',
|
||||
'{"businessName": "Ocean Breeze Resort", "location": "Anjuna Beach", "type": "Eco Resort", "capacity": 25}',
|
||||
'stage_2_parallel',
|
||||
CURRENT_TIMESTAMP - INTERVAL '10 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '12 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '2 days'
|
||||
) ON CONFLICT (request_number) DO NOTHING;
|
||||
|
||||
-- Fire approval for Application 3 (completed)
|
||||
INSERT INTO approvals (id, request_id, department_id, status, remarks, created_at, updated_at)
|
||||
SELECT
|
||||
'appr3333-fire-3333-3333-333333333333',
|
||||
'demo3333-3333-3333-3333-333333333333',
|
||||
'$FIRE_DEPT_ID',
|
||||
'APPROVED',
|
||||
'Fire safety requirements met. All exits properly marked.',
|
||||
CURRENT_TIMESTAMP - INTERVAL '7 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '5 days'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM approvals WHERE id = 'appr3333-fire-3333-3333-333333333333'
|
||||
);
|
||||
|
||||
-- Tourism pending approval for Application 3
|
||||
INSERT INTO approvals (id, request_id, department_id, status, created_at, updated_at)
|
||||
SELECT
|
||||
'appr3333-tour-3333-3333-333333333333',
|
||||
'demo3333-3333-3333-3333-333333333333',
|
||||
'$TOURISM_DEPT_ID',
|
||||
'PENDING',
|
||||
CURRENT_TIMESTAMP - INTERVAL '5 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '5 days'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM approvals WHERE id = 'appr3333-tour-3333-3333-333333333333'
|
||||
);
|
||||
|
||||
-- Demo Application 4: Approved (completed all stages)
|
||||
INSERT INTO license_requests (id, request_number, applicant_id, request_type, workflow_id, status, metadata, current_stage_id, submitted_at, approved_at, created_at, updated_at)
|
||||
VALUES (
|
||||
'demo4444-4444-4444-4444-444444444444',
|
||||
'GOA-2024-RESORT-004',
|
||||
'$CITIZEN_ID',
|
||||
'RESORT_LICENSE',
|
||||
'$WORKFLOW_ID',
|
||||
'APPROVED',
|
||||
'{"businessName": "Golden Sands Resort", "location": "Candolim Beach", "type": "Luxury Resort", "capacity": 100}',
|
||||
NULL,
|
||||
CURRENT_TIMESTAMP - INTERVAL '30 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '5 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '35 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '5 days'
|
||||
) ON CONFLICT (request_number) DO NOTHING;
|
||||
|
||||
-- Demo Application 5: Rejected
|
||||
INSERT INTO license_requests (id, request_number, applicant_id, request_type, workflow_id, status, metadata, current_stage_id, submitted_at, created_at, updated_at)
|
||||
VALUES (
|
||||
'demo5555-5555-5555-5555-555555555555',
|
||||
'GOA-2024-RESORT-005',
|
||||
'$CITIZEN_ID',
|
||||
'RESORT_LICENSE',
|
||||
'$WORKFLOW_ID',
|
||||
'REJECTED',
|
||||
'{"businessName": "Beach Shack Resort", "location": "Morjim Beach", "type": "Beach Shack", "capacity": 15}',
|
||||
'stage_1_fire',
|
||||
CURRENT_TIMESTAMP - INTERVAL '20 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '25 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '15 days'
|
||||
) ON CONFLICT (request_number) DO NOTHING;
|
||||
|
||||
-- Rejected approval for Application 5
|
||||
INSERT INTO approvals (id, request_id, department_id, status, remarks, created_at, updated_at)
|
||||
SELECT
|
||||
'appr5555-fire-5555-5555-555555555555',
|
||||
'demo5555-5555-5555-5555-555555555555',
|
||||
'$FIRE_DEPT_ID',
|
||||
'REJECTED',
|
||||
'Fire safety requirements not met. Insufficient emergency exits.',
|
||||
CURRENT_TIMESTAMP - INTERVAL '18 days',
|
||||
CURRENT_TIMESTAMP - INTERVAL '15 days'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM approvals WHERE id = 'appr5555-fire-5555-5555-555555555555'
|
||||
);
|
||||
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
echo "Demo applications created:"
|
||||
echo " - GOA-2024-RESORT-001: Draft"
|
||||
echo " - GOA-2024-RESORT-002: Pending (Fire Dept review)"
|
||||
echo " - GOA-2024-RESORT-003: In Review (Tourism/Municipality pending)"
|
||||
echo " - GOA-2024-RESORT-004: Approved"
|
||||
echo " - GOA-2024-RESORT-005: Rejected"
|
||||
echo ""
|
||||
echo "Done!"
|
||||
Reference in New Issue
Block a user