rustploy 0.1.37

Rustploy PaaS daemon — lightweight self-hosted deployment platform
//! `Command::GitRepoList`: repositórios de um provedor git, com um refresh
//! OAuth e nova tentativa se o token expirou.

use crate::bootstrap::state::AppState;
use shared::Response;

pub async fn handle(state: AppState, provider_id: String) -> Response {
    let provider = match crate::store::git_providers::get(&state.db, &provider_id).await {
        Ok(Some(p)) => p,
        Ok(None) => return Response::err("NotFound", "Provider não encontrado"),
        Err(e) => return Response::err("DatabaseError", e.to_string()),
    };
    let token = match crate::features::git_providers::usable_token(&state.secrets, &provider) {
        Ok(t) => t,
        Err(e) => return Response::err("NotConnected", e.to_string()),
    };
    let kind =
        shared::GitProviderKind::from_str(&provider.kind).unwrap_or(shared::GitProviderKind::Gitea);
    match crate::features::git_providers::list_repos(kind, &provider.base_url, &token).await {
        Ok(repos) => Response::GitRepos(repos),
        Err(first) => {
            // Token possivelmente expirado: tenta um refresh OAuth e repete.
            match crate::features::git_providers::refresh_access_token(
                &state.db,
                &state.secrets,
                &provider,
            )
            .await
            {
                Some(fresh) => {
                    match crate::features::git_providers::list_repos(
                        kind,
                        &provider.base_url,
                        &fresh,
                    )
                    .await
                    {
                        Ok(repos) => Response::GitRepos(repos),
                        Err(e) => Response::err("GitApiError", e.to_string()),
                    }
                }
                None => Response::err("GitApiError", first.to_string()),
            }
        }
    }
}