nodes/YouTrack/resources/issueDraft/update.ts (115 lines of code) (raw):

import {INodeProperties, NodeOperationError} from 'n8n-workflow'; import type { IssueDraftUpdateRequestBody } from '../types'; const DEFAULT_FIELDS = 'id,idReadable,summary,description'; export const issueDraftUpdateDescription: INodeProperties[] = [ // Fields to Update { displayName: 'Update Fields', name: 'updateFields', type: 'collection', placeholder: 'Add Field', default: { summary: '', description: '', }, displayOptions: { show: { resource: ['issueDraft'], operation: ['update'], }, }, options: [ { displayName: 'Project', name: 'project', type: 'string', default: '', description: 'Project database ID (e.g., 0-0). Use the Get Projects operation to find the ID if you only have the short name.', routing: { send: { type: 'body', property: 'project', preSend: [ /** * Validates and formats the project ID for issue draft updates. * Ensures the project ID is in the correct database ID format (e.g., "0-0", "1-2"). * Converts the string ID to the required object format { id: "..." }. * * @throws {NodeOperationError} If project ID format is invalid (must be "number-number") */ async function (this, requestOptions) { const project = this.getNodeParameter('updateFields.project') as string; if (!project) { return requestOptions; } // Validate that it's a database ID format (number-number) const isDatabaseId = /^\d+-\d+$/.test(project); if (!isDatabaseId) { throw new NodeOperationError( this.getNode(), `Invalid project ID format: "${project}". Please provide a database ID in the format "0-0" (e.g., "0-0", "1-2"). Use the "Get Projects" operation to find the database ID if you only have the short name.`, { itemIndex: this.getItemIndex() } ); } if (requestOptions.body && typeof requestOptions.body === 'object') { (requestOptions.body as IssueDraftUpdateRequestBody).project = { id: project }; } return requestOptions; }, ], }, }, }, { displayName: 'Summary', name: 'summary', type: 'string', default: '', description: 'New issue draft title/summary', routing: { send: { type: 'body', property: 'summary', }, }, }, { displayName: 'Description', name: 'description', type: 'string', typeOptions: { rows: 4, }, default: '', description: 'New issue draft description', routing: { send: { type: 'body', property: 'description', }, }, }, ], }, { displayName: 'Additional Options', name: 'additionalOptions', type: 'collection', placeholder: 'Add Option', default: { fields: DEFAULT_FIELDS, }, displayOptions: { show: { resource: ['issueDraft'], operation: ['update'], }, }, options: [ { displayName: 'Fields', name: 'fields', type: 'string', default: DEFAULT_FIELDS, description: 'Comma-separated list of fields to return in response. If not specified, only entityID is returned.', routing: { send: { type: 'query', property: 'fields', }, }, }, ], }, ]