Major improvements: - Deleted 80+ unused markdown files from .claude/ directory (saves disk space) - Removed 342MB .backups/ directory with old frontend code - Cleaned Python cache files (__pycache__ and .pyc) - Fixed critical bugs in votes.py: - Removed duplicate candidate_id field assignment (line 465) - Removed duplicate datetime import (line 804) - Removed commented code from crypto-client.ts (23 lines of dead code) - Moved root-level test scripts to proper directories: - test_blockchain.py → tests/ - test_blockchain_election.py → tests/ - fix_elgamal_keys.py → backend/scripts/ - restore_data.py → backend/scripts/ - Cleaned unused imports: - Removed unused RSA/padding imports from encryption.py - Removed unused asdict import from blockchain.py - Optimized database queries: - Fixed N+1 query issue in get_voter_history() using eager loading - Added joinedload for election and candidate relationships - Removed unused validation schemas: - Removed profileUpdateSchema (no profile endpoints exist) - Removed passwordChangeSchema (no password change endpoint) - Updated .gitignore with comprehensive rules for Node.js artifacts and backups Code quality improvements following DRY and KISS principles: - Simplified complex functions - Reduced code duplication - Improved performance (eliminated N+1 queries) - Enhanced maintainability 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
72 lines
1.7 KiB
TypeScript
72 lines
1.7 KiB
TypeScript
/**
|
|
* Form Validation Schemas
|
|
* Using Zod for type-safe validation
|
|
*/
|
|
|
|
import { z } from "zod"
|
|
|
|
/**
|
|
* Login form validation schema
|
|
*/
|
|
export const loginSchema = z.object({
|
|
email: z
|
|
.string()
|
|
.email("Adresse email invalide")
|
|
.min(1, "Email requis"),
|
|
password: z
|
|
.string()
|
|
.min(1, "Mot de passe requis")
|
|
.min(6, "Le mot de passe doit contenir au moins 6 caractères"),
|
|
})
|
|
|
|
export type LoginFormData = z.infer<typeof loginSchema>
|
|
|
|
/**
|
|
* Registration form validation schema
|
|
*/
|
|
export const registerSchema = z.object({
|
|
firstName: z
|
|
.string()
|
|
.min(1, "Prénom requis")
|
|
.max(50, "Le prénom ne doit pas dépasser 50 caractères"),
|
|
lastName: z
|
|
.string()
|
|
.min(1, "Nom requis")
|
|
.max(50, "Le nom ne doit pas dépasser 50 caractères"),
|
|
email: z
|
|
.string()
|
|
.email("Adresse email invalide"),
|
|
citizenId: z
|
|
.string()
|
|
.min(1, "Numéro de citoyen requis")
|
|
.max(20, "Le numéro de citoyen ne doit pas dépasser 20 caractères"),
|
|
password: z
|
|
.string()
|
|
.min(6, "Le mot de passe doit contenir au moins 6 caractères"),
|
|
passwordConfirm: z
|
|
.string()
|
|
.min(1, "Confirmation du mot de passe requise"),
|
|
}).refine(
|
|
(data) => data.password === data.passwordConfirm,
|
|
{
|
|
message: "Les mots de passe ne correspondent pas",
|
|
path: ["passwordConfirm"],
|
|
}
|
|
)
|
|
|
|
export type RegisterFormData = z.infer<typeof registerSchema>
|
|
|
|
/**
|
|
* Vote submission validation schema
|
|
*/
|
|
export const voteSubmissionSchema = z.object({
|
|
electionId: z
|
|
.number()
|
|
.min(1, "Élection requise"),
|
|
choix: z
|
|
.string()
|
|
.min(1, "Candidat requis"),
|
|
})
|
|
|
|
export type VoteSubmissionFormData = z.infer<typeof voteSubmissionSchema>
|