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