Contribuer à rustwarden

Ce document décrit les interactions entre gitrust et le framework rustwarden-core, et explique comment étendre le framework côté gitrust sans modifier ses sources.

Services framework utilisés

Service Usage dans gitrust
UserService CRUD users, roles, delete_user, admin_reset_password, change_password_direct, unassign_role_from_user
RoleService Liste/création/suppression roles, get_role_by_name
PasswordService hash_password (async), verify_password (async), generate_secure_password
ResourceService register/unregister repos, set_public, effective_permission, find_by_type_and_id
AuthService authenticate_user (login)
JwtService generate_token (login)
EmailValidationService Vérification email
PasswordResetService Flux "mot de passe oublié"
AppSettingsService get_bool pour registration_enabled

Hook on_user_deleted implémenté

Le hook on_user_deleted dans gitrust-hooks supprime le répertoire utilisateur sur le filesystem (repos_base_path/username/) avant la cascade DB. Appelé automatiquement par UserService::delete_user.

Règle fondamentale

Ne jamais modifier crates/rustwarden-core/. Ce crate est le framework partagé. Toute extension passe par :

  • Des wrappers côté gitrust-core (services qui délèguent au framework)
  • Des trait impls (RustwardenHooks dans gitrust-hooks)
  • Des extensions via les mécanismes d'injection Axum (Extension, State)

Aucun contournement en cours

Tous les anciens contournements (entités directes, hash manuels) ont été remplacés par les services du framework suite à la mise à jour du 2026-03-26.

Ajouter une fonctionnalité nécessitant un service framework absent

Si un service nécessaire n'existe pas dans rustwarden-core :

  1. Implémenter le service côté gitrust-core en réutilisant les primitives du framework (ex: PasswordService::hash_password pour le hashage)
  2. Si la fonctionnalité est générique et bénéficierait au framework lui-même, ouvrir une issue ou une PR upstream sur le dépôt rustwarden-core
  3. Ne pas dupliquer la logique d'auth, de session, ou de JWT — ces domaines appartiennent exclusivement au framework

Pattern d'extension via hooks

Les hooks (gitrust-hooks/src/lib.rs) implémentent RustwardenHooks et sont injectés dans le routeur Axum au démarrage :

// Dans main.rs
let hooks = Arc::new(GitrustHooks::new(config.clone()));
// Passé via .merge_routes(app_routes(hooks))
// Puis disponible via axum::Extension dans les handlers

Pour réagir à un nouvel événement du framework, ajouter la méthode correspondante dans l'impl RustwardenHooks de gitrust-hooks, sans toucher au code du framework qui émet l'événement.