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