jira-node / node-jira-client

A Node.js wrapper for the Jira REST API
https://jira-node.github.io/
MIT License
449 stars 168 forks source link

Rank API calls failing #335

Open Andr3wid opened 2 years ago

Andr3wid commented 2 years ago

Hello there :wave:

I'm currently trying to use the rankIssues(body) method as follows:

// code exists inside a function that answers an HTTP-request
const jiraClient = new JiraApi({ ... });

    const rankRequestBody = {
      issues: ['ISSUE-10'],
      rankBeforeIssue: 'ISSUE-12',
      rankCustomFieldId: 10057,
    };

    return jiraClient.rankIssues(rankRequestBody);

The rankIssues call fails with the following reason:

Error: Can not instantiate value of type [simple type, class com.atlassian.greenhopper.api.rest.bean.IssueRankRequestBean] from JSON String; no single-String constructor/factory method
    at JiraApi.doRequest (/path/to/project/node_modules/jira-client/lib/jira.js:333:15)

The error seems to indicate that the request-body is malformed according to this source. The exact same request-body works when submitted through postman though. After some digging, it seems that the request body gets stringified twice or something. Indeed if I directly pass rankRequestBody without stringifying it (or changing the expected type to object in the corresponding type-declaration), the call works. :tada:

Is the expected body something different than the stringified request-body, or is this a typing issue?

EDIT: Intercepted the doRequest() method and inspected the options before they are submitted.

When passing `rankRequestBody` as `object` (--> request works): ```json { "auth": { /* Auth related stuff */ }, "rejectUnauthorized": true, "method": "PUT", "uri": "https://my-base-uri.xyz/rest/agile/1.0/issue/rank", "json": true, "body": { "issues": ["ISSUE-10"], "rankBeforeIssue": "ISSUE-12", "rankCustomFieldId":10057 } } ```
When passing `rankRequestBody` as `string`ified version (as noted in comments and types; --> request fails): ```json { "auth": { /* Auth related stuff */ }, "rejectUnauthorized": true, "method": "PUT", "uri": "https://my-base-uri.xyz/rest/agile/1.0/issue/rank", "json": true, "body": "{\"issues\":[\"ISSUE-10\"],\"rankBeforeIssue\":\"ISSUE-12\",\"rankCustomFieldId\":10057}" } ```
sawilde commented 1 year ago

I came to report the same issue but instead I will :+1: this

my workaround was to do this

const body = {
  rankBeforeIssue: page.issues[0].key,
  issues: [issueKey],
};
return jira.rankIssues(body as unknown as string)
Seth10001 commented 1 year ago

I'm under the impression that it's intended to be passed as a string since the jsdoc indicates that here: https://github.com/jira-node/node-jira-client/blob/9dc7c187271077dc98ff316fbd9e4b9dbb271508/src/jira.js#L1852