Contribua para o Rustwarden

Este documento descreve as interações entre o gitrust e a estrutura rustwarden-core e explica como estender a estrutura no lado do gitrust sem modificar suas fontes.

Serviços de estrutura usados

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

Gancho on_user_deleted implementado

O gancho on_user_deleted em gitrust-hooks exclui o diretório do usuário no sistema de arquivos (repos_base_path/username/) antes da cascata do banco de dados. Chamado automaticamente por UserService::delete_user.

Regra fundamental

Nunca modifique crates/rustwarden-core/. Esta caixa é a estrutura compartilhada. Qualquer extensão passa por:

  • wrappers no lado gitrust-core (serviços que delegam ao framework)
  • Impls traits (RustwardenHooks em gitrust-hooks)
  • Extensões via mecanismos de injeção Axum (Extension, State)

Nenhum desvio em andamento

Todas as soluções alternativas antigas (entidades diretas, hashes manuais) foram substituídas por serviços de estrutura após a atualização de 26/03/2026.

Adicionar um recurso que exige um serviço de estrutura ausente

Se um serviço necessário não existir no Rustwarden-core:

  1. Implemente o serviço no lado gitrust-core reutilizando as primitivas da estrutura (ex: PasswordService::hash_password para hashing)
  2. Se a funcionalidade for genérica e beneficiar a própria estrutura, abra um problema ou um PR upstream no repositório Rustwarden-core
  3. Não duplique a lógica de autenticação, sessão ou JWT — essas áreas pertencem exclusivamente à estrutura

Padrão de extensão via ganchos

Os ganchos (gitrust-hooks/src/lib.rs) implementam RustwardenHooks e são injetados no roteador Axum na inicialização:

// 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

Para reagir a um novo evento do framework, adicione o método correspondente no impl RustwardenHooks de gitrust-hooks, sem tocar no código do framework que emite o evento.