diff --git a/packages/nodes-base/nodes/Harvest/Harvest.node.ts b/packages/nodes-base/nodes/Harvest/Harvest.node.ts index dba51023a4..2e604ad4b9 100644 --- a/packages/nodes-base/nodes/Harvest/Harvest.node.ts +++ b/packages/nodes-base/nodes/Harvest/Harvest.node.ts @@ -111,7 +111,7 @@ export class Harvest implements INodeType { }, { name: 'User', - value: 'user', + value: 'users', }, ], default: 'task', @@ -356,7 +356,7 @@ export class Harvest implements INodeType { } else { throw new Error(`The resource "${resource}" is not known!`); } - } else if (resource === 'user') { + } else if (resource === 'users') { if (operation === 'get') { // ---------------------------------- // get @@ -365,7 +365,7 @@ export class Harvest implements INodeType { requestMethod = 'GET'; const id = this.getNodeParameter('id', i) as string; - endpoint = `users/${id}`; + endpoint = `${resource}/${id}`; const responseData = await harvestApiRequest.call(this, requestMethod, qs, endpoint); returnData.push(responseData); @@ -375,7 +375,7 @@ export class Harvest implements INodeType { // getAll // ---------------------------------- - const responseData: IDataObject[] = await getAllResource.call(this, 'users', i); + const responseData: IDataObject[] = await getAllResource.call(this, resource, i); returnData.push.apply(returnData, responseData); } else if (operation === 'me') { @@ -385,12 +385,30 @@ export class Harvest implements INodeType { requestMethod = 'GET'; - endpoint = 'users/me'; + endpoint = `${resource}/me`; const responseData = await harvestApiRequest.call(this, requestMethod, qs, endpoint); returnData.push(responseData); - } else if (operation === 'delete') { + } else if (operation === 'create') { + // ---------------------------------- + // createByDuration + // ---------------------------------- + + requestMethod = 'POST'; + endpoint = resource; + ['first_name', 'last_name', 'email'].forEach(val => { + body[val] = this.getNodeParameter(val, i) as string; + }) + + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + Object.assign(body, additionalFields); + + const responseData = await harvestApiRequest.call(this, requestMethod, qs, endpoint, body); + returnData.push(responseData); + + } else if (operation === 'delete') { // ---------------------------------- // delete // ---------------------------------- diff --git a/packages/nodes-base/nodes/Harvest/UserDescription.ts b/packages/nodes-base/nodes/Harvest/UserDescription.ts index 0a69c8fc32..d4f445f2de 100644 --- a/packages/nodes-base/nodes/Harvest/UserDescription.ts +++ b/packages/nodes-base/nodes/Harvest/UserDescription.ts @@ -1,5 +1,7 @@ import { INodeProperties } from "n8n-workflow"; +const resource = ['users']; + export const userOperations = [ { displayName: 'Operation', @@ -7,9 +9,7 @@ export const userOperations = [ type: 'options', displayOptions: { show: { - resource: [ - 'user', - ], + resource, }, }, options: [ @@ -28,6 +28,11 @@ export const userOperations = [ value: 'getAll', description: 'Get data of all users', }, + { + name: 'Create', + value: 'create', + description: `Create a user`, + }, { name: 'Delete', value: 'delete', @@ -42,137 +47,287 @@ export const userOperations = [ export const userFields = [ -/* -------------------------------------------------------------------------- */ -/* user:getAll */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* user:getAll */ + /* -------------------------------------------------------------------------- */ -{ - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - resource: [ - 'user', - ], - operation: [ - 'getAll', - ], - }, - }, - default: false, - description: 'Returns a list of your users.', -}, -{ - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - resource: [ - 'user', - ], - operation: [ - 'getAll', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 100, - }, - default: 100, - description: 'How many results to return.', -}, -{ - displayName: 'Filters', - name: 'filters', - type: 'collection', - placeholder: 'Add Filter', - default: {}, - displayOptions: { - show: { - resource: [ - 'user', - ], - operation: [ - 'getAll', - ], - }, - }, - options: [ - { - displayName: 'Is Active', - name: 'is_active', - type: 'boolean', - default: true, - description: 'Pass true to only return active users and false to return inactive users.', - }, - { - displayName: 'Updated Since', - name: 'updated_since', - type: 'dateTime', - default: '', - description: 'Only return users belonging to the user with the given ID.', - }, - { - displayName: 'Page', - name: 'page', - type: 'number', - typeOptions: { - minValue: 1, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + resource, + operation: [ + 'getAll', + ], }, - default: 1, - description: 'The page number to use in pagination..', - } - ] -}, + }, + default: false, + description: 'Returns a list of your users.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource, + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 100, + }, + default: 100, + description: 'How many results to return.', + }, + { + displayName: 'Filters', + name: 'filters', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource, + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Is Active', + name: 'is_active', + type: 'boolean', + default: true, + description: 'Pass true to only return active users and false to return inactive users.', + }, + { + displayName: 'Updated Since', + name: 'updated_since', + type: 'dateTime', + default: '', + description: 'Only return users belonging to the user with the given ID.', + }, + { + displayName: 'Page', + name: 'page', + type: 'number', + typeOptions: { + minValue: 1, + }, + default: 1, + description: 'The page number to use in pagination..', + } + ] + }, + + /* -------------------------------------------------------------------------- */ + /* user:get */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'User Id', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource, + }, + }, + description: 'The ID of the user you are retrieving.', + }, + + /* -------------------------------------------------------------------------- */ + /* user:delete */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'User Id', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource, + }, + }, + description: 'The ID of the user you want to delete.', + }, /* -------------------------------------------------------------------------- */ -/* user:get */ +/* user:create */ /* -------------------------------------------------------------------------- */ { - displayName: 'User Id', - name: 'id', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'user', - ], + displayName: 'First Name', + name: 'first_name', + type: 'string', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource, + }, }, + default: '', + required: true, + description: 'The first name of the user.', }, - description: 'The ID of the user you are retrieving.', -}, - -/* -------------------------------------------------------------------------- */ -/* user:delete */ -/* -------------------------------------------------------------------------- */ -{ - displayName: 'User Id', - name: 'id', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'user', - ], + { + displayName: 'Last Name', + name: 'last_name', + type: 'string', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource, + }, }, + default: '', + required: true, + description: 'The last name of the user.', + }, + { + displayName: 'Email', + name: 'email', + type: 'string', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource, + }, + }, + default: '', + required: true, + description: 'The email of the user.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource, + }, + }, + default: {}, + options: [ + { + displayName: 'Timezone', + name: 'timezone', + type: 'string', + default: '', + description: 'The user’s timezone. Defaults to the company’s timezone. See a list of supported time zones.' + }, + { + displayName: 'Has Access To All Future Projects', + name: 'has_access_to_all_future_projects', + type: 'string', + default: '', + description: 'Whether the user should be automatically added to future projects. Defaults to false.' + }, + { + displayName: 'Is Contractor', + name: 'is_contractor', + type: 'string', + default: '', + description: 'Whether the user is a contractor or an employee. Defaults to false.' + }, + { + displayName: 'Is Admin', + name: 'is_admin', + type: 'string', + default: '', + description: 'Whether the user has Admin permissions. Defaults to false.' + }, + { + displayName: 'Is Project Manager', + name: 'is_project_manager', + type: 'string', + default: '', + description: 'Whether the user has Project Manager permissions. Defaults to false.' + }, + { + displayName: 'Can See Rates', + name: 'can_see_rates', + type: 'string', + default: '', + description: 'Whether the user can see billable rates on projects. Only applicable to Project Managers. Defaults to false.' + }, + { + displayName: 'Can Create Projects', + name: 'can_create_projects', + type: 'string', + default: '', + description: 'Whether the user can create projects. Only applicable to Project Managers. Defaults to false.' + }, + { + displayName: 'Can Create Invoices', + name: 'can_create_invoices', + type: 'string', + default: '', + description: 'Whether the user can create invoices. Only applicable to Project Managers. Defaults to false.' + }, + { + displayName: 'Is Active', + name: 'is_active', + type: 'string', + default: '', + description: 'Whether the user is active or archived. Defaults to true.' + }, + { + displayName: 'Weekly Capacity', + name: 'weekly_capacity', + type: 'string', + default: '', + description: 'The number of hours per week this person is available to work in seconds. Defaults to 126000 seconds (35 hours).' + }, + { + displayName: 'Default Hourly Rate', + name: 'default_hourly_rate', + type: 'string', + default: '', + description: 'The billable rate to use for this user when they are added to a project. Defaults to 0.' + }, + { + displayName: 'Cost Rate', + name: 'cost_rate', + type: 'string', + default: '', + description: 'The cost rate to use for this user when calculating a project’s costs vs billable amount. Defaults to 0.' + }, + { + displayName: 'Roles', + name: 'roles', + type: 'string', + default: '', + description: 'The role names assigned to this person.' + }, + ], }, - description: 'The ID of the user you want to delete.', -} ] as INodeProperties[];