Fleshed out the table storage service and started syncing logic

This commit is contained in:
2020-03-19 19:09:03 -04:00
parent 59377a7749
commit 0bfab99f1b
22 changed files with 630 additions and 131 deletions

View File

@@ -1,4 +1,6 @@
using Habitica.Todoist.Integration.Model.Habitica;
using Habitica.Todoist.Integration.Model.Habitica.Enums;
using Habitica.Todoist.Integration.Model.Storage;
using Habitica.Todoist.Integration.Model.Todoist;
using Habitica.Todoist.Integration.Services;
using Microsoft.Extensions.Configuration;
@@ -20,30 +22,79 @@ namespace Habitica.Todoist.Integration.Console
private static string habiticaApiUrl => "https://habitica.com/api/v3/";
private static string habiticaUserId => configuration["habitica:userId"];
private static string habiticaApiKey => configuration["habitica:apiKey"];
private static string todoistApiUrl => "https://api.todoist.com/sync/v8/";
private static string todoistApiKey => configuration["todoist:apiKey"];
private static string tableStorageConnectionString => configuration["tableStorage:connectionString"];
private static string giosUserId => "0b6ec4eb-8878-4b9e-8585-7673764a6541";
static void Main(string[] args)
{
ConfigBuild();
var todoistClient = new TodoistClientService(todoistApiKey);
var syncResponse = todoistClient.GetUpdatedItems().ConfigureAwait(false).GetAwaiter().GetResult();
foreach (var item in syncResponse.Items)
{
var newTask = new Task
{
Text = item.GetCleanContent(),
Type = TaskType.Todo,
Date = item.Due?.ToJavaScriptDateStr(),
Priority = GetHabiticaDifficulty(item.GetDifficulty().GetValueOrDefault())
};
//var habiticaClient2 = new HabiticaServiceClient(habiticaUserId, habiticaApiKey);
var habiticaClient = new HabiticaClientService(habiticaUserId, habiticaApiKey);
var task = habiticaClient.CreateUserTask(newTask).ConfigureAwait(false).GetAwaiter().GetResult();
//var tasks = habiticaClient2.ReadTasks().ConfigureAwait(false).GetAwaiter().GetResult().Data;
//foreach (var task in tasks)
// habiticaClient2.DeleteTask(task.Id).ConfigureAwait(false).GetAwaiter().GetResult();
//return;
// initialize all the clients
var habiticaClient = new HabiticaServiceClient(habiticaUserId, habiticaApiKey);
var todoistClient = new TodoistServiceClient(todoistApiKey);
var tableStorageClient = new TableStorageClient(tableStorageConnectionString);
// get todoist sync token if available
var syncToken = "";
try { syncToken = tableStorageClient.Query<TodoistSync>().Where(x => x.PartitionKey == giosUserId).ToList()
.OrderByDescending(x => x.Timestamp).First().RowKey; } catch { }
// get all changed items from todoist
var response = todoistClient.GetChangedItems(syncToken).ConfigureAwait(false).GetAwaiter().GetResult();
var changedItems = response.Items;
// filter out items by actions
var addItems = changedItems.Where(x => !tableStorageClient.Exists<TodoHabitLink>(giosUserId, x.Id)
.ConfigureAwait(false).GetAwaiter().GetResult() && x.Is_deleted == 0).ToList();
var updateItems = changedItems.Where(x => tableStorageClient.Exists<TodoHabitLink>(giosUserId, x.Id)
.ConfigureAwait(false).GetAwaiter().GetResult() && x.Is_deleted == 0 && x.Date_completed == null).ToList();
var completeItems = changedItems.Where(x => x.Is_deleted == 0 && x.Date_completed != null).ToList();
var deleteItems = changedItems.Where(x => tableStorageClient.Exists<TodoHabitLink>(giosUserId, x.Id)
.ConfigureAwait(false).GetAwaiter().GetResult() && x.Is_deleted == 1).ToList();
foreach (var addItem in addItems)
{
var task = habiticaClient.CreateTask(TaskFromTodoistItem(addItem)).ConfigureAwait(false).GetAwaiter().GetResult().Data;
var link = new TodoHabitLink(giosUserId, addItem.Id, task.Id);
tableStorageClient.InsertOrUpdate(link).ConfigureAwait(false).GetAwaiter().GetResult();
tableStorageClient.InsertOrUpdate(link.Reverse()).ConfigureAwait(false).GetAwaiter().GetResult();
}
foreach (var updateItem in updateItems)
{
var habiticaId = tableStorageClient.Query<TodoHabitLink>().Where(x => x.PartitionKey == giosUserId && x.RowKey == updateItem.Id)
.ToList().First().HabiticaId;
habiticaClient.UpdateTask(TaskFromTodoistItem(updateItem, habiticaId)).ConfigureAwait(false).GetAwaiter().GetResult();
}
foreach (var completeItem in completeItems)
{
var habiticaId = tableStorageClient.Query<TodoHabitLink>().Where(x => x.PartitionKey == giosUserId && x.RowKey == completeItem.Id)
.ToList().First().HabiticaId;
habiticaClient.ScoreTask(habiticaId, ScoreAction.Up).ConfigureAwait(false).GetAwaiter().GetResult();
}
foreach (var deleteItem in deleteItems)
{
var habiticaId = tableStorageClient.Query<TodoHabitLink>().Where(x => x.PartitionKey == giosUserId && x.RowKey == deleteItem.Id)
.ToList().First().HabiticaId;
habiticaClient.DeleteTask(habiticaId).ConfigureAwait(false).GetAwaiter().GetResult();
}
// store sync token
var todoistSync = new TodoistSync(giosUserId, response.Sync_token);
tableStorageClient.InsertOrUpdate(todoistSync).ConfigureAwait(false).GetAwaiter().GetResult();
}
public static string GetHabiticaDifficulty(int todoistDifficulty)
@@ -62,6 +113,21 @@ namespace Habitica.Todoist.Integration.Console
return null;
}
public static Task TaskFromTodoistItem(Item item, string id = null)
{
var taskTypeStr = Enum.GetName(typeof(TaskType), TaskType.Todo).ToLower();
var task = new Task
{
Id = id,
Text = item.Content,
Type = taskTypeStr,
Date = item.Due?.ToJavaScriptDateStr(),
Priority = GetHabiticaDifficulty(item.Priority)
};
return task;
}
static void ConfigBuild()
{
new ConfigurationBuilder()