diff --git a/Habitica.Todoist.Integration.Function.Sync/HttpSyncFunction.cs b/Habitica.Todoist.Integration.Function.Sync/HttpSyncFunction.cs index a9af22e..78c70d8 100644 --- a/Habitica.Todoist.Integration.Function.Sync/HttpSyncFunction.cs +++ b/Habitica.Todoist.Integration.Function.Sync/HttpSyncFunction.cs @@ -1,16 +1,20 @@ using System; using System.IO; +using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; +using Habitica.Todoist.Integration.Data; +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.Azure.WebJobs; +using Microsoft.Azure.WebJobs.Host; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; -using Habitica.Todoist.Integration.Model.Todoist; +using Microsoft.Extensions.Logging; using HabiticaTask = Habitica.Todoist.Integration.Model.Habitica.Task; -using Habitica.Todoist.Integration.Model.Habitica.Enums; namespace Habitica.Todoist.Integration.Function.Sync { @@ -18,10 +22,61 @@ namespace Habitica.Todoist.Integration.Function.Sync { public static Configuration HttpConfiguration { get; set; } = new Configuration(); + [Singleton("SyncLock", SingletonScope.Host)] [FunctionName("HttpSyncFunction")] public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { - return new OkObjectResult("TEST"); + // initialize all the clients + var habiticaClient = new HabiticaServiceClient(HttpConfiguration.HabiticaUserId, HttpConfiguration.HabiticaApiKey); + var todoistClient = new TodoistServiceClient(HttpConfiguration.TodoistApiKey); + var storageClient = new TableStorageClient(HttpConfiguration.TableStorageConnectionString); + + // initialize integration services + var todoistIntegration = new TodoistIntegrationService(todoistClient, storageClient, HttpConfiguration.GiosUserId); + var giosUserId = HttpConfiguration.GiosUserId; + + // get all changed items from todoist + var items = await todoistIntegration.ReadItemChanges(); + + // perform actions + foreach (var addedItem in items.WhereAdded()) + { + var task = (await habiticaClient.CreateTask(TaskFromTodoistItem(addedItem))).Data; + var link = new TodoHabitLink(giosUserId, addedItem.Id, task.Id); + + await storageClient.InsertOrUpdate(link); + await storageClient.InsertOrUpdate(link.Reverse()); + } + + foreach (var updatedItem in items.WhereUpdated()) + { + var habiticaId = storageClient.Query() + .Where(x => x.PartitionKey == giosUserId && x.RowKey == updatedItem.Id) + .ToList().First().HabiticaId; + await habiticaClient.UpdateTask(TaskFromTodoistItem(updatedItem, habiticaId)); + } + + foreach (var completedItem in items.WhereCompleted()) + { + var habiticaId = storageClient.Query() + .Where(x => x.PartitionKey == giosUserId && x.RowKey == completedItem.Id) + .ToList().First().HabiticaId; + await habiticaClient.ScoreTask(habiticaId, ScoreAction.Up); + } + + foreach (var deleteItem in items.WhereDeleted()) + { + var habiticaId = storageClient.Query() + .Where(x => x.PartitionKey == giosUserId && x.RowKey == deleteItem.Id) + .ToList().First().HabiticaId; + await habiticaClient.DeleteTask(habiticaId); + } + + // commit read changes + await todoistIntegration.CommitRead(); + + // return success + return new OkResult(); } private static string GetHabiticaDifficulty(int todoistDifficulty) diff --git a/Habitica.Todoist.Integration.Function.Sync/ScheduledSyncFunction.cs b/Habitica.Todoist.Integration.Function.Sync/ScheduledSyncFunction.cs index 2041757..0fe431c 100644 --- a/Habitica.Todoist.Integration.Function.Sync/ScheduledSyncFunction.cs +++ b/Habitica.Todoist.Integration.Function.Sync/ScheduledSyncFunction.cs @@ -19,9 +19,9 @@ namespace Habitica.Todoist.Integration.Function.Sync { public static Configuration ScheduledConfiguration { get; set; } = new Configuration(); - [Singleton] + [Singleton("SyncLock", SingletonScope.Host)] [FunctionName("ScheduledSyncFunction")] - public static async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log) + public static async Task Run([TimerTrigger("0 0 * * * *")]TimerInfo myTimer, ILogger log) { // initialize all the clients var habiticaClient = new HabiticaServiceClient(ScheduledConfiguration.HabiticaUserId, ScheduledConfiguration.HabiticaApiKey);