2020-10-19 10:57:50 -07:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
import {
2020-10-20 15:09:13 -07:00
IDataObject ,
2020-10-19 10:57:50 -07:00
INodeExecutionData ,
INodeType ,
INodeTypeDescription ,
} from 'n8n-workflow' ;
import {
googleApiRequest ,
2020-10-20 15:09:13 -07:00
googleApiRequestAllItems ,
2020-10-19 10:57:50 -07:00
} from './GenericFunctions' ;
export interface IGoogleAuthCredentials {
email : string ;
privateKey : string ;
}
export class GoogleBooks implements INodeType {
description : INodeTypeDescription = {
displayName : 'Google Books' ,
name : 'googleBooks' ,
icon : 'file:googlebooks.svg' ,
group : [ 'input' , 'output' ] ,
version : 1 ,
description : 'Read data from Google Books' ,
2020-10-20 15:09:13 -07:00
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
2020-10-19 10:57:50 -07:00
defaults : {
name : 'Google Books' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'googleApi' ,
required : true ,
displayOptions : {
show : {
authentication : [
'serviceAccount' ,
] ,
} ,
} ,
} ,
{
name : 'googleBooksOAuth2Api' ,
required : true ,
displayOptions : {
show : {
authentication : [
'oAuth2' ,
] ,
} ,
} ,
} ,
] ,
properties : [
{
displayName : 'Authentication' ,
name : 'authentication' ,
type : 'options' ,
options : [
{
name : 'Service Account' ,
value : 'serviceAccount' ,
} ,
{
name : 'OAuth2' ,
value : 'oAuth2' ,
} ,
] ,
default : 'serviceAccount' ,
} ,
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-19 10:57:50 -07:00
options : [
{
name : 'Bookshelf' ,
value : 'bookshelf' ,
} ,
{
2020-10-20 15:09:13 -07:00
name : 'Bookshelf Volume' ,
value : 'bookshelfVolume' ,
2020-10-19 10:57:50 -07:00
} ,
{
name : 'Volume' ,
value : 'volume' ,
} ,
] ,
default : 'bookshelf' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-19 10:57:50 -07:00
options : [
{
name : 'Get' ,
2020-10-20 15:09:13 -07:00
value : 'get' ,
2020-10-19 10:57:50 -07:00
description : 'Retrieve a specific bookshelf resource for the specified user' ,
} ,
{
2020-10-20 15:09:13 -07:00
name : 'Get All' ,
value : 'getAll' ,
description : 'Get all public bookshelf resource for the specified user' ,
2020-10-19 10:57:50 -07:00
} ,
] ,
displayOptions : {
show : {
resource : [
'bookshelf' ,
] ,
} ,
} ,
2020-10-20 15:09:13 -07:00
default : 'get' ,
2020-10-19 10:57:50 -07:00
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-19 10:57:50 -07:00
options : [
{
2020-10-20 15:09:13 -07:00
name : 'Add' ,
value : 'add' ,
description : 'Add a volume to a bookshelf' ,
2020-10-19 10:57:50 -07:00
} ,
{
2020-10-20 15:09:13 -07:00
name : 'Clear' ,
value : 'clear' ,
description : 'Clears all volumes from a bookshelf' ,
2020-10-19 10:57:50 -07:00
} ,
{
2020-10-20 15:09:13 -07:00
name : 'Get All' ,
value : 'getAll' ,
description : 'Get all volumes in a specific bookshelf for the specified user' ,
2020-10-19 10:57:50 -07:00
} ,
{
2020-10-20 15:09:13 -07:00
name : 'Move' ,
value : 'move' ,
description : 'Moves a volume within a bookshelf' ,
2020-10-19 10:57:50 -07:00
} ,
{
2020-10-20 15:09:13 -07:00
name : 'Remove' ,
value : 'remove' ,
description : 'Removes a volume from a bookshelf' ,
2020-10-19 10:57:50 -07:00
} ,
] ,
displayOptions : {
show : {
resource : [
2020-10-20 15:09:13 -07:00
'bookshelfVolume' ,
2020-10-19 10:57:50 -07:00
] ,
} ,
} ,
2020-10-20 15:09:13 -07:00
default : 'getAll' ,
2020-10-19 10:57:50 -07:00
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-19 10:57:50 -07:00
options : [
{
name : 'Get' ,
2020-10-20 15:09:13 -07:00
value : 'get' ,
description : 'Get a volume resource based on ID' ,
2020-10-19 10:57:50 -07:00
} ,
{
2020-10-20 15:09:13 -07:00
name : 'Get All' ,
value : 'getAll' ,
description : 'Get all volumes filtered by query' ,
2020-10-19 10:57:50 -07:00
} ,
] ,
displayOptions : {
show : {
resource : [
'volume' ,
] ,
} ,
} ,
2020-10-20 15:09:13 -07:00
default : 'get' ,
2020-10-19 10:57:50 -07:00
} ,
2020-10-20 15:09:13 -07:00
{
displayName : 'My Library' ,
name : 'myLibrary' ,
type : 'boolean' ,
default : false ,
required : true ,
displayOptions : {
show : {
operation : [
'get' ,
'getAll' ,
] ,
resource : [
'bookshelf' ,
2020-11-04 07:11:51 -08:00
'bookshelfVolume' ,
2020-10-20 15:09:13 -07:00
] ,
} ,
} ,
} ,
2020-10-19 10:57:50 -07:00
// ----------------------------------
// All
// ----------------------------------
{
displayName : 'Search Query' ,
name : 'searchQuery' ,
type : 'string' ,
2022-05-06 14:01:25 -07:00
description : 'Full-text search query string' ,
2020-10-19 10:57:50 -07:00
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
2020-10-20 15:09:13 -07:00
'getAll' ,
2020-10-19 10:57:50 -07:00
] ,
resource : [
'volume' ,
] ,
} ,
} ,
} ,
{
displayName : 'User ID' ,
name : 'userId' ,
type : 'string' ,
description : 'ID of user' ,
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
2020-10-20 15:09:13 -07:00
'get' ,
'getAll' ,
2020-10-19 10:57:50 -07:00
] ,
resource : [
'bookshelf' ,
2020-10-20 15:09:13 -07:00
'bookshelfVolume' ,
] ,
} ,
hide : {
myLibrary : [
true ,
2020-10-19 10:57:50 -07:00
] ,
} ,
} ,
} ,
{
displayName : 'Bookshelf ID' ,
name : 'shelfId' ,
type : 'string' ,
2022-05-06 14:01:25 -07:00
description : 'ID of the bookshelf' ,
2020-10-19 10:57:50 -07:00
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
2020-10-20 15:09:13 -07:00
'get' ,
'add' ,
'clear' ,
'move' ,
'remove' ,
2020-10-19 10:57:50 -07:00
] ,
resource : [
'bookshelf' ,
2020-11-04 07:11:51 -08:00
'bookshelfVolume' ,
2020-10-19 10:57:50 -07:00
] ,
} ,
} ,
} ,
2020-11-04 05:20:29 -08:00
{
displayName : 'Bookshelf ID' ,
name : 'shelfId' ,
type : 'string' ,
2022-05-06 14:01:25 -07:00
description : 'ID of the bookshelf' ,
2020-11-04 05:20:29 -08:00
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
'getAll' ,
] ,
resource : [
'bookshelfVolume' ,
] ,
} ,
} ,
} ,
2020-10-19 10:57:50 -07:00
{
displayName : 'Volume ID' ,
name : 'volumeId' ,
type : 'string' ,
2022-05-06 14:01:25 -07:00
description : 'ID of the volume' ,
2020-10-19 10:57:50 -07:00
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
2020-10-20 15:09:13 -07:00
'add' ,
'move' ,
'remove' ,
'get' ,
2020-10-19 10:57:50 -07:00
] ,
resource : [
2020-10-20 15:09:13 -07:00
'bookshelfVolume' ,
2020-11-04 05:20:29 -08:00
'volume' ,
2020-10-19 10:57:50 -07:00
] ,
} ,
} ,
} ,
{
displayName : 'Volume Position' ,
name : 'volumePosition' ,
type : 'string' ,
2022-05-06 14:01:25 -07:00
description : 'Position on shelf to move the item (0 puts the item before the current first item, 1 puts it between the first and the second and so on)' ,
2020-10-19 10:57:50 -07:00
default : '' ,
required : true ,
displayOptions : {
show : {
operation : [
2020-10-20 15:09:13 -07:00
'move' ,
2020-10-19 10:57:50 -07:00
] ,
resource : [
2020-10-20 15:09:13 -07:00
'bookshelfVolume' ,
] ,
} ,
} ,
} ,
{
displayName : 'Return All' ,
name : 'returnAll' ,
type : 'boolean' ,
displayOptions : {
show : {
operation : [
'getAll' ,
2020-10-19 10:57:50 -07:00
] ,
} ,
} ,
2020-10-20 15:09:13 -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-10-20 15:09:13 -07:00
} ,
{
displayName : 'Limit' ,
name : 'limit' ,
type : 'number' ,
displayOptions : {
show : {
operation : [
'getAll' ,
] ,
returnAll : [
false ,
] ,
} ,
} ,
typeOptions : {
minValue : 1 ,
maxValue : 40 ,
} ,
default : 40 ,
2022-05-06 14:01:25 -07:00
description : 'Max number of results to return' ,
2020-10-19 10:57:50 -07:00
} ,
] ,
} ;
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
2022-04-22 09:29:51 -07:00
const length = items . length ;
2020-10-20 15:09:13 -07:00
const returnData : IDataObject [ ] = [ ] ;
2020-10-19 10:57:50 -07:00
const resource = this . getNodeParameter ( 'resource' , 0 ) as string ;
const operation = this . getNodeParameter ( 'operation' , 0 ) as string ;
2020-10-20 15:09:13 -07:00
const qs : IDataObject = { } ;
let responseData ;
2020-10-19 10:57:50 -07:00
2020-10-20 15:09:13 -07:00
for ( let i = 0 ; i < length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
if ( resource === 'volume' ) {
if ( operation === 'get' ) {
const volumeId = this . getNodeParameter ( 'volumeId' , i ) as string ;
responseData = await googleApiRequest . call ( this , 'GET' , ` v1/volumes/ ${ volumeId } ` , { } ) ;
} else if ( operation === 'getAll' ) {
const searchQuery = this . getNodeParameter ( 'searchQuery' , i ) as string ;
const returnAll = this . getNodeParameter ( 'returnAll' , i ) as boolean ;
if ( returnAll ) {
responseData = await googleApiRequestAllItems . call ( this , 'items' , 'GET' , ` v1/volumes?q= ${ searchQuery } ` , { } ) ;
} else {
qs . maxResults = this . getNodeParameter ( 'limit' , i ) as number ;
responseData = await googleApiRequest . call ( this , 'GET' , ` v1/volumes?q= ${ searchQuery } ` , { } , qs ) ;
responseData = responseData . items || [ ] ;
}
2020-10-20 15:09:13 -07:00
}
2020-11-04 07:11:51 -08:00
}
2020-10-19 10:57:50 -07:00
2021-07-19 23:58:54 -07:00
if ( resource === 'bookshelf' ) {
if ( operation === 'get' ) {
const shelfId = this . getNodeParameter ( 'shelfId' , i ) as string ;
const myLibrary = this . getNodeParameter ( 'myLibrary' , i ) as boolean ;
let endpoint ;
if ( myLibrary === false ) {
const userId = this . getNodeParameter ( 'userId' , i ) as string ;
endpoint = ` v1/users/ ${ userId } /bookshelves/ ${ shelfId } ` ;
} else {
endpoint = ` v1/mylibrary/bookshelves/ ${ shelfId } ` ;
}
2020-10-19 10:57:50 -07:00
2021-07-19 23:58:54 -07:00
responseData = await googleApiRequest . call ( this , 'GET' , endpoint , { } ) ;
} else if ( operation === 'getAll' ) {
const myLibrary = this . getNodeParameter ( 'myLibrary' , i ) as boolean ;
const returnAll = this . getNodeParameter ( 'returnAll' , i ) as boolean ;
let endpoint ;
if ( myLibrary === false ) {
const userId = this . getNodeParameter ( 'userId' , i ) as string ;
endpoint = ` v1/users/ ${ userId } /bookshelves ` ;
} else {
endpoint = ` v1/mylibrary/bookshelves ` ;
}
if ( returnAll ) {
responseData = await googleApiRequestAllItems . call ( this , 'items' , 'GET' , endpoint , { } ) ;
} else {
qs . maxResults = this . getNodeParameter ( 'limit' , i ) as number ;
responseData = await googleApiRequest . call ( this , 'GET' , endpoint , { } , qs ) ;
responseData = responseData . items || [ ] ;
}
2020-10-20 15:09:13 -07:00
}
2020-10-19 10:57:50 -07:00
}
2020-10-20 15:09:13 -07:00
2021-07-19 23:58:54 -07:00
if ( resource === 'bookshelfVolume' ) {
if ( operation === 'add' ) {
const shelfId = this . getNodeParameter ( 'shelfId' , i ) as string ;
const volumeId = this . getNodeParameter ( 'volumeId' , i ) as string ;
const body : IDataObject = {
volumeId ,
} ;
responseData = await googleApiRequest . call ( this , 'POST' , ` v1/mylibrary/bookshelves/ ${ shelfId } /addVolume ` , body ) ;
}
2020-10-19 10:57:50 -07:00
2021-07-19 23:58:54 -07:00
if ( operation === 'clear' ) {
const shelfId = this . getNodeParameter ( 'shelfId' , i ) as string ;
responseData = await googleApiRequest . call ( this , 'POST' , ` v1/mylibrary/bookshelves/ ${ shelfId } /clearVolumes ` ) ;
}
2020-10-19 10:57:50 -07:00
2021-07-19 23:58:54 -07:00
if ( operation === 'getAll' ) {
const shelfId = this . getNodeParameter ( 'shelfId' , i ) as string ;
const returnAll = this . getNodeParameter ( 'returnAll' , i ) as boolean ;
const myLibrary = this . getNodeParameter ( 'myLibrary' , i ) as boolean ;
let endpoint ;
if ( myLibrary === false ) {
const userId = this . getNodeParameter ( 'userId' , i ) as string ;
endpoint = ` v1/users/ ${ userId } /bookshelves/ ${ shelfId } /volumes ` ;
} else {
endpoint = ` v1/mylibrary/bookshelves/ ${ shelfId } /volumes ` ;
}
if ( returnAll ) {
responseData = await googleApiRequestAllItems . call ( this , 'items' , 'GET' , endpoint , { } ) ;
} else {
qs . maxResults = this . getNodeParameter ( 'limit' , i ) as number ;
responseData = await googleApiRequest . call ( this , 'GET' , endpoint , { } , qs ) ;
responseData = responseData . items || [ ] ;
}
2020-10-20 15:09:13 -07:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'move' ) {
const shelfId = this . getNodeParameter ( 'shelfId' , i ) as string ;
const volumeId = this . getNodeParameter ( 'volumeId' , i ) as string ;
const volumePosition = this . getNodeParameter ( 'volumePosition' , i ) as number ;
const body : IDataObject = {
volumeId ,
volumePosition ,
} ;
responseData = await googleApiRequest . call ( this , 'POST' , ` v1/mylibrary/bookshelves/ ${ shelfId } /moveVolume ` , body ) ;
2020-10-20 15:09:13 -07:00
}
2020-10-19 10:57:50 -07:00
2021-07-19 23:58:54 -07:00
if ( operation === 'remove' ) {
const shelfId = this . getNodeParameter ( 'shelfId' , i ) as string ;
const volumeId = this . getNodeParameter ( 'volumeId' , i ) as string ;
const body : IDataObject = {
volumeId ,
} ;
responseData = await googleApiRequest . call ( this , 'POST' , ` v1/mylibrary/bookshelves/ ${ shelfId } /removeVolume ` , body ) ;
}
}
if ( Array . isArray ( responseData ) ) {
returnData . push . apply ( returnData , responseData as IDataObject [ ] ) ;
} else {
returnData . push ( responseData as IDataObject ) ;
2020-10-20 15:09:13 -07:00
}
2020-10-19 10:57:50 -07:00
2021-07-19 23:58:54 -07:00
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { error : error.message } ) ;
continue ;
2020-10-19 10:57:50 -07:00
}
2021-07-19 23:58:54 -07:00
throw error ;
2020-10-20 15:09:13 -07:00
}
2020-10-19 10:57:50 -07:00
}
return [ this . helpers . returnJsonArray ( responseData ) ] ;
}
}