diff --git a/components/brave_search_api/brave_search_api.app.mjs b/components/brave_search_api/brave_search_api.app.mjs index 09a477e24209e..fad13cd5853e9 100644 --- a/components/brave_search_api/brave_search_api.app.mjs +++ b/components/brave_search_api/brave_search_api.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/freshdesk/actions/add-note-to-ticket/add-note-to-ticket.mjs b/components/freshdesk/actions/add-note-to-ticket/add-note-to-ticket.mjs new file mode 100644 index 0000000000000..f8fa1cc684abd --- /dev/null +++ b/components/freshdesk/actions/add-note-to-ticket/add-note-to-ticket.mjs @@ -0,0 +1,104 @@ +import freshdesk from "../../freshdesk.app.mjs"; +import { ConfigurationError } from "@pipedream/platform"; + +export default { + key: "freshdesk-add-note-to-ticket", + name: "Add Note to Ticket", + description: "Add a note or conversation to an existing ticket. [See the documentation](https://developers.freshdesk.com/api/#add_note_to_a_ticket).", + version: "0.0.1", + type: "action", + props: { + freshdesk, + ticketId: { + propDefinition: [ + freshdesk, + "ticketId", + ], + }, + body: { + type: "string", + label: "Note Body", + description: "Content of the note in HTML format", + }, + private: { + type: "boolean", + label: "Private Note", + description: "Set to true if the note is private (internal)", + default: false, + }, + incoming: { + type: "boolean", + label: "Incoming", + description: "Set to true if the note should be marked as incoming (false for outgoing)", + default: false, + optional: true, + }, + user_id: { + propDefinition: [ + freshdesk, + "agentId", + ], + label: "User ID", + description: "ID of the user creating the note (defaults to the API user)", + optional: true, + }, + notify_emails: { + type: "string[]", + label: "Notify Emails", + description: "Array of email addresses to notify about this note", + optional: true, + }, + }, + async run({ $ }) { + const { + freshdesk, + ticketId, + body, + private: isPrivate, + incoming, + user_id, + notify_emails, + } = this; + + if (!body || !body.trim()) { + throw new ConfigurationError("Note body cannot be empty"); + } + + const ticketName = await freshdesk.getTicketName(ticketId) || "Unknown Ticket"; + + const data = { + body, + private: isPrivate, + }; + + if (incoming !== undefined) { + data.incoming = incoming; + } + + if (user_id) { + const userId = Number(user_id); + if (isNaN(userId)) { + throw new ConfigurationError("User ID must be a valid number"); + } + data.user_id = userId; + } + + if (notify_emails && notify_emails.length > 0) { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + const invalidEmails = notify_emails.filter((email) => !emailRegex.test(email)); + if (invalidEmails.length > 0) { + throw new ConfigurationError(`Invalid email addresses: ${invalidEmails.join(", ")}`); + } + data.notify_emails = notify_emails; + } + + const response = await freshdesk.addNoteToTicket({ + $, + ticketId: Number(ticketId), + data, + }); + + $.export("$summary", `Note added to ticket "${ticketName}" (ID: ${ticketId})`); + return response; + }, +}; diff --git a/components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs b/components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs index 62db32235e53a..c96706ba9990c 100644 --- a/components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs +++ b/components/freshdesk/actions/add-ticket-tags/add-ticket-tags.mjs @@ -6,7 +6,7 @@ export default { 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", + version: "0.0.2", props: { freshdesk, ticketId: { diff --git a/components/freshdesk/actions/assign-ticket-to-agent/assign-ticket-to-agent.mjs b/components/freshdesk/actions/assign-ticket-to-agent/assign-ticket-to-agent.mjs index 59ff9b4c94476..159c2756d867b 100644 --- a/components/freshdesk/actions/assign-ticket-to-agent/assign-ticket-to-agent.mjs +++ b/components/freshdesk/actions/assign-ticket-to-agent/assign-ticket-to-agent.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-assign-ticket-to-agent", name: "Assign Ticket to Agent", description: "Assign a Freshdesk ticket to a specific agent. [See the documentation](https://developers.freshdesk.com/api/#update_ticket).", - version: "0.0.2", + version: "0.0.3", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/assign-ticket-to-group/assign-ticket-to-group.mjs b/components/freshdesk/actions/assign-ticket-to-group/assign-ticket-to-group.mjs index 053c43b865bf1..dab86e1316c0e 100644 --- a/components/freshdesk/actions/assign-ticket-to-group/assign-ticket-to-group.mjs +++ b/components/freshdesk/actions/assign-ticket-to-group/assign-ticket-to-group.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-assign-ticket-to-group", name: "Assign Ticket to Group", description: "Assign a Freshdesk ticket to a specific group [See the documentation](https://developers.freshdesk.com/api/#update_ticket).", - version: "0.0.2", + version: "0.0.3", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/close-ticket/close-ticket.mjs b/components/freshdesk/actions/close-ticket/close-ticket.mjs index ed11003c729d7..6697f7e56db1a 100644 --- a/components/freshdesk/actions/close-ticket/close-ticket.mjs +++ b/components/freshdesk/actions/close-ticket/close-ticket.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-close-ticket", name: "Close Ticket", description: "Set a Freshdesk ticket's status to 'Closed'. [See docs](https://developers.freshdesk.com/api/#update_a_ticket)", - version: "0.0.2", + version: "0.0.3", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/create-company/create-company.mjs b/components/freshdesk/actions/create-company/create-company.mjs index 4c710b57e9d94..77c77ee7a217f 100644 --- a/components/freshdesk/actions/create-company/create-company.mjs +++ b/components/freshdesk/actions/create-company/create-company.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-create-company", name: "Create a Company", description: "Create a company. [See the documentation](https://developers.freshdesk.com/api/#create_company)", - version: "0.0.5", + version: "0.0.6", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/create-contact/create-contact.mjs b/components/freshdesk/actions/create-contact/create-contact.mjs index a233d6075c15c..c3a092d912504 100644 --- a/components/freshdesk/actions/create-contact/create-contact.mjs +++ b/components/freshdesk/actions/create-contact/create-contact.mjs @@ -5,7 +5,7 @@ export default { key: "freshdesk-create-contact", name: "Create a Contact", description: "Create a contact. [See the documentation](https://developers.freshdesk.com/api/#create_contact)", - version: "0.0.5", + version: "0.0.6", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/create-ticket/create-ticket.mjs b/components/freshdesk/actions/create-ticket/create-ticket.mjs index 5cb4c3de171fe..2ca3a9844b591 100644 --- a/components/freshdesk/actions/create-ticket/create-ticket.mjs +++ b/components/freshdesk/actions/create-ticket/create-ticket.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-create-ticket", name: "Create a Ticket", description: "Create a ticket. [See the documentation](https://developers.freshdesk.com/api/#create_ticket)", - version: "0.0.6", + version: "0.0.7", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/get-ticket/get-ticket.mjs b/components/freshdesk/actions/get-ticket/get-ticket.mjs index 60115c6f4ddcc..2e5b5ed1cca0c 100644 --- a/components/freshdesk/actions/get-ticket/get-ticket.mjs +++ b/components/freshdesk/actions/get-ticket/get-ticket.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-get-ticket", name: "Get Ticket Details", description: "Get details of a Ticket. [See the documentation](https://developers.freshdesk.com/api/#view_a_ticket)", - version: "0.1.3", + version: "0.1.4", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/list-all-tickets/list-all-tickets.mjs b/components/freshdesk/actions/list-all-tickets/list-all-tickets.mjs index dc28a74d5cb78..54d1386349165 100644 --- a/components/freshdesk/actions/list-all-tickets/list-all-tickets.mjs +++ b/components/freshdesk/actions/list-all-tickets/list-all-tickets.mjs @@ -5,7 +5,7 @@ export default { name: "List Tickets", description: "Fetch up to 100 tickets according to the selected filters. [See the documentation](https://developers.freshdesk.com/api/#list_all_tickets)", - version: "0.2.3", + version: "0.2.4", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs b/components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs index 4a921408d576a..6709bd0269688 100644 --- a/components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs +++ b/components/freshdesk/actions/remove-ticket-tags/remove-ticket-tags.mjs @@ -6,7 +6,7 @@ export default { 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", + version: "0.0.2", props: { freshdesk, ticketId: { diff --git a/components/freshdesk/actions/set-ticket-priority/set-ticket-priority.mjs b/components/freshdesk/actions/set-ticket-priority/set-ticket-priority.mjs index 5e29a3b43b081..d995792ab33da 100644 --- a/components/freshdesk/actions/set-ticket-priority/set-ticket-priority.mjs +++ b/components/freshdesk/actions/set-ticket-priority/set-ticket-priority.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-set-ticket-priority", name: "Set Ticket Priority", description: "Update the priority of a ticket in Freshdesk [See the documentation](https://developers.freshdesk.com/api/#update_ticket).", - version: "0.0.2", + version: "0.0.3", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/set-ticket-status/set-ticket-status.mjs b/components/freshdesk/actions/set-ticket-status/set-ticket-status.mjs index cdcb7e6bdfa39..82f40ada10849 100644 --- a/components/freshdesk/actions/set-ticket-status/set-ticket-status.mjs +++ b/components/freshdesk/actions/set-ticket-status/set-ticket-status.mjs @@ -4,7 +4,7 @@ export default { key: "freshdesk-set-ticket-status", name: "Set Ticket Status", description: "Update the status of a ticket in Freshdesk [See the documentation](https://developers.freshdesk.com/api/#update_ticket).", - version: "0.0.2", + version: "0.0.3", type: "action", props: { freshdesk, diff --git a/components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs b/components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs index 95201dd7f9182..a7adcce2437f9 100644 --- a/components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs +++ b/components/freshdesk/actions/set-ticket-tags/set-ticket-tags.mjs @@ -6,7 +6,7 @@ export default { 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", + version: "0.0.2", props: { freshdesk, ticketId: { diff --git a/components/freshdesk/actions/update-ticket/update-ticket.mjs b/components/freshdesk/actions/update-ticket/update-ticket.mjs index 67e7a354c4dd5..77e7804dedd2c 100644 --- a/components/freshdesk/actions/update-ticket/update-ticket.mjs +++ b/components/freshdesk/actions/update-ticket/update-ticket.mjs @@ -5,7 +5,7 @@ export default { key: "freshdesk-update-ticket", name: "Update a Ticket", description: "Update status, priority, subject, description, agent, group, etc. [See the documentation](https://developers.freshdesk.com/api/#update_ticket).", - version: "0.0.2", + version: "0.0.3", type: "action", props: { freshdesk, @@ -100,7 +100,7 @@ export default { const data = removeNullEntries(fields); - const ticketName = await freshdesk.getTicketName(ticketId); + const ticketName = await freshdesk.getTicketName(ticketId) || "Unknown Ticket"; if (!Object.keys(data).length) { throw new Error("Please provide at least one field to update."); @@ -119,4 +119,3 @@ export default { return response; }, }; - diff --git a/components/freshdesk/freshdesk.app.mjs b/components/freshdesk/freshdesk.app.mjs index 3a50a0148acf1..a9d816414dacb 100644 --- a/components/freshdesk/freshdesk.app.mjs +++ b/components/freshdesk/freshdesk.app.mjs @@ -257,10 +257,17 @@ export default { }); }, async getTicketName(ticketId) { - const ticket = await this.getTicket({ - ticketId, - }); - return ticket.subject; + try { + const ticket = await this.getTicket({ + ticketId, + }); + return ticket.subject; + } catch (error) { + if (error.response?.status === 404) { + return null; + } + throw error; + } }, parseIfJSONString(input) { if (typeof input === "string") { @@ -272,6 +279,29 @@ export default { } return input; }, + /** + * Add a note to a Freshdesk ticket + * @param {Object} options - The options object + * @param {number} options.ticketId - The ID of the ticket to add the note to + * @param {Object} options.data - The note data object + * @param {string} options.data.body - Content of the note in HTML format + * @param {boolean} [options.data.private=false] - Whether the note is private + * @param {boolean} [options.data.incoming] - Whether the note is incoming + * @param {number} [options.data.user_id] - ID of the user creating the note + * @param {string[]} [options.data.notify_emails] - Array of email addresses to notify + * @param {...*} args - Additional arguments passed to _makeRequest + * @returns {Promise} The API response containing the created note + */ + async addNoteToTicket({ + ticketId, data, ...args + }) { + return this._makeRequest({ + url: `/tickets/${ticketId}/notes`, + method: "post", + data, + ...args, + }); + }, /** * Set tags on a ticket (replaces all existing tags) * @param {object} args - Arguments object diff --git a/components/freshdesk/package.json b/components/freshdesk/package.json index 47eec8f471b46..7b0c3c96ae7af 100644 --- a/components/freshdesk/package.json +++ b/components/freshdesk/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/freshdesk", - "version": "0.3.0", + "version": "0.3.1", "description": "Pipedream Freshdesk Components", "main": "freshdesk.app.mjs", "keywords": [ diff --git a/components/freshdesk/sources/new-contact/new-contact.mjs b/components/freshdesk/sources/new-contact/new-contact.mjs index 3c44548ec65c9..3b67fb9814b11 100644 --- a/components/freshdesk/sources/new-contact/new-contact.mjs +++ b/components/freshdesk/sources/new-contact/new-contact.mjs @@ -6,7 +6,7 @@ export default { key: "freshdesk-new-contact", name: "New Contact Created", description: "Emit new event when a contact is created. [See the documentation](https://developers.freshdesk.com/api/#filter_contacts)", - version: "0.0.6", + version: "0.0.7", type: "source", props: { freshdesk, diff --git a/components/freshdesk/sources/new-ticket/new-ticket.mjs b/components/freshdesk/sources/new-ticket/new-ticket.mjs index 6489da3509641..3d9f9ef4fea5e 100644 --- a/components/freshdesk/sources/new-ticket/new-ticket.mjs +++ b/components/freshdesk/sources/new-ticket/new-ticket.mjs @@ -6,7 +6,7 @@ export default { key: "freshdesk-new-ticket", name: "New Ticket Created", description: "Emit new event when a ticket is created. [See the documentation](https://developers.freshdesk.com/api/#filter_tickets)", - version: "0.0.6", + version: "0.0.7", type: "source", props: { freshdesk, diff --git a/components/rewiser/rewiser.app.mjs b/components/rewiser/rewiser.app.mjs index ef1fd0b3eefa4..ca620607b3660 100644 --- a/components/rewiser/rewiser.app.mjs +++ b/components/rewiser/rewiser.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/snipe_it/snipe_it.app.mjs b/components/snipe_it/snipe_it.app.mjs index b3bcc011d69ba..f0411fdaba9e1 100644 --- a/components/snipe_it/snipe_it.app.mjs +++ b/components/snipe_it/snipe_it.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e794e293099c4..5868cc99b8d2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1829,8 +1829,7 @@ importers: components/brandmentions: {} - components/brave_search_api: - specifiers: {} + components/brave_search_api: {} components/braze: {} @@ -12854,8 +12853,7 @@ importers: specifier: ^3.0.0 version: 3.0.3 - components/snipe_it: - specifiers: {} + components/snipe_it: {} components/snov: dependencies: