rustploy 0.1.22

Rustploy PaaS daemon — lightweight self-hosted deployment platform
//! `Command::GitBranchList`: branches de um repositório num provedor git
//! conectado.

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

pub async fn handle(state: AppState, provider_id: String, repo_full_name: 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_branches(
        kind,
        &provider.base_url,
        &token,
        &repo_full_name,
    )
    .await
    {
        Ok(branches) => Response::GitBranches(branches),
        Err(first) => {
            match crate::features::git_providers::refresh_access_token(
                &state.db,
                &state.secrets,
                &provider,
            )
            .await
            {
                Some(fresh) => match crate::features::git_providers::list_branches(
                    kind,
                    &provider.base_url,
                    &fresh,
                    &repo_full_name,
                )
                .await
                {
                    Ok(branches) => Response::GitBranches(branches),
                    Err(e) => Response::err("GitApiError", e.to_string()),
                },
                None => Response::err("GitApiError", first.to_string()),
            }
        }
    }
}