A modern, high-performance web platform for the ABUVI Association, designed to manage memberships, camp registrations, and preserve the association's 50-year historical archive.
This project is a showcase of Spec-Driven Development assisted by AI Agents (Google Antigravity, Cursor, or Windsurf). Unlike traditional development, here the Specification is the Source of Truth.
- Specs First: No code is written before defining the feature or standard in
ai-specs/specs/. - Context-Aware Agents: We use
.mdcfiles (Model Context Rules) to enforce architectural standards (Vertical Slices, Clean Code, Security) directly into the AI's reasoning engine. - Verifiable Progress: Each feature starts with a "Change Plan" in
ai-specs/changes/, ensuring the AI follows a logical and documented execution path. - AI Orchestration: The developer acts as a Software Architect, guiding agents through specialized skills defined in the
.agent/directory.
- Core: .NET 9 (Minimal APIs)
- Database: PostgreSQL 16 + Entity Framework Core
- AI/Data Science: Python 3.12 integration via CSnakes
- Architecture: Vertical Slice Architecture
- Framework: Vue 3 (Composition API) + TypeScript
- UI Toolkit: PrimeVue + Tailwind CSS
- Build Tool: Vite
- Containerization: Docker & Docker Compose
- Payments: Redsys Integration (SHA-256)
- AI Tooling: Google Antigravity / Cursor
abuvi-app/ # Root directory
βββ .agent/ # AI Skills and agent-specific configurations
βββ ai-specs/ # SDD Core (The "Brain" of the project)
β βββ specs/ # Architectural & Feature specifications (.mdc, .md)
β βββ changes/ # Execution plans for specific tasks (Change Plans)
βββ src/
β βββ Abuvi.API/ # .NET 9 Backend (Vertical Slices)
β βββ Abuvi.Web/ # Vue 3 Frontend
β βββ Abuvi.Analysis/ # Python Data Analysis modules
βββ docker-compose.yml # Local development infrastructure
βββ README.md # You are here
- .NET 9 SDK
- Node.js 20+
- Python 3.12
- Docker Desktop
-
Clone the repository:
git clone https://github.com/your-user/abuvi-app.git
-
Setup the infrastructure:
docker-compose up -d
-
Initialize the Backend:
dotnet run --project src/Abuvi.API
-
Initialize the Frontend:
cd frontend && npm install && npm run dev
-
Start PostgreSQL:
docker compose up -d
-
Run database migrations (first time only):
dotnet ef database update --project src/Abuvi.API
-
Configure JWT secret (first time only):
cd src/Abuvi.API dotnet user-secrets set "Jwt:Secret" "your-strong-secret-key-at-least-32-characters-long-change-this"
-
Configure Resend email service (first time only):
The application uses Resend for sending transactional emails (verification emails, password resets, camp confirmations, payment receipts, etc.).
cd src/Abuvi.API # Get your API key from https://resend.com/api-keys dotnet user-secrets set "Resend:ApiKey" "re_your_api_key_here" # Optional: Customize sender email (default: noreply@abuvi.org) dotnet user-secrets set "Resend:FromEmail" "noreply@yourdomain.com" dotnet user-secrets set "Resend:FromName" "Your Organization Name"
Email Types Sent:
- Verification Email: On user registration (blocks account activation until verified)
- Welcome Email: After successful email verification
- Password Reset: On password reset request
- Camp Registration Confirmation: After successful camp booking
- Payment Receipt: After successful payment
- Event Reminders: Before upcoming events
- Feedback Requests: After camp completion
- Camp Update Notifications: When camp details change
Troubleshooting:
- Emails not sending: Verify API key is configured correctly
- 401 Unauthorized: API key is invalid, regenerate in Resend dashboard
- 403 Forbidden: Domain not verified (production only)
- 429 Rate Limit: Free tier limit reached (100/day), upgrade plan or wait 24h
-
Start the Backend API:
dotnet run --project src/Abuvi.API
-
Verify the application:
- API: http://localhost:5079/health
- Swagger UI: http://localhost:5079/swagger
dotnet restore- Restore NuGet packagesdotnet build- Build the solutiondotnet run --project src/Abuvi.API- Run the APIdotnet test- Run all testsdotnet ef migrations add <MigrationName> --project src/Abuvi.API- Create a new migrationdotnet ef database update --project src/Abuvi.API- Apply migrations to the databasedotnet ef migrations list --project src/Abuvi.API- List all migrations
cd frontend && npm install- Install dependenciesnpm run dev- Start development server (http://localhost:5173)npm run build- Build for productionnpm run test- Run Vitest unit tests in watch modenpm run test:run- Run tests oncenpm run test:ui- Run tests with Vitest UInpm run cypress- Open Cypress E2E test runnernpm run cypress:run- Run Cypress tests headlesslynpm run lint- Lint codenpm run format- Format code with Prettier
docker compose up -d- Start PostgreSQL in detached modedocker compose down- Stop PostgreSQLdocker compose ps- Check container statusdocker compose logs postgres- View PostgreSQL logs
dotnet test- Run all testsdotnet test --logger "console;verbosity=detailed"- Run tests with detailed outputdotnet test --collect:"XPlat Code Coverage"- Run tests with code coverage
abuvi-app/
βββ src/
β βββ Abuvi.API/ # Backend .NET 9 API
β β βββ Features/ # Vertical slice features (empty, ready for features)
β β βββ Common/ # Cross-cutting concerns
β β β βββ Middleware/ # Global middleware (exception handling)
β β β βββ Models/ # Shared models (ApiResponse, ApiError)
β β β βββ Extensions/ # Service extensions (empty)
β β β βββ Filters/ # Action filters (empty)
β β βββ Data/ # EF Core DbContext & migrations
β β β βββ Configurations/ # Entity configurations (empty)
β β β βββ Migrations/ # EF Core migrations
β β βββ Program.cs # Application entry point
β β βββ appsettings.json # Application configuration
β βββ Abuvi.Analysis/ # Python integration (CSnakes)
β β βββ requirements.txt # Python dependencies
β β βββ __init__.py # Python module initialization
β βββ Abuvi.Tests/ # xUnit test project
β βββ Unit/ # Unit tests
β βββ Integration/ # Integration tests (HealthCheckTests)
β βββ Helpers/ # Test utilities
β βββ Builders/ # Test data builders (empty)
β βββ Fixtures/ # Test fixtures (empty)
βββ frontend/ # Vue 3 Frontend
β βββ src/
β β βββ assets/ # Images, fonts, styles
β β βββ components/ # Vue components
β β β βββ common/ # Shared components
β β βββ composables/ # Reusable logic (useXxx)
β β βββ layouts/ # Page layouts
β β βββ pages/ # Route-level pages
β β β βββ HomePage.vue # Home page component
β β βββ router/ # Vue Router config
β β β βββ index.ts # Router configuration
β β βββ stores/ # Pinia state stores
β β βββ types/ # TypeScript types
β β β βββ api.ts # API response types
β β βββ utils/ # Utilities (API client)
β β β βββ api.ts # Axios API client
β β βββ App.vue # Root component
β β βββ main.ts # Entry point
β βββ cypress/ # E2E tests
β β βββ e2e/ # E2E test specs
β β βββ fixtures/ # Test data
β β βββ support/ # Cypress commands
β βββ index.html # HTML entry
β βββ vite.config.ts # Vite configuration
β βββ tsconfig.json # TypeScript config
β βββ tailwind.config.js # Tailwind configuration
β βββ package.json # NPM dependencies
βββ ai-specs/ # Specifications (SDD approach)
β βββ .agents/ # AI agent configurations
β βββ .commands/ # Custom AI commands
β βββ specs/ # Core specifications
β βββ changes/ # Change plans
βββ docker-compose.yml # PostgreSQL container
βββ Abuvi.sln # .NET solution file
βββ README.md # This file
-
Backend (
feature/phase1-user-crud-backend):- User entity with roles (Admin, Board, Member)
- REST API endpoints: GET, POST, PUT for users
- Vertical Slice Architecture implementation
- Comprehensive unit and integration tests
-
Frontend (
feature/phase1-user-crud-frontend):- User list page with DataTable (pagination, sorting)
- User detail page with view/edit modes
- Create user dialog with validation
- Composable-based API communication
- PrimeVue + Tailwind CSS styling
- Comprehensive Vitest + Cypress tests
-
Backend (
feature/phase2-authentication-backend):- BCrypt password hashing (work factor 12)
- JWT token generation with configurable expiry (24h)
- Authentication middleware with Bearer token validation
- Login endpoint: POST /api/auth/login
- Register endpoint: POST /api/auth/register
- Role-based authorization (Admin, Board, Member)
- Protected user endpoints with JWT authentication
- Comprehensive unit tests (67 tests) and integration tests (47 tests)
- Total: 114/114 tests passing (100% success rate)
-
Security Features:
- JWT secret stored in user-secrets (not in source code)
- Password requirements: min 8 chars, uppercase, lowercase, number
- Token validation: Issuer, Audience, Lifetime, SigningKey
- Role-based access control on all endpoints
- Active user status verification on login
-
API Endpoints:
- Public: POST /api/auth/register, POST /api/auth/login
- Authenticated: GET /api/users/{id}, PUT /api/users/{id}
- Admin Only: GET /api/users, POST /api/users, DELETE /api/users/{id}
Next: Phase 3 will implement frontend authentication integration.
- Frontend: http://localhost:5173
- Home: Displays "Welcome to ABUVI" message
- Users: http://localhost:5173/users (User management interface)
- Backend API Health Check: http://localhost:5079/health
- Returns:
{"status":"healthy","timestamp":"2026-02-06T..."}
- Returns:
- Backend API Endpoints:
- Authentication (Public):
POST /api/auth/register- Register new userPOST /api/auth/login- Login and receive JWT token
- Users (Protected):
GET /api/users- Get all users (Admin only)GET /api/users/:id- Get user by ID (Authenticated)POST /api/users- Create new user (Admin only)PUT /api/users/:id- Update user (Authenticated)DELETE /api/users/:id- Delete user (Admin only)
- Authentication (Public):
- Swagger UI (API Documentation): http://localhost:5079/swagger
- PostgreSQL Database:
localhost:5432- Database:
abuvi - Username:
abuvi_user - Password:
dev_password(local dev only)
- Database:
If PostgreSQL port is already in use, change the port mapping in docker-compose.yml:
ports:
- "5433:5432" # Changed host port to 5433Then update the connection string in src/Abuvi.API/appsettings.json:
"DefaultConnection": "Host=localhost;Port=5433;Database=abuvi;Username=abuvi_user;Password=dev_password"Ensure Docker Desktop is running:
docker ps # Should not error- Check PostgreSQL is running:
docker compose ps - Verify health status shows "healthy"
- Check connection string in
appsettings.jsonmatchesdocker-compose.ymlenvironment variables
This project targets .NET 9, but can be built with .NET 10 SDK (backward compatible). If you encounter framework errors:
- Check installed SDKs:
dotnet --list-sdks - Verify you have .NET 9.0.x SDK installed
- If needed, create
global.jsonto pin SDK version
Ensure PostgreSQL is running before creating or applying migrations:
docker compose ps # Should show "healthy" statusThis project is licensed under the Apache License 2.0 - see the LICENSE file for details. This license allows for community use and transparency while protecting the core architectural patterns and the non-profit organization's brand.
Developed with β€οΈ for ABUVI using Spec-Driven Development methodology.