new flashcards
All checks were successful
Mindforge API Build and Deploy / Build Mindforge API Image (push) Successful in 4m4s
Mindforge Web Build and Deploy (internal) / Build Mindforge Web Image (push) Successful in 5m29s
Mindforge Web Build and Deploy (internal) / Deploy Mindforge Web (internal) (push) Successful in 9s
Mindforge API Build and Deploy / Deploy Mindforge API (internal) (push) Successful in 8s

This commit is contained in:
2026-05-30 11:59:19 -03:00
parent b9736293d3
commit b80d28f671
27 changed files with 1735 additions and 290 deletions

View File

@@ -10,10 +10,11 @@ namespace Mindforge.API.Services
public class GiteaService : IGiteaService
{
private readonly HttpClient _httpClient;
private readonly string _baseUrl;
private readonly string _owner;
private readonly string _repo;
private readonly string _token;
private readonly string _baseUrl = string.Empty;
private readonly string _owner = string.Empty;
private readonly string _repo = string.Empty;
private readonly string _token = string.Empty;
private readonly bool _isConfigured;
private static readonly JsonSerializerOptions JsonOptions = new()
{
@@ -25,25 +26,35 @@ namespace Mindforge.API.Services
_httpClient = httpClient;
var repoUrl = configuration["GITEA_REPO_URL"];
if (string.IsNullOrEmpty(repoUrl))
throw new InvalidOperationException("GITEA_REPO_URL is not set in configuration.");
var token = configuration["GITEA_ACCESS_TOKEN"];
if (string.IsNullOrWhiteSpace(repoUrl) || string.IsNullOrWhiteSpace(token))
{
_isConfigured = false;
return;
}
_token = configuration["GITEA_ACCESS_TOKEN"]
?? throw new InvalidOperationException("GITEA_ACCESS_TOKEN is not set in configuration.");
// Parse: https://host/owner/repo or https://host/owner/repo.git
var normalizedUrl = repoUrl.TrimEnd('/').TrimEnd(".git".ToCharArray());
var uri = new Uri(normalizedUrl);
_baseUrl = $"{uri.Scheme}://{uri.Host}{(uri.IsDefaultPort ? "" : $":{uri.Port}")}";
var parts = uri.AbsolutePath.Trim('/').Split('/');
if (parts.Length < 2)
{
_isConfigured = false;
return;
}
_baseUrl = $"{uri.Scheme}://{uri.Host}{(uri.IsDefaultPort ? "" : $":{uri.Port}")}";
_owner = parts[0];
_repo = parts[1];
_token = token;
_isConfigured = true;
}
public string GetRepositoryName() => _repo;
public string GetRepositoryName() => _isConfigured ? _repo : "repositorio";
public async Task<List<FileTreeNode>> GetFileTreeAsync()
{
EnsureConfigured();
// Get the master branch to obtain the latest commit SHA
var branchJson = await GetApiAsync($"/api/v1/repos/{_owner}/{_repo}/branches/master");
var branch = JsonSerializer.Deserialize<GiteaBranch>(branchJson, JsonOptions)
@@ -61,6 +72,8 @@ namespace Mindforge.API.Services
public async Task<string> GetFileContentAsync(string path)
{
EnsureConfigured();
var request = new HttpRequestMessage(HttpMethod.Get,
$"{_baseUrl}/api/v1/repos/{_owner}/{_repo}/raw/{path}?ref=master");
request.Headers.Add("Authorization", $"token {_token}");
@@ -75,6 +88,8 @@ namespace Mindforge.API.Services
private async Task<string> GetApiAsync(string endpoint)
{
EnsureConfigured();
var request = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}{endpoint}");
request.Headers.Add("Authorization", $"token {_token}");
var response = await _httpClient.SendAsync(request);
@@ -82,6 +97,14 @@ namespace Mindforge.API.Services
return await response.Content.ReadAsStringAsync();
}
private void EnsureConfigured()
{
if (!_isConfigured)
{
throw new InvalidOperationException("Gitea nao configurado. Defina GITEA_REPO_URL e GITEA_ACCESS_TOKEN.");
}
}
private static List<FileTreeNode> BuildTree(List<GiteaTreeItem> items)
{
var root = new List<FileTreeNode>();