Alexis Bruneteau b4c5c97523 refactor: Comprehensive code cleanup and optimization
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>
2025-11-11 19:57:13 +01:00

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>