diff --git a/packages/backend/src/apps/google-tasks/actions/create-task-list/index.js b/packages/backend/src/apps/google-tasks/actions/create-task-list/index.js
new file mode 100644
index 00000000..0d2571bd
--- /dev/null
+++ b/packages/backend/src/apps/google-tasks/actions/create-task-list/index.js
@@ -0,0 +1,31 @@
+import defineAction from '../../../../helpers/define-action.js';
+
+export default defineAction({
+ name: 'Create task list',
+ key: 'createTaskList',
+ description: 'Creates a new task list.',
+ arguments: [
+ {
+ label: 'List Title',
+ key: 'listTitle',
+ type: 'string',
+ required: true,
+ description: '',
+ variables: true,
+ },
+ ],
+
+ async run($) {
+ const listTitle = $.step.parameters.listTitle;
+
+ const body = {
+ title: listTitle,
+ };
+
+ const { data } = await $.http.post('/tasks/v1/users/@me/lists', body);
+
+ $.setActionItem({
+ raw: data,
+ });
+ },
+});
diff --git a/packages/backend/src/apps/google-tasks/actions/create-task/index.js b/packages/backend/src/apps/google-tasks/actions/create-task/index.js
new file mode 100644
index 00000000..2b03a20e
--- /dev/null
+++ b/packages/backend/src/apps/google-tasks/actions/create-task/index.js
@@ -0,0 +1,70 @@
+import defineAction from '../../../../helpers/define-action.js';
+
+export default defineAction({
+ name: 'Create task',
+ key: 'createTask',
+ description: 'Creates a new task.',
+ arguments: [
+ {
+ label: 'Task List',
+ key: 'taskListId',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listTaskLists',
+ },
+ ],
+ },
+ },
+ {
+ label: 'Title',
+ key: 'title',
+ type: 'string',
+ required: true,
+ description: '',
+ variables: true,
+ },
+ {
+ label: 'Notes',
+ key: 'notes',
+ type: 'string',
+ required: false,
+ description: '',
+ variables: true,
+ },
+ {
+ label: 'Due Date',
+ key: 'due',
+ type: 'string',
+ required: false,
+ description: 'RFC 3339 timestamp.',
+ variables: true,
+ },
+ ],
+
+ async run($) {
+ const { taskListId, title, notes, due } = $.step.parameters;
+
+ const body = {
+ title,
+ notes,
+ due,
+ };
+
+ const { data } = await $.http.post(
+ `/tasks/v1/lists/${taskListId}/tasks`,
+ body
+ );
+
+ $.setActionItem({
+ raw: data,
+ });
+ },
+});
diff --git a/packages/backend/src/apps/google-tasks/actions/index.js b/packages/backend/src/apps/google-tasks/actions/index.js
index 5a5941db..ed71df70 100644
--- a/packages/backend/src/apps/google-tasks/actions/index.js
+++ b/packages/backend/src/apps/google-tasks/actions/index.js
@@ -1,4 +1,6 @@
+import createTask from './create-task/index.js';
+import createTaskList from './create-task-list/index.js';
import findTask from './find-task/index.js';
import updateTask from './update-task/index.js';
-export default [findTask, updateTask];
+export default [createTask, createTaskList, findTask, updateTask];
diff --git a/packages/backend/src/apps/google-tasks/triggers/index.js b/packages/backend/src/apps/google-tasks/triggers/index.js
new file mode 100644
index 00000000..3677b97c
--- /dev/null
+++ b/packages/backend/src/apps/google-tasks/triggers/index.js
@@ -0,0 +1,5 @@
+import newCompletedTasks from './new-completed-tasks/index.js';
+import newTaskLists from './new-task-lists/index.js';
+import newTasks from './new-tasks/index.js';
+
+export default [newCompletedTasks, newTaskLists, newTasks];
diff --git a/packages/backend/src/apps/google-tasks/triggers/new-completed-tasks/index.js b/packages/backend/src/apps/google-tasks/triggers/new-completed-tasks/index.js
new file mode 100644
index 00000000..155d353b
--- /dev/null
+++ b/packages/backend/src/apps/google-tasks/triggers/new-completed-tasks/index.js
@@ -0,0 +1,59 @@
+import defineTrigger from '../../../../helpers/define-trigger.js';
+
+export default defineTrigger({
+ name: 'New completed tasks',
+ key: 'newTasks',
+ pollInterval: 15,
+ description: 'Triggers when a task is finished within a specified task list.',
+ arguments: [
+ {
+ label: 'Task List',
+ key: 'taskListId',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listTaskLists',
+ },
+ ],
+ },
+ },
+ ],
+
+ async run($) {
+ const taskListId = $.step.parameters.taskListId;
+
+ const params = {
+ maxResults: 100,
+ showCompleted: true,
+ showHidden: true,
+ pageToken: undefined,
+ };
+
+ do {
+ const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`, {
+ params,
+ });
+ params.pageToken = data.nextPageToken;
+
+ if (data.items?.length) {
+ for (const task of data.items) {
+ if (task.status === 'completed') {
+ $.pushTriggerItem({
+ raw: task,
+ meta: {
+ internalId: task.etag,
+ },
+ });
+ }
+ }
+ }
+ } while (params.pageToken);
+ },
+});
diff --git a/packages/backend/src/apps/google-tasks/triggers/new-task-lists/index.js b/packages/backend/src/apps/google-tasks/triggers/new-task-lists/index.js
new file mode 100644
index 00000000..3835f28f
--- /dev/null
+++ b/packages/backend/src/apps/google-tasks/triggers/new-task-lists/index.js
@@ -0,0 +1,31 @@
+import defineTrigger from '../../../../helpers/define-trigger.js';
+
+export default defineTrigger({
+ name: 'New task lists',
+ key: 'newTaskLists',
+ pollInterval: 15,
+ description: 'Triggers when a new task list is created.',
+
+ async run($) {
+ const params = {
+ maxResults: 100,
+ pageToken: undefined,
+ };
+
+ do {
+ const { data } = await $.http.get('/tasks/v1/users/@me/lists');
+ params.pageToken = data.nextPageToken;
+
+ if (data.items?.length) {
+ for (const taskList of data.items.reverse()) {
+ $.pushTriggerItem({
+ raw: taskList,
+ meta: {
+ internalId: taskList.etag,
+ },
+ });
+ }
+ }
+ } while (params.pageToken);
+ },
+});
diff --git a/packages/backend/src/apps/google-tasks/triggers/new-tasks/index.js b/packages/backend/src/apps/google-tasks/triggers/new-tasks/index.js
new file mode 100644
index 00000000..0b88b330
--- /dev/null
+++ b/packages/backend/src/apps/google-tasks/triggers/new-tasks/index.js
@@ -0,0 +1,53 @@
+import defineTrigger from '../../../../helpers/define-trigger.js';
+
+export default defineTrigger({
+ name: 'New tasks',
+ key: 'newTasks',
+ pollInterval: 15,
+ description: 'Triggers when a new task is created.',
+ arguments: [
+ {
+ label: 'Task List',
+ key: 'taskListId',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listTaskLists',
+ },
+ ],
+ },
+ },
+ ],
+
+ async run($) {
+ const taskListId = $.step.parameters.taskListId;
+
+ const params = {
+ maxResults: 100,
+ pageToken: undefined,
+ };
+
+ do {
+ const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`);
+ params.pageToken = data.nextPageToken;
+
+ if (data.items?.length) {
+ for (const task of data.items) {
+ $.pushTriggerItem({
+ raw: task,
+ meta: {
+ internalId: task.etag,
+ },
+ });
+ }
+ }
+ } while (params.pageToken);
+ },
+});
diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js
index 868fa5b2..a37c1ddd 100644
--- a/packages/docs/pages/.vitepress/config.js
+++ b/packages/docs/pages/.vitepress/config.js
@@ -174,6 +174,7 @@ export default defineConfig({
collapsible: true,
collapsed: true,
items: [
+ { text: 'Triggers', link: '/apps/google-tasks/triggers' },
{ text: 'Actions', link: '/apps/google-tasks/actions' },
{ text: 'Connection', link: '/apps/google-tasks/connection' },
],
diff --git a/packages/docs/pages/apps/google-tasks/actions.md b/packages/docs/pages/apps/google-tasks/actions.md
index f53be795..30446b0d 100644
--- a/packages/docs/pages/apps/google-tasks/actions.md
+++ b/packages/docs/pages/apps/google-tasks/actions.md
@@ -1,6 +1,10 @@
---
favicon: /favicons/google-tasks.svg
items:
+ - name: Create task
+ desc: Creates a new task.
+ - name: Create task list
+ desc: Creates a new task list.
- name: Find task
desc: Looking for an incomplete task.
- name: Update task
diff --git a/packages/docs/pages/apps/google-tasks/triggers.md b/packages/docs/pages/apps/google-tasks/triggers.md
new file mode 100644
index 00000000..3c6bf3b2
--- /dev/null
+++ b/packages/docs/pages/apps/google-tasks/triggers.md
@@ -0,0 +1,16 @@
+---
+favicon: /favicons/google-tasks.svg
+items:
+ - name: New completed tasks
+ desc: Triggers when a task is finished within a specified task list.
+ - name: New task lists
+ desc: Triggers when a new task list is created.
+ - name: New tasks
+ desc: Triggers when a new task is created.
+---
+
+
+
+