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 (
RustwardenHooksdansgitrust-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 :
- Implémenter le service côté
gitrust-coreen réutilisant les primitives du framework (ex:PasswordService::hash_passwordpour le hashage) - 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
- 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.