n8n-nodes-toggl
Version:
n8n community node for Toggl Track time tracking integration with comprehensive operations including client management and webhook support
72 lines (71 loc) • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.togglApiRequest = togglApiRequest;
exports.togglApiRequestAllItems = togglApiRequestAllItems;
const n8n_workflow_1 = require("n8n-workflow");
async function togglApiRequest(method, resource, body = {}, qs = {}, uri, headers = {}) {
var _a, _b, _c, _d, _e, _f;
const credentials = await this.getCredentials('togglApi');
const options = {
method,
body,
qs,
uri: uri || `https://api.track.toggl.com/api/v9${resource}`,
json: true,
gzip: true,
auth: {
user: credentials.apiToken,
pass: 'api_token',
},
headers,
};
if (Object.keys(body).length === 0) {
delete options.body;
}
if (Object.keys(qs).length === 0) {
delete options.qs;
}
try {
return await this.helpers.requestWithAuthentication.call(this, 'togglApi', options);
}
catch (error) {
// Handle rate limiting with exponential backoff
if (error.httpCode === '429') {
const retryAfter = ((_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.headers) === null || _b === void 0 ? void 0 : _b['retry-after']) || 60;
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
return togglApiRequest.call(this, method, resource, body, qs, uri, headers);
}
// Wrap and rethrow the error
if ((_d = (_c = error.response) === null || _c === void 0 ? void 0 : _c.body) === null || _d === void 0 ? void 0 : _d.message) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), error, {
message: error.response.body.message,
description: error.response.body.description || error.response.body.message,
});
}
if ((_f = (_e = error.response) === null || _e === void 0 ? void 0 : _e.body) === null || _f === void 0 ? void 0 : _f.error) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), error, {
message: error.response.body.error,
});
}
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Toggl API request failed: ${error.message}`, {
description: error.description,
});
}
}
async function togglApiRequestAllItems(propertyName, method, resource, body = {}, query = {}) {
const returnData = [];
let responseData;
query.per_page = 200;
query.page = 1;
do {
responseData = await togglApiRequest.call(this, method, resource, body, query);
if (Array.isArray(responseData)) {
returnData.push.apply(returnData, responseData);
}
else if (responseData[propertyName]) {
returnData.push.apply(returnData, responseData[propertyName]);
}
query.page = query.page + 1;
} while (responseData.length === query.per_page);
return returnData;
}