De nos jours, peu de services Web ou d'applications se passent de fonctionnalités, où les utilisateurs peuvent se plaindre (notifier, signaler) divers types de contenu, qu'il s'agisse d'une erreur grammaticale dans le texte, d'une formulation erronée, d'un contenu inintéressant ou non informatif (comme un exercice, une leçon, un article , matériel de formation ou partie de la fonctionnalité) . Être capable de «signaler un problème» fait partie intégrante de l'engagement des utilisateurs dans un produit, de la mise en œuvre d'une forme de collecte de commentaires et de la capacité d'améliorer votre application dans son ensemble.
- , , , , , . , . , Uxcel JIRA REST API.
“Report a problem”?
— ?
Uxcel — - UI/UX . “” — 2 , , — . . (hint — ) (description) , .
— , - , - , , . “ ” , , . , , , , .
, backlog-, , JIRA + REST API.
JIRA
1 BUG JIRA Practices Reports. -. , Label ( : Course, Gym, UEye). :
, - ( ) .
.
JIRA REST API
API token JIRA, JIRA API. , , .
API :
- -> Create
. - , .
API JIRA. , ( ) — HTTP basic authentication.
( TypeScript NodeJS):
private generateAuthHeader(): string {
// email:apiToken Base64
const basicAuthValue = Buffer.from(`${this.jiraEmail}:${this.jiraApiToken}`).toString('base64');
return `Basic ${basicAuthValue}`;
}
: AWS Secrets Manager. . .
API
. , Issue ID JIRA. — GET :
GET https://{id}.atlassian.net/rest/api/3/issuetype
, Postman:
Authorization Type: Basic Auth, email api token.
:
{
"self": "https://{id}.atlassian.net/rest/api/3/issuetype/10004",
"id": "10001",
"description": "A problem or error.",
"iconUrl": "https://${id}.atlassian.net/secure/viewavatar?size=medium&avatarId=10303&avatarType=issuetype",
"name": "Bug",
"untranslatedName": "Bug",
"subtask": false,
"avatarId": 10303
}
Issue Id BUG (“10001”) Project Id, . id .
GET
GET https://{id}.atlassian.net/rest/api/3/project/search
: , (Jira Epic). id , Key ( , , UX-1).
API.
npm Got HTTP NodeJS.
await got.post({
url: `${this.jiraApiHost}/issue`, // jiraApiHost = https://{id}.atlassian.net/rest/api/3
headers: {
Authorization: authorization, // Basic Auth Header generateAuthHeader
'Content-Type': 'application/json'
},
responseType: 'json',
json: {
update: {},
fields: {
issuetype: { id: this.jiraBugTypeId }, // id BUG ( - ‘10001’)
project: { id: this.jiraPracticeReportProjectId }, // id ( - ‘10005’)
parent: { key: this.jiraPracticeReportEpicKey }, // Epic ( - UX-1)
summary: practiceTicketName, // - [practiceId] practiceName (#reports)
labels: [practice.label]
}
}
});
. JIRA, : , , , .
API
API . , , .
:
// JQL , BUG id ( )
const jql = `issuetype = Bug AND project = CNT AND parent = ${this.jiraEpicKey} AND text ~ "${practiceId}" order by created DESC`;
const response = await got.get({
url: `${this.jiraApiHost}/search?jql=${jql}`,
headers: {
Authorization: authorization
},
responseType: 'json'
});
const practiceJiraTicket = response.body['issues'] && response.body['issues'][0];
, , CLOSED.
API
, Transitions. Status ID TODO / OPENED ( JIRA).
Postman:
GET https://{id}.atlassian.net/rest/api/3/project/{projectIdOrKey}/statuses
id , , id.
:
await got.post({
url: `${this.jiraApiHost}/issue/${practiceJiraTicket.key}/transitions`, // practiceJiraTicket -
headers: {
Authorization: authorization,
'Content-Type': 'application/json'
},
responseType: 'json',
json: {
transition: {
id: this.jiraToDoStatusId // id ( - ‘10006’)
}
}
});
— ( , ).
API
, id . . , n — .
API :
await got.put({
url: `${this.jiraApiHost}/issue/${practiceJiraTicket.key}`,
headers: {
Authorization: authorization,
'Content-Type': 'application/json'
},
responseType: 'json',
json: {
update: {
summary: [{ set: newPracticeTicketName }]
}
}
});
.
API
-.
:
await got.post({
url: `${this.jiraApiHost}/issue/${practiceJiraTicket.key}/comment`,
headers: {
Authorization: authorization,
'Content-Type': 'application/json'
},
responseType: 'json',
json: comment //
});
comment Atlassian Document Format.
Builder, : — JSON .
! , , , JIRA.
:
JIRA ( id, #N — , % — ):
. , :
- , JIRA ( AWS SNS)
- priority
- Slack (slack/webhook — )
- JIRA Webhooks, ,
- , .
! , :)
!