using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Messaging;
using gehGassiApp.Core.Interfaces;
using gehGassiApp.Core.Interfaces.Synchronization;
using gehGassiApp.Core.Messaging;
using gehGassiApp.Domain.Common;
using gehGassiApp.Domain.Dogs;
using gehGassiApp.Domain.Messages;
using gehGassiApp.Domain.News;
using gehGassiApp.Domain.Users;
using gehGassiApp.Domain.Walkers;
using gehGassiApp.Domain.Walks;
namespace gehGassiApp.Core.Services.Synchronization
{
///
/// Service der Synchronisierungen initiieren kann
///
public class SyncService : ISyncService
{
private readonly INewsService _newsService;
private readonly IUserService _userService;
private readonly IConversationService _conversationService;
private readonly IMessageService _messageService;
private readonly IDogRaceService _dogRaceService;
private readonly IDogService _dogService;
private readonly IWalkerProfileService _walkerProfileService;
private readonly IPublicWalkRequestService _publicWalkRequestService;
private readonly IPublicWalkResponseService _publicWalkResponseService;
private readonly IWalkService _walkService;
private readonly IWalkingTimeService _walkingTimeService;
private readonly IRatingService _ratingService;
private readonly IFavouriteService _favouriteService;
private readonly ISystemMessageService _systemMessageService;
private readonly ITransactionFeeService _transactionFeeService;
private readonly IPaymentService _paymentService;
///
/// Erstellt eine Instanz
///
/// Instanz eines INewsService
/// Instanz eines IUserService
/// Instanz eines IConversationService
/// Instanz eines IMessageService
/// Instanz eines IDogRaceService
/// Instanz eines IDogService
/// Instanz eines IWalkerProfileService
/// Instanz eines IPublicWalkRequestService
/// Instanz eines IPublicWalkResponseService
/// Instanz eines IWalkService
/// Instanz eines IWalkingTimeService
/// Instanz eines IRatingService
/// Instanz eines IFavouriteService
/// Instanz eines ISystemMessageService
/// Instanz eines ITransactionFeeService
/// Instanz eines IPaymentService
public SyncService(INewsService newsService, IUserService userService, IConversationService conversationService, IMessageService messageService, IDogRaceService dogRaceService, IDogService dogService, IWalkerProfileService walkerProfileService,
IPublicWalkRequestService publicWalkRequestService, IPublicWalkResponseService publicWalkResponseService, IWalkService walkService, IWalkingTimeService walkingTimeService, IRatingService ratingService, IFavouriteService favouriteService,
ISystemMessageService systemMessageService, ITransactionFeeService transactionFeeService, IPaymentService paymentService)
{
_newsService = newsService;
_userService = userService;
_conversationService = conversationService;
_messageService = messageService;
_dogRaceService = dogRaceService;
_dogService = dogService;
_walkerProfileService = walkerProfileService;
_publicWalkRequestService = publicWalkRequestService;
_publicWalkResponseService = publicWalkResponseService;
_walkService = walkService;
_walkingTimeService = walkingTimeService;
_ratingService = ratingService;
_favouriteService = favouriteService;
_systemMessageService = systemMessageService;
_transactionFeeService = transactionFeeService;
_paymentService = paymentService;
}
///
/// App-User Synchronisieren
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncAppUserAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _userService.PushAsync(accessToken, token);
var pullResult = await _userService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new AppUserChangedMessage(pullResult));
}
}
///
/// Walker-Profil Synchronisieren
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncWalkerProfileAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _walkerProfileService.PushAsync(accessToken, token);
var pullResult = await _walkerProfileService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new DogWalkerProfileChangedMessage(pullResult));
}
}
///
/// Konversationen Synchronisieren
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncConversationsAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _conversationService.PushAsync(accessToken, token);
var pullResult = await _conversationService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new ConversationsChangedMessage(pullResult));
}
}
///
/// Nachrichten synchronisieren
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncMessagesAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _messageService.PushAsync(accessToken, token);
var pullResult = await _messageService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new ConversationsUnreadChangedMessage());
if (pullResult.Added.Any())
{
var groups = pullResult.Added.GroupBy(c => c.ConversationId);
foreach (var group in groups)
{
WeakReferenceMessenger.Default.Send(new SignalRConversationMessageAddedMessage(group.Key));
}
}
}
}
///
/// Synchronisieren der News-Kategorien
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncNewsCategoriesAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _newsService.PushAsync(accessToken, token);
var pullResult = await _newsService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new NewsCategoriesChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Hunderassen
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncDogRacesAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _dogRaceService.PushAsync(accessToken, token);
var pullResult = await _dogRaceService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new DogRacesChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Hunde
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncDogsAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _dogService.PushAsync(accessToken, token);
var pullResult = await _dogService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new DogsChangedMessage(pullResult));
}
}
///
/// Synchronisieren der offenen Anfragen
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncPublicWalkRequestsAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _publicWalkRequestService.PushAsync(accessToken, token);
var pullResult = await _publicWalkRequestService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new PublicWalkRequestsChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Antworten auf offenen Anfragen
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncPublicWalkResponsesAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _publicWalkResponseService.PushAsync(accessToken, token);
var pullResult = await _publicWalkResponseService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new PublicWalkResponsesChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Walks
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncWalksAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _walkService.PushAsync(accessToken, token);
var pullResult = await _walkService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new WalksChangedMessage(pullResult));
WeakReferenceMessenger.Default.Send(new WalkRequestedChangedMessage());
}
}
///
/// Synchronisieren der WalkintgTimes
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncWalkingTimesAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _walkingTimeService.PushAsync(accessToken, token);
var pullResult = await _walkingTimeService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new WalkingTimesChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Ratings
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncRatingsAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _ratingService.PushAsync(accessToken, token);
var pullResult = await _ratingService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new RatingsChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Favoriten
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncFavouritesAsync(string language, string accessToken, CancellationToken token)
{
var pushResult = await _favouriteService.PushAsync(accessToken, token);
var pullResult = await _favouriteService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new FavouritesChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Favoriten
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncSystemMessagesAsync(string language, string accessToken, CancellationToken token)
{
//Bewusst kein Push
var pullResult = await _systemMessageService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new SystemMessagesChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Transaktionsgebühren
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncTransactionFeesAsync(string language, string accessToken, CancellationToken token)
{
//Bewusst kein Push
var pullResult = await _transactionFeeService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new TransactionFeesChangedMessage(pullResult));
}
}
///
/// Synchronisieren der Auszahlungen
///
/// Gewünschte Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// Task
public async Task SyncPayoutsAsync(string language, string accessToken, CancellationToken token)
{
//Bewusst kein Push
var pullResult = await _paymentService.PullAsync(language, accessToken, token);
if (pullResult.HasChanges)
{
//Nun Events auslösen wenn nötig
WeakReferenceMessenger.Default.Send(new PayoutsChangedMessage(pullResult));
}
}
}
}