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);
}
}
}