Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
acadcde
Jira Service Desk package
GTFalcao Sep 28, 2023
f570ae1
pnpm
GTFalcao Sep 28, 2023
9e5d724
Initial AI-generated code (after eslint fixes)
GTFalcao Sep 29, 2023
d7a577b
AI-generated app file
GTFalcao Sep 29, 2023
baa15c9
App file adjustments
GTFalcao Sep 29, 2023
91363b4
prop definitions and adjustments for 'create request'
GTFalcao Sep 29, 2023
188d7f2
Create Request adjustments
GTFalcao Sep 29, 2023
aca848b
Adding and fixing propDefinitions
GTFalcao Sep 29, 2023
f56d242
'create comment on request'
GTFalcao Sep 29, 2023
2d7ef0e
Merge branch 'master' into 8017-jira-service-desk
GTFalcao Oct 2, 2023
c60754f
pnpm
GTFalcao Oct 2, 2023
9ad9fff
Adjustments for 'create request'
GTFalcao Oct 2, 2023
3e387c8
Merge branch 'master' into 8017-jira-service-desk
GTFalcao Oct 3, 2023
e80048d
pnpm
GTFalcao Oct 3, 2023
dd4d5b6
Adding Cloud ID prop definition
GTFalcao Oct 3, 2023
ac42991
'Create Request' implementation with cloudId
GTFalcao Oct 4, 2023
dc39ba7
'Create Comment on Request' with cloudId implementation
GTFalcao Oct 4, 2023
423d0c3
'New Request Created' source with cloudId implemn
GTFalcao Oct 4, 2023
936b06d
Adding test events for sources
GTFalcao Oct 4, 2023
34a8894
Request updated + common structure for sources
GTFalcao Oct 4, 2023
5ab11e4
fix
GTFalcao Oct 4, 2023
ff7a911
key fix
GTFalcao Oct 4, 2023
3997995
Source improvements
GTFalcao Oct 4, 2023
28bfbd0
Merge branch 'master' into 8017-jira-service-desk
GTFalcao Oct 4, 2023
d21a19e
pnpm
GTFalcao Oct 4, 2023
54c9844
Merge branch 'master' into 8017-jira-service-desk
GTFalcao Oct 4, 2023
617e411
newline
GTFalcao Oct 4, 2023
ceb69bf
Merge branch 'master' into 8017-jira-service-desk
GTFalcao Oct 4, 2023
e297edd
Merge branch 'master' into 8017-jira-service-desk
GTFalcao Oct 6, 2023
c72fd16
Adding request type fields as additionalProps
GTFalcao Oct 8, 2023
650b1d5
Adding timestamp to id to avoid bad deduping
GTFalcao Oct 8, 2023
c0bf46d
Improving custom field description
GTFalcao Oct 8, 2023
952e966
Further improving field description
GTFalcao Oct 8, 2023
8ce5589
Docs link update
GTFalcao Oct 9, 2023
5354f62
Merge branch 'master' into 8017-jira-service-desk
GTFalcao Oct 10, 2023
bf9881c
Adding field schema to prop description
GTFalcao Oct 10, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions components/jira_service_desk/.gitignore

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import jiraServiceDesk from "../../jira_service_desk.app.mjs";

export default {
key: "jira_service_desk-create-comment-on-request",
name: "Create Comment on Request",
description: "Create a comment on a customer request. [See the documentation](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-request/#api-rest-servicedeskapi-request-issueidorkey-comment-post)",
version: "0.0.1",
type: "action",
props: {
jiraServiceDesk,
cloudId: {
propDefinition: [
jiraServiceDesk,
"cloudId",
],
},
requestId: {
propDefinition: [
jiraServiceDesk,
"requestId",
({ cloudId }) => ({
cloudId,
}),
],
},
body: {
type: "string",
label: "Comment Body",
description: "The content of the comment",
},
isPublic: {
type: "boolean",
label: "Public",
description: "Whether the comment is public or not",
},
},
async run({ $ }) {
const {
cloudId, requestId, body, isPublic,
} = this;
const response = await this.jiraServiceDesk.createRequestComment({
$,
cloudId,
requestId,
data: {
body,
public: isPublic,
},
});
$.export("$summary", "Successfully created comment on request");
return response;
},
};
115 changes: 115 additions & 0 deletions components/jira_service_desk/actions/create-request/create-request.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import jiraServiceDesk from "../../jira_service_desk.app.mjs";

export default {
key: "jira_service_desk-create-request",
name: "Create Request",
description:
"Creates a new customer request. [See the documentation](https://docs.atlassian.com/jira-servicedesk/REST/3.6.2/#servicedeskapi/request-createCustomerRequest)",
version: "0.0.1",
type: "action",
props: {
jiraServiceDesk,
cloudId: {
propDefinition: [
jiraServiceDesk,
"cloudId",
],
},
serviceDeskId: {
propDefinition: [
jiraServiceDesk,
"serviceDeskId",
({ cloudId }) => ({
cloudId,
}),
],
},
requestTypeId: {
propDefinition: [
jiraServiceDesk,
"requestTypeId",
({
cloudId, serviceDeskId,
}) => ({
cloudId,
serviceDeskId,
}),
],
reloadProps: true,
},
requestParticipants: {
type: "string[]",
label: "Request Participants",
description:
"Not available to users who only have the Service Desk customer permission.",
optional: true,
},
},
async additionalProps() {
const {
cloudId, serviceDeskId, requestTypeId,
} = this;
const types = await this.jiraServiceDesk.getRequestTypeFields({
cloudId,
serviceDeskId,
requestTypeId,
});

return Object.fromEntries(
types.map((field) => [
field.fieldId,
{
type: "string",
label: `Field: "${field.name}"`,
description: `[See the documentation](https://docs.atlassian.com/jira-servicedesk/REST/3.6.2/#fieldformats) for info on specific fields. If the provided value is not a string, it will be parsed as JSON.${field.description
? `
\\
Field description: "${field.description}"`
: ""}${field.jiraSchema
? `
\\
Field schema: \`${JSON.stringify(field.jiraSchema)}\``
: ""}`,
optional: !field.required,
},
]),
);
},
async run({ $ }) {
const {
// eslint-disable-next-line no-unused-vars
jiraServiceDesk,
cloudId,
serviceDeskId,
requestTypeId,
requestParticipants,
...requestFieldValues
} = this;

Object.entries(requestFieldValues).forEach(([
key,
value,
]) => {
try {
const parsedValue = JSON.parse(value);
requestFieldValues[key] = parsedValue;
}
catch (err) {
// ignore non-serializable values
}
});

const response = await this.jiraServiceDesk.createCustomerRequest({
$,
cloudId,
data: {
serviceDeskId,
requestTypeId,
requestFieldValues,
requestParticipants,
},
});
$.export("$summary", "Successfully created request");
return response;
},
};
13 changes: 0 additions & 13 deletions components/jira_service_desk/app/jira_service_desk.app.ts

This file was deleted.

144 changes: 144 additions & 0 deletions components/jira_service_desk/jira_service_desk.app.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import { axios } from "@pipedream/platform";

export default {
type: "app",
app: "jira_service_desk",
propDefinitions: {
cloudId: {
type: "string",
label: "Cloud ID",
description: "Select a site, or provide a custom ID.",
async options() {
const sites = await this.getSites();
return sites?.filter?.(({ scopes }) => scopes?.includes("write:servicedesk-request")).map(({
id, name,
}) => ({
label: name,
value: id,
}));
},
},
serviceDeskId: {
type: "string",
label: "Service Desk ID",
description: "Select a service desk, or provide a custom ID.",
async options({ cloudId }) {
const desks = await this.getServiceDesks({
cloudId,
});
return desks?.map?.(({
id, projectName,
}) => ({
label: projectName,
value: id,
}));
},
},
requestId: {
type: "string",
label: "Request ID",
description: "Select a request, or provide a custom ID.",
async options({ cloudId }) {
const requests = await this.getCustomerRequests({
cloudId,
});
return requests?.map?.(({
issueId, issueKey, requestFieldValues,
}) => {
const summary = requestFieldValues?.find?.(({ fieldId }) => fieldId === "summary")?.value;
return ({
label: `(${issueKey}) ${summary}`,
value: issueId,
});
});
},
},
requestTypeId: {
type: "string",
label: "Request Type ID",
description: "Select a request type, or provide a custom ID.",
async options({
cloudId, serviceDeskId,
}) {
const types = await this.getRequestTypes({
cloudId,
serviceDeskId,
});
return types?.map?.(({
id, name,
}) => ({
label: name,
value: id,
}));
},
},
},
methods: {
_baseUrl() {
return "https://api.atlassian.com";
},
async _makeRequest({
$ = this, path, headers, ...otherOpts
} = {}) {
return axios($, {
...otherOpts,
url: this._baseUrl() + path,
headers: {
...headers,
Authorization: `Bearer ${this.$auth.oauth_access_token}`,
},
});
},
async getSites() {
return this._makeRequest({
path: "/oauth/token/accessible-resources",
});
},
async getServiceDesks({ cloudId }) {
const response = await this._makeRequest({
path: `/ex/jira/${cloudId}/rest/servicedeskapi/servicedesk`,
});
return response.values;
},
async getRequestTypes({
cloudId, serviceDeskId,
}) {
const response = await this._makeRequest({
path: `/ex/jira/${cloudId}/rest/servicedeskapi/servicedesk/${serviceDeskId}/requesttype`,
});
return response.values;
},
async getRequestTypeFields({
cloudId, serviceDeskId, requestTypeId,
}) {
const response = await this._makeRequest({
path: `/ex/jira/${cloudId}/rest/servicedeskapi/servicedesk/${serviceDeskId}/requesttype/${requestTypeId}/field`,
});
return response.requestTypeFields;
},
async getCustomerRequests({ cloudId }) {
const response = await this._makeRequest({
path: `/ex/jira/${cloudId}/rest/servicedeskapi/request`,
});
return response.values;
},
async createCustomerRequest({
cloudId, ...opts
}) {
return this._makeRequest({
...opts,
method: "POST",
path: `/ex/jira/${cloudId}/rest/servicedeskapi/request`,
});
},
async createRequestComment({
cloudId, requestId, ...opts
}) {
return this._makeRequest({
...opts,
method: "POST",
path: `/ex/jira/${cloudId}/rest/servicedeskapi/request/${requestId}/comment`,
});
},
},
};
10 changes: 6 additions & 4 deletions components/jira_service_desk/package.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
{
"name": "@pipedream/jira_service_desk",
"version": "0.0.1",
"version": "0.1.0",
"description": "Pipedream Jira Service Desk Components",
"main": "dist/app/jira_service_desk.app.mjs",
"main": "jira_service_desk.app.mjs",
"keywords": [
"pipedream",
"jira_service_desk"
],
"files": ["dist"],
"homepage": "https://pipedream.com/apps/jira_service_desk",
"author": "Pipedream <support@pipedream.com> (https://pipedream.com/)",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@pipedream/platform": "^1.5.1"
}
}
}
Loading