Пример #1
0
        private async Task <EmptyResponseDto> DeleteUpTask(GoogleTask task)
        {
            var response = await _apiService.DeleteTask(task.TaskList.GoogleTaskListID, task.GoogleTaskID);

            var result = new EmptyResponseDto
            {
                Succeed = response.Succeed
            };

            if (response.Succeed)
            {
                result = await _dataService.TaskService.RemoveAsync(task);
            }
            else
            {
                result.Message = response.Message ??
                                 $"An unkwon error occurred while trying to delete task {task.Title}";
                _logger.Error(
                    $"{nameof(SyncUpTasksAsync)}: An error occurred while trying to " +
                    $"delete remotely taskId = {task.ID}. {result.Message}",
                    task, result.Message);
            }

            return(result);
        }
Пример #2
0
 public async Task <ResponseDto <GoogleTask> > UpdateAsync(GoogleTask entity)
 {
     return(await Task.Run(async() =>
     {
         _logger.Information($"UpdateAsync: Trying to update taskId = {entity.ID}");
         var response = new ResponseDto <GoogleTask>
         {
             Message = string.Empty,
             Succeed = false
         };
         using (var context = new MiraiNotesContext())
         {
             try
             {
                 context.Entry(entity).State = EntityState.Modified;
                 response.Succeed = await context.SaveChangesAsync() > 0;
                 response.Result = entity;
                 _logger.Information("UpdateAsync: Completed successfully");
             }
             catch (Exception e)
             {
                 _logger.Error(e, "UpdateAsync: An unknown error occurred");
                 response.Message = GetExceptionMessage(e);
             }
         }
         return response;
     }).ConfigureAwait(false));
 }
Пример #3
0
 public async Task <EmptyResponseDto> RemoveAsync(GoogleTask entity)
 {
     return(await Task.Run(async() =>
     {
         _logger.Information($"RemoveAsync: Trying to delete taskId = {entity.ID}");
         var response = new EmptyResponseDto
         {
             Message = string.Empty,
             Succeed = false
         };
         using (var context = new MiraiNotesContext())
         {
             try
             {
                 context.Remove(entity);
                 response.Succeed = await context.SaveChangesAsync() > 0;
                 _logger.Information("RemoveAsync: Completed successfully");
             }
             catch (Exception e)
             {
                 _logger.Error(e, "RemoveAsync: An unknown error occurred");
                 response.Message = GetExceptionMessage(e);
             }
         }
         return response;
     }).ConfigureAwait(false));
 }
Пример #4
0
        private async Task <EmptyResponseDto> SaveUpTask(GoogleTask task)
        {
            var result = new EmptyResponseDto();

            var t = new GoogleTaskModel
            {
                Notes           = task.Notes,
                Status          = task.Status,
                Title           = task.Title,
                ToBeCompletedOn = task.ToBeCompletedOn,
                UpdatedAt       = task.UpdatedAt
            };

            var previousResponse = await _dataService
                                   .TaskService
                                   .GetPreviousTaskId(task.TaskList.GoogleTaskListID, task.ParentTask);

            if (!previousResponse.Succeed)
            {
                _logger.Error(
                    $"{nameof(SyncUpTasksAsync)}: Couldnt get the previous taskId " +
                    $"for taskListId = {task.TaskList.GoogleTaskListID} - parentTask = {task.ParentTask}");
                result.Message = "Couldnt get the previous taskId";
                return(result);
            }

            var response = await _apiService.SaveTask(task.TaskList.GoogleTaskListID, t, task.ParentTask, previousResponse.Result);

            if (response.Succeed)
            {
                task.LocalStatus  = LocalStatus.DEFAULT;
                task.ToBeSynced   = false;
                task.GoogleTaskID = response.Result.TaskID;
                task.UpdatedAt    = response.Result.UpdatedAt;
                task.Position     = response.Result.Position;
                task.ParentTask   = response.Result.ParentTask;

                result = await _dataService.TaskService.UpdateAsync(task);
            }
            else
            {
                result.Message = response.Message ??
                                 $"An unkwon error occurred while trying to create task {task.Title}";
                _logger.Error(
                    $"{nameof(SyncUpTasksAsync)}: An error occurred while trying to " +
                    $"save remotely taskId = {task.ID}. {result.Message}");
            }

            return(result);
        }
Пример #5
0
        public void ReturnsIntermediateFileFromVariable()
        {
            var contents        = "SampleGoogleServices";
            var environmentName = nameof(ReturnsIntermediateFileFromVariable);

            Environment.SetEnvironmentVariable(environmentName, contents, EnvironmentVariableTarget.Process);

            var path = GoogleTask.GetResourcePath(environmentName, IntermediateOutputDirectory, "google-services.json");

            var expectedPath = Path.Combine(IntermediateOutputDirectory, "google-services", "google-services.json");

            Assert.Equal(expectedPath, path);

            Assert.Equal(contents, File.ReadAllText(path));
        }
Пример #6
0
        public async Task <ResponseDto <GoogleTask> > AddAsync(string taskListID, GoogleTask task)
        {
            return(await Task.Run(async() =>
            {
                _logger.Information($"AddAsync: Trying to add a new task into taskListId = {taskListID}");
                var response = new ResponseDto <GoogleTask>
                {
                    Message = string.Empty,
                    Succeed = false
                };
                using (var context = new MiraiNotesContext())
                {
                    try
                    {
                        var taskList = await context.TaskLists
                                       .FirstOrDefaultAsync(tl => tl.GoogleTaskListID == taskListID);

                        if (taskList == null)
                        {
                            response.Message = $"Couldn't find the tasklist where {task.Title} is going to be saved";
                            _logger.Warning($"AddAsync: Couldn't find a tasklist with id = {taskListID}");
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(task.Position))
                            {
                                string position = await GetLastestPosition(context, taskList.GoogleTaskListID, task.ParentTask);
                                task.Position = position;
                            }
                            task.TaskList = taskList;

                            await context.AddAsync(task);
                            response.Succeed = await context.SaveChangesAsync() > 0;
                            response.Result = task;
                        }
                        _logger.Information("AddAsync: Completed successfully");
                    }
                    catch (Exception e)
                    {
                        _logger.Error(e, "AddAsync: An unknown error occurred");
                        response.Message = GetExceptionMessage(e);
                    }
                }
                return response;
            }).ConfigureAwait(false));
        }
Пример #7
0
        public void ReturnsSpecifiedFileFromAbsolutePath()
        {
            var contents  = "SampleGoogleServices";
            var directory = Path.Combine("Generated", "tests", nameof(ReturnsSpecifiedFileFromAbsolutePath));

            Directory.CreateDirectory(directory);
            var expectedPath = new FileInfo(Path.Combine(directory, "google-test.json")).FullName;

            File.WriteAllText(expectedPath, contents);
            var environmentName = nameof(ReturnsSpecifiedFileFromAbsolutePath);

            Environment.SetEnvironmentVariable(environmentName, expectedPath, EnvironmentVariableTarget.Process);

            var path = GoogleTask.GetResourcePath(environmentName, IntermediateOutputDirectory, "google-services.json");

            Assert.Equal(expectedPath, path);
        }
        private void ReAddReminderDate(
            int notificationId,
            TaskListItemViewModel taskList,
            GoogleTask task)
        {
            if (!TasksHelper.CanReAddReminder(task.RemindOn.Value))
            {
                return;
            }

            string notes = TasksHelper.GetNotesForNotification(task.Notes);

            _notificationService.RemoveScheduledNotification(notificationId);
            _notificationService.ScheduleNotification(new TaskReminderNotification
            {
                Id            = notificationId,
                TaskListId    = taskList.Id,
                TaskId        = task.ID,
                TaskListTitle = taskList.Title,
                TaskTitle     = task.Title,
                TaskBody      = notes,
                DeliveryOn    = task.RemindOn.Value
            });
        }
Пример #9
0
        private async Task <IEnumerable <TaskItemViewModel> > SaveSubTasksAsync(
            IEnumerable <TaskItemViewModel> subTasksToSave,
            bool isNewTask,
            bool moveToDifferentTaskList,
            List <TaskItemViewModel> currentSubTasks)
        {
            ShowTaskProgressRing = true;
            string taskListID = moveToDifferentTaskList
                ? SelectedTaskList.TaskListID
                : _currentTaskList.TaskListID;

            if (moveToDifferentTaskList && !isNewTask)
            {
                foreach (var subTask in subTasksToSave)
                {
                    var lastStID     = currentSubTasks.LastOrDefault()?.TaskID;
                    var moveResponse = await _dataService
                                       .TaskService
                                       .MoveAsync(taskListID, subTask.TaskID, subTask.ParentTask, lastStID);

                    if (moveResponse.Succeed)
                    {
                        currentSubTasks.Add(_mapper.Map <TaskItemViewModel>(moveResponse.Result));
                    }
                }
            }
            else
            {
                foreach (var subTask in subTasksToSave)
                {
                    var lastStID = currentSubTasks.LastOrDefault()?.TaskID;
                    var entity   = new GoogleTask
                    {
                        CompletedOn  = subTask.CompletedOn,
                        CreatedAt    = DateTimeOffset.UtcNow,
                        GoogleTaskID = subTask.IsNew
                            ? Guid.NewGuid().ToString()
                            : subTask.TaskID,
                        IsDeleted   = subTask.IsDeleted,
                        IsHidden    = subTask.IsHidden,
                        LocalStatus = LocalStatus.CREATED,
                        Notes       = subTask.Notes,
                        ParentTask  = isNewTask && moveToDifferentTaskList
                            ? subTask.ParentTask
                            : CurrentTask.TaskID,
                        Position        = lastStID,
                        Status          = subTask.Status,
                        Title           = subTask.Title,
                        ToBeCompletedOn = subTask.ToBeCompletedOn,
                        ToBeSynced      = true,
                        UpdatedAt       = DateTimeOffset.UtcNow
                    };

                    var response = await _dataService
                                   .TaskService
                                   .AddAsync(taskListID, entity);

                    if (response.Succeed)
                    {
                        currentSubTasks.Add(_mapper.Map <TaskItemViewModel>(response.Result));
                    }
                }
            }

            ShowTaskProgressRing = false;

            return(currentSubTasks);
        }
Пример #10
0
        private async Task SaveChangesAsync()
        {
            bool isNewTask = CurrentTask.IsNew;

            if (SelectedTaskList?.TaskListID == null || _currentTaskList?.TaskListID == null)
            {
                await _dialogService.ShowMessageDialogAsync(
                    $"An error occurred while trying to {(isNewTask ? "save" : "update")} the task.",
                    $"The selected task list and the current task list cant be null");

                return;
            }

            if (CurrentTask.RemindOn.HasValue)
            {
                var minutesDiff = (CurrentTask.RemindOn.Value - DateTimeOffset.Now).TotalMinutes;
                if (minutesDiff < 2)
                {
                    _messenger.Send(
                        $"The date of the reminder must be at least 2 mins above the current time.",
                        $"{MessageType.SHOW_IN_APP_NOTIFICATION}");
                    return;
                }
            }

            //If the task list selected in the combo is not the same as the one in the
            //navigation view, its because we are trying to save/update a
            //task into a different task list
            bool moveToDifferentTaskList = SelectedTaskList.TaskListID != _currentTaskList.TaskListID;

            //If we are updating a task but also moving it into a different tasklist
            if (moveToDifferentTaskList && !isNewTask)
            {
                bool move = await _dialogService.ShowConfirmationDialogAsync(
                    "Confirm",
                    "Since you are moving an existing task to a different task list, any change made here will be lost. Do you want to continue ?",
                    "Yes",
                    "No");

                if (move)
                {
                    await MoveCurrentTaskAsync();
                }
                return;
            }

            GoogleTask entity;

            ShowTaskProgressRing = true;
            if (isNewTask)
            {
                entity = new GoogleTask();
            }
            else
            {
                var dbResponse = await _dataService
                                 .TaskService
                                 .FirstOrDefaultAsNoTrackingAsync(t => t.GoogleTaskID == CurrentTask.TaskID);

                if (!dbResponse.Succeed || dbResponse.Result == null)
                {
                    ShowTaskProgressRing = false;
                    await _dialogService.ShowMessageDialogAsync(
                        "Error",
                        $"Couldn't find the task to update from db. Error = {dbResponse.Message}");

                    return;
                }

                entity = dbResponse.Result;
            }

            if (!moveToDifferentTaskList || moveToDifferentTaskList && isNewTask)
            {
                if (isNewTask)
                {
                    entity.CreatedAt = DateTimeOffset.UtcNow;
                }
                entity.CompletedOn  = CurrentTask.CompletedOn;
                entity.GoogleTaskID = CurrentTask.IsNew
                    ? Guid.NewGuid().ToString()
                    : CurrentTask.TaskID;
                entity.IsDeleted  = CurrentTask.IsDeleted;
                entity.IsHidden   = CurrentTask.IsHidden;
                entity.Notes      = CurrentTask.Notes;
                entity.ParentTask = CurrentTask.ParentTask;
                entity.Position   = CurrentTask.Position;
                entity.Status     = CurrentTask.IsNew
                    ? GoogleTaskStatus.NEEDS_ACTION.GetString()
                    : CurrentTask.Status;
                entity.Title       = CurrentTask.Title;
                entity.LocalStatus = CurrentTask.IsNew
                    ? LocalStatus.CREATED
                    : entity.LocalStatus == LocalStatus.CREATED
                        ? LocalStatus.CREATED
                        : LocalStatus.UPDATED;
                entity.ToBeSynced      = true;
                entity.UpdatedAt       = DateTimeOffset.UtcNow;
                entity.ToBeCompletedOn = CurrentTask.ToBeCompletedOn;
                entity.RemindOn        = CurrentTask.RemindOn;
            }

            //If the current task has a reminder date and the entity doesn't have
            //a reminder guid, we set it up. I do this to avoid replacing the guid
            if (CurrentTask.RemindOn.HasValue && string.IsNullOrEmpty(entity.RemindOnGUID))
            {
                //the 12 is because uwp toast notif. doesnt work with strings longer than that
                //and the '-' is because hashcode can return a negative integer
                entity.RemindOnGUID = string.Join("", $"{entity.GetHashCode()}".Take(12).Where(c => c != '-'));
            }

            ResponseDto <GoogleTask> response;
            var subTasksToSave = GetSubTasksToSave(isNewTask, moveToDifferentTaskList);
            var currentSts     = GetCurrentSubTasks();

            //If we are creating a new task but in a different tasklist
            if (moveToDifferentTaskList)
            {
                response = await _dataService
                           .TaskService
                           .AddAsync(SelectedTaskList.TaskListID, entity);

                if (!response.Succeed)
                {
                    ShowTaskProgressRing = false;
                    await _dialogService.ShowMessageDialogAsync(
                        $"An error occurred while trying to seve the task into {SelectedTaskList.Title}.",
                        $"Error = {response.Message}.");

                    return;
                }

                _messenger.Send(false, $"{MessageType.OPEN_PANE}");

                subTasksToSave.ForEach(st => st.ParentTask = entity.GoogleTaskID);

                await SaveSubTasksAsync(
                    subTasksToSave,
                    isNewTask,
                    moveToDifferentTaskList,
                    Enumerable.Empty <TaskItemViewModel>().ToList());

                _messenger.Send(
                    $"The task was sucessfully created into {SelectedTaskList.Title}",
                    $"{MessageType.SHOW_IN_APP_NOTIFICATION}");
                return;
            }
            else if (isNewTask)
            {
                response = await _dataService
                           .TaskService
                           .AddAsync(_currentTaskList.TaskListID, entity);
            }
            else
            {
                response = await _dataService
                           .TaskService
                           .UpdateAsync(entity);
            }

            ShowTaskProgressRing = false;

            if (!response.Succeed)
            {
                await _dialogService.ShowMessageDialogAsync(
                    $"An error occurred while trying to {(isNewTask ? "save" : "update")} the task.",
                    $"Error: {response.Message}.");

                return;
            }

            CurrentTask = _mapper.Map <TaskItemViewModel>(response.Result);

            var sts = await SaveSubTasksAsync(subTasksToSave, isNewTask, moveToDifferentTaskList, currentSts);

            CurrentTask.SubTasks = new ObservableCollection <TaskItemViewModel>(sts);

            if (CurrentTask.RemindOn.HasValue)
            {
                string notes = CurrentTask.Notes.Length > 15
                    ? $"{CurrentTask.Notes.Substring(0, 15)}...."
                    : $"{CurrentTask.Notes}....";

                int id = int.Parse(response.Result.RemindOnGUID);

                _notificationService.RemoveScheduledNotification(id);
                _notificationService.ScheduleNotification(new TaskReminderNotification
                {
                    Id            = id,
                    TaskListId    = _currentTaskList.Id,
                    TaskId        = CurrentTask.Id,
                    TaskListTitle = _currentTaskList.Title,
                    TaskTitle     = CurrentTask.Title,
                    TaskBody      = notes,
                    DeliveryOn    = CurrentTask.RemindOn.Value
                });
            }

            _messenger.Send(CurrentTask.TaskID, $"{MessageType.TASK_SAVED}");
            UpdateTaskOperationTitle(isNewTask, CurrentTask.HasParentTask);

            _changedProperties.Clear();
        }
Пример #11
0
        public async Task <ResponseDto <GoogleTask> > MoveAsync(string selectedTaskListID, string taskID, string parentTask, string previous)
        {
            return(await Task.Run(async() =>
            {
                _logger.Information($"MoveAsync: Trying to move the taskID = {taskID} to tasklistID {selectedTaskListID} with parentTask = {parentTask} and previousTaskID = {previous}");
                var response = new ResponseDto <GoogleTask>
                {
                    Message = string.Empty,
                    Succeed = false
                };

                using (var context = new MiraiNotesContext())
                {
                    try
                    {
                        var taskList = await context
                                       .TaskLists
                                       .FirstOrDefaultAsync(tl => tl.GoogleTaskListID == selectedTaskListID);

                        if (taskList == null)
                        {
                            response.Message = $"Couldn't find the selected task list in db";
                            _logger.Warning($"MoveAsync: Couldn't find the selected task list id = {selectedTaskListID}");
                            return response;
                        }

                        var oldEntity = await context
                                        .Tasks
                                        .FirstOrDefaultAsync(t => t.GoogleTaskID == taskID);

                        if (oldEntity == null)
                        {
                            response.Message = $"Couldn't find the task to be moved in db";
                            _logger.Warning($"MoveAsync: Couldn't find the task to be moved. TaskID = {taskID}");
                            return response;
                        }

                        string position = await GetLastestPosition(context, taskList.GoogleTaskListID, parentTask);

                        var entity = new GoogleTask
                        {
                            CompletedOn = oldEntity.CompletedOn,
                            CreatedAt = DateTimeOffset.UtcNow,
                            GoogleTaskID = Guid.NewGuid().ToString(),
                            IsDeleted = oldEntity.IsDeleted,
                            IsHidden = oldEntity.IsHidden,
                            LocalStatus = LocalStatus.CREATED,
                            Notes = oldEntity.Notes,
                            ParentTask = parentTask,
                            Position = position,
                            RemindOn = oldEntity.RemindOn,
                            RemindOnGUID = oldEntity.RemindOnGUID,
                            Status = oldEntity.Status,
                            TaskList = taskList,
                            Title = oldEntity.Title,
                            ToBeCompletedOn = oldEntity.ToBeCompletedOn,
                            ToBeSynced = true,
                            UpdatedAt = DateTimeOffset.UtcNow
                        };

                        if (oldEntity.LocalStatus == LocalStatus.CREATED)
                        {
                            context.Remove(oldEntity);
                        }
                        else
                        {
                            oldEntity.LocalStatus = LocalStatus.DELETED;
                            oldEntity.ToBeSynced = true;
                            oldEntity.UpdatedAt = DateTimeOffset.UtcNow;
                        }

                        await context.Tasks.AddAsync(entity);

                        response.Succeed = await context.SaveChangesAsync() > 0;
                        response.Result = entity;
                        _logger.Information("MoveAsync: Completed successfully");
                    }
                    catch (Exception e)
                    {
                        _logger.Error(e, "MoveAsync: An unknown error occurred");
                        response.Message = GetExceptionMessage(e);
                    }
                }
                return response;
            }).ConfigureAwait(false));
        }
Пример #12
0
        private async Task <EmptyResponseDto> UpdateUpTask(GoogleTask task)
        {
            var response = await _apiService.GetTask(task.TaskList.GoogleTaskListID, task.GoogleTaskID);

            var result = new EmptyResponseDto
            {
                Succeed = response.Succeed
            };

            if (!response.Succeed)
            {
                result.Message = response.Message ??
                                 $"An unkwon error occurred while trying to get task {task.Title}";
                _logger.Error(
                    $"{nameof(SyncUpTasksAsync)}: An error occurred while trying to get the task to " +
                    $"update remotely taskId = {task.ID}. {result.Message}");
            }
            else if (task.UpdatedAt > response.Result.UpdatedAt)
            {
                response.Result.CompletedOn     = task.CompletedOn;
                response.Result.IsDeleted       = task.IsDeleted;
                response.Result.Notes           = task.Notes;
                response.Result.Status          = task.Status;
                response.Result.Title           = task.Title;
                response.Result.ToBeCompletedOn = task.ToBeCompletedOn;
                response.Result.UpdatedAt       = task.UpdatedAt;

                response = await _apiService.UpdateTask(task.TaskList.GoogleTaskListID, task.GoogleTaskID, response.Result);

                result.Succeed = response.Succeed;

                if (response.Succeed)
                {
                    task.LocalStatus = LocalStatus.DEFAULT;
                    task.ToBeSynced  = false;
                    result           = await _dataService.TaskService.UpdateAsync(task);
                }
                else
                {
                    result.Message = response.Message ??
                                     $"An unkwon error occurred while trying to delete task {task.Title}";
                    _logger.Error(
                        $"{nameof(SyncUpTasksAsync)}: An error occurred while trying to " +
                        $"update remotely taskId = {task.ID}. {result.Message}");
                }
            }
            else
            {
                task.CompletedOn     = response.Result.CompletedOn;
                task.IsDeleted       = response.Result.IsDeleted;
                task.IsHidden        = response.Result.IsHidden;
                task.Notes           = response.Result.Notes;
                task.ParentTask      = response.Result.ParentTask;
                task.Position        = response.Result.Position;
                task.Status          = response.Result.Status;
                task.Title           = response.Result.Title;
                task.ToBeCompletedOn = response.Result.ToBeCompletedOn;
                task.UpdatedAt       = response.Result.UpdatedAt;
                task.LocalStatus     = LocalStatus.DEFAULT;
                task.ToBeSynced      = false;
                result = await _dataService.TaskService.UpdateAsync(task);
            }

            return(result);
        }