- Rust 49.7%
- Vue 27.1%
- TypeScript 21.1%
- JavaScript 1.6%
- SCSS 0.4%
- Other 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Convert santa-http into a lib+bin so the route configuration can be reused by tests: - src/lib.rs exposes `configure(cfg)` building all /api/* routes. - src/main.rs is now a thin wrapper that builds the app data and hands the configure function to actix. tests/common/mod.rs exposes a setup_pool() (in-memory SQLite, runs migrations) plus a make_app! macro that wires JwtSecret + WebBaseUrl + SqliteRepository into an actix test service. Macro keeps each test self-contained without dragging actix's gnarly ServiceFactory generics into a shared helper. Coverage: - tests/auth_test.rs (4 cases): register → login → me happy path, wrong password → 401, missing token → 401, duplicate email → 400. - tests/events_test.rs (2 cases): full CRUD cycle on /api/events (list empty → create → fetch → delete → not found), and cross-user isolation (Bob cannot read Alice's events thanks to owner_id filtering). actix-rt added as dev-dep for #[actix_rt::test]. Run with `cargo test -p santa-http`; all six pass. |
||
| crates | ||
| packages | ||
| .gitignore | ||
| bun.lock | ||
| Cargo.lock | ||
| Cargo.toml | ||
| devbox.json | ||
| devbox.lock | ||
| LICENSE | ||
| package.json | ||
| README.md | ||
| Taskfile.yml | ||
mysecretsanta-rs
Monorepo Secret Santa : appli desktop Tauri + backend HTTP Actix + frontend Vue/Vuetify partagé entre les deux modes.
Architecture
mysecretsanta-rs/
├── crates/
│ ├── santa-core/ lib Rust : domaine pur (modèles, draw,
│ │ Repository trait + impl SQLite, emails,
│ │ backup, email templates, schema migrations)
│ ├── santa-http/ binaire Actix : routes /api/auth/* + CRUD,
│ │ JWT, middleware AuthUser
│ └── santa-tauri/ binaire Tauri : desktop app, expose tout
│ via #[tauri::command]
└── packages/
├── santa-client/ lib TS : interface SantaClient + impls
│ HttpSantaClient et TauriSantaClient,
│ AuthClient pour login/register/reset
└── santa-web/ app Vue 3 + Vuetify, consomme santa-client,
sert les deux modes (Tauri / browser)
Le frontend Vue est identique des deux côtés. La sélection de transport est faite à l'exécution dans services/santaClient.ts :
- Tauri détecté (
window.__TAURI_INTERNALS__présent) →TauriSantaClient(commandes invoke) - Sinon →
HttpSantaClient(REST + Bearer JWT)
Démarrer
devbox shell # Rust, Node, Bun, Tauri CLI, lib système (GTK/Webkit/dbus), MailHog
task install # bun install + cargo build
task help # liste toutes les tâches
Lancer en mode complet
task dev:full # santa-http + santa-web + MailHog en parallèle, un seul Ctrl-C
Ouvre http://localhost:5173. Premier passage → /login, lien "Pas encore de compte" pour register.
Lancer en mode desktop
task dev:tauri # ouvre la fenêtre Tauri + MailHog en background (kill à la sortie)
Pas de login en mode desktop : un user "local" est bootstrappé au premier lancement.
Autres tâches utiles
| Tâche | Effet |
|---|---|
task dev:http |
santa-http seul (MailHog non lancé, fais task dev:mailhog à côté si besoin) |
task dev:http:memory |
santa-http avec sqlite ::memory: (data perdues à l'arrêt) |
task dev:http:reset-db |
supprime .devdata/santa-http.db |
task dev:web |
Vite seul (proxifie /api vers 127.0.0.1:8080) |
task dev:mailhog |
MailHog seul (SMTP :1025, UI http://127.0.0.1:8025) |
task build:tauri |
release Tauri |
task build:http |
release HTTP |
task build:web |
release web |
task rust-check / rust-clippy / rust-fmt / rust-test |
sur tout le workspace |
task lint |
bun run lint côté frontend + clippy côté Rust |
Configuration
| Variable | Effet | Défaut dev |
|---|---|---|
JWT_SECRET |
Clé HS256 des tokens d'auth — obligatoire en production | hardcodé si SANTA_HTTP_DEV_MODE=1 |
SANTA_HTTP_DEV_MODE |
1/true/yes autorise le fallback hardcodé du JWT_SECRET |
non set |
BIND_ADDR |
hôte:port d'écoute santa-http | 127.0.0.1:8080 |
DATABASE_URL |
URL sqlx | sqlite:.devdata/santa-http.db?mode=rwc (task dev:http) |
WEB_BASE_URL |
base pour les liens de reset password envoyés par mail | http://localhost:5173 |
SANTA_HTTP_PROXY_TARGET |
utilisé par Vite pour proxifier /api (server-side, jamais exposé au browser) |
http://127.0.0.1:8080 |
VITE_HTTP_BASE_URL |
base URL HTTP en build de prod si pas servi sur la même origine | vide |
MailHog en dev
task dev:full, task dev:tauri et task dev:http lancent MailHog si rien n'écoute sur le port 1025. SMTP capture sur 127.0.0.1:1025, UI web sur http://127.0.0.1:8025.
Pour qu'un nouveau compte fasse partir des mails dedans (notamment la réinitialisation de mot de passe), aller dans Paramètres → Sauvegarde et restauration → SMTP et mettre smtp_host=127.0.0.1, smtp_port=1025, smtp_security=none.
Auth
- POST
/api/auth/register→ crée le compte, seed les templates email, renvoie{token, user} - POST
/api/auth/login→{token, user}, JWT TTL 7 jours - GET
/api/auth/me→ user courant (headerAuthorization: Bearer …) - POST
/api/auth/request-password-reset→ envoie un mail avec un lien (réponse 200 quoi qu'il arrive, anti-énumération) - POST
/api/auth/reset-password→ token + nouveau mot de passe (≥ 8 caractères)
Côté Tauri, tout ça est court-circuité : un user "local" déterministe (00000000-0000-0000-0000-000000000001) est utilisé pour stamper owner_id partout. Pas de login screen.
Persistance
| Mode | Storage |
|---|---|
| Tauri | ~/.config/<bundle>/secret_santa.db (SQLite, géré par tauri-plugin-sql) |
| HTTP dev | .devdata/santa-http.db (gitignored) |
| HTTP prod | configurable via DATABASE_URL |
Le schéma et les migrations vivent dans crates/santa-core/migrations/ et sont appliquées au boot par les deux runtimes. Toutes les tables métier ont une colonne owner_id NOT NULL qui pointe vers users.id. Les paramètres SMTP (app_parameters) sont globaux.
Backup / restore
Format : JSON. Paramètres → Backup permet de télécharger un dump et d'en restaurer un. Cross-mode : un export Tauri peut être restauré côté web et vice-versa (le owner_id est ré-écrit par le user courant à l'import). Une case "Effacer mes données avant la restauration" permet de remplacer plutôt que d'ajouter.
Limitations connues
- Pas de refresh token : re-login après 7 jours.
- Pas de vérification d'email à l'inscription (le compte est utilisable directement).
- Restore sans wipe est additif : les conflits d'ID sont silencieusement skippés. Utiliser la checkbox "Effacer mes données" pour repartir d'une base propre.
- Tauri télécharge les backups dans le dossier "Downloads" par défaut (pas de file picker natif).
- L'envoi d'emails (test, reset password, mails d'event) requiert que les paramètres SMTP soient configurés — sinon les opérations renvoient une erreur claire.