From 00cf41ed19031bdac95b3925fef79005ac7e85a6 Mon Sep 17 00:00:00 2001 From: victor Date: Mon, 23 Oct 2023 19:40:12 +0200 Subject: [PATCH] add tasks API --- .../googlecalsync/+page.svelte" | 184 ++++++++++++++---- 1 file changed, 145 insertions(+), 39 deletions(-) diff --git "a/src/routes/v\303\246rkt\303\270jer/googlecalsync/+page.svelte" "b/src/routes/v\303\246rkt\303\270jer/googlecalsync/+page.svelte" index 1b21db7b..0168dad8 100644 --- "a/src/routes/v\303\246rkt\303\270jer/googlecalsync/+page.svelte" +++ "b/src/routes/v\303\246rkt\303\270jer/googlecalsync/+page.svelte" @@ -14,12 +14,14 @@ let gIsInitialized = false; let loggedin = false; - let responseObj = {}; + const responseObj = {}; let turn = 0; $: isModulerSynced = true; $: isOpgaverSynced = false; + // if one is true, the other is false + // weeknr = url param "week" let weeknr = new URLSearchParams(window.location.search).get('week'); @@ -52,9 +54,9 @@ const start = async() => { const CLIENT_ID = '24684948206-14gdudquegcmmekdkfk2ud0isq4i2bnj.apps.googleusercontent.com'; - const API_KEY = 'AIzaSyA8zKy_id5K_c7_HvmueBjRf_EB-8n0-z4'; - const DISCOVERY_DOCS = ['https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest']; - const SCOPES = 'https://www.googleapis.com/auth/calendar'; + const API_KEY = 'AIzaSyDW02jMJFpHyJuvHG_IgXAvJQsnqy0EWiQ'; + const DISCOVERY_DOCS = ['https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest', 'https://www.googleapis.com/discovery/v1/apis/tasks/v1/rest']; + const SCOPES = 'https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/tasks'; // document.getElementById('authorize_button').style.visibility = 'hidden'; // document.getElementById('signout_button').style.visibility = 'hidden'; @@ -176,6 +178,16 @@ return [formattedStartDate, formattedEndDate]; } + function convertLectioTimeSingle(dateString) { + const [startDay, startMonth, startYear, startHour, startMinute] = dateString.match(/\d+/gu); + + // month is 0-indexed + const startDate = new Date(startYear, startMonth - 1, startDay, startHour, startMinute, 0); + + const formattedStartDate = startDate.toISOString(); + return formattedStartDate; + } + function formatModuler(moduler) { const events = []; moduler.forEach(modul => { @@ -193,6 +205,26 @@ return events; } + function formatOpgaver(opgaver) { + const tasks = []; + opgaver.forEach(opgave => { + const dueDate = convertLectioTimeSingle(opgave.frist); + tasks.push({ + kind: 'tasks#task', + etag: `betlec${opgave.exerciseid }`, + title: opgave.opgavetitel, + updated: new Date().toDateString(), + notes: `${opgave.opgavenote === '' ? 'ingen opgavenote' : opgave.opgavenote }\nlink: https://app.betterlectio.dk/opgave?exerciseid=${opgave.exerciseid}\n\nikke slet (betterlectio${ opgave.exerciseid})`, + status: opgave.status === 'Venter' ? 'needsAction' : 'completed', + due: dueDate, + completed: opgave.status === 'Afleveret' ? opgave.dueDate : null, + deleted: false, + hidden: false + }); + }); + return tasks; + } + async function pushEvents(events) { const batch = window.gapi.client.newBatch(); events.forEach(event => { @@ -200,7 +232,21 @@ }); await batch.then(response => { console.log(response.result); - responseObj = response.result; + }).catch(err => { + console.error(err); + }); + } + + async function pushTasks(tasks) { + let _tasks = tasks; + if (tasks.length > 50) _tasks = tasks.slice(-50); + + const batch = window.gapi.client.newBatch(); + _tasks.forEach(task => { + batch.add(window.gapi.client.tasks.tasks.insert({ tasklist: '@default', resource: task })); + }); + await batch.then(response => { + console.log(response.result); }).catch(err => { console.error(err); }); @@ -231,14 +277,44 @@ }); await batch.then(response => { console.log(response.result); - responseObj = response.result; + }).catch(err => { + console.error(err); + }); + } + + async function removeOldTasks() { + // get the list of events from the calendar for that week + const response = await window.gapi.client.tasks.tasks.list({ + tasklist: '@default', + showCompleted: true, + showHidden: true, + showDeleted: false, + maxResults: 10000 + }); + const { items } = response.result; + console.log(items); + const betterlectioTasks = items.filter(item => { + if (item.notes === undefined) return false; + return item.notes.includes('betterlectio'); + }); + console.log(betterlectioTasks); + + if (betterlectioTasks.length === 0) return; + + console.log(`removing ${betterlectioTasks.length} old tasks ahead of sync`); + const batch = window.gapi.client.newBatch(); + betterlectioTasks.forEach(task => { + batch.add(window.gapi.client.tasks.tasks.delete({ tasklist: '@default', task: task.id })); + }); + await batch.then(response => { + console.log(response.result); }).catch(err => { console.error(err); }); } let skemaLoaded = false; - let OpgaverLoaded = false; + let opgaverLoaded = false; let SyncLoaded = false; async function getSkema(weekNumber) { @@ -250,23 +326,29 @@ } async function getOpgaver() { - // eslint-disable-next-line no-warning-comments - // todo: make it work - - // as a temp solution, just return an empty array after waiting 1 second - - await new Promise(resolve => setTimeout(resolve, 1000)); - OpgaverLoaded = true; - return ['TODO']; + const opgaver = await get('/opgaver'); + opgaverLoaded = true; + return opgaver; } async function sync() { const start = Date.now(); const [moduler, opgaver] = await Promise.all([getSkema(weeknr), getOpgaver()]); - console.log(`time to fetch data: ${Date.now() - start}ms`); - const events = formatModuler(moduler); - await removeOldEvents(weeknr); - await pushEvents(events); - console.log(`time to sync events: ${Date.now() - start}ms`); + console.log(opgaver); + if (isModulerSynced) { + console.log(`time to fetch moduler: ${Date.now() - start}ms`); + const events = formatModuler(moduler); + await removeOldEvents(weeknr); + await pushEvents(events); + console.log(`time to sync events: ${Date.now() - start}ms`); + } + if (isOpgaverSynced) { + console.log(`time to fetch opgaver: ${Date.now() - start}ms`); + const tasks = formatOpgaver(opgaver); + await removeOldTasks(); + await pushTasks(tasks); + console.log(`time to sync tasks: ${Date.now() - start}ms`); + } + SyncLoaded = true; turn = 5; } @@ -337,16 +419,23 @@
+

+ på nuværende tidspunkt skal du vælge enten moduler eller opgaver, ikke begge to. det er en begrænsning i google api'et. +

-
@@ -370,10 +459,19 @@
+ {#if isOpgaverSynced} +

+ Ugenummer er kun gældende for moduler og ikke opgaver, det er kun de seneste 50 opgaver i Lectio, der bliver synkroniseret. (hvis du kun synkroniserer opgaver, er denne indstilling ligegyldig) +

+ {/if}