2022-06-20 16:42:08 -07:00
import { response } from 'express' ;
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-07-04 00:43:56 -07:00
import { todoistApiRequest , } from './GenericFunctions' ;
2019-11-05 07:17:06 -08:00
2022-06-20 16:42:08 -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 : {
authentication : [
'apiKey' ,
] ,
} ,
} ,
} ,
{
name : 'todoistOAuth2Api' ,
required : true ,
displayOptions : {
show : {
authentication : [
'oAuth2' ,
] ,
} ,
} ,
} ,
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 : {
resource : [
'task' ,
] ,
} ,
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' ,
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' ,
} ,
2020-08-17 13:41:05 -07:00
{
2020-08-26 00:09:07 -07:00
name : 'Delete' ,
value : 'delete' ,
description : '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' ,
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-06-20 16:42:08 -07:00
{
name : 'Move' ,
value : 'move' ,
description : 'Move a task' ,
} ,
2020-08-26 00:09:07 -07:00
{
name : 'Reopen' ,
value : 'reopen' ,
description : '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' ,
} ,
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 : {
resource : [
'task' ,
] ,
operation : [
'delete' ,
'close' ,
'get' ,
'reopen' ,
'update' ,
'move' ,
] ,
} ,
} ,
} ,
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 : {
resource : [
'task' ,
2019-11-06 23:40:12 -08:00
] ,
operation : [
'create' ,
2022-06-20 16:42:08 -07:00
'move' ,
'sync' ,
2020-08-26 00:09:07 -07:00
] ,
2019-11-05 12:56:10 -08:00
} ,
} ,
2020-01-04 20:19:10 -08:00
default : '' ,
2022-06-03 10:23:49 -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/nodes/expressions.html#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 : {
resource : [
'task' ,
] ,
operation : [
'move' ,
] ,
} ,
} ,
default : '' ,
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/nodes/expressions.html#expressions">expression</a>.' ,
} ,
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 : {
resource : [
'task' ,
2019-11-06 23:40:12 -08:00
] ,
operation : [
'create' ,
2020-08-26 00:09:07 -07:00
] ,
2019-11-05 15:50:55 -08:00
} ,
} ,
2019-11-06 23:40:12 -08:00
default : [ ] ,
2022-06-20 07:54:01 -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/nodes/expressions.html#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 : {
resource : [
'task' ,
2019-11-06 23:40:12 -08:00
] ,
operation : [
'create' ,
2020-08-26 00:09:07 -07:00
] ,
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 : {
2020-08-26 00:09:07 -07:00
resource : [
'task' ,
] ,
operation : [
2022-06-20 16:42:08 -07:00
'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 : {
resource : [
'task' ,
2019-11-06 23:40:12 -08:00
] ,
operation : [
'create' ,
2020-08-26 00:09:07 -07:00
] ,
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 : '' ,
description : '2-letter code specifying language in case due_string is not written in English' ,
} ,
2020-08-26 00:09:07 -07:00
{
displayName : 'Due String' ,
name : 'dueString' ,
type : 'string' ,
default : '' ,
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-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' ,
loadOptionsDependsOn : [
'project' ,
'options.section' ,
] ,
} ,
default : { } ,
2022-06-03 10:23:49 -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/nodes/expressions.html#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' ,
loadOptionsDependsOn : [
'project' ,
] ,
} ,
default : { } ,
2022-06-03 10:23:49 -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/nodes/expressions.html#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 : {
operation : [
'getAll' ,
] ,
resource : [
'task' ,
] ,
} ,
} ,
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 : {
operation : [
'getAll' ,
] ,
resource : [
'task' ,
] ,
returnAll : [
false ,
] ,
} ,
} ,
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 : {
resource : [
'task' ,
] ,
operation : [
'getAll' ,
2021-12-19 05:38:51 -08:00
] ,
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 : '' ,
2020-08-26 00:09:07 -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-05-06 14:01:25 -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-06-03 10:23:49 -07:00
description : 'Filter tasks by label. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>.' ,
2020-08-26 00:09:07 -07:00
} ,
{
displayName : 'Lang' ,
name : 'lang' ,
type : 'string' ,
default : '' ,
description : 'IETF language tag defining what language filter is written in, if differs from default English' ,
} ,
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' ,
loadOptionsDependsOn : [
'filters.projectId' ,
'filters.sectionId' ,
] ,
} ,
default : '' ,
2022-06-03 10:23:49 -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/nodes/expressions.html#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-06-03 10:23:49 -07:00
description : 'Filter tasks by project ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/nodes/expressions.html#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' ,
loadOptionsDependsOn : [
'filters.projectId' ,
] ,
} ,
default : '' ,
2022-06-03 10:23:49 -07:00
description : 'Filter tasks by section ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/nodes/expressions.html#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 : {
resource : [
'task' ,
] ,
operation : [
'update' ,
] ,
} ,
} ,
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-05-27 09:15:05 -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-05-27 09:15:05 -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 : '' ,
description : '2-letter code specifying language in case due_string is not written in English' ,
} ,
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' ,
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-05-27 09:15:05 -07:00
const options = Object . assign ( { } ,
this . getNodeParameter ( 'options' , { } ) ,
this . getNodeParameter ( 'filters' , { } ) ,
) as IDataObject ;
const projectId = options . projectId as number ? ?
this . getCurrentNodeParameter ( 'project' ) as number ;
2021-01-31 10:09:24 -08:00
if ( projectId ) {
const qs : IDataObject = { project_id : projectId } ;
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 [ ] = [ ] ;
const options = Object . assign ( { } ,
this . getNodeParameter ( 'options' , { } ) ,
this . getNodeParameter ( 'filters' , { } ) ,
) as IDataObject ;
const projectId = options . projectId as number ? ?
this . getCurrentNodeParameter ( 'project' ) as number ;
const sectionId = options . sectionId as number || options . section as number ||
this . getCurrentNodeParameter ( 'sectionId' ) as number ;
if ( projectId ) {
const qs : IDataObject = sectionId ?
{ project_id : projectId , section_id : sectionId } : { project_id : projectId } ;
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-07-04 00:43:56 -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
}