This commit is contained in:
87
BimAI.Infrastructure/Sync/ProductSyncService.cs
Normal file
87
BimAI.Infrastructure/Sync/ProductSyncService.cs
Normal file
@@ -0,0 +1,87 @@
|
||||
using System.Text.Json;
|
||||
using System.Web;
|
||||
using BimAI.Domain.Entities;
|
||||
using BimAI.Infrastructure.Data;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace BimAI.Infrastructure.Sync;
|
||||
|
||||
public class ProductSyncService(HttpClient httpClient, BimAIDbContext db, IConfiguration configuration)
|
||||
{
|
||||
/// <summary>
|
||||
/// Dekoduje encje HTML w ciągu znaków (np. " na ")
|
||||
/// </summary>
|
||||
private string DecodeHtmlEntities(string text)
|
||||
{
|
||||
if (string.IsNullOrEmpty(text))
|
||||
return text;
|
||||
|
||||
return HttpUtility.HtmlDecode(text);
|
||||
}
|
||||
public async Task RunAsync()
|
||||
{
|
||||
var apiKey = configuration["E5_CRM:ApiKey"];
|
||||
var syncState = db.SyncStates.FirstOrDefault(x => x.Entity == "Product") ?? new SyncState { Entity = "Product", LastSynced = 0};
|
||||
|
||||
var url = $"https://crm.e5.pl/REST/index.php?key={apiKey}&action=export.products.list&since={syncState.LastSynced}";
|
||||
var response = await httpClient.GetStringAsync(url);
|
||||
|
||||
var products = JsonSerializer.Deserialize<List<JsonElement>>(response);
|
||||
if (products == null) return;
|
||||
|
||||
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||
|
||||
foreach (var p in products)
|
||||
{
|
||||
var idStr = p.GetProperty("id").GetString() ?? "";
|
||||
var name = DecodeHtmlEntities(p.GetProperty("name").GetString() ?? "");
|
||||
var code = DecodeHtmlEntities(p.GetProperty("code").GetString() ?? "");
|
||||
var stockAddresses = DecodeHtmlEntities(p.GetProperty("stock_addresses").GetString() ?? "");
|
||||
var ean = DecodeHtmlEntities(p.GetProperty("ean").GetString() ?? "");
|
||||
|
||||
if (!Guid.TryParse(idStr, out Guid id))
|
||||
{
|
||||
Console.WriteLine($"[SYNC] Skipping product with wrong ID: '{idStr}', Name: '{name}'");
|
||||
continue;
|
||||
}
|
||||
|
||||
var existing = db.Products.FirstOrDefault(x => x.Id == id);
|
||||
|
||||
if (existing == null)
|
||||
{
|
||||
var product = new Product
|
||||
{
|
||||
Id = id,
|
||||
Name = name,
|
||||
Ean = ean,
|
||||
Code = code,
|
||||
StockAddresses = stockAddresses,
|
||||
CreatedAt = DateTime.UtcNow,
|
||||
UpdatedAt = DateTime.UtcNow
|
||||
};
|
||||
db.Products.Add(product);
|
||||
}
|
||||
else
|
||||
{
|
||||
existing.Name = name;
|
||||
existing.UpdatedAt = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
Console.WriteLine($"[SYNC] Updated product ID: '{idStr}', Name: '{name}'");
|
||||
|
||||
var exportedAt = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||
var updateUrl = $"https://crm.e5.pl/REST/index.php?key={apiKey}&action=export.products.setExportedAt&id={id}&exportedAt={exportedAt}";
|
||||
await httpClient.GetAsync(updateUrl);
|
||||
}
|
||||
syncState.LastSynced = now;
|
||||
if (db.SyncStates.FirstOrDefault(x => x.Entity == "Product") == null)
|
||||
{
|
||||
db.SyncStates.Add(syncState);
|
||||
}
|
||||
else
|
||||
{
|
||||
db.SyncStates.Update(syncState);
|
||||
}
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user