From e292f3f8e279aa5d594485d06a94b9a529fbbc80 Mon Sep 17 00:00:00 2001 From: seynadio <79858321+seynadio@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:08:29 +0200 Subject: [PATCH] Add comprehensive tag management for Freshdesk tickets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added ticketTags prop definition to freshdesk.app.mjs - Added 3 tag management methods: setTicketTags, addTicketTags, removeTicketTags - Created 3 dedicated tag actions: set-ticket-tags, add-ticket-tags, remove-ticket-tags - Enhanced update-ticket action with tag support - Provides feature parity with Zendesk tag management 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../add-ticket-tags/add-ticket-tags.mjs | 44 +++++++++++ .../remove-ticket-tags/remove-ticket-tags.mjs | 44 +++++++++++ .../set-ticket-tags/set-ticket-tags.mjs | 44 +++++++++++ .../actions/update-ticket/update-ticket.mjs | 7 ++ components/freshdesk/freshdesk.app.mjs | 74 +++++++++++++++++++ 5 files changed, 213 insertions(+) create mode 100644 components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs create mode 100644 components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs create mode 100644 components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs diff --git a/components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs b/components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs new file mode 100644 index 0000000000000..99650853acee7 --- /dev/null +++ b/components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs @@ -0,0 +1,44 @@ +import freshdesk from "../../freshdesk.app.mjs"; + +export default { + key: "freshdesk-add-ticket-tags", + name: "Add Ticket Tags", + description: "Add tags to a ticket (appends to existing tags). [See the documentation](https://developers.freshdesk.com/api/#update_ticket)", + type: "action", + version: "0.0.1", + props: { + freshdesk, + ticketId: { + propDefinition: [ + freshdesk, + "ticketId", + ], + }, + ticketTags: { + propDefinition: [ + freshdesk, + "ticketTags", + ], + description: "Array of tags to add to the ticket. These will be added to any existing tags.", + }, + }, + async run({ $ }) { + const { + ticketId, + ticketTags, + } = this; + + if (!ticketTags || ticketTags.length === 0) { + throw new Error("At least one tag must be provided"); + } + + const response = await this.freshdesk.addTicketTags({ + ticketId, + tags: ticketTags, + $, + }); + + $.export("$summary", `Successfully added ${ticketTags.length} tag(s) to ticket ${ticketId}`); + return response; + }, +}; \ No newline at end of file diff --git a/components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs b/components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs new file mode 100644 index 0000000000000..364dfb25f7a8a --- /dev/null +++ b/components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs @@ -0,0 +1,44 @@ +import freshdesk from "../../freshdesk.app.mjs"; + +export default { + key: "freshdesk-remove-ticket-tags", + name: "Remove Ticket Tags", + description: "Remove specific tags from a ticket. [See the documentation](https://developers.freshdesk.com/api/#update_ticket)", + type: "action", + version: "0.0.1", + props: { + freshdesk, + ticketId: { + propDefinition: [ + freshdesk, + "ticketId", + ], + }, + ticketTags: { + propDefinition: [ + freshdesk, + "ticketTags", + ], + description: "Array of tags to remove from the ticket. Only these specific tags will be removed.", + }, + }, + async run({ $ }) { + const { + ticketId, + ticketTags, + } = this; + + if (!ticketTags || ticketTags.length === 0) { + throw new Error("At least one tag must be provided"); + } + + const response = await this.freshdesk.removeTicketTags({ + ticketId, + tags: ticketTags, + $, + }); + + $.export("$summary", `Successfully removed ${ticketTags.length} tag(s) from ticket ${ticketId}`); + return response; + }, +}; \ No newline at end of file diff --git a/components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs b/components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs new file mode 100644 index 0000000000000..b0b55bb0ab93b --- /dev/null +++ b/components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs @@ -0,0 +1,44 @@ +import freshdesk from "../../freshdesk.app.mjs"; + +export default { + key: "freshdesk-set-ticket-tags", + name: "Set Ticket Tags", + description: "Set tags on a ticket (replaces all existing tags). [See the documentation](https://developers.freshdesk.com/api/#update_ticket)", + type: "action", + version: "0.0.1", + props: { + freshdesk, + ticketId: { + propDefinition: [ + freshdesk, + "ticketId", + ], + }, + ticketTags: { + propDefinition: [ + freshdesk, + "ticketTags", + ], + description: "Array of tags to set on the ticket. This will replace all existing tags.", + }, + }, + async run({ $ }) { + const { + ticketId, + ticketTags, + } = this; + + if (!ticketTags || ticketTags.length === 0) { + throw new Error("At least one tag must be provided"); + } + + const response = await this.freshdesk.setTicketTags({ + ticketId, + tags: ticketTags, + $, + }); + + $.export("$summary", `Successfully set ${ticketTags.length} tag(s) on ticket ${ticketId}`); + return response; + }, +}; \ No newline at end of file diff --git a/components/freshdesk/actions/update-ticket/update-ticket.mjs b/components/freshdesk/actions/update-ticket/update-ticket.mjs index f1dd5c8c1e7df..91dd51eaceb3f 100644 --- a/components/freshdesk/actions/update-ticket/update-ticket.mjs +++ b/components/freshdesk/actions/update-ticket/update-ticket.mjs @@ -90,6 +90,13 @@ export default { description: "Custom fields as key-value pairs (make sure types match your config)", optional: true, }, + tags: { + propDefinition: [ + freshdesk, + "ticketTags", + ], + description: "Array of tags to set on the ticket. This will replace all existing tags.", + }, }, async run({ $ }) { const { diff --git a/components/freshdesk/freshdesk.app.mjs b/components/freshdesk/freshdesk.app.mjs index fe405b1c37151..e8137480e16b8 100644 --- a/components/freshdesk/freshdesk.app.mjs +++ b/components/freshdesk/freshdesk.app.mjs @@ -116,6 +116,12 @@ export default { })); }, }, + ticketTags: { + type: "string[]", + label: "Tags", + description: "Array of tags to apply to the ticket. Each tag must be 32 characters or less.", + optional: true, + }, }, methods: { setLastDateChecked(db, value) { @@ -266,5 +272,73 @@ export default { } return input; }, + /** + * Set tags on a ticket (replaces all existing tags) + * @param {object} args - Arguments object + * @param {string|number} args.ticketId - The ticket ID + * @param {string[]} args.tags - Array of tags to set + * @returns {Promise} API response + */ + async setTicketTags({ + ticketId, tags, ...args + }) { + return this._makeRequest({ + url: `/tickets/${ticketId}`, + method: "PUT", + data: { + tags, + }, + ...args, + }); + }, + /** + * Add tags to a ticket (appends to existing tags) + * @param {object} args - Arguments object + * @param {string|number} args.ticketId - The ticket ID + * @param {string[]} args.tags - Array of tags to add + * @returns {Promise} API response + */ + async addTicketTags({ + ticketId, tags, ...args + }) { + // Get current ticket to merge tags + const ticket = await this.getTicket({ + ticketId, + ...args, + }); + const currentTags = ticket.tags || []; + const newTags = [...new Set([...currentTags, ...tags])]; // Remove duplicates + + return this.setTicketTags({ + ticketId, + tags: newTags, + ...args, + }); + }, + /** + * Remove specific tags from a ticket + * @param {object} args - Arguments object + * @param {string|number} args.ticketId - The ticket ID + * @param {string[]} args.tags - Array of tags to remove + * @returns {Promise} API response + */ + async removeTicketTags({ + ticketId, tags, ...args + }) { + // Get current ticket to filter tags + const ticket = await this.getTicket({ + ticketId, + ...args, + }); + const currentTags = ticket.tags || []; + const tagsToRemove = new Set(tags); + const remainingTags = currentTags.filter(tag => !tagsToRemove.has(tag)); + + return this.setTicketTags({ + ticketId, + tags: remainingTags, + ...args, + }); + }, }, };