using gehGassi.Core.Interfaces;
using gehGassi.Domain.Common;
using gehGassi.Domain.Favourites;
using gehGassi.Domain.Messages;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Dto.Messages;
using gehGassi.Domain.Dogs;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace gehGassi.Core.Services
{
///
/// Service der die Verwaltung von Systemnachrichten ermöglicht
///
public class SystemMessageService : ServiceBase, ISystemMessageService
{
private readonly IRepository _toSendRepository;
///
/// Erstellt eine Instanz
///
/// Instanz eines IUnitOfWork
public SystemMessageService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_toSendRepository = unitOfWork.GetRepository();
}
///
/// Erstellen einer Systemnachrichten
///
/// Systemnachricht
public SystemMessage Create()
{
var item = new SystemMessage()
{
Id = Guid.NewGuid().ToString("N"),
Created = DateTimeOffset.UtcNow,
Read = false,
ReadDate = null
};
return item;
}
///
/// Erstellen einer Systemnachrichten
///
/// Id des AppUsers
/// Typ des App-Users
/// Id des verknüpften Objekts
/// Typ des verknüpften Objekts
/// Typ der Systemnachricht
/// Systemnachricht
public SystemMessage Create(string appUserId, AppUserType appUserType, string key, string table, SystemMessageType type)
{
var item = new SystemMessage()
{
Id = Guid.NewGuid().ToString("N"),
Created = DateTimeOffset.UtcNow,
AppUserId = appUserId,
AppUserType = appUserType,
Key = key,
Table = table,
Type = type,
Read = false,
ReadDate = null
};
return item;
}
///
/// Gibt eine Liste der Systemnachrichten eines Benutzers zurück
///
/// Id des AppUsers
/// Letztes Update
/// Liste der Systemnachricht
public async Task> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate)
{
var query = Repository.Query(c => c.AppUserId == appUserId);
if (lastUpdate.HasValue)
query = query.Where(c => c.UpdatedAt > lastUpdate);
return await query.ToListAsync().ConfigureAwait(false);
}
///
/// Berstätigen des Erhaltes von SystemNachrichten für einen Benutzer. Alle die älter als das UpdateDatum sind werden gelöscht
///
/// Id des Users - wird als Receiver gesucht
/// Letztes Update
/// Benutzer der die Änderung vornimmt
/// true wenn erfolgreich, false sonst
public async Task ConfirmAsync(string senderId, DateTimeOffset lastUpdate, string userName)
{
var query = Repository.Query(c => c.AppUserId == senderId && c.UpdatedAt <= lastUpdate);
var list = await query.ToListAsync().ConfigureAwait(false);
if (list.Any())
{
Repository.RemoveRange(list);
await CommitAsync(userName).ConfigureAwait(false);
}
return true;
}
///
/// Entfernen von Systemnachrichten für einen Benutzer wenn diese in der App schon gesehen wurden
///
/// Id des AppUsers
/// Typ des App-Users
/// Id des verknüpften Objekts
/// Typ des verknüpften Objekts
/// Datum - das created Datum der Systemnachricht muss kleiner gleich sein
/// Benutzer der die Änderung vornimmt
/// Systemnachricht
public async Task RemoveAsync(string appUserId, AppUserType appUserType, string key, string table, DateTimeOffset? created, string userName)
{
var query = Repository.Query(c => c.AppUserId == appUserId && c.AppUserType == appUserType && c.Key == key && c.Table == table && c.Created <= created.Value);
var list = await query.ToListAsync().ConfigureAwait(false);
if (list.Any())
{
Repository.RemoveRange(list);
await CommitAsync(userName).ConfigureAwait(false);
}
return true;
}
///
/// Hinzufügen eines Systemnachricht
///
/// Id des Ziels
/// Typ des App-Users
/// Id des Objekts
/// Objekttyp
/// Nachrichten-Typ
/// Ablaufdatum
/// Task
public void Add(string appUserId, AppUserType appUserType, string key, string table, SystemMessageType type, DateTimeOffset expires)
{
var systemMessage = Create(appUserId, appUserType, key, table, type);
systemMessage.Expires = expires;
Repository.Add(systemMessage);
}
///
/// Hinzufügen einer Systemnachricht als Text. Setzt den Typen automatisch
///
/// Id des Ziels
/// Typ des App-Users
/// Id des Objekts
/// Ablaufdatum
/// Nachricht
/// Task
public void Add(string appUserId, AppUserType appUserType, string key, DateTimeOffset expires, string message)
{
var systemMessage = Create();
systemMessage.AppUserId = appUserId;
systemMessage.AppUserType = appUserType;
systemMessage.Key = key;
systemMessage.Table = SystemMessageTables.Message;
systemMessage.Expires = expires;
systemMessage.Type = SystemMessageType.Text;
systemMessage.Message = message;
Repository.Add(systemMessage);
}
///
/// Löschen abgelaufener Nachrichten
///
/// Grenzdatum für Expired
/// Anzahl gelöschte Nachrichten
public async Task RemoveExpiredAsync(DateTimeOffset date)
{
var expiredMessages = await Repository.FindAsync(c => c.Expires < date).ConfigureAwait(false);
foreach (var expiredMessage in expiredMessages)
{
Repository.Remove(expiredMessage);
}
return expiredMessages.Count();
}
///
/// Alle Systemnachrichten eines AppUsers löschen
///
/// Id des AppUsers
/// Anzahl gelöscht
public async Task DeleteAllForAppUserAsync(string appUserId)
{
var messages = await Repository.FindAsync(c => c.AppUserId == appUserId).ConfigureAwait(false);
foreach (var message in messages)
{
Repository.Remove(message);
}
return messages.Count();
}
///
/// Erstellen einer Systemnachrichten die gesendet werden sollen
///
/// Systemnachricht die gesendet werden soll
public SystemMessageToSend CreateToSend()
{
var item = new SystemMessageToSend()
{
Created = DateTimeOffset.UtcNow,
AppUserCount = 0,
SentCount = 0,
HasBeenSent = false,
SentDate = null,
SentBy = string.Empty
};
return item;
}
#region SystemMessagesToSend
///
/// Gibt eine gefilterte Liste von Systemnachrichten die gesendet werden sollen
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Systemnachrichten die gesendet werden sollen
public IQueryable FilterSystemMessagesToSend(string filter)
{
return _toSendRepository.Query(c => c.Title.Contains(filter));
}
///
/// Hinzufügen einer Systemnachricht die gesendet werden soll
///
/// SystemMessageToSend
public void AddToSend(SystemMessageToSend item)
{
_toSendRepository.Add(item);
}
///
/// Löschen einer Systemnachricht die gesendet werden soll
///
/// SystemMessageToSend
public void RemoveToSend(SystemMessageToSend item)
{
_toSendRepository.Remove(item);
}
///
/// Gibt eine Systemnachricht die gesendet werden soll zurück
///
/// Id der Systemnachricht
/// SystemMessageToSend oder null, wenn nicht gefunden
public async Task GetToSendAsync(long id)
{
return await _toSendRepository.GetAsync(id).ConfigureAwait(false);
}
///
/// Gibt eine Liste von Systemnachrichten die gesendet werden sollen zurück.
/// Bereits gesendete oder Nachrichten die kein Versanddatum haben werden nicht zurückgegeben
///
/// Datum das größer als das Versanddatum sein muss
/// Liste Nachrichten zu senden
public async Task> GetToSendAsync(DateTimeOffset date)
{
var list = await _toSendRepository.FindAsync(c => c.SentDate != null && c.HasBeenSent == false && c.ToSendDate <= date).ConfigureAwait(false);
return list.ToList();
}
#endregion
}
}