No description
  • Rust 49.7%
  • Vue 27.1%
  • TypeScript 21.1%
  • JavaScript 1.6%
  • SCSS 0.4%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Clément Hubert 69a9d2f1e2 Add HTTP integration tests for auth and events
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.
2026-06-28 19:34:36 +02:00
crates Add HTTP integration tests for auth and events 2026-06-28 19:34:36 +02:00
packages Add forgot password / password reset flow 2026-06-28 19:29:11 +02:00
.gitignore Persist santa-http dev SQLite to .devdata/ 2026-06-28 15:21:42 +02:00
bun.lock Cleanup: lint, dead deps, clippy warnings, unused Rust plugins 2026-06-28 19:16:03 +02:00
Cargo.lock Add HTTP integration tests for auth and events 2026-06-28 19:34:36 +02:00
Cargo.toml Share SQLite migrations between santa-tauri and santa-http 2026-06-28 14:40:03 +02:00
devbox.json Add MailHog to the dev env and wire it to the dev tasks 2026-06-28 15:44:35 +02:00
devbox.lock Add MailHog to the dev env and wire it to the dev tasks 2026-06-28 15:44:35 +02:00
LICENSE Initial commit 2026-06-28 12:02:38 +02:00
package.json Set up Cargo and bun workspaces 2026-06-28 12:11:14 +02:00
README.md Rewrite README with full setup, modes and configuration 2026-06-28 19:30:11 +02:00
Taskfile.yml 401 redirect, JWT_SECRET hard guard, MailHog cleanup on dev:tauri 2026-06-28 19:17:48 +02:00

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 (header Authorization: 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.