Example #1
0
        private async Task <bool> UploadSynchronization(IEnumerable <VacantionRequest> changedModels, CancellationToken cancellationToken)
        {
            foreach (var model in changedModels)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var dto = SetupVacationDto(model);

                if (model.SyncState == SynchronizationState.New)
                {
                    await CreateOnServer(model, dto, cancellationToken);
                }
                else
                {
                    await UpdateOnServer(model, dto, cancellationToken);
                }

                model.SyncState = SynchronizationState.Synced;

                lock (_syncRoot)
                    VacationRequestsRepository.Update(model);
            }

            return(true);
        }
Example #2
0
        public void AddVacation(NewVacationRequest newVacantion)
        {
            var vacation = SetupVacationRequest(newVacantion);

            ChangeLocalDataAndRunSync(() => VacationRequestsRepository.Add(vacation));

            RaiseVacationAdded(vacation);
        }
Example #3
0
        private void AddNewBackendModel(VacantionRequest backendModel)
        {
            backendModel.LocalId = backendModel.Id;

            backendModel.SyncState = SynchronizationState.Synced;

            VacationRequestsRepository.Add(backendModel);
        }
Example #4
0
        public void UpdateVacation(VacantionRequest vacation)
        {
            var current = VacationRequestsRepository.GetByKey(vacation.LocalId);

            if (current.Equals(vacation))
            {
                return;
            }

            if (vacation.SyncState == SynchronizationState.Synced)
            {
                vacation.SyncState = SynchronizationState.Changed;
            }

            ChangeLocalDataAndRunSync(() => VacationRequestsRepository.Update(vacation));

            RaiseVacationChanged(vacation);
        }
Example #5
0
        private void ResetLocalItems(IEnumerable <VacantionRequest> localSyncedModels, IEnumerable <VacantionRequest> backendModels, CancellationToken cancellationToken)
        {
            lock (_syncRoot)
            {
                VacationRequestsRepository.RemoveRange(localSyncedModels);

                cancellationToken.ThrowIfCancellationRequested();

                foreach (var item in backendModels)
                {
                    item.LocalId = item.Id;
                }

                VacationRequestsRepository.AddRange(backendModels);
            }

            RaiseVacationsChanged();
        }
Example #6
0
 public VacantionRequest GetVacantion(string localId)
 => VacationRequestsRepository.GetByKey(localId);
Example #7
0
 public IEnumerable <VacantionRequest> GetVacantionRequests()
 => VacationRequestsRepository.GetAll();
Example #8
0
        private void UpdateByBackendModel(VacantionRequest backendModel)
        {
            backendModel.SyncState = SynchronizationState.Synced;

            VacationRequestsRepository.Update(backendModel);
        }
Example #9
0
        private async Task Synchronization(CancellationToken cancellationToken)
        {
            bool success = false;

            try
            {
                var changedModels =
                    VacationRequestsRepository.GetAll()
                    .Where((arg) => arg.SyncState != SynchronizationState.Synced)
                    .ToList();

                var uploadSuccess = !changedModels.Any();

                if (!uploadSuccess)
                {
                    var uploadNotSyncModels = await UploadSynchronization(changedModels, cancellationToken);

                    uploadSuccess = uploadNotSyncModels;
                }

                if (uploadSuccess)
                {
                    var vacationDtos = await VacationRequestsApiService.GetVacations(cancellationToken);

                    var backendModels = vacationDtos
                                        ?.Select(SetupVacationRequest)
                                        .ToList()
                                        ?? new List <VacantionRequest>();

                    cancellationToken.ThrowIfCancellationRequested();

                    var localSyncedModels = VacationRequestsRepository
                                            .GetAll()
                                            .Where(t => t.SyncState == SynchronizationState.Synced)
                                            .ToList();

                    var removedModels = localSyncedModels
                                        .Any(l => backendModels
                                             .All(b => b.Id != l.Id));

                    if (removedModels || (backendModels.Any() && !localSyncedModels.Any()))
                    {
                        ResetLocalItems(localSyncedModels, backendModels, cancellationToken);
                    }
                    else
                    {
                        UpdateLocalItems(localSyncedModels, backendModels, cancellationToken);
                    }

                    success = true;
                }
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception)
            {
            }

            lock (_syncRoot)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                _syncTCS.TrySetResult(success);

                _syncTCS = null;
            }
        }