using gehGassiApp.Core.Interfaces.Synchronization; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassiApp.Core.Data; using gehGassiApp.Domain.Common; using System.Text.Json; namespace gehGassiApp.Core.Services.Synchronization { /// /// Service der die Verwaltung von Push Synch-Infos ermöglicht. /// public class SyncInfoPushService : ServiceBase, ISyncInfoPushService { /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork public SyncInfoPushService(IUnitOfWork unitOfWork) : base(unitOfWork) { } /// /// Gibt eine Entität anhand der eindeutigen Id zurück /// /// Id der Entität /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Entität oder null, wenn nicht gefunden public override SyncInfoPush Get(object id, bool noTracking = true) { return Repository.SingleOrDefault(c => c.Id == (Guid)id, noTracking); } /// /// Gibt eine Entität anhand der eindeutigen Id zurück /// /// Id der Entität /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Entität oder null, wenn nicht gefunden public override async Task GetAsync(object id, bool noTracking = true) { return await Repository.SingleOrDefaultAsync(c => c.Id == (Guid)id, noTracking).ConfigureAwait(false); } /// /// Hinzufügen eines Push-Deltas /// /// Typ des Objekts /// Name der Tabelle = nameof(objekt) /// ID des Objektes als string /// Operationstyp. Hinzufügen, Aktualisieren, Löschen /// Objekt das Serialisiert werden soll /// SyncInfoPush public async Task AddAsync(string table, string key, SyncOperation operation, T value) { if (value == null) return null; string jsonString; try { jsonString = JsonSerializer.Serialize(value, new JsonSerializerOptions(JsonSerializerDefaults.Web)); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); jsonString = string.Empty; } var pushInfo = new SyncInfoPush { Id = Guid.NewGuid(), Table = table, Key = key, Operation = operation, DateTime = DateTimeOffset.UtcNow, Value = jsonString }; Repository.Add(pushInfo); await CommitAsync().ConfigureAwait(false); return pushInfo; } /// /// Gibt eine Liste aller offenen SyncInfoPushs einer Tabelle zurück /// /// Tabelle = nameof(objcet) /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Liste von SyncInfoPushs public async Task> GetAllAsync(string table, bool noTracking = true) { return (await Repository.FindAsync(c => c.Table == table, noTracking).ConfigureAwait(false)).ToList(); } /// /// Entfernen einer SyncInfoPush /// /// Eindeutige Id /// Task public async Task RemoveAsync(Guid id) { var item = await Repository.FirstOrDefaultAsync(c => c.Id == id); if (item != null) { Repository.Remove(item); await CommitAsync().ConfigureAwait(false); } } /// /// Entfernen einer SyncInfoPush /// /// SyncInfoPush /// Task public async Task RemoveAsync(SyncInfoPush item) { if (item != null) { Repository.Remove(item); await CommitAsync().ConfigureAwait(false); } } /// /// Löschen aller Sync-Infos /// /// Task public async Task RemoveAllAsync() { var items = await GetAllAsync().ConfigureAwait(false); if (items.Any()) { Repository.RemoveRange(items); await CommitAsync().ConfigureAwait(false); } } /// /// Löschen aller Sync-Infos /// /// Datum vor welchem alle Sync-Infos gelöscht werden sollen /// Task public async Task RemoveAllAsync(DateTimeOffset before) { var items = await FindAsync(c => c.DateTime < before).ConfigureAwait(false); var syncInfoPushes = items.ToList(); if (syncInfoPushes.Any()) { Repository.RemoveRange(syncInfoPushes); await CommitAsync().ConfigureAwait(false); } } /// /// Löschen aller Sync-Infos einer Tabelle /// /// Tabelle = nameof(objcet) /// Task public async Task RemoveAllAsync(string table) { var items = await FindAsync(c => c.Table == table).ConfigureAwait(false); var syncInfoPushes = items.ToList(); if (syncInfoPushes.Any()) { Repository.RemoveRange(syncInfoPushes); await CommitAsync().ConfigureAwait(false); } } /// /// Löschen aller Sync-Infos einer Tabelle /// /// Tabelle = nameof(objcet) /// Datum vor welchem alle Sync-Infos gelöscht werden sollen /// Task public async Task RemoveAllAsync(string table, DateTimeOffset before) { var items = await FindAsync(c => c.Table == table && c.DateTime < before).ConfigureAwait(false); var syncInfoPushes = items.ToList(); if (syncInfoPushes.Any()) { Repository.RemoveRange(syncInfoPushes); await CommitAsync().ConfigureAwait(false); } } /// /// Gibt zurück ob offene Push-Infos anliegen /// /// Anzahl offene Push-Infos public async Task HasOpenAsync() { return await Repository.CountAsync().ConfigureAwait(false); } /// /// Gibt zurück ob für eine Tabelle offene Push-Infos anliegen /// /// Tabelle = nameof(objcet) /// Anzahl offene Push-Infos public async Task HasOpenAsync(string table) { return await Repository.CountAsync(c => c.Table == table).ConfigureAwait(false); } } }