using gehGassi.Domain.Pushnotifications; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using gehGassi.Domain.Common; using System.Text.Json; namespace gehGassi.Core.Interfaces { /// /// Schnittstellenbeschreibung für einen Service der Push-Notifications senden kann /// public interface IPushNotificationService { /// /// Registrieren eines Gerätes für Pushnotifications /// /// Informationen für die Installation / Registrierung /// True wenn erfolgreich, false sonst Task CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation); /// /// Löschen der Registrierung eines Gerätes für Pushnotifications /// /// Id der Installation /// Task DeleteInstallationByIdAsync(string installationId); /// /// Senden einer Pushnotification Nachricht /// /// Nachricht die gesendet werden soll /// true wenn gesendet, false sonst Task SendNotificationAsync(NotificationMessage notificationMessage); /// /// Senden einer Pushnotification Nachricht /// /// Nachricht die gesendet werden soll /// Liste zusätzlicher Tags für die Adressierung der Ziele /// true wenn gesendet, false sonst Task SendNotificationAsync(NotificationMessage notificationMessage, List tags); /// /// Auflisten der registrierten Geräte /// /// Task Task ListRegistrationsAsync(); /// /// Sendet eine Pushnotification an einen App-User wenn eine neue Nachricht für ihn eingetroffen ist /// /// ID des App-Users /// Id des Konversation /// true wenn erfolgreich, false sonst Task SendNewMessageAsync(string receiverId, string conversationId); /// /// Sendet eine Pushnotification an einen App-User wenn eine neue Text-Nachricht von gehgassi für ihn eingetroffen ist /// /// ID des App-Users /// Id der Nachricht /// true wenn erfolgreich, false sonst Task SendNewTextMessageAsync(string receiverId, string messageId); /// /// Sendet eine Pushnotification an einen App-User wenn ein neuer Walk für ihn eingetroffen ist /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendNewWalkAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn sich eine öffentliche Anfrage geändert hat /// /// ID des App-Users /// Id des öffentlichen Anfrage /// true wenn erfolgreich, false sonst Task SendPublicWalkRequestChangedAsync(string receiverId, string publicWalkRequestId); /// /// Sendet eine Pushnotification an einen App-User wenn sich eine öffentliche Anfrage in der Nähe verfügbar ist /// /// ID des App-Users /// Id des öffentlichen Anfrage /// true wenn erfolgreich, false sonst Task SendPublicWalkRequestAvailableAsync(string receiverId, string publicWalkRequestId); /// /// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage erstellt wurde /// /// ID des App-Users /// Id des öffentlichen Anfrage /// true wenn erfolgreich, false sonst Task SendPublicWalkResponseAddedAsync(string receiverId, string publicWalkRequestId); /// /// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage sich geändert hat /// /// ID des App-Users /// Id des öffentlichen Anfrage /// true wenn erfolgreich, false sonst Task SendPublicWalkResponseChangedAsync(string receiverId, string publicWalkRequestId); /// /// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage stonriert wurde /// /// ID des App-Users /// Id des öffentlichen Anfrage /// true wenn erfolgreich, false sonst Task SendPublicWalkResponseCancelledAsync(string receiverId, string publicWalkRequestId); /// /// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage abgelehnt wurde /// /// ID des App-Users /// Id des öffentlichen Anfrage /// true wenn erfolgreich, false sonst Task SendPublicWalkResponseDeclinedAsync(string receiverId, string publicWalkRequestId); /// /// Sendet eine Pushnotification an einen App-User wenn eine öffentliche anfrage storniert wurde /// /// ID des App-Users /// Id des öffentlichen Anfrage /// true wenn erfolgreich, false sonst Task SendPublicWalkRequestCancelledAsync(string receiverId, string publicWalkRequestId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk storniert wurde /// /// ID des App-Users /// Id des Walks /// App-Mode /// true wenn erfolgreich, false sonst Task SendWalkCancelledAsync(string receiverId, string walkId, AppMode appMode); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk gestartet wurde /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkStartedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk abgeschlossen wurde /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkCompletedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk abgeschlossen wurde als Erinnerung /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkCompletedReminderAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk angenommen wurde /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkAcceptedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk abgelehnt wurde /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkDeclinedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk angefragt wurde /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkRequestedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk bestätigt wurde /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkConfirmedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk reklamiert wurde /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkComplainedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Walk reklamiert wurde /// /// ID des App-Users /// Id des Walks /// App-Mode /// true wenn erfolgreich, false sonst Task SendWalkComplainedUpdateAsync(string receiverId, string walkId, AppMode appMode); /// /// Sendet eine Pushnotification an einen Hundebesitzer wenn die Bezahlung für einen ein Walk gescheitert ist. /// Wird verwendet wenn das Payment nicht funktioniert hat und der Hundebesitzer den Walk neu buchen muss. /// /// ID des App-Users /// Id des Walks /// true wenn erfolgreich, false sonst Task SendWalkPaymentFailedAsync(string receiverId, string walkId); /// /// Sendet eine Pushnotification an einen App-User wenn ein KYC-Status (Dokument) geändert wurde /// /// ID des App-Users /// Id des KYC-Dokuments /// true wenn erfolgreich, false sonst Task SendIdentityDocumentUpdateAsync(string receiverId, string documentId); /// /// Sendet eine Pushnotification an einen App-User wenn ein Auszahlungsstatus geändert wurde /// /// ID des App-Users /// Id der Auszahlung /// true wenn erfolgreich, false sonst Task SendPayoutUpdateAsync(string receiverId, string payoutId); /// /// Sendet eine Pushnotification an einen App-User dass ein Logout durchgeführt werden soll /// /// ID des App-Users /// true wenn erfolgreich, false sonst Task SendLogoutAsync(string receiverId); } /// /// Hilfsklasse zum abspeichern der referenz-Info für Server PushNotifications /// public class ServerPushNotificationInfo { /// /// Title der Nachricht /// [JsonPropertyName("title")] public string Title { get; set; } /// /// Inhalt der Nachricht /// [JsonPropertyName("body")] public string Body { get; set; } /// /// Daten der Nachricht /// [JsonPropertyName("data")] public string Data { get; set; } /// /// Typ des Appusers damit man bei jenen die beides sind auch unterscheiden kann /// [JsonPropertyName("appMode")] [JsonConverter(typeof(AppModeConverter))] public AppMode? AppMode { get; set; } /// /// Id des verknüpften Objektes /// [JsonPropertyName("key")] public string Key { get; set; } /// /// Typ des Objektes das verbunden wurde /// [JsonPropertyName("table")] public string Table { get; set; } /// /// Typ der Systemnachricht /// [JsonPropertyName("type")] [JsonConverter(typeof(SystemMessageTypeConverter))] public SystemMessageType? Type { get; set; } /// /// Id der Nachricht für Cancel /// [JsonPropertyName("notificationId")] public int NotificationId { get; set; } } public class SystemMessageTypeConverter : JsonConverter { public override SystemMessageType? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { try { var value = reader.GetInt32(); return (SystemMessageType)value; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } try { var stringVal = reader.GetString(); if (string.IsNullOrEmpty(stringVal)) { return null; } var intVal = int.Parse(stringVal); return (SystemMessageType)intVal; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } return null; } public override void Write(Utf8JsonWriter writer, SystemMessageType? value, JsonSerializerOptions options) { if (value == null) { writer.WriteNullValue(); return; } var intVal = (int)value; writer.WriteNumberValue(intVal); } } public class AppModeConverter : JsonConverter { public override AppMode? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { try { var value = reader.GetInt32(); return (AppMode)value; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } try { var stringVal = reader.GetString(); if (string.IsNullOrEmpty(stringVal)) { return null; } var intVal = int.Parse(stringVal); return (AppMode)intVal; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } return null; } public override void Write(Utf8JsonWriter writer, AppMode? value, JsonSerializerOptions options) { if (value == null) { writer.WriteNullValue(); return; } var intVal = (int)value; writer.WriteNumberValue(intVal); } } }