81 lines
3.0 KiB
C#
81 lines
3.0 KiB
C#
using System.Reflection.Metadata.Ecma335;
|
|
using System.Text.Json;
|
|
using Bimix.Domain.Entities;
|
|
using Bimix.Infrastructure.Data;
|
|
using Microsoft.Extensions.Configuration;
|
|
|
|
namespace Bimix.Infrastructure.Sync;
|
|
|
|
public class ProductSyncService(HttpClient httpClient, BimixDbContext db, IConfiguration configuration)
|
|
{
|
|
private readonly HttpClient _httpClient = httpClient;
|
|
private readonly BimixDbContext _db = db;
|
|
private readonly IConfiguration _configuration = configuration;
|
|
|
|
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 = p.GetProperty("name").GetString() ?? "";
|
|
var code = p.GetProperty("code").GetString() ?? "";
|
|
var stockAddresses = p.GetProperty("stock_addresses").GetString() ?? "";
|
|
var ean = 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();
|
|
}
|
|
} |