docs: Fill out openspec/project.md with complete project details
Documented: - Project purpose and goals (e-voting with blockchain) - Complete tech stack (Next.js, FastAPI, MySQL, Docker) - Code style conventions (TypeScript, Python, Git) - Architecture patterns (frontend, backend, API client) - Testing strategy and git workflow - Domain context (e-voting concepts, security model) - Important constraints (technical, security, regulatory) - External dependencies and key endpoints 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
fc7be6df26
commit
6ef4dc851b
261
e-voting-system/openspec/project.md
Normal file
261
e-voting-system/openspec/project.md
Normal file
@ -0,0 +1,261 @@
|
||||
# Project Context
|
||||
|
||||
## Purpose
|
||||
E-Voting System - A secure electronic voting platform with blockchain-based vote recording, post-quantum cryptography, and real-time election management. Allows users to register, authenticate, and participate in elections through a web-based interface while ensuring vote integrity and transparency through distributed ledger technology.
|
||||
|
||||
**Key Goals:**
|
||||
- Provide secure, verifiable electronic voting
|
||||
- Ensure vote immutability via blockchain
|
||||
- Support post-quantum cryptographic algorithms
|
||||
- Enable transparent election results
|
||||
- Maintain voter privacy and authentication
|
||||
|
||||
## Tech Stack
|
||||
|
||||
### Frontend
|
||||
- **Framework**: Next.js 15 (App Router)
|
||||
- **Language**: TypeScript 5.3
|
||||
- **Styling**: Tailwind CSS 3.3.6
|
||||
- **UI Components**: shadcn/ui (custom components)
|
||||
- **Forms**: React Hook Form 7.66.0
|
||||
- **Validation**: Zod 4.1.12
|
||||
- **Icons**: Lucide React
|
||||
- **Environment**: Node.js 18+, npm
|
||||
|
||||
### Backend
|
||||
- **Framework**: FastAPI (Python 3.12+)
|
||||
- **Authentication**: JWT tokens (30-minute expiry)
|
||||
- **Database**: MySQL 8.0+ / SQLite (dev)
|
||||
- **ORM**: SQLAlchemy
|
||||
- **Validation**: Pydantic
|
||||
- **Cryptography**:
|
||||
- bcrypt for password hashing
|
||||
- Post-quantum algorithms (ML-KEM, ML-DSA)
|
||||
- Ballot hashing for vote verification
|
||||
- **Middleware**: CORS enabled
|
||||
- **Documentation**: Swagger UI & ReDoc
|
||||
|
||||
### Infrastructure
|
||||
- **Containerization**: Docker & Docker Compose
|
||||
- **Development Server**: uvicorn (backend), Next.js dev (frontend)
|
||||
- **Production Build**: Next.js static export + Node.js server
|
||||
|
||||
### Blockchain/Distributed Ledger
|
||||
- Vote records stored with ballot hashes
|
||||
- Immutable vote recording
|
||||
- Transparent result verification
|
||||
|
||||
## Project Conventions
|
||||
|
||||
### Code Style
|
||||
|
||||
**TypeScript/JavaScript:**
|
||||
- Use TypeScript for all new code (no `any` types)
|
||||
- Use arrow functions and const declarations
|
||||
- Use camelCase for variables and functions
|
||||
- Use PascalCase for component names and types
|
||||
- Max line length: 100 characters
|
||||
- Indent with 2 spaces
|
||||
- Quote style: Double quotes for JSX, prefer template literals
|
||||
|
||||
**Python:**
|
||||
- Follow PEP 8 naming conventions
|
||||
- snake_case for functions and variables
|
||||
- PascalCase for classes
|
||||
- 4-space indentation
|
||||
- Use type hints for all functions
|
||||
- Docstrings for public functions/classes
|
||||
|
||||
**Git Formatting:**
|
||||
- ESLint config: `.eslintrc.json` disables unescaped entities rule
|
||||
- No Prettier config needed (uses Next.js defaults)
|
||||
|
||||
### Architecture Patterns
|
||||
|
||||
**Frontend Architecture:**
|
||||
```
|
||||
app/ # Next.js App Router
|
||||
├── page.tsx # Route components
|
||||
├── layout.tsx # Route layouts
|
||||
├── @modal/ # Optional slot routes
|
||||
components/
|
||||
├── ui/ # Reusable UI components (shadcn/ui)
|
||||
└── protected-route.tsx # Authentication wrapper
|
||||
lib/
|
||||
├── api.ts # API client with TypeScript types
|
||||
├── auth-context.tsx # Global auth state (React Context)
|
||||
├── validation.ts # Zod schemas for form validation
|
||||
└── utils.ts # Utility functions
|
||||
```
|
||||
|
||||
**Authentication Flow:**
|
||||
1. User submits form (login/register)
|
||||
2. Frontend validates with Zod schema
|
||||
3. API request with JSON payload
|
||||
4. Backend validates and returns JWT token
|
||||
5. Frontend stores token in localStorage
|
||||
6. Token included in Authorization header for all subsequent requests
|
||||
7. useAuth() hook provides user state across components
|
||||
|
||||
**API Client Pattern:**
|
||||
- Centralized in `lib/api.ts`
|
||||
- Grouped by resource: `authApi`, `electionsApi`, `votesApi`
|
||||
- Returns `{ data?, error?, status }` structure
|
||||
- Automatic token injection in headers
|
||||
- Type-safe responses with TypeScript interfaces
|
||||
|
||||
**Protected Routes:**
|
||||
- ProtectedRoute component wraps dashboard
|
||||
- Checks useAuth() context before rendering
|
||||
- Redirects to login if not authenticated
|
||||
- Shows loading spinner during auth check
|
||||
|
||||
**Backend Architecture:**
|
||||
```
|
||||
backend/
|
||||
├── main.py # FastAPI app entry point
|
||||
├── routes/ # Endpoint handlers
|
||||
│ ├── auth.py # Authentication endpoints
|
||||
│ ├── elections.py # Election management
|
||||
│ └── votes.py # Vote recording
|
||||
├── models.py # SQLAlchemy ORM models
|
||||
├── schemas.py # Pydantic request/response schemas
|
||||
├── services.py # Business logic
|
||||
├── auth.py # JWT and password utilities
|
||||
├── database.py # Database connection
|
||||
└── crypto/ # Cryptographic utilities
|
||||
```
|
||||
|
||||
### Testing Strategy
|
||||
|
||||
**Manual Testing (Current):**
|
||||
- Test registration with form validation
|
||||
- Test login/logout flow
|
||||
- Test protected routes redirect
|
||||
- Test election data loading
|
||||
- Test form validation errors
|
||||
- Test API error handling
|
||||
|
||||
**Future Testing:**
|
||||
- **Unit Tests**: Jest for frontend components
|
||||
- **E2E Tests**: Cypress for user workflows
|
||||
- **Backend Tests**: pytest for API endpoints
|
||||
- **Integration Tests**: Full stack with Docker
|
||||
|
||||
### Git Workflow
|
||||
|
||||
**Branching Strategy:**
|
||||
- `paul/evoting` - Main development branch
|
||||
- `UI` - Current frontend branch with Next.js rebuild
|
||||
- `backup` - Old React CRA frontend (preserved)
|
||||
- Feature branches off main development branch
|
||||
|
||||
**Commit Conventions:**
|
||||
Format: `<type>: <subject>`
|
||||
|
||||
**Types:**
|
||||
- `feat:` - New feature
|
||||
- `fix:` - Bug fix
|
||||
- `refactor:` - Code restructuring
|
||||
- `docs:` - Documentation updates
|
||||
- `chore:` - Dependencies, config changes
|
||||
- `test:` - Test additions/updates
|
||||
|
||||
**Example:**
|
||||
```
|
||||
feat: Integrate backend API with frontend - Authentication & Elections
|
||||
fix: Update Docker config for Next.js frontend
|
||||
docs: Add comprehensive project status document
|
||||
```
|
||||
|
||||
**Commit Messages:**
|
||||
- Use imperative mood ("add" not "added")
|
||||
- Keep subject under 50 characters
|
||||
- Include context in body if needed
|
||||
- Sign with: `🤖 Generated with Claude Code`
|
||||
- Co-author: `Co-Authored-By: Claude <noreply@anthropic.com>`
|
||||
|
||||
## Domain Context
|
||||
|
||||
### E-Voting Concepts
|
||||
- **Election**: A voting event with candidates and a deadline
|
||||
- **Candidate**: Options users can vote for
|
||||
- **Voter/User**: Authenticated user who can vote in elections
|
||||
- **Vote**: Immutable record of voter choice (with ballot hash for verification)
|
||||
- **Ballot Hash**: Cryptographic hash of vote details for verification without exposing vote
|
||||
|
||||
### Election States
|
||||
- **Pending/Upcoming**: Not yet started, no voting allowed
|
||||
- **Active**: Currently accepting votes
|
||||
- **Completed**: Voting finished, results available
|
||||
|
||||
### Security Model
|
||||
- User authentication via JWT tokens (30-minute expiry)
|
||||
- Password hashing with bcrypt
|
||||
- Post-quantum cryptography for future-proofing
|
||||
- Vote recording with ballot hashes for transparency
|
||||
- Vote immutability via blockchain/ledger
|
||||
- No voter identification in vote records (privacy)
|
||||
|
||||
### French Language Convention
|
||||
- All UI text in French
|
||||
- Error messages: `Erreur`, validation messages, etc.
|
||||
- Date format: DD/MM/YYYY
|
||||
|
||||
## Important Constraints
|
||||
|
||||
### Technical
|
||||
- **Password Requirements**:
|
||||
- Minimum 8 characters
|
||||
- At least 1 uppercase letter
|
||||
- At least 1 digit
|
||||
- At least 1 special character (!@#$%^&*)
|
||||
- **Token Expiry**: 30 minutes
|
||||
- **Build Output**: Static pre-rendered pages + Node.js server
|
||||
- **Database**: MySQL for production, SQLite for development
|
||||
- **API URL**: Environment variable `NEXT_PUBLIC_API_URL`
|
||||
|
||||
### Security
|
||||
- **CORS**: Currently allow all origins (restrict to frontend domain in production)
|
||||
- **HTTPS**: Required for production
|
||||
- **HttpOnly Cookies**: Recommended instead of localStorage for production
|
||||
- **Rate Limiting**: Should be implemented on auth endpoints in production
|
||||
- **Audit Logging**: Should be added for compliance
|
||||
|
||||
### Business/Regulatory
|
||||
- **Election Integrity**: Votes must be immutable once recorded
|
||||
- **Voter Privacy**: Vote contents never tied to voter identity
|
||||
- **Transparency**: Results and vote counts must be verifiable
|
||||
- **Blockchain**: All votes stored with cryptographic verification
|
||||
- **Compliance**: Consider GDPR and voting regulations
|
||||
|
||||
### Development
|
||||
- No destructive git commands without explicit user confirmation
|
||||
- Always commit before major changes
|
||||
- Preserve working tree cleanly
|
||||
- Test Docker builds before deployment
|
||||
|
||||
## External Dependencies
|
||||
|
||||
### APIs/Services
|
||||
- **Backend Database**: MySQL server (localhost:3306 in dev)
|
||||
- **CORS-enabled**: Frontend communicates with backend via REST API
|
||||
|
||||
### Libraries/Packages
|
||||
- **shadcn/ui**: Component library (via npm)
|
||||
- **Radix UI**: Primitive components for shadcn/ui
|
||||
- **FastAPI**: Built-in Swagger/ReDoc documentation
|
||||
- **SQLAlchemy**: ORM for database abstraction
|
||||
|
||||
### Infrastructure
|
||||
- **Docker Hub**: Alpine Linux images for containers
|
||||
- **npm Registry**: Frontend dependencies
|
||||
- **PyPI**: Python backend dependencies
|
||||
- **MariaDB/MySQL**: Database provider
|
||||
|
||||
### Key Endpoints
|
||||
- Backend Health: `GET /health`
|
||||
- Backend Docs: `GET /docs` (Swagger)
|
||||
- Backend ReDoc: `GET /redoc`
|
||||
- Frontend: `http://localhost:3000`
|
||||
- Backend: `http://localhost:8000`
|
||||
Loading…
x
Reference in New Issue
Block a user