2021-05-20 14:31:23 -07:00
import {
IPollFunctions ,
} from 'n8n-core' ;
import {
IDataObject ,
ILoadOptionsFunctions ,
INodeExecutionData ,
INodePropertyOptions ,
INodeType ,
INodeTypeDescription ,
} from 'n8n-workflow' ;
import {
notionApiRequest ,
simplifyObjects ,
} from './GenericFunctions' ;
2022-04-08 14:32:08 -07:00
import moment from 'moment' ;
2021-05-20 14:31:23 -07:00
export class NotionTrigger implements INodeType {
description : INodeTypeDescription = {
2022-07-04 02:12:08 -07:00
// eslint-disable-next-line n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node
2021-05-20 14:31:23 -07:00
displayName : 'Notion Trigger (Beta)' ,
name : 'notionTrigger' ,
icon : 'file:notion.svg' ,
group : [ 'trigger' ] ,
version : 1 ,
description : 'Starts the workflow when Notion events occur' ,
subtitle : '={{$parameter["event"]}}' ,
defaults : {
name : 'Notion Trigger' ,
} ,
credentials : [
{
name : 'notionApi' ,
required : true ,
2021-12-29 14:23:22 -08:00
testedBy : 'notionApiCredentialTest' ,
2021-05-20 14:31:23 -07:00
} ,
] ,
polling : true ,
inputs : [ ] ,
outputs : [ 'main' ] ,
properties : [
{
displayName : 'Event' ,
name : 'event' ,
type : 'options' ,
options : [
{
name : 'Page Added to Database' ,
value : 'pageAddedToDatabase' ,
} ,
2021-12-29 14:23:22 -08:00
{
2022-05-06 08:12:14 -07:00
name : 'Page Updated in Database' ,
2021-12-29 14:23:22 -08:00
value : 'pagedUpdatedInDatabase' ,
} ,
2021-05-20 14:31:23 -07:00
] ,
required : true ,
default : '' ,
} ,
2022-07-04 00:41:44 -07:00
{
displayName : 'In Notion, make sure you share your database with your integration. Otherwise it won\'t be accessible, or listed here.' ,
name : 'notionNotice' ,
type : 'notice' ,
default : '' ,
} ,
2021-05-20 14:31:23 -07:00
{
2022-06-03 10:23:49 -07:00
displayName : 'Database Name or ID' ,
2021-05-20 14:31:23 -07:00
name : 'databaseId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getDatabases' ,
} ,
displayOptions : {
show : {
event : [
'pageAddedToDatabase' ,
2021-12-29 14:23:22 -08:00
'pagedUpdatedInDatabase' ,
2021-05-20 14:31:23 -07:00
] ,
} ,
} ,
default : '' ,
required : true ,
2022-06-03 10:23:49 -07:00
description : 'The ID of this database. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>.' ,
2021-05-20 14:31:23 -07:00
} ,
{
2022-05-20 14:47:24 -07:00
displayName : 'Simplify' ,
2021-05-20 14:31:23 -07:00
name : 'simple' ,
type : 'boolean' ,
displayOptions : {
show : {
event : [
'pageAddedToDatabase' ,
2021-12-29 14:23:22 -08:00
'pagedUpdatedInDatabase' ,
2021-05-20 14:31:23 -07:00
] ,
} ,
} ,
default : true ,
2021-12-29 14:23:22 -08:00
description : 'Whether to return a simplified version of the response instead of the raw data' ,
2021-05-20 14:31:23 -07:00
} ,
] ,
} ;
methods = {
loadOptions : {
async getDatabases ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const returnData : INodePropertyOptions [ ] = [ ] ;
const { results : databases } = await notionApiRequest . call ( this , 'POST' , ` /search ` , { page_size : 100 , filter : { property : 'object' , value : 'database' } } ) ;
for ( const database of databases ) {
returnData . push ( {
2021-09-15 01:13:11 -07:00
name : database.title [ 0 ] ? . plain_text || database . id ,
2021-05-20 14:31:23 -07:00
value : database.id ,
} ) ;
}
returnData . sort ( ( a , b ) = > {
if ( a . name . toLocaleLowerCase ( ) < b . name . toLocaleLowerCase ( ) ) { return - 1 ; }
if ( a . name . toLocaleLowerCase ( ) > b . name . toLocaleLowerCase ( ) ) { return 1 ; }
return 0 ;
} ) ;
return returnData ;
} ,
} ,
} ;
async poll ( this : IPollFunctions ) : Promise < INodeExecutionData [ ] [ ] | null > {
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
const databaseId = this . getNodeParameter ( 'databaseId' ) as string ;
const event = this . getNodeParameter ( 'event' ) as string ;
const simple = this . getNodeParameter ( 'simple' ) as boolean ;
const now = moment ( ) . utc ( ) . format ( ) ;
const startDate = webhookData . lastTimeChecked as string || now ;
const endDate = now ;
webhookData . lastTimeChecked = endDate ;
const sortProperty = ( event === 'pageAddedToDatabase' ) ? 'created_time' : 'last_edited_time' ;
const body : IDataObject = {
page_size : 1 ,
sorts : [
{
timestamp : sortProperty ,
direction : 'descending' ,
} ,
] ,
} ;
let records : IDataObject [ ] = [ ] ;
let hasMore = true ;
//get last record
let { results : data } = await notionApiRequest . call ( this , 'POST' , ` /databases/ ${ databaseId } /query ` , body ) ;
if ( this . getMode ( ) === 'manual' ) {
if ( simple === true ) {
2021-12-29 14:23:22 -08:00
data = simplifyObjects ( data , false , 1 ) ;
2021-05-20 14:31:23 -07:00
}
if ( Array . isArray ( data ) && data . length ) {
return [ this . helpers . returnJsonArray ( data ) ] ;
}
}
// if something changed after the last check
if ( Object . keys ( data [ 0 ] ) . length !== 0 && webhookData . lastRecordProccesed !== data [ 0 ] . id ) {
do {
body . page_size = 10 ;
const { results , has_more , next_cursor } = await notionApiRequest . call ( this , 'POST' , ` /databases/ ${ databaseId } /query ` , body ) ;
records . push . apply ( records , results ) ;
hasMore = has_more ;
if ( next_cursor !== null ) {
body [ 'start_cursor' ] = next_cursor ;
}
} while ( ! moment ( records [ records . length - 1 ] [ sortProperty ] as string ) . isSameOrBefore ( startDate ) && hasMore === true ) ;
if ( this . getMode ( ) !== 'manual' ) {
records = records . filter ( ( record : IDataObject ) = > moment ( record [ sortProperty ] as string ) . isBetween ( startDate , endDate ) ) ;
}
if ( simple === true ) {
2021-12-29 14:23:22 -08:00
records = simplifyObjects ( records , false , 1 ) ;
2021-05-20 14:31:23 -07:00
}
webhookData . lastRecordProccesed = data [ 0 ] . id ;
if ( Array . isArray ( records ) && records . length ) {
return [ this . helpers . returnJsonArray ( records ) ] ;
}
}
return null ;
}
}