fix: arreglo bug porque dolibar devuelve un objeto anidado

This commit is contained in:
javiermengual 2026-01-03 20:31:53 +01:00
parent 283a9e7f5f
commit 9a06cc945e
5 changed files with 27 additions and 37 deletions

View File

@ -2,5 +2,13 @@ namespace DoliMiddlewareApi.Dtos.Dolibarr;
public class TokenResponse
{
public required string AccessToken { get; set; }
public required SuccessData success { get; set; }
public class SuccessData
{
public int code { get; set; }
public required string token { get; set; }
public string? entity { get; set; }
public string? message { get; set; }
}
}

View File

@ -22,11 +22,11 @@ public sealed class DolibarrAuthService(IDolibarrApiClient apiClient)
}
var response = JsonSerializer.Deserialize<TokenResponse>(responseString);
if (response == null || string.IsNullOrEmpty(response.AccessToken))
if (response == null || string.IsNullOrEmpty(response.success.token))
{
throw new UnauthorizedException("Respuesta inválida de Dolibarr");
}
return response.AccessToken;
return response.success.token;
}
}

View File

@ -9,9 +9,8 @@ public class DolibarrTokenCacheService(IHttpContextAccessor httpContextAccessor,
public string? GetDolibarrToken()
{
var context = httpContextAccessor.HttpContext;
if (context?.User.Identity?.IsAuthenticated == true)
{
var sessionIdClaim = context.User.Claims.FirstOrDefault(c => c.Type == "sessionId");
var sessionIdClaim = context?.User.Claims.FirstOrDefault(c => c.Type == "sessionId");
if (sessionIdClaim != null && cache.TryGetValue(sessionIdClaim.Value, out string? dolibarrToken))
{
return dolibarrToken;

View File

@ -4,24 +4,14 @@ using DoliMiddlewareApi.Services.Auth;
namespace DoliMiddlewareApi.Services.Clients;
public class DolibarrApiClient : IDolibarrApiClient
public class DolibarrApiClient(HttpClient httpClient, DolibarrTokenCacheService tokenCacheService)
: IDolibarrApiClient
{
private readonly HttpClient _httpClient;
private readonly DolibarrTokenCacheService _tokenCacheService;
public DolibarrApiClient(HttpClient httpClient, DolibarrTokenCacheService tokenCacheService)
{
_httpClient = httpClient;
_tokenCacheService = tokenCacheService;
}
// ===== MÉTODOS GENÉRICOS =====
public async Task<T> GetResourceAsync<T>(string endpoint) where T : class
{
var request = new HttpRequestMessage(HttpMethod.Get, endpoint);
AddDolibarrTokenHeader(request);
var response = await _httpClient.SendAsync(request);
var response = await httpClient.SendAsync(request);
await EnsureSuccessOrThrowAsync(response, endpoint);
return await response.Content.ReadFromJsonAsync<T>()
@ -32,7 +22,7 @@ public class DolibarrApiClient : IDolibarrApiClient
{
var request = new HttpRequestMessage(HttpMethod.Get, endpoint);
AddDolibarrTokenHeader(request);
var response = await _httpClient.SendAsync(request);
var response = await httpClient.SendAsync(request);
await EnsureSuccessOrThrowAsync(response, endpoint);
return await response.Content.ReadFromJsonAsync<List<T>>()
@ -47,7 +37,7 @@ public class DolibarrApiClient : IDolibarrApiClient
Content = JsonContent.Create(requestBody)
};
AddDolibarrTokenHeader(request);
var response = await _httpClient.SendAsync(request);
var response = await httpClient.SendAsync(request);
await EnsureSuccessOrThrowAsync(response, endpoint);
// porque devuelve el id como response
@ -61,7 +51,7 @@ public class DolibarrApiClient : IDolibarrApiClient
Content = JsonContent.Create(requestBody)
};
AddDolibarrTokenHeader(request);
var response = await _httpClient.SendAsync(request);
var response = await httpClient.SendAsync(request);
await EnsureSuccessOrThrowAsync(response, endpoint);
return await response.Content.ReadAsStringAsync();
@ -69,7 +59,7 @@ public class DolibarrApiClient : IDolibarrApiClient
private void AddDolibarrTokenHeader(HttpRequestMessage request)
{
var dolibarrToken = _tokenCacheService.GetDolibarrToken();
var dolibarrToken = tokenCacheService.GetDolibarrToken();
if (!string.IsNullOrEmpty(dolibarrToken))
{
request.Headers.Add("DOLAPIKEY", dolibarrToken);

View File

@ -8,18 +8,11 @@ using DoliMiddlewareApi.Services.Clients;
namespace DoliMiddlewareApi.Services;
public class InvoiceService
public class InvoiceService(IDolibarrApiClient apiClient)
{
private readonly IDolibarrApiClient _apiClient;
public InvoiceService(IDolibarrApiClient apiClient)
{
_apiClient = apiClient;
}
public async Task<InvoiceDetailDto> GetInvoiceAsync(int id)
{
var data = await _apiClient.GetResourceAsync<InvoiceDetailResponse>($"invoices/{id}");
var data = await apiClient.GetResourceAsync<InvoiceDetailResponse>($"invoices/{id}");
return InvoiceMapper.MapToInvoiceDetailDto(data);
}
@ -36,7 +29,7 @@ public class InvoiceService
endpoint += $"&status={status}";
}
var dataList = await _apiClient.GetCollectionAsync<InvoiceResponse>(endpoint);
var dataList = await apiClient.GetCollectionAsync<InvoiceResponse>(endpoint);
return dataList.Select(InvoiceMapper.MapToInvoiceDto).ToList();
}
@ -63,14 +56,14 @@ public class InvoiceService
}).ToArray()
};
var responseBody = await _apiClient.PostAsync("invoices", requestBody);
var responseBody = await apiClient.PostAsync("invoices", requestBody);
return int.Parse(responseBody);
}
public async Task<string> AddInvoiceLineAsync(int invoiceId, CreateInvoiceLineDto lineDto)
{
var invoice = await _apiClient.GetResourceAsync<InvoiceDetailResponse>($"invoices/{invoiceId}");
var invoice = await apiClient.GetResourceAsync<InvoiceDetailResponse>($"invoices/{invoiceId}");
if (invoice.statut != "0") throw new ForbiddenException("Solo se pueden añadir líneas a facturas en borrador");
var requestBody = new
@ -81,13 +74,13 @@ public class InvoiceService
tva_tx = lineDto.TaxRate.ToString(CultureInfo.InvariantCulture)
};
return await _apiClient.PostAsync($"invoices/{invoiceId}/lines", requestBody);
return await apiClient.PostAsync($"invoices/{invoiceId}/lines", requestBody);
}
public async Task UpdateInvoiceAsync(int id, UpdateInvoiceDto dto)
{
// GET el JSON completo
var current = await _apiClient.GetResourceAsync<InvoiceDetailResponse>($"invoices/{id}");
var current = await apiClient.GetResourceAsync<InvoiceDetailResponse>($"invoices/{id}");
if (current.statut != "0") throw new ForbiddenException("Solo drafts");
// Modifica solo campos que Dolibarr permite en PUT
@ -99,7 +92,7 @@ public class InvoiceService
// No tocar: date, socid, lines (Dolibarr no los cambia en PUT)
await _apiClient.PutAsync($"invoices/{id}", current);
await apiClient.PutAsync($"invoices/{id}", current);
}
}