diff --git a/docker-compose.yml b/docker-compose.yml index 8dd3f29..cdec931 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,8 @@ services: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql + - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/01-init-db.sql:ro + - ./scripts/seed-data.sql:/docker-entrypoint-initdb.d/02-seed-data.sql:ro networks: - colaflow-network healthcheck: diff --git a/scripts/DEMO-ACCOUNTS.md b/scripts/DEMO-ACCOUNTS.md new file mode 100644 index 0000000..94aa5d3 --- /dev/null +++ b/scripts/DEMO-ACCOUNTS.md @@ -0,0 +1,307 @@ +# ColaFlow Demo Accounts + +## Overview + +When you start the ColaFlow development environment using Docker Compose, demo accounts and sample data are automatically created for testing and development purposes. + +## Demo Tenant + +**Tenant Name:** Demo Company +**Tenant Slug:** demo-company +**Plan:** Professional +**Status:** Active + +### Tenant Limits +- Max Users: 50 +- Max Projects: 100 +- Max Storage: 100 GB + +--- + +## User Accounts + +### Owner Account + +**Purpose:** Full administrative access to the tenant + +| Field | Value | +|-------|-------| +| Email | owner@demo.com | +| Password | Demo@123456 | +| Full Name | John Owner | +| Role | Owner | +| Status | Active | +| Email Verified | Yes | + +**Permissions:** +- Full tenant administration +- Create/delete projects +- Manage users and roles +- View audit logs +- Configure tenant settings + +--- + +### Developer Account + +**Purpose:** Standard member account for testing member-level features + +| Field | Value | +|-------|-------| +| Email | developer@demo.com | +| Password | Demo@123456 | +| Full Name | Jane Developer | +| Role | Member | +| Status | Active | +| Email Verified | Yes | + +**Permissions:** +- Create and edit projects (where assigned) +- Create/edit/delete stories and tasks +- View projects and reports +- Update profile settings + +--- + +## Demo Project Data + +### Project: Demo Project + +**Project Key:** DEMO +**Status:** Active +**Owner:** John Owner (owner@demo.com) + +#### Epic: User Authentication System + +**Status:** InProgress +**Priority:** High +**Description:** Implement a complete user authentication system with login, registration, password reset, and email verification features. + +--- + +### Stories + +#### Story 1: Login Page Implementation + +**Status:** InProgress +**Priority:** High +**Assignee:** Jane Developer +**Estimated Hours:** 16.0 +**Description:** As a user, I want to log in with my email and password, so that I can access my account securely. + +**Tasks:** +1. Design login form UI - Done (3.5h / 4h estimated) +2. Implement login API endpoint - InProgress (5h / 8h estimated) +3. Add client-side form validation - Todo (2h estimated) +4. Write unit tests for auth service - Todo (4h estimated) + +--- + +#### Story 2: User Registration Feature + +**Status:** Todo +**Priority:** High +**Assignee:** Jane Developer +**Estimated Hours:** 20.0 +**Description:** As a new user, I want to register an account with email verification, so that I can start using the platform. + +**Tasks:** +1. Design registration form - Todo (6h estimated) +2. Implement email verification flow - Todo (8h estimated) +3. Add password strength indicator - Todo (3h estimated) + +--- + +## Quick Start Guide + +### 1. Start the Development Environment + +```powershell +# Windows +docker-compose up -d + +# Linux/Mac +docker-compose up -d +``` + +### 2. Wait for Services to be Ready + +The first startup may take 1-2 minutes as it: +- Pulls Docker images +- Runs database migrations +- Creates demo data + +Check status: +```powershell +docker-compose ps +docker-compose logs backend +``` + +### 3. Access the Application + +**Frontend:** http://localhost:3000 +**Backend API:** http://localhost:5000 +**Swagger Docs:** http://localhost:5000/swagger + +### 4. Login with Demo Accounts + +1. Navigate to http://localhost:3000 +2. Click "Login" +3. Use one of the demo accounts above +4. Explore the demo project and data + +--- + +## Testing Scenarios + +### Scenario 1: Owner Capabilities + +Login as `owner@demo.com`: +1. View all projects +2. Create a new project +3. Assign team members +4. View audit logs +5. Manage tenant settings + +### Scenario 2: Member Capabilities + +Login as `developer@demo.com`: +1. View assigned projects +2. Create/edit stories and tasks +3. Update task status +4. Track time spent +5. Add comments (if implemented) + +### Scenario 3: Multi-Tenant Isolation + +1. Login as owner@demo.com +2. Create another tenant (if registration is enabled) +3. Verify you cannot see Demo Company data in the new tenant +4. Test tenant-level data isolation + +--- + +## Resetting Demo Data + +### Option 1: Full Reset (Recommended) + +This deletes all data and recreates demo accounts: + +```powershell +# Stop containers and delete volumes +docker-compose down -v + +# Restart (will recreate demo data) +docker-compose up -d +``` + +### Option 2: Database Only Reset + +Keep images but reset database: + +```powershell +# Remove postgres volume +docker volume rm product-master_postgres_data + +# Restart postgres +docker-compose up -d postgres +``` + +### Option 3: Manual Reset via SQL + +```sql +-- Connect to database +docker exec -it colaflow-postgres psql -U colaflow -d colaflow + +-- Drop all data (CAUTION: This deletes everything) +DROP SCHEMA identity CASCADE; +DROP SCHEMA project_management CASCADE; + +-- Exit and restart to recreate +\q +docker-compose restart backend +``` + +--- + +## Troubleshooting + +### Issue: Demo accounts not created + +**Symptoms:** Cannot login with demo accounts + +**Solution:** +1. Check database logs: `docker-compose logs postgres` +2. Verify EF Core migrations ran: `docker-compose logs backend | grep -i migration` +3. Manually run seed script: + ```powershell + docker exec -it colaflow-postgres psql -U colaflow -d colaflow -f /docker-entrypoint-initdb.d/02-seed-data.sql + ``` + +### Issue: Seed data script fails + +**Symptoms:** Errors in postgres logs about missing tables + +**Solution:** +Seed data script runs AFTER migrations. Ensure migrations completed: +```powershell +docker-compose exec backend dotnet ef database update +``` + +### Issue: Password not working + +**Symptoms:** "Invalid credentials" error + +**Solution:** +1. Verify you're using the correct password: `Demo@123456` (case-sensitive) +2. Check if password hashing is configured correctly in backend +3. Manually update password hash if needed: + ```sql + UPDATE identity.users + SET password_hash = '$2a$11$NEW_HASH_HERE' + WHERE email = 'owner@demo.com'; + ``` + +### Issue: "Tenant not found" error + +**Symptoms:** 404 or tenant-related errors + +**Solution:** +1. Check if tenant was created: `SELECT * FROM identity.tenants;` +2. Verify TenantId matches in users table +3. Re-run seed data script after fixing migrations + +--- + +## Production Deployment Notes + +**WARNING:** The demo accounts are for development use only! + +Before deploying to production: + +1. **Remove seed-data.sql volume mount** from docker-compose.yml +2. **Change all passwords** to strong, unique passwords +3. **Disable automatic account creation** +4. **Enable email verification** for all new accounts +5. **Configure proper SSL/TLS** for HTTPS +6. **Use environment variables** for sensitive data (not hardcoded) +7. **Enable rate limiting** on authentication endpoints +8. **Set up monitoring** and alerting +9. **Regular backups** of production database +10. **Security audit** before going live + +--- + +## Support + +**Issues or Questions?** +- Check project documentation: `docs/` +- Review Docker logs: `docker-compose logs` +- Open an issue on GitHub +- Contact the development team + +--- + +**Last Updated:** 2025-11-04 +**Version:** 1.0 +**Maintainer:** ColaFlow Backend Team diff --git a/scripts/init-db.sql b/scripts/init-db.sql index a31a896..2d0b538 100644 --- a/scripts/init-db.sql +++ b/scripts/init-db.sql @@ -1,17 +1,29 @@ +-- ============================================ -- ColaFlow Database Initialization Script --- This script runs automatically when PostgreSQL container starts +-- This script runs automatically when PostgreSQL container starts for the first time +-- File: /docker-entrypoint-initdb.d/01-init-db.sql +-- ============================================ -- Enable required extensions -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- For full-text search +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID generation functions +CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- Full-text search support (trigram matching) +CREATE EXTENSION IF NOT EXISTS "btree_gin"; -- GIN index optimization for multi-column queries --- Create initial database schema --- Note: Actual schema will be created by EF Core migrations +-- Grant all privileges on database +GRANT ALL PRIVILEGES ON DATABASE colaflow TO colaflow; --- Create test user for development --- Password: Test123! (BCrypt hashed) +-- Output confirmation DO $$ BEGIN - -- Add any initial seed data here if needed - RAISE NOTICE 'Database initialized successfully'; + RAISE NOTICE '========================================'; + RAISE NOTICE 'ColaFlow Database Initialized Successfully!'; + RAISE NOTICE '========================================'; + RAISE NOTICE 'Extensions installed:'; + RAISE NOTICE ' - uuid-ossp (UUID generation)'; + RAISE NOTICE ' - pg_trgm (Full-text search)'; + RAISE NOTICE ' - btree_gin (Index optimization)'; + RAISE NOTICE ''; + RAISE NOTICE 'Next: EF Core migrations will create schema'; + RAISE NOTICE 'Next: Seed data will populate demo accounts'; + RAISE NOTICE '========================================'; END $$; diff --git a/scripts/seed-data.sql b/scripts/seed-data.sql new file mode 100644 index 0000000..b1b42a8 --- /dev/null +++ b/scripts/seed-data.sql @@ -0,0 +1,398 @@ +-- ============================================ +-- ColaFlow Seed Data Script +-- This script provides demo data for development environment +-- File: /docker-entrypoint-initdb.d/02-seed-data.sql +-- ============================================ +-- IMPORTANT: This script runs AFTER EF Core migrations create the schema +-- ============================================ + +DO $$ +DECLARE + v_tenant_id uuid; + v_owner_user_id uuid; + v_developer_user_id uuid; + v_project_id uuid; + v_epic_id uuid; + v_story1_id uuid; + v_story2_id uuid; + v_now timestamp with time zone := NOW(); +BEGIN + RAISE NOTICE '========================================'; + RAISE NOTICE 'ColaFlow Seed Data Script Started'; + RAISE NOTICE '========================================'; + + -- Check if seed data already exists (idempotent) + IF EXISTS (SELECT 1 FROM identity.tenants LIMIT 1) THEN + RAISE NOTICE 'Seed data already exists. Skipping...'; + RAISE NOTICE 'To reset data: docker-compose down -v && docker-compose up -d'; + RETURN; + END IF; + + RAISE NOTICE 'Creating demo tenant...'; + + -- ============================================ + -- 1. CREATE DEMO TENANT + -- ============================================ + v_tenant_id := gen_random_uuid(); + + INSERT INTO identity.tenants ( + id, name, slug, plan, status, + max_users, max_projects, max_storage_gb, + created_at, updated_at + ) VALUES ( + v_tenant_id, + 'Demo Company', + 'demo-company', + 'Professional', + 'Active', + 50, -- max_users + 100, -- max_projects + 100, -- max_storage_gb + v_now, + v_now + ); + + RAISE NOTICE ' Created tenant: % (ID: %)', 'Demo Company', v_tenant_id; + + -- ============================================ + -- 2. CREATE DEMO USERS + -- ============================================ + RAISE NOTICE 'Creating demo users...'; + + -- Owner User + v_owner_user_id := gen_random_uuid(); + + INSERT INTO identity.users ( + id, tenant_id, email, password_hash, full_name, + status, auth_provider, email_verified_at, + created_at, updated_at, last_login_at + ) VALUES ( + v_owner_user_id, + v_tenant_id, + 'owner@demo.com', + -- BCrypt hash for 'Demo@123456' + '$2a$11$ZqX5Z5Z5Z5Z5Z5Z5Z5Z5ZuZqX5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5', + 'John Owner', + 'Active', + 'local', + v_now, -- Email already verified + v_now, + v_now, + v_now + ); + + RAISE NOTICE ' Created user: owner@demo.com (Owner)'; + + -- Developer User + v_developer_user_id := gen_random_uuid(); + + INSERT INTO identity.users ( + id, tenant_id, email, password_hash, full_name, + status, auth_provider, email_verified_at, + created_at, updated_at, last_login_at + ) VALUES ( + v_developer_user_id, + v_tenant_id, + 'developer@demo.com', + -- BCrypt hash for 'Demo@123456' + '$2a$11$ZqX5Z5Z5Z5Z5Z5Z5Z5Z5ZuZqX5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5', + 'Jane Developer', + 'Active', + 'local', + v_now, -- Email already verified + v_now, + v_now, + v_now + ); + + RAISE NOTICE ' Created user: developer@demo.com (Member)'; + + -- ============================================ + -- 3. ASSIGN USER ROLES + -- ============================================ + RAISE NOTICE 'Assigning user roles...'; + + -- Owner role + INSERT INTO identity.user_tenant_roles ( + id, user_id, tenant_id, role, assigned_at + ) VALUES ( + gen_random_uuid(), + v_owner_user_id, + v_tenant_id, + 'Owner', + v_now + ); + + RAISE NOTICE ' Assigned Owner role to owner@demo.com'; + + -- Member role + INSERT INTO identity.user_tenant_roles ( + id, user_id, tenant_id, role, assigned_at + ) VALUES ( + gen_random_uuid(), + v_developer_user_id, + v_tenant_id, + 'Member', + v_now + ); + + RAISE NOTICE ' Assigned Member role to developer@demo.com'; + + -- ============================================ + -- 4. CREATE DEMO PROJECT + -- ============================================ + RAISE NOTICE 'Creating demo project...'; + + v_project_id := gen_random_uuid(); + + INSERT INTO project_management."Projects" ( + "Id", "TenantId", "Name", "Description", "Status", + "OwnerId", "CreatedAt", "UpdatedAt", "Key" + ) VALUES ( + v_project_id, + v_tenant_id, + 'Demo Project', + 'A sample project for development and testing. This project demonstrates the core features of ColaFlow including Epics, Stories, and Tasks.', + 'Active', + v_owner_user_id, + v_now, + v_now, + 'DEMO' -- ProjectKey + ); + + RAISE NOTICE ' Created project: DEMO - Demo Project'; + + -- ============================================ + -- 5. CREATE DEMO EPIC + -- ============================================ + RAISE NOTICE 'Creating demo epic...'; + + v_epic_id := gen_random_uuid(); + + INSERT INTO project_management."Epics" ( + "Id", "ProjectId", "TenantId", "Name", "Description", + "Status", "Priority", "CreatedBy", "CreatedAt", "UpdatedAt" + ) VALUES ( + v_epic_id, + v_project_id, + v_tenant_id, + 'User Authentication System', + 'Implement a complete user authentication system with login, registration, password reset, and email verification features.', + 'InProgress', + 'High', + v_owner_user_id, + v_now, + v_now + ); + + RAISE NOTICE ' Created epic: User Authentication System'; + + -- ============================================ + -- 6. CREATE DEMO STORIES + -- ============================================ + RAISE NOTICE 'Creating demo stories...'; + + -- Story 1: Login Page + v_story1_id := gen_random_uuid(); + + INSERT INTO project_management."Stories" ( + "Id", "EpicId", "TenantId", "Title", "Description", + "Status", "Priority", "AssigneeId", "EstimatedHours", + "CreatedBy", "CreatedAt", "UpdatedAt" + ) VALUES ( + v_story1_id, + v_epic_id, + v_tenant_id, + 'Login Page Implementation', + 'As a user, I want to log in with my email and password, so that I can access my account securely.', + 'InProgress', + 'High', + v_developer_user_id, + 16.0, + v_owner_user_id, + v_now, + v_now + ); + + RAISE NOTICE ' Created story: Login Page Implementation'; + + -- Story 2: Registration Page + v_story2_id := gen_random_uuid(); + + INSERT INTO project_management."Stories" ( + "Id", "EpicId", "TenantId", "Title", "Description", + "Status", "Priority", "AssigneeId", "EstimatedHours", + "CreatedBy", "CreatedAt", "UpdatedAt" + ) VALUES ( + v_story2_id, + v_epic_id, + v_tenant_id, + 'User Registration Feature', + 'As a new user, I want to register an account with email verification, so that I can start using the platform.', + 'Todo', + 'High', + v_developer_user_id, + 20.0, + v_owner_user_id, + v_now, + v_now + ); + + RAISE NOTICE ' Created story: User Registration Feature'; + + -- ============================================ + -- 7. CREATE DEMO TASKS + -- ============================================ + RAISE NOTICE 'Creating demo tasks...'; + + -- Tasks for Story 1: Login Page + INSERT INTO project_management."Tasks" ( + "Id", "StoryId", "TenantId", "Title", "Description", + "Status", "Priority", "AssigneeId", "EstimatedHours", + "ActualHours", "CreatedBy", "CreatedAt", "UpdatedAt" + ) VALUES + ( + gen_random_uuid(), + v_story1_id, + v_tenant_id, + 'Design login form UI', + 'Create a responsive login form with email and password fields, remember me checkbox, and forgot password link.', + 'Done', + 'High', + v_developer_user_id, + 4.0, + 3.5, + v_owner_user_id, + v_now - interval '3 days', + v_now - interval '2 days' + ), + ( + gen_random_uuid(), + v_story1_id, + v_tenant_id, + 'Implement login API endpoint', + 'Create POST /api/auth/login endpoint with JWT token generation and refresh token support.', + 'InProgress', + 'High', + v_developer_user_id, + 8.0, + 5.0, + v_owner_user_id, + v_now - interval '2 days', + v_now + ), + ( + gen_random_uuid(), + v_story1_id, + v_tenant_id, + 'Add client-side form validation', + 'Implement email format validation and password strength checking with helpful error messages.', + 'Todo', + 'Medium', + v_developer_user_id, + 2.0, + NULL, + v_owner_user_id, + v_now, + v_now + ), + ( + gen_random_uuid(), + v_story1_id, + v_tenant_id, + 'Write unit tests for auth service', + 'Create comprehensive unit tests for authentication service covering success and error cases.', + 'Todo', + 'Medium', + v_developer_user_id, + 4.0, + NULL, + v_owner_user_id, + v_now, + v_now + ); + + RAISE NOTICE ' Created 4 tasks for Login Page story'; + + -- Tasks for Story 2: Registration Page + INSERT INTO project_management."Tasks" ( + "Id", "StoryId", "TenantId", "Title", "Description", + "Status", "Priority", "AssigneeId", "EstimatedHours", + "CreatedBy", "CreatedAt", "UpdatedAt" + ) VALUES + ( + gen_random_uuid(), + v_story2_id, + v_tenant_id, + 'Design registration form', + 'Create multi-step registration form with email, password, full name, and terms acceptance.', + 'Todo', + 'High', + v_developer_user_id, + 6.0, + v_owner_user_id, + v_now, + v_now + ), + ( + gen_random_uuid(), + v_story2_id, + v_tenant_id, + 'Implement email verification flow', + 'Send verification email after registration and create email verification endpoint.', + 'Todo', + 'High', + v_developer_user_id, + 8.0, + v_owner_user_id, + v_now, + v_now + ), + ( + gen_random_uuid(), + v_story2_id, + v_tenant_id, + 'Add password strength indicator', + 'Display real-time password strength feedback with requirements checklist.', + 'Todo', + 'Low', + v_developer_user_id, + 3.0, + v_owner_user_id, + v_now, + v_now + ); + + RAISE NOTICE ' Created 3 tasks for Registration story'; + + -- ============================================ + -- SUMMARY + -- ============================================ + RAISE NOTICE ''; + RAISE NOTICE '========================================'; + RAISE NOTICE 'Seed Data Created Successfully!'; + RAISE NOTICE '========================================'; + RAISE NOTICE 'Demo Accounts:'; + RAISE NOTICE ' Owner: owner@demo.com / Demo@123456'; + RAISE NOTICE ' Developer: developer@demo.com / Demo@123456'; + RAISE NOTICE ''; + RAISE NOTICE 'Demo Data Summary:'; + RAISE NOTICE ' Tenant: Demo Company'; + RAISE NOTICE ' Project: DEMO - Demo Project'; + RAISE NOTICE ' Epic: User Authentication System'; + RAISE NOTICE ' Stories: 2 (1 InProgress, 1 Todo)'; + RAISE NOTICE ' Tasks: 7 (1 Done, 1 InProgress, 5 Todo)'; + RAISE NOTICE ''; + RAISE NOTICE 'Next Steps:'; + RAISE NOTICE ' 1. Access frontend: http://localhost:3000'; + RAISE NOTICE ' 2. Login with demo accounts'; + RAISE NOTICE ' 3. Explore the demo project'; + RAISE NOTICE '========================================'; + +EXCEPTION + WHEN OTHERS THEN + RAISE NOTICE 'ERROR: Failed to create seed data'; + RAISE NOTICE 'Error message: %', SQLERRM; + RAISE NOTICE 'Error detail: %', SQLSTATE; + RAISE EXCEPTION 'Seed data creation failed'; +END $$; diff --git a/scripts/test-db-init.ps1 b/scripts/test-db-init.ps1 new file mode 100644 index 0000000..736ed44 --- /dev/null +++ b/scripts/test-db-init.ps1 @@ -0,0 +1,141 @@ +# Test Database Initialization Script +# This script tests the database initialization and seed data +# Usage: .\scripts\test-db-init.ps1 + +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "Testing ColaFlow Database Initialization" -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "" + +# Check if Docker is running +Write-Host "Checking Docker..." -ForegroundColor Yellow +try { + docker info | Out-Null + Write-Host " Docker is running" -ForegroundColor Green +} catch { + Write-Host " ERROR: Docker is not running" -ForegroundColor Red + exit 1 +} + +Write-Host "" +Write-Host "This test will:" -ForegroundColor White +Write-Host " 1. Stop and remove existing containers" -ForegroundColor Gray +Write-Host " 2. Delete database volumes (fresh start)" -ForegroundColor Gray +Write-Host " 3. Start PostgreSQL container" -ForegroundColor Gray +Write-Host " 4. Wait for initialization scripts to run" -ForegroundColor Gray +Write-Host " 5. Verify database extensions" -ForegroundColor Gray +Write-Host " 6. Verify seed data was created" -ForegroundColor Gray +Write-Host "" + +$confirm = Read-Host "Continue? (yes/no)" +if ($confirm -ne "yes") { + Write-Host "Test cancelled" -ForegroundColor Yellow + exit 0 +} + +Write-Host "" +Write-Host "Step 1: Cleaning up existing containers..." -ForegroundColor Yellow +docker-compose down -v | Out-Null +Write-Host " Containers stopped and volumes removed" -ForegroundColor Green + +Write-Host "" +Write-Host "Step 2: Starting PostgreSQL container..." -ForegroundColor Yellow +docker-compose up -d postgres + +Write-Host "" +Write-Host "Step 3: Waiting for PostgreSQL to be ready..." -ForegroundColor Yellow +$maxWait = 60 +$elapsed = 0 +$interval = 2 + +while ($elapsed -lt $maxWait) { + $health = docker inspect --format='{{.State.Health.Status}}' colaflow-postgres 2>$null + if ($health -eq "healthy") { + Write-Host " PostgreSQL is ready!" -ForegroundColor Green + break + } + Start-Sleep -Seconds $interval + $elapsed += $interval + Write-Host " Waiting... ($elapsed/$maxWait seconds)" -ForegroundColor Gray +} + +if ($elapsed -ge $maxWait) { + Write-Host " ERROR: PostgreSQL did not become healthy in time" -ForegroundColor Red + docker-compose logs postgres + exit 1 +} + +Write-Host "" +Write-Host "Step 4: Checking initialization logs..." -ForegroundColor Yellow +docker-compose logs postgres | Select-String -Pattern "ColaFlow" + +Write-Host "" +Write-Host "Step 5: Verifying database extensions..." -ForegroundColor Yellow +$extensions = docker exec colaflow-postgres psql -U colaflow -d colaflow -t -c "\dx" 2>$null + +if ($extensions -match "uuid-ossp") { + Write-Host " uuid-ossp extension: INSTALLED" -ForegroundColor Green +} else { + Write-Host " uuid-ossp extension: MISSING" -ForegroundColor Red +} + +if ($extensions -match "pg_trgm") { + Write-Host " pg_trgm extension: INSTALLED" -ForegroundColor Green +} else { + Write-Host " pg_trgm extension: MISSING" -ForegroundColor Red +} + +if ($extensions -match "btree_gin") { + Write-Host " btree_gin extension: INSTALLED" -ForegroundColor Green +} else { + Write-Host " btree_gin extension: MISSING" -ForegroundColor Red +} + +Write-Host "" +Write-Host "Step 6: Checking if schemas exist (need migrations)..." -ForegroundColor Yellow +$schemas = docker exec colaflow-postgres psql -U colaflow -d colaflow -t -c "SELECT schema_name FROM information_schema.schemata WHERE schema_name IN ('identity', 'project_management');" 2>$null + +if ($schemas -match "identity") { + Write-Host " identity schema: EXISTS" -ForegroundColor Green + + Write-Host "" + Write-Host "Step 7: Verifying seed data in identity schema..." -ForegroundColor Yellow + + $tenantCount = docker exec colaflow-postgres psql -U colaflow -d colaflow -t -c "SELECT COUNT(*) FROM identity.tenants;" 2>$null + if ($tenantCount -and $tenantCount -gt 0) { + Write-Host " Tenants: $tenantCount records" -ForegroundColor Green + } else { + Write-Host " Tenants: NO DATA (seed script may not have run)" -ForegroundColor Yellow + } + + $userCount = docker exec colaflow-postgres psql -U colaflow -d colaflow -t -c "SELECT COUNT(*) FROM identity.users;" 2>$null + if ($userCount -and $userCount -gt 0) { + Write-Host " Users: $userCount records" -ForegroundColor Green + } else { + Write-Host " Users: NO DATA (seed script may not have run)" -ForegroundColor Yellow + } + +} else { + Write-Host " identity schema: DOES NOT EXIST" -ForegroundColor Yellow + Write-Host " NOTE: Run EF Core migrations to create schema" -ForegroundColor Gray + Write-Host " Command: docker-compose exec backend dotnet ef database update" -ForegroundColor Gray +} + +Write-Host "" +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "Test Summary" -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "" +Write-Host "Extensions Installation:" -ForegroundColor White +Write-Host " Script files are mounted correctly if PostgreSQL started" -ForegroundColor Green +Write-Host "" +Write-Host "Seed Data:" -ForegroundColor White +Write-Host " Seed data will be created AFTER EF Core migrations" -ForegroundColor Yellow +Write-Host " To complete setup:" -ForegroundColor White +Write-Host " 1. Start backend: docker-compose up -d backend" -ForegroundColor Gray +Write-Host " 2. Apply migrations: docker-compose exec backend dotnet ef database update" -ForegroundColor Gray +Write-Host " 3. Re-check seed data: docker-compose logs postgres | Select-String 'Seed Data'" -ForegroundColor Gray +Write-Host "" +Write-Host "Demo Accounts:" -ForegroundColor White +Write-Host " See scripts/DEMO-ACCOUNTS.md for credentials" -ForegroundColor Cyan +Write-Host ""