using gehGassi.Dto; using gehGassiApp.Core.Interfaces; using gehGassiApp.Core.Resources; using gehGassiApp.Domain.Common; using gehGassiApp.Domain.Subscriptions; using Platform = gehGassiApp.Domain.Common.Platform; namespace gehGassiApp.Core.Services { /// /// Service für die Verwaltung von Abonnements /// public class SubscriptionService : ISubscriptionService { private readonly ICommunicationService _communicationService; /// /// Erstellt eine Instanz /// /// Instanz eines ICommunicationService public SubscriptionService(ICommunicationService communicationService) { _communicationService = communicationService; } /// /// Gibt eine Liste von verfügbaren Abos zurück /// /// AppMode - Hundebesitzer oder Walker /// Sprache /// Aktuelles Accesstoken /// CancellationToken /// CommunicationResult public async Task>> GetSubscriptionsAsync(AppMode appMode, string language, string accessToken, CancellationToken token) { var result = new CommunicationResult>() { Value = null }; var isConnected = await _communicationService.IsConnected(); if (isConnected) { var communicationResult = await _communicationService.GetSubscriptionsAsync(appMode, language, accessToken, token); if (communicationResult.Success) return communicationResult; } else { result.Success = false; result.ErrorCode = CommunicationErrors.ServerNoConnection; result.ErrorMessage = Errors.Server_NoConnection; } return result; } /// /// Gibt eine Liste von gebuchten Abos zurück /// /// Sprache /// Aktuelles Accesstoken /// CancellationToken /// CommunicationResult public async Task>> GetMySubscriptionsAsync(string language, string accessToken, CancellationToken token) { var result = new CommunicationResult>() { Value = null }; var isConnected = await _communicationService.IsConnected(); if (isConnected) { var communicationResult = await _communicationService.GetMySubscriptionsAsync(language, accessToken, token); if (communicationResult.Success) return communicationResult; } else { result.Success = false; result.ErrorCode = CommunicationErrors.ServerNoConnection; result.ErrorMessage = Errors.Server_NoConnection; } return result; } /// /// Gibt eine Liste von gebuchten aktiven Abos zurück /// /// Sprache /// Aktuelles Accesstoken /// CancellationToken /// CommunicationResult public async Task>> GetMyActiveSubscriptionsAsync(string language, string accessToken, CancellationToken token) { var result = new CommunicationResult>() { Value = null }; var isConnected = await _communicationService.IsConnected(); if (isConnected) { var communicationResult = await _communicationService.GetMyActiveSubscriptionsAsync(language, accessToken, token); if (communicationResult.Success) return communicationResult; } else { result.Success = false; result.ErrorCode = CommunicationErrors.ServerNoConnection; result.ErrorMessage = Errors.Server_NoConnection; } return result; } /// /// Erstellen einer Abo-Buchung /// /// AppUserId /// Id des Abos /// Sprache /// InAppBillingPurchase serialisiert als JSON /// Optional: Ablaufdatum das gesetzt werden soll /// Plattform auf welcher das Abo erstellt wird /// Aktuelles Accesstoken /// CancellationToken /// CommunicationResult public async Task> CreateSubscriptionAsync(string appUserId, string subscriptionId, string language, string inAppBillingPurchase, DateTime? expirationDateToSet, Platform platform, string accessToken, CancellationToken token) { var result = new CommunicationResult() { Value = null }; var isConnected = await _communicationService.IsConnected(); if (isConnected) { var communicationResult = await _communicationService.CreateSubscriptionAsync(appUserId, subscriptionId, language, inAppBillingPurchase, expirationDateToSet, platform, accessToken, token); if (communicationResult.Success && communicationResult.Value.Status != CreateStatus.Error) { if (communicationResult.Value.Status == CreateStatus.Success) { result.Success = true; result.Value = communicationResult.Value.Value; } else { result.Success = false; result.ErrorCode = CommunicationErrors.Subscription_Exists; } } } else { result.Success = false; result.ErrorCode = CommunicationErrors.ServerNoConnection; result.ErrorMessage = Errors.Server_NoConnection; } return result; } /// /// Wechseln eines Abos in der Gruppe für eine Abo-Buchung /// /// Id der Abo-Buchung /// AppUserId /// Id des Abos auf das gechselt werden soll /// Sprache /// Aktuelles Accesstoken /// CancellationToken /// CommunicationResult public async Task> SwitchSubscriptionAsync(long bookingId, string appUserId, string subscriptionId, string language, string accessToken, CancellationToken token) { var result = new CommunicationResult() { Value = null }; var isConnected = await _communicationService.IsConnected(); if (isConnected) { var communicationResult = await _communicationService.SwitchSubscriptionAsync(bookingId, appUserId, subscriptionId, language, accessToken, token); if (communicationResult.Success) return communicationResult; result.Success = false; result.ErrorCode = communicationResult.ErrorCode; } else { result.Success = false; result.ErrorCode = CommunicationErrors.ServerNoConnection; result.ErrorMessage = Errors.Server_NoConnection; } return result; } /// /// Stornieren einer Abo-Buchung /// /// Abo-Buchungs ID /// AppUserId /// Sprache /// Plattform auf der das Abo erstellt wurde /// Aktuelles Accesstoken /// CancellationToken /// CommunicationResult public async Task> CancelSubscriptionAsync(long bookingId, string appUserId, string language, Platform platform, string accessToken, CancellationToken token) { var result = new CommunicationResult() { Value = null }; var isConnected = await _communicationService.IsConnected(); if (isConnected) { var communicationResult = await _communicationService.CancelSubscriptionAsync(bookingId, appUserId, language, platform, accessToken, token); if (communicationResult.Success) return communicationResult; result.Success = false; result.ErrorCode = communicationResult.ErrorCode; } else { result.Success = false; result.ErrorCode = CommunicationErrors.ServerNoConnection; result.ErrorMessage = Errors.Server_NoConnection; } return result; } /// /// Verlängern einer Abo-Buchung /// /// Abo-Buchungs ID /// AppUserId /// Sprache /// Plattform auf der das Abo erstellt wurde /// Aktuelles Accesstoken /// CancellationToken /// CommunicationResult public async Task> RenewSubscriptionAsync(long bookingId, string appUserId, string language, Platform platform, string accessToken, CancellationToken token) { var result = new CommunicationResult() { Value = null }; var isConnected = await _communicationService.IsConnected(); if (isConnected) { var communicationResult = await _communicationService.RenewSubscriptionAsync(bookingId, appUserId, language, platform, accessToken, token); if (communicationResult.Success) return communicationResult; result.Success = false; result.ErrorCode = communicationResult.ErrorCode; } else { result.Success = false; result.ErrorCode = CommunicationErrors.ServerNoConnection; result.ErrorMessage = Errors.Server_NoConnection; } return result; } } }