90 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassiApp.Core.Data;
using gehGassiApp.Core.Interfaces.Synchronization;
using gehGassiApp.Domain.Common;
namespace gehGassiApp.Core.Services.Synchronization
{
/// <summary>
/// Service der die Verwaltung von Synch-Infos ermöglicht.
/// </summary>
public class SyncInfoPullService : ServiceBase<SyncInfoPull>, ISyncInfoPullService
{
/// <summary>
/// Erstellt eine Instanz
/// </summary>
/// <param name="unitOfWork">Instanz eines IUnitOfWork</param>
public SyncInfoPullService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
/// <summary>
/// Gibt eine Entität anhand der eindeutigen Id zurück
/// </summary>
/// <param name="id">Id der Entität</param>
/// <param name="noTracking">Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten</param>
/// <returns>Entität oder null, wenn nicht gefunden</returns>
public override SyncInfoPull Get(object id, bool noTracking = true)
{
return Repository.SingleOrDefault(c => c.Id == (int)id, noTracking);
}
/// <summary>
/// Gibt eine Entität anhand der eindeutigen Id zurück
/// </summary>
/// <param name="id">Id der Entität</param>
/// <param name="noTracking">Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten</param>
/// <returns>Entität oder null, wenn nicht gefunden</returns>
public override async Task<SyncInfoPull> GetAsync(object id, bool noTracking = true)
{
return await Repository.SingleOrDefaultAsync(c => c.Id == (int)id, noTracking).ConfigureAwait(false);
}
/// <summary>
/// Hinzufügen oder Aktualisieren einer SyncInfo zu einem Objekt.
/// </summary>
/// <param name="table">Tabelle bzw. Name des Objektes</param>
/// <param name="lastUpdate">Wann wurde das letzte Mal ein Sync durchgeführt</param>
/// <returns>Task</returns>
public async Task AddOrUpddateAsync(string table, DateTimeOffset lastUpdate)
{
var syncInfo = await Repository.FirstOrDefaultAsync(c => c.Table == table, false).ConfigureAwait(false);
if (syncInfo != null && lastUpdate > syncInfo.LastUpdate)
{
syncInfo.LastUpdate = lastUpdate;
Repository.Update(syncInfo);
}
else
{
syncInfo = new SyncInfoPull()
{
Table = table,
LastUpdate = lastUpdate
};
Repository.Add(syncInfo);
}
await CommitAsync().ConfigureAwait(false);
}
/// <summary>
/// Abfragen einer Sync-Info zu einem Objekt
/// </summary>
/// <param name="table">Tabelle bzw. Name des Objektes</param>
/// <returns>SncInfo wenn gefunden, oder null wenn es noch keine gibt</returns>
public async Task<SyncInfoPull> GetAsync(string table)
{
var syncInfo = await Repository.FirstOrDefaultAsync(c => c.Table == table).ConfigureAwait(false);
if (syncInfo != null)
{
//syncInfo.LastUpdate = syncInfo.LastUpdate.AddMilliseconds(999);
}
return syncInfo;
}
}
}