feat(rust) : serveur réécrit en Rust, Node retiré ; Calendrier en tête du menu (#571)

- Serveur Rust (server-rs/, axum + sqlx) : les 148 adresses de l'API,
  l'interface, les migrations de démarrage et les tâches de fond ; même
  comportement que Node (banc : 2027 cas, 0 écart hors écarts déclarés
  USERS-02, RAPPRO-21, R4, R5).
- Node retiré : server/, dépendances serveur, image Docker sans Node
  (51 Mo), docker-compose à un seul service applicatif.
- R4 : écritures d'un autre site refusées (Sec-Fetch-Site / Origin).
- R5 : « aujourd'hui » et sauvegarde automatique à l'heure de Paris.
- R6 : mainteneur dans .github/CODEOWNERS.
- Menu latéral : Accueil puis Calendrier en tête.
- Plan et état : docs/PLAN-MIGRATION-RUST.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ke2qyS8rgacP3ap5iezDbM
This commit is contained in:
LogiFlowandClaude Opus 5.5 authored and GitHub committed 2026-10-15 20:31:14 +02:00
1 parent 6760f43e87
commit 600627c632
146 files changed
+31521 -20331

No files matched your search

+207
View File
@@ -0,0 +1,207 @@
{
"dashboard": {
"admin": [
"view"
],
"directeur": [
"view"
],
"manager": [
"view"
],
"employee": [
"view"
]
},
"calendar": {
"admin": [
"view",
"create",
"edit",
"delete"
],
"directeur": [
"view",
"create",
"edit",
"delete"
],
"manager": [
"view",
"create",
"edit"
],
"employee": [
"view"
]
},
"orders": {
"admin": [
"view",
"create",
"edit",
"delete"
],
"directeur": [
"view",
"create",
"edit",
"delete"
],
"manager": [
"view",
"create",
"edit"
],
"employee": []
},
"deliveries": {
"admin": [
"view",
"create",
"edit",
"delete",
"validate"
],
"directeur": [
"view",
"create",
"edit",
"delete",
"validate"
],
"manager": [
"view",
"create",
"edit",
"validate"
],
"employee": []
},
"reconciliation": {
"admin": [
"view",
"create",
"edit",
"delete",
"validate"
],
"directeur": [
"view",
"create",
"edit",
"validate"
],
"manager": [],
"employee": []
},
"publicity": {
"admin": [
"view",
"create",
"edit",
"delete"
],
"directeur": [
"view"
],
"manager": [
"view"
],
"employee": [
"view"
]
},
"customer-orders": {
"admin": [
"view",
"create",
"edit",
"delete"
],
"directeur": [
"view",
"create",
"edit",
"delete"
],
"manager": [
"view",
"create",
"edit"
],
"employee": [
"view",
"create"
]
},
"dlc": {
"admin": [
"view",
"create",
"edit",
"delete"
],
"directeur": [
"view",
"create",
"edit",
"delete"
],
"manager": [
"view",
"create",
"edit"
],
"employee": [
"view",
"create"
]
},
"tasks": {
"admin": [
"view",
"create",
"edit",
"delete",
"validate"
],
"directeur": [
"view",
"create",
"edit",
"delete",
"validate"
],
"manager": [
"view",
"create",
"edit",
"validate"
],
"employee": [
"view"
]
},
"avoir": {
"admin": [
"view",
"create",
"edit",
"delete",
"validate"
],
"directeur": [
"view",
"create",
"edit",
"delete",
"validate"
],
"manager": [
"view",
"create"
],
"employee": []
}
}
+14 -82
View File
@@ -1,5 +1,6 @@
// Système de permissions hardcodé par module
// Remplace l'ancien système flexible basé sur la base de données
import PERMISSIONS_DATA from "./permissions.json";
export type Permission = 'view' | 'create' | 'edit' | 'delete' | 'validate';
export type Role = 'admin' | 'directeur' | 'manager' | 'employee';
@@ -15,88 +16,19 @@ export type Module =
| 'tasks'
| 'avoir';
// Définition des permissions par module et par rôle
const PERMISSIONS: Record<Module, Record<Role, Permission[]>> = {
// Tableau de bord - tous les rôles peuvent le voir
dashboard: {
admin: ['view'],
directeur: ['view'],
manager: ['view'],
employee: ['view']
},
// Calendrier - Admin/Directeur tout, Manager tout sauf delete, Employé view
calendar: {
admin: ['view', 'create', 'edit', 'delete'],
directeur: ['view', 'create', 'edit', 'delete'],
manager: ['view', 'create', 'edit'],
employee: ['view']
},
// Commandes - Admin/Directeur tout, Manager tout sauf delete, Employé aucun accès
orders: {
admin: ['view', 'create', 'edit', 'delete'],
directeur: ['view', 'create', 'edit', 'delete'],
manager: ['view', 'create', 'edit'],
employee: []
},
// Livraisons - Admin/Directeur tout + validate, Manager tout sauf delete + validate, Employé aucun accès
deliveries: {
admin: ['view', 'create', 'edit', 'delete', 'validate'],
directeur: ['view', 'create', 'edit', 'delete', 'validate'],
manager: ['view', 'create', 'edit', 'validate'],
employee: []
},
// Rapprochement - Admin tout y compris validate, Directeur tout sauf delete, Manager/Employé rien
reconciliation: {
admin: ['view', 'create', 'edit', 'delete', 'validate'],
directeur: ['view', 'create', 'edit', 'validate'],
manager: [],
employee: []
},
// Publicité - Admin tout, autres view seulement
publicity: {
admin: ['view', 'create', 'edit', 'delete'],
directeur: ['view'],
manager: ['view'],
employee: ['view']
},
// Commandes client - Admin/Directeur tout, Manager tout sauf delete, Employé view + create
'customer-orders': {
admin: ['view', 'create', 'edit', 'delete'],
directeur: ['view', 'create', 'edit', 'delete'],
manager: ['view', 'create', 'edit'],
employee: ['view', 'create']
},
// DLC - Admin/Directeur tout, Manager tout sauf delete, Employé create + view
dlc: {
admin: ['view', 'create', 'edit', 'delete'],
directeur: ['view', 'create', 'edit', 'delete'],
manager: ['view', 'create', 'edit'],
employee: ['view', 'create']
},
// Tâches - Admin/Directeur tout, Manager view + create + edit + validate, Employé view seulement
tasks: {
admin: ['view', 'create', 'edit', 'delete', 'validate'],
directeur: ['view', 'create', 'edit', 'delete', 'validate'],
manager: ['view', 'create', 'edit', 'validate'],
employee: ['view']
},
// Avoirs - Admin/Directeur tout, Manager create + view seulement, Employé pas d'accès
avoir: {
admin: ['view', 'create', 'edit', 'delete', 'validate'],
directeur: ['view', 'create', 'edit', 'delete', 'validate'],
manager: ['view', 'create'],
employee: []
}
};
// Matrice rôle × module dans permissions.json, lue aussi par le serveur Rust
// (server-rs/src/access.rs). Résumé :
// - dashboard : tous les rôles voient
// - calendar : admin/directeur tout, manager tout sauf supprimer, employé voit
// - orders : admin/directeur tout, manager tout sauf supprimer, employé aucun accès
// - deliveries : admin/directeur tout + valider, manager tout sauf supprimer + valider, employé aucun accès
// - reconciliation : admin tout, directeur tout sauf supprimer, manager/employé rien
// - publicity : admin tout, autres voient
// - customer-orders : admin/directeur tout, manager tout sauf supprimer, employé voit + crée
// - dlc : admin/directeur tout, manager tout sauf supprimer, employé voit + crée
// - tasks : admin/directeur tout, manager voit + crée + modifie + valide, employé voit
// - avoir : admin/directeur tout, manager crée + voit, employé aucun accès
const PERMISSIONS = PERMISSIONS_DATA as Record<Module, Record<Role, Permission[]>>;
// Hook pour vérifier les permissions
export function usePermissions(userRole?: string) {