Add Clockify Node (#997)

* Added pull.yml back after reset

* Added Clockify Entry

* Created ClockifyWriter

*  Improvements to #988

*  Improvements

*  Improvements

Co-authored-by: Ethan Sowell <ethan.sowell@dominion.solutions>
Co-authored-by: Mark Horninger <mark.horninger@dominion.solutions>
This commit is contained in:
Ricardo Espinoza
2020-10-04 10:28:05 -04:00
committed by GitHub
parent 76dec013db
commit 3a73493aeb
13 changed files with 1915 additions and 12 deletions

View File

@@ -1,15 +1,24 @@
import { OptionsWithUri } from 'request';
import {
OptionsWithUri,
} from 'request';
import {
IExecuteFunctions,
ILoadOptionsFunctions,
IPollFunctions
IPollFunctions,
} from 'n8n-core';
import { IDataObject } from 'n8n-workflow';
import {
IDataObject,
} from 'n8n-workflow';
export async function clockifyApiRequest(this: ILoadOptionsFunctions | IPollFunctions | IExecuteFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
export async function clockifyApiRequest(this: ILoadOptionsFunctions | IPollFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
const credentials = this.getCredentials('clockifyApi');
if (credentials === undefined) {
throw new Error('No credentials got returned!');
}
const BASE_URL = 'https://api.clockify.me/api/v1';
@@ -22,17 +31,53 @@ export async function clockifyApiRequest(this: ILoadOptionsFunctions | IPollFunc
qs,
body,
uri: `${BASE_URL}/${resource}`,
json: true
json: true,
useQuerystring: true,
};
try {
return await this.helpers.request!(options);
} catch (error) {
let errorMessage = error.message;
if (error.response.body && error.response.body.message) {
errorMessage = `[${error.response.body.status_code}] ${error.response.body.message}`;
errorMessage = `[${error.statusCode}] ${error.response.body.message}`;
}
throw new Error('Clockify Error: ' + errorMessage);
}
}
export async function clockifyApiRequestAllItems(this: IExecuteFunctions | IPollFunctions | ILoadOptionsFunctions, method: string, endpoint: string, body: any = {}, query: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
const returnData: IDataObject[] = [];
let responseData;
query['page-size'] = 50;
query.page = 1;
do {
responseData = await clockifyApiRequest.call(this, method, endpoint, body, query);
returnData.push.apply(returnData, responseData);
if (query.limit && (returnData.length >= query.limit)) {
return returnData;
}
query.page++;
} while (
responseData.length !== 0
);
return returnData;
}