2020-08-26 00:09:07 -07:00
import {
IExecuteFunctions ,
2019-11-05 07:17:06 -08:00
} 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
2019-11-05 07:17:06 -08:00
import {
2021-12-19 03:41:19 -08:00
FormatDueDatetime ,
2021-12-19 05:38:51 -08:00
todoistApiRequest ,
2019-11-05 07:17:06 -08:00
} from './GenericFunctions' ;
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' ,
} ,
{
name : 'Reopen' ,
value : 'reopen' ,
description : 'Reopen a task' ,
2020-08-17 13:41:05 -07:00
} ,
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-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' ,
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
} ,
{
displayName : 'Labels' ,
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-05-27 09:15:05 -07:00
description : 'Optional labels that will be assigned to a created task' ,
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
{
2020-08-26 00:09:07 -07:00
displayName : 'Task ID' ,
name : 'taskId' ,
2020-08-17 13:41:05 -07:00
type : 'string' ,
default : '' ,
required : true ,
displayOptions : {
show : {
2020-08-26 00:09:07 -07:00
resource : [
'task' ,
] ,
operation : [
'delete' ,
'close' ,
'get' ,
'reopen' ,
2021-11-04 19:21:35 -07:00
'update' ,
2020-08-26 00:09:07 -07:00
] ,
} ,
} ,
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
} ,
2021-11-04 19:21:35 -07:00
{
displayName : 'Labels' ,
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 ;
2020-08-26 00:09:07 -07:00
const qs : IDataObject = { } ;
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 ++ ) {
2019-11-05 12:56:10 -08:00
2021-07-19 23:58:54 -07:00
try {
if ( resource === 'task' ) {
if ( operation === 'create' ) {
//https://developer.todoist.com/rest/v1/#create-a-new-task
const content = this . getNodeParameter ( 'content' , i ) as string ;
const projectId = this . getNodeParameter ( 'project' , i ) as number ;
const labels = this . getNodeParameter ( 'labels' , i ) as number [ ] ;
const options = this . getNodeParameter ( 'options' , i ) as IDataObject ;
2021-11-04 19:21:35 -07:00
2021-07-19 23:58:54 -07:00
const body : IBodyCreateTask = {
content ,
project_id : projectId ,
priority : ( options . priority ! ) ? parseInt ( options . priority as string , 10 ) : 1 ,
} ;
2021-11-04 19:21:35 -07:00
2021-07-19 23:58:54 -07:00
if ( options . description ) {
body . description = options . description as string ;
}
2021-11-04 19:21:35 -07:00
2021-07-19 23:58:54 -07:00
if ( options . dueDateTime ) {
2021-12-19 03:41:19 -08:00
body . due_datetime = FormatDueDatetime ( options . dueDateTime as string ) ;
2021-07-19 23:58:54 -07:00
}
2021-11-04 19:21:35 -07:00
2021-07-19 23:58:54 -07:00
if ( options . dueString ) {
body . due_string = options . dueString as string ;
}
2021-11-04 19:21:35 -07:00
2021-12-19 03:41:19 -08:00
if ( options . dueLang ) {
body . due_lang = options . dueLang as string ;
}
2021-07-19 23:58:54 -07:00
if ( labels !== undefined && labels . length !== 0 ) {
2022-05-27 09:15:05 -07:00
body . label_ids = labels as number [ ] ;
2021-07-19 23:58:54 -07:00
}
2021-11-04 19:21:35 -07:00
2021-07-19 23:58:54 -07:00
if ( options . section ) {
body . section_id = options . section as number ;
}
2021-11-04 19:21:35 -07:00
2022-05-27 09:15:05 -07:00
if ( options . parentId ) {
body . parent_id = options . parentId as number ;
}
2021-07-19 23:58:54 -07:00
responseData = await todoistApiRequest . call ( this , 'POST' , '/tasks' , body ) ;
2021-06-08 16:55:36 -07:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'close' ) {
//https://developer.todoist.com/rest/v1/#close-a-task
const id = this . getNodeParameter ( 'taskId' , i ) as string ;
2021-06-08 16:55:36 -07:00
2021-07-19 23:58:54 -07:00
responseData = await todoistApiRequest . call ( this , 'POST' , ` /tasks/ ${ id } /close ` ) ;
2020-08-26 00:28:39 -07:00
2021-07-19 23:58:54 -07:00
responseData = { success : true } ;
2020-08-26 00:28:39 -07:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'delete' ) {
//https://developer.todoist.com/rest/v1/#delete-a-task
const id = this . getNodeParameter ( 'taskId' , i ) as string ;
2019-11-05 12:56:10 -08:00
2021-07-19 23:58:54 -07:00
responseData = await todoistApiRequest . call ( this , 'DELETE' , ` /tasks/ ${ id } ` ) ;
2020-08-26 00:09:07 -07:00
2021-07-19 23:58:54 -07:00
responseData = { success : true } ;
2020-08-26 00:09:07 -07:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'get' ) {
//https://developer.todoist.com/rest/v1/#get-an-active-task
const id = this . getNodeParameter ( 'taskId' , i ) as string ;
responseData = await todoistApiRequest . call ( this , 'GET' , ` /tasks/ ${ id } ` ) ;
2020-08-26 00:09:07 -07:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'getAll' ) {
//https://developer.todoist.com/rest/v1/#get-active-tasks
const returnAll = this . getNodeParameter ( 'returnAll' , i ) as boolean ;
2022-05-27 09:15:05 -07:00
const filters = this . getNodeParameter ( 'filters' , i , { } ) as IDataObject ;
2021-07-19 23:58:54 -07:00
if ( filters . projectId ) {
qs . project_id = filters . projectId as string ;
}
2022-05-27 09:15:05 -07:00
if ( filters . sectionId ) {
qs . section_id = filters . sectionId as string ;
}
if ( filters . parentId ) {
qs . parent_id = filters . parentId as string ;
}
2021-07-19 23:58:54 -07:00
if ( filters . labelId ) {
qs . label_id = filters . labelId as string ;
}
if ( filters . filter ) {
qs . filter = filters . filter as string ;
}
if ( filters . lang ) {
qs . lang = filters . lang as string ;
}
if ( filters . ids ) {
qs . ids = filters . ids as string ;
}
responseData = await todoistApiRequest . call ( this , 'GET' , '/tasks' , { } , qs ) ;
if ( ! returnAll ) {
const limit = this . getNodeParameter ( 'limit' , i ) as number ;
responseData = responseData . splice ( 0 , limit ) ;
}
2020-08-26 00:09:07 -07:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'reopen' ) {
//https://developer.todoist.com/rest/v1/#get-an-active-task
const id = this . getNodeParameter ( 'taskId' , i ) as string ;
2020-08-26 00:09:07 -07:00
2021-07-19 23:58:54 -07:00
responseData = await todoistApiRequest . call ( this , 'POST' , ` /tasks/ ${ id } /reopen ` ) ;
2020-08-26 00:09:07 -07:00
2021-07-19 23:58:54 -07:00
responseData = { success : true } ;
2020-08-26 00:09:07 -07:00
}
2021-11-04 19:21:35 -07:00
if ( operation === 'update' ) {
//https://developer.todoist.com/rest/v1/#update-a-task
const id = this . getNodeParameter ( 'taskId' , i ) as string ;
const updateFields = this . getNodeParameter ( 'updateFields' , i ) as IDataObject ;
const body : IBodyCreateTask = { } ;
if ( updateFields . content ) {
body . content = updateFields . content as string ;
}
if ( updateFields . priority ) {
body . priority = parseInt ( updateFields . priority as string , 10 ) ;
}
if ( updateFields . description ) {
body . description = updateFields . description as string ;
}
if ( updateFields . dueDateTime ) {
2021-12-19 03:41:19 -08:00
body . due_datetime = FormatDueDatetime ( updateFields . dueDateTime as string ) ;
2021-11-04 19:21:35 -07:00
}
if ( updateFields . dueString ) {
body . due_string = updateFields . dueString as string ;
}
2021-12-19 03:41:19 -08:00
if ( updateFields . dueLang ) {
body . due_lang = updateFields . dueLang as string ;
}
2021-11-04 19:21:35 -07:00
if ( updateFields . labels !== undefined &&
Array . isArray ( updateFields . labels ) &&
updateFields . labels . length !== 0 ) {
body . label_ids = updateFields . labels as number [ ] ;
}
await todoistApiRequest . call ( this , 'POST' , ` /tasks/ ${ id } ` , body ) ;
responseData = { success : true } ;
}
2020-08-26 00:09:07 -07:00
}
2021-07-19 23:58:54 -07:00
if ( Array . isArray ( responseData ) ) {
returnData . push . apply ( returnData , responseData as IDataObject [ ] ) ;
} else {
returnData . push ( responseData 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
}