2022-06-20 16:42:08 -07:00
import { response } from 'express' ;
2022-08-17 08:50:24 -07:00
import { IExecuteFunctions } from 'n8n-core' ;
2020-08-26 00:09:07 -07:00
2019-11-05 07:17:06 -08:00
import {
IDataObject ,
ILoadOptionsFunctions ,
2020-10-01 05:01:39 -07:00
INodeExecutionData ,
2019-11-05 07:17:06 -08:00
INodePropertyOptions ,
2020-10-01 05:01:39 -07:00
INodeType ,
INodeTypeDescription ,
2019-11-05 07:17:06 -08:00
} from 'n8n-workflow' ;
2020-08-26 00:09:07 -07:00
2022-08-17 08:50:24 -07:00
import { todoistApiRequest } from './GenericFunctions' ;
2019-11-05 07:17:06 -08:00
2022-08-17 08:50:24 -07:00
import { OperationType , TodoistService } from './Service' ;
2019-11-06 23:40:12 -08:00
interface IBodyCreateTask {
2021-11-04 19:21:35 -07:00
content? : string ;
2021-06-08 16:55:36 -07:00
description? : string ;
2019-11-06 23:40:12 -08:00
project_id? : number ;
2021-01-31 10:09:24 -08:00
section_id? : number ;
2022-05-27 09:15:05 -07:00
parent_id? : number ;
2019-11-06 23:40:12 -08:00
order? : number ;
label_ids? : number [ ] ;
priority? : number ;
due_string? : string ;
due_datetime? : string ;
due_date? : string ;
due_lang? : string ;
}
2019-11-05 07:17:06 -08:00
2019-11-05 12:56:10 -08:00
export class Todoist implements INodeType {
2019-11-05 07:17:06 -08:00
description : INodeTypeDescription = {
displayName : 'Todoist' ,
name : 'todoist' ,
2021-06-12 12:00:37 -07:00
icon : 'file:todoist.svg' ,
2019-11-05 07:17:06 -08:00
group : [ 'output' ] ,
version : 1 ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
description : 'Consume Todoist API' ,
defaults : {
name : 'Todoist' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'todoistApi' ,
required : true ,
2020-08-26 00:09:07 -07:00
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
authentication : [ 'apiKey' ] ,
2020-08-26 00:09:07 -07:00
} ,
} ,
} ,
{
name : 'todoistOAuth2Api' ,
required : true ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
authentication : [ 'oAuth2' ] ,
2020-08-26 00:09:07 -07:00
} ,
} ,
} ,
2019-11-06 23:40:12 -08:00
] ,
2019-11-05 07:17:06 -08:00
properties : [
2020-08-26 00:09:07 -07:00
{
displayName : 'Authentication' ,
name : 'authentication' ,
type : 'options' ,
options : [
{
name : 'API Key' ,
value : 'apiKey' ,
} ,
{
name : 'OAuth2' ,
value : 'oAuth2' ,
} ,
] ,
default : 'apiKey' ,
} ,
2019-11-06 23:40:12 -08:00
{
2019-11-05 12:56:10 -08:00
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2019-11-05 12:56:10 -08:00
options : [
{
name : 'Task' ,
value : 'task' ,
2022-05-06 14:01:25 -07:00
description : 'Task resource' ,
2019-11-05 12:56:10 -08:00
} ,
] ,
2019-11-06 23:40:12 -08:00
default : 'task' ,
2019-11-05 12:56:10 -08:00
required : true ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2019-11-05 12:56:10 -08:00
required : true ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
2019-11-05 12:56:10 -08:00
} ,
2019-11-05 07:17:06 -08:00
} ,
options : [
2020-08-17 13:41:05 -07:00
{
2020-08-26 00:09:07 -07:00
name : 'Close' ,
value : 'close' ,
description : 'Close a task' ,
2022-07-10 13:50:51 -07:00
action : 'Close a task' ,
2020-08-17 13:41:05 -07:00
} ,
2022-05-27 09:15:05 -07:00
{
name : 'Create' ,
value : 'create' ,
description : 'Create a new task' ,
2022-07-10 13:50:51 -07:00
action : 'Create a task' ,
2022-05-27 09:15:05 -07:00
} ,
2020-08-17 13:41:05 -07:00
{
2020-08-26 00:09:07 -07:00
name : 'Delete' ,
value : 'delete' ,
description : 'Delete a task' ,
2022-07-10 13:50:51 -07:00
action : 'Delete a task' ,
2020-08-17 13:41:05 -07:00
} ,
{
2020-08-26 00:09:07 -07:00
name : 'Get' ,
value : 'get' ,
description : 'Get a task' ,
2022-07-10 13:50:51 -07:00
action : 'Get a task' ,
2020-08-17 13:41:05 -07:00
} ,
{
2020-08-26 00:09:07 -07:00
name : 'Get All' ,
value : 'getAll' ,
description : 'Get all tasks' ,
2022-07-10 13:50:51 -07:00
action : 'Get all tasks' ,
2020-08-26 00:09:07 -07:00
} ,
2022-06-20 16:42:08 -07:00
{
name : 'Move' ,
value : 'move' ,
description : 'Move a task' ,
2022-07-10 13:50:51 -07:00
action : 'Move a task' ,
2022-06-20 16:42:08 -07:00
} ,
2020-08-26 00:09:07 -07:00
{
name : 'Reopen' ,
value : 'reopen' ,
description : 'Reopen a task' ,
2022-07-10 13:50:51 -07:00
action : 'Reopen a task' ,
2020-08-17 13:41:05 -07:00
} ,
2022-06-20 16:42:08 -07:00
// {
// name: 'Sync',
// value: 'sync',
// description: 'Sync a project',
// },
2021-11-04 19:21:35 -07:00
{
name : 'Update' ,
value : 'update' ,
description : 'Update a task' ,
2022-07-10 13:50:51 -07:00
action : 'Update a task' ,
2021-11-04 19:21:35 -07:00
} ,
2019-11-05 07:17:06 -08:00
] ,
2019-11-05 12:56:10 -08:00
default : 'create' ,
2019-11-06 23:40:12 -08:00
} ,
2022-06-20 16:42:08 -07:00
{
displayName : 'Task ID' ,
name : 'taskId' ,
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'delete' , 'close' , 'get' , 'reopen' , 'update' , 'move' ] ,
2022-06-20 16:42:08 -07:00
} ,
} ,
} ,
2019-11-06 23:40:12 -08:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Project Name or ID' ,
2019-11-05 12:56:10 -08:00
name : 'project' ,
2019-11-06 23:40:12 -08:00
type : 'options' ,
typeOptions : {
2019-11-05 12:56:10 -08:00
loadOptionsMethod : 'getProjects' ,
} ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'create' , 'move' , 'sync' ] ,
2019-11-05 12:56:10 -08:00
} ,
} ,
2020-01-04 20:19:10 -08:00
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'The project you want to operate on. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2019-11-05 15:50:55 -08:00
} ,
2022-06-20 16:42:08 -07:00
{
displayName : 'Section Name or ID' ,
name : 'section' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getSections' ,
loadOptionsDependsOn : [ 'project' ] ,
} ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'move' ] ,
2022-06-20 16:42:08 -07:00
} ,
} ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'Section to which you want move the task. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2022-06-20 16:42:08 -07:00
} ,
2019-11-05 15:50:55 -08:00
{
2022-06-20 07:54:01 -07:00
displayName : 'Label Names or IDs' ,
2019-11-05 15:50:55 -08:00
name : 'labels' ,
type : 'multiOptions' ,
typeOptions : {
loadOptionsMethod : 'getLabels' ,
} ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'create' ] ,
2019-11-05 15:50:55 -08:00
} ,
} ,
2019-11-06 23:40:12 -08:00
default : [ ] ,
2022-08-17 08:50:24 -07:00
description :
'Optional labels that will be assigned to a created task. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2019-11-06 23:40:12 -08:00
} ,
{
2019-11-05 12:56:10 -08:00
displayName : 'Content' ,
name : 'content' ,
2019-11-06 23:40:12 -08:00
type : 'string' ,
typeOptions : {
2019-11-05 12:56:10 -08:00
rows : 5 ,
} ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'create' ] ,
2019-11-05 12:56:10 -08:00
} ,
} ,
2020-01-04 20:19:10 -08:00
default : '' ,
2019-11-06 23:40:12 -08:00
required : true ,
2019-11-05 12:56:10 -08:00
description : 'Task content' ,
2019-11-05 15:50:55 -08:00
} ,
2020-08-17 13:41:05 -07:00
{
2022-06-20 16:42:08 -07:00
displayName : 'Sync Commands' ,
name : 'commands' ,
2020-08-17 13:41:05 -07:00
type : 'string' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'sync' ] ,
2020-08-26 00:09:07 -07:00
} ,
} ,
2022-06-20 16:42:08 -07:00
default : '[]' ,
hint : 'See docs for possible commands: https://developer.todoist.com/sync/v8/#sync' ,
description : 'Sync body' ,
2020-08-17 13:41:05 -07:00
} ,
2019-11-06 23:40:12 -08:00
{
2020-08-26 00:09:07 -07:00
displayName : 'Additional Fields' ,
2019-11-05 12:56:10 -08:00
name : 'options' ,
type : 'collection' ,
placeholder : 'Add Option' ,
default : { } ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'create' ] ,
2019-11-05 12:56:10 -08:00
} ,
} ,
options : [
2021-06-08 16:55:36 -07:00
{
displayName : 'Description' ,
name : 'description' ,
type : 'string' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'A description for the task' ,
2021-06-08 16:55:36 -07:00
} ,
2020-08-26 00:09:07 -07:00
{
displayName : 'Due Date Time' ,
name : 'dueDateTime' ,
type : 'dateTime' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'Specific date and time in RFC3339 format in UTC' ,
2020-08-26 00:09:07 -07:00
} ,
2022-05-27 09:15:05 -07:00
{
displayName : 'Due String Locale' ,
name : 'dueLang' ,
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'2-letter code specifying language in case due_string is not written in English' ,
2022-05-27 09:15:05 -07:00
} ,
2020-08-26 00:09:07 -07:00
{
displayName : 'Due String' ,
name : 'dueString' ,
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'Human defined task due date (ex.: “next Monday”, “Tomorrow”). Value is set using local (not UTC) time.' ,
2020-08-26 00:09:07 -07:00
} ,
2021-12-19 03:41:19 -08:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Parent Name or ID' ,
2022-05-27 09:15:05 -07:00
name : 'parentId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getItems' ,
2022-08-17 08:50:24 -07:00
loadOptionsDependsOn : [ 'project' , 'options.section' ] ,
2022-05-27 09:15:05 -07:00
} ,
default : { } ,
2022-08-17 08:50:24 -07:00
description :
'The parent task you want to operate on. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2021-12-19 03:41:19 -08:00
} ,
2019-11-05 12:56:10 -08:00
{
displayName : 'Priority' ,
name : 'priority' ,
2019-11-06 23:40:12 -08:00
type : 'number' ,
typeOptions : {
maxValue : 4 ,
minValue : 1 ,
} ,
2019-11-05 12:56:10 -08:00
default : 1 ,
2022-05-06 14:01:25 -07:00
description : 'Task priority from 1 (normal) to 4 (urgent)' ,
2019-11-06 23:40:12 -08:00
} ,
2021-01-31 10:09:24 -08:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Section Name or ID' ,
2021-01-31 10:09:24 -08:00
name : 'section' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getSections' ,
2022-08-17 08:50:24 -07:00
loadOptionsDependsOn : [ 'project' ] ,
2021-01-31 10:09:24 -08:00
} ,
default : { } ,
2022-08-17 08:50:24 -07:00
description :
'The section you want to operate on. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2021-01-31 10:09:24 -08:00
} ,
2020-08-26 00:09:07 -07:00
] ,
} ,
{
displayName : 'Return All' ,
name : 'returnAll' ,
type : 'boolean' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
operation : [ 'getAll' ] ,
resource : [ 'task' ] ,
2020-08-26 00:09:07 -07:00
} ,
} ,
default : false ,
2022-05-06 14:01:25 -07:00
description : 'Whether to return all results or only up to a given limit' ,
2020-08-26 00:09:07 -07:00
} ,
{
displayName : 'Limit' ,
name : 'limit' ,
type : 'number' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
operation : [ 'getAll' ] ,
resource : [ 'task' ] ,
returnAll : [ false ] ,
2020-08-26 00:09:07 -07:00
} ,
} ,
typeOptions : {
minValue : 1 ,
maxValue : 500 ,
} ,
2022-05-27 09:15:05 -07:00
default : 50 ,
2022-05-06 14:01:25 -07:00
description : 'Max number of results to return' ,
2020-08-26 00:09:07 -07:00
} ,
{
displayName : 'Filters' ,
name : 'filters' ,
type : 'collection' ,
placeholder : 'Add Option' ,
default : { } ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'getAll' ] ,
2020-08-26 00:09:07 -07:00
} ,
} ,
options : [
2019-11-06 23:40:12 -08:00
{
2020-08-26 00:09:07 -07:00
displayName : 'Filter' ,
name : 'filter' ,
type : 'string' ,
2019-11-05 12:56:10 -08:00
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'Filter by any <a href="https://get.todoist.help/hc/en-us/articles/205248842">supported filter.</a>' ,
2019-11-05 12:56:10 -08:00
} ,
{
2020-08-26 00:09:07 -07:00
displayName : 'IDs' ,
name : 'ids' ,
2019-11-06 23:40:12 -08:00
type : 'string' ,
2019-11-05 12:56:10 -08:00
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'A list of the task IDs to retrieve, this should be a comma-separated list' ,
2019-11-05 12:56:10 -08:00
} ,
2020-08-26 00:09:07 -07:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Label Name or ID' ,
2020-08-26 00:09:07 -07:00
name : 'labelId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getLabels' ,
} ,
default : { } ,
2022-08-17 08:50:24 -07:00
description :
'Filter tasks by label. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2020-08-26 00:09:07 -07:00
} ,
{
displayName : 'Lang' ,
name : 'lang' ,
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'IETF language tag defining what language filter is written in, if differs from default English' ,
2020-08-26 00:09:07 -07:00
} ,
2022-05-27 09:15:05 -07:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Parent Name or ID' ,
2022-05-27 09:15:05 -07:00
name : 'parentId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getItems' ,
2022-08-17 08:50:24 -07:00
loadOptionsDependsOn : [ 'filters.projectId' , 'filters.sectionId' ] ,
2022-05-27 09:15:05 -07:00
} ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'Filter tasks by parent task ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2022-05-27 09:15:05 -07:00
} ,
2020-08-26 00:09:07 -07:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Project Name or ID' ,
2020-08-26 00:09:07 -07:00
name : 'projectId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getProjects' ,
} ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'Filter tasks by project ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2020-08-26 00:09:07 -07:00
} ,
2022-05-27 09:15:05 -07:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Section Name or ID' ,
2022-05-27 09:15:05 -07:00
name : 'sectionId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getSections' ,
2022-08-17 08:50:24 -07:00
loadOptionsDependsOn : [ 'filters.projectId' ] ,
2022-05-27 09:15:05 -07:00
} ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'Filter tasks by section ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2022-05-27 09:15:05 -07:00
} ,
2020-08-26 00:09:07 -07:00
] ,
} ,
2021-11-04 19:21:35 -07:00
{
displayName : 'Update Fields' ,
name : 'updateFields' ,
type : 'collection' ,
placeholder : 'Add Field' ,
default : { } ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'task' ] ,
operation : [ 'update' ] ,
2021-11-04 19:21:35 -07:00
} ,
} ,
options : [
{
displayName : 'Content' ,
name : 'content' ,
type : 'string' ,
default : '' ,
description : 'Task content' ,
} ,
{
displayName : 'Description' ,
name : 'description' ,
type : 'string' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'A description for the task' ,
2021-11-04 19:21:35 -07:00
} ,
{
displayName : 'Due Date Time' ,
name : 'dueDateTime' ,
type : 'dateTime' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'Specific date and time in RFC3339 format in UTC' ,
2021-11-04 19:21:35 -07:00
} ,
{
2022-05-27 09:15:05 -07:00
displayName : 'Due String Locale' ,
name : 'dueLang' ,
2021-11-04 19:21:35 -07:00
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'2-letter code specifying language in case due_string is not written in English' ,
2021-11-04 19:21:35 -07:00
} ,
2021-12-19 03:41:19 -08:00
{
2022-05-27 09:15:05 -07:00
displayName : 'Due String' ,
name : 'dueString' ,
2021-12-19 03:41:19 -08:00
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'Human defined task due date (ex.: “next Monday”, “Tomorrow”). Value is set using local (not UTC) time.' ,
2021-12-19 03:41:19 -08:00
} ,
2022-06-20 16:42:08 -07:00
{
displayName : 'Due String Locale' ,
name : 'dueLang' ,
type : 'string' ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'2-letter code specifying language in case due_string is not written in English' ,
2022-06-20 16:42:08 -07:00
} ,
2021-11-04 19:21:35 -07:00
{
2022-06-20 07:54:01 -07:00
displayName : 'Label Names or IDs' ,
2021-11-04 19:21:35 -07:00
name : 'labels' ,
type : 'multiOptions' ,
2022-08-17 08:50:24 -07:00
description :
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>' ,
2021-11-04 19:21:35 -07:00
typeOptions : {
loadOptionsMethod : 'getLabels' ,
} ,
default : [ ] ,
} ,
{
displayName : 'Priority' ,
name : 'priority' ,
type : 'number' ,
typeOptions : {
maxValue : 4 ,
minValue : 1 ,
} ,
default : 1 ,
2022-05-06 14:01:25 -07:00
description : 'Task priority from 1 (normal) to 4 (urgent)' ,
2021-11-04 19:21:35 -07:00
} ,
] ,
} ,
2020-08-26 00:09:07 -07:00
] ,
2019-11-06 23:40:12 -08:00
} ;
2019-11-05 07:17:06 -08:00
2019-11-06 23:40:12 -08:00
methods = {
2019-11-05 12:56:10 -08:00
loadOptions : {
// Get all the available projects to display them to user so that he can
// select them easily
async getProjects ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const returnData : INodePropertyOptions [ ] = [ ] ;
2020-08-26 00:09:07 -07:00
const projects = await todoistApiRequest . call ( this , 'GET' , '/projects' ) ;
2019-11-05 12:56:10 -08:00
for ( const project of projects ) {
const projectName = project . name ;
const projectId = project . id ;
returnData . push ( {
name : projectName ,
value : projectId ,
} ) ;
}
2019-11-06 23:40:12 -08:00
return returnData ;
2019-11-05 15:50:55 -08:00
} ,
2021-01-31 10:09:24 -08:00
// Get all the available sections in the selected project, to display them
// to user so that he can select one easily
async getSections ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const returnData : INodePropertyOptions [ ] = [ ] ;
2022-08-17 08:50:24 -07:00
const options = Object . assign (
{ } ,
2022-05-27 09:15:05 -07:00
this . getNodeParameter ( 'options' , { } ) ,
this . getNodeParameter ( 'filters' , { } ) ,
2022-08-17 08:50:24 -07:00
) as IDataObject ;
2022-05-27 09:15:05 -07:00
2022-08-17 08:50:24 -07:00
const projectId =
( options . projectId as number ) ? ? ( this . getCurrentNodeParameter ( 'project' ) as number ) ;
2021-01-31 10:09:24 -08:00
if ( projectId ) {
2022-08-17 08:50:24 -07:00
const qs : IDataObject = { project_id : projectId } ;
2021-01-31 10:09:24 -08:00
const sections = await todoistApiRequest . call ( this , 'GET' , '/sections' , { } , qs ) ;
for ( const section of sections ) {
const sectionName = section . name ;
const sectionId = section . id ;
returnData . push ( {
name : sectionName ,
value : sectionId ,
} ) ;
}
}
return returnData ;
} ,
2022-05-27 09:15:05 -07:00
// Get all the available parents in the selected project and section,
// to display them to user so that they can select one easily
async getItems ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const returnData : INodePropertyOptions [ ] = [ ] ;
2022-08-17 08:50:24 -07:00
const options = Object . assign (
{ } ,
2022-05-27 09:15:05 -07:00
this . getNodeParameter ( 'options' , { } ) ,
this . getNodeParameter ( 'filters' , { } ) ,
2022-08-17 08:50:24 -07:00
) as IDataObject ;
2022-05-27 09:15:05 -07:00
2022-08-17 08:50:24 -07:00
const projectId =
( options . projectId as number ) ? ? ( this . getCurrentNodeParameter ( 'project' ) as number ) ;
2022-05-27 09:15:05 -07:00
2022-08-17 08:50:24 -07:00
const sectionId =
( options . sectionId as number ) ||
( options . section as number ) ||
( this . getCurrentNodeParameter ( 'sectionId' ) as number ) ;
2022-05-27 09:15:05 -07:00
if ( projectId ) {
2022-08-17 08:50:24 -07:00
const qs : IDataObject = sectionId
? { project_id : projectId , section_id : sectionId }
: { project_id : projectId } ;
2022-05-27 09:15:05 -07:00
const items = await todoistApiRequest . call ( this , 'GET' , '/tasks' , { } , qs ) ;
for ( const item of items ) {
const itemContent = item . content ;
const itemId = item . id ;
returnData . push ( {
name : itemContent ,
value : itemId ,
} ) ;
}
}
return returnData ;
} ,
2019-11-05 15:50:55 -08:00
// Get all the available labels to display them to user so that he can
// select them easily
async getLabels ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const returnData : INodePropertyOptions [ ] = [ ] ;
2020-08-26 00:09:07 -07:00
const labels = await todoistApiRequest . call ( this , 'GET' , '/labels' ) ;
2019-11-05 15:50:55 -08:00
for ( const label of labels ) {
const labelName = label . name ;
const labelId = label . id ;
returnData . push ( {
name : labelName ,
value : labelId ,
} ) ;
}
2019-11-06 23:40:12 -08:00
return returnData ;
2020-10-22 06:46:03 -07:00
} ,
} ,
2019-11-06 23:40:12 -08:00
} ;
2020-08-26 00:09:07 -07:00
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
2022-04-22 09:29:51 -07:00
const length = items . length ;
2022-06-20 16:42:08 -07:00
const service = new TodoistService ( ) ;
2020-08-26 00:09:07 -07:00
let responseData ;
2020-08-26 00:28:39 -07:00
const resource = this . getNodeParameter ( 'resource' , 0 ) as string ;
const operation = this . getNodeParameter ( 'operation' , 0 ) as string ;
2020-08-26 00:09:07 -07:00
for ( let i = 0 ; i < length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
if ( resource === 'task' ) {
2022-08-17 08:50:24 -07:00
responseData = await service . execute (
this ,
OperationType [ operation as keyof typeof OperationType ] ,
i ,
) ;
2020-08-26 00:09:07 -07:00
}
2022-06-20 16:42:08 -07:00
if ( Array . isArray ( responseData ? . data ) ) {
returnData . push . apply ( returnData , responseData ? . data as IDataObject [ ] ) ;
2021-07-19 23:58:54 -07:00
} else {
2022-06-20 16:42:08 -07:00
if ( responseData ? . hasOwnProperty ( 'success' ) ) {
returnData . push ( { success : responseData.success } ) ;
} else {
returnData . push ( responseData ? . data as IDataObject ) ;
}
2020-08-26 00:09:07 -07:00
}
2021-07-19 23:58:54 -07:00
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { error : error.message } ) ;
continue ;
}
throw error ;
2020-08-26 00:09:07 -07:00
}
2019-11-05 12:56:10 -08:00
}
2020-08-26 00:09:07 -07:00
return [ this . helpers . returnJsonArray ( returnData ) ] ;
2019-11-05 07:17:06 -08:00
}
2020-08-26 00:09:07 -07:00
}