Files
Henry Heng 2387a06ce4 Feature/GoogleDocs (#4613)
* add teams, gmail, outlook tools

* update docs link

* update credentials for oauth2

* add jira tool

* add google drive, google calendar, google sheets tools, powerpoint, excel, word doc loader

* update jira logo

* Refactor Gmail and Outlook tools to remove maxOutputLength parameter and enhance request handling. Update response formatting to include parameters in the output. Adjust Google Drive tools to simplify success messages by removing unnecessary parameter details.

* Update pnpm-lock.yaml

* add google docs
2025-06-09 00:30:03 +01:00

450 lines
16 KiB
TypeScript

import { convertMultiOptionsToStringArray, getCredentialData, getCredentialParam } from '../../../src/utils'
import { createJiraTools } from './core'
import type { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
class Jira_Tools implements INode {
label: string
name: string
version: number
type: string
icon: string
category: string
description: string
baseClasses: string[]
credential: INodeParams
inputs: INodeParams[]
constructor() {
this.label = 'Jira'
this.name = 'jiraTool'
this.version = 1.0
this.type = 'Jira'
this.icon = 'jira.svg'
this.category = 'Tools'
this.description = 'Perform Jira operations for issues, comments, and users'
this.baseClasses = [this.type, 'Tool']
this.credential = {
label: 'Connect Credential',
name: 'credential',
type: 'credential',
credentialNames: ['jiraApi']
}
this.inputs = [
{
label: 'Host',
name: 'jiraHost',
type: 'string',
placeholder: 'https://example.atlassian.net'
},
{
label: 'Type',
name: 'jiraType',
type: 'options',
options: [
{
label: 'Issues',
name: 'issues'
},
{
label: 'Issue Comments',
name: 'comments'
},
{
label: 'Users',
name: 'users'
}
]
},
// Issue Actions
{
label: 'Issue Actions',
name: 'issueActions',
type: 'multiOptions',
options: [
{
label: 'List Issues',
name: 'listIssues'
},
{
label: 'Create Issue',
name: 'createIssue'
},
{
label: 'Get Issue',
name: 'getIssue'
},
{
label: 'Update Issue',
name: 'updateIssue'
},
{
label: 'Delete Issue',
name: 'deleteIssue'
},
{
label: 'Assign Issue',
name: 'assignIssue'
},
{
label: 'Transition Issue',
name: 'transitionIssue'
}
],
show: {
jiraType: ['issues']
}
},
// Comment Actions
{
label: 'Comment Actions',
name: 'commentActions',
type: 'multiOptions',
options: [
{
label: 'List Comments',
name: 'listComments'
},
{
label: 'Create Comment',
name: 'createComment'
},
{
label: 'Get Comment',
name: 'getComment'
},
{
label: 'Update Comment',
name: 'updateComment'
},
{
label: 'Delete Comment',
name: 'deleteComment'
}
],
show: {
jiraType: ['comments']
}
},
// User Actions
{
label: 'User Actions',
name: 'userActions',
type: 'multiOptions',
options: [
{
label: 'Search Users',
name: 'searchUsers'
},
{
label: 'Get User',
name: 'getUser'
},
{
label: 'Create User',
name: 'createUser'
},
{
label: 'Update User',
name: 'updateUser'
},
{
label: 'Delete User',
name: 'deleteUser'
}
],
show: {
jiraType: ['users']
}
},
// ISSUE PARAMETERS
{
label: 'Project Key',
name: 'projectKey',
type: 'string',
placeholder: 'PROJ',
description: 'Project key for the issue',
show: {
issueActions: ['listIssues', 'createIssue']
},
additionalParams: true,
optional: true
},
{
label: 'Issue Type',
name: 'issueType',
type: 'string',
placeholder: 'Bug, Task, Story',
description: 'Type of issue to create',
show: {
issueActions: ['createIssue']
},
additionalParams: true,
optional: true
},
{
label: 'Summary',
name: 'issueSummary',
type: 'string',
description: 'Issue summary/title',
show: {
issueActions: ['createIssue', 'updateIssue']
},
additionalParams: true,
optional: true
},
{
label: 'Description',
name: 'issueDescription',
type: 'string',
description: 'Issue description',
show: {
issueActions: ['createIssue', 'updateIssue']
},
additionalParams: true,
optional: true
},
{
label: 'Priority',
name: 'issuePriority',
type: 'string',
placeholder: 'Highest, High, Medium, Low, Lowest',
description: 'Issue priority',
show: {
issueActions: ['createIssue', 'updateIssue']
},
additionalParams: true,
optional: true
},
{
label: 'Issue Key',
name: 'issueKey',
type: 'string',
placeholder: 'PROJ-123',
description: 'Issue key (e.g., PROJ-123)',
show: {
issueActions: ['getIssue', 'updateIssue', 'deleteIssue', 'assignIssue', 'transitionIssue']
},
additionalParams: true,
optional: true
},
{
label: 'Assignee Account ID',
name: 'assigneeAccountId',
type: 'string',
description: 'Account ID of the user to assign',
show: {
issueActions: ['assignIssue', 'createIssue', 'updateIssue']
},
additionalParams: true,
optional: true
},
{
label: 'Transition ID',
name: 'transitionId',
type: 'string',
description: 'ID of the transition to execute',
show: {
issueActions: ['transitionIssue']
},
additionalParams: true,
optional: true
},
{
label: 'JQL Query',
name: 'jqlQuery',
type: 'string',
placeholder: 'project = PROJ AND status = "To Do"',
description: 'JQL query for filtering issues',
show: {
issueActions: ['listIssues']
},
additionalParams: true,
optional: true
},
{
label: 'Max Results',
name: 'issueMaxResults',
type: 'number',
default: 50,
description: 'Maximum number of issues to return',
show: {
issueActions: ['listIssues']
},
additionalParams: true,
optional: true
},
// COMMENT PARAMETERS
{
label: 'Issue Key (for Comments)',
name: 'commentIssueKey',
type: 'string',
placeholder: 'PROJ-123',
description: 'Issue key for comment operations',
show: {
commentActions: ['listComments', 'createComment']
},
additionalParams: true,
optional: true
},
{
label: 'Comment Text',
name: 'commentText',
type: 'string',
description: 'Comment content',
show: {
commentActions: ['createComment', 'updateComment']
},
additionalParams: true,
optional: true
},
{
label: 'Comment ID',
name: 'commentId',
type: 'string',
description: 'ID of the comment',
show: {
commentActions: ['getComment', 'updateComment', 'deleteComment']
},
additionalParams: true,
optional: true
},
// USER PARAMETERS
{
label: 'Search Query',
name: 'userQuery',
type: 'string',
placeholder: 'john.doe',
description: 'Query string for user search',
show: {
userActions: ['searchUsers']
},
additionalParams: true,
optional: true
},
{
label: 'Account ID',
name: 'userAccountId',
type: 'string',
description: 'User account ID',
show: {
userActions: ['getUser', 'updateUser', 'deleteUser']
},
additionalParams: true,
optional: true
},
{
label: 'Email Address',
name: 'userEmail',
type: 'string',
placeholder: 'user@example.com',
description: 'User email address',
show: {
userActions: ['createUser', 'updateUser']
},
additionalParams: true,
optional: true
},
{
label: 'Display Name',
name: 'userDisplayName',
type: 'string',
description: 'User display name',
show: {
userActions: ['createUser', 'updateUser']
},
additionalParams: true,
optional: true
},
{
label: 'User Max Results',
name: 'userMaxResults',
type: 'number',
default: 50,
description: 'Maximum number of users to return',
show: {
userActions: ['searchUsers']
},
additionalParams: true,
optional: true
}
]
}
async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
let credentialData = await getCredentialData(nodeData.credential ?? '', options)
const username = getCredentialParam('username', credentialData, nodeData)
const accessToken = getCredentialParam('accessToken', credentialData, nodeData)
const jiraHost = nodeData.inputs?.jiraHost as string
if (!username) {
throw new Error('No username found in credential')
}
if (!accessToken) {
throw new Error('No access token found in credential')
}
if (!jiraHost) {
throw new Error('No Jira host provided')
}
// Get all actions based on type
const jiraType = nodeData.inputs?.jiraType as string
let actions: string[] = []
if (jiraType === 'issues') {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.issueActions)
} else if (jiraType === 'comments') {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.commentActions)
} else if (jiraType === 'users') {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.userActions)
}
const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
// Create and return tools based on selected actions
const tools = createJiraTools({
actions,
username,
accessToken,
jiraHost,
defaultParams
})
return tools
}
transformNodeInputsToToolArgs(nodeData: INodeData): Record<string, any> {
// Collect default parameters from inputs
const defaultParams: Record<string, any> = {}
// Issue parameters
if (nodeData.inputs?.projectKey) defaultParams.projectKey = nodeData.inputs.projectKey
if (nodeData.inputs?.issueType) defaultParams.issueType = nodeData.inputs.issueType
if (nodeData.inputs?.issueSummary) defaultParams.issueSummary = nodeData.inputs.issueSummary
if (nodeData.inputs?.issueDescription) defaultParams.issueDescription = nodeData.inputs.issueDescription
if (nodeData.inputs?.issuePriority) defaultParams.issuePriority = nodeData.inputs.issuePriority
if (nodeData.inputs?.issueKey) defaultParams.issueKey = nodeData.inputs.issueKey
if (nodeData.inputs?.assigneeAccountId) defaultParams.assigneeAccountId = nodeData.inputs.assigneeAccountId
if (nodeData.inputs?.transitionId) defaultParams.transitionId = nodeData.inputs.transitionId
if (nodeData.inputs?.jqlQuery) defaultParams.jqlQuery = nodeData.inputs.jqlQuery
if (nodeData.inputs?.issueMaxResults) defaultParams.issueMaxResults = nodeData.inputs.issueMaxResults
// Comment parameters
if (nodeData.inputs?.commentIssueKey) defaultParams.commentIssueKey = nodeData.inputs.commentIssueKey
if (nodeData.inputs?.commentText) defaultParams.commentText = nodeData.inputs.commentText
if (nodeData.inputs?.commentId) defaultParams.commentId = nodeData.inputs.commentId
// User parameters
if (nodeData.inputs?.userQuery) defaultParams.userQuery = nodeData.inputs.userQuery
if (nodeData.inputs?.userAccountId) defaultParams.userAccountId = nodeData.inputs.userAccountId
if (nodeData.inputs?.userEmail) defaultParams.userEmail = nodeData.inputs.userEmail
if (nodeData.inputs?.userDisplayName) defaultParams.userDisplayName = nodeData.inputs.userDisplayName
if (nodeData.inputs?.userMaxResults) defaultParams.userMaxResults = nodeData.inputs.userMaxResults
return defaultParams
}
}
module.exports = { nodeClass: Jira_Tools }