node-jira-client icon indicating copy to clipboard operation
node-jira-client copied to clipboard

Rank API calls failing

Open Andr3wid opened this issue 3 years ago • 2 comments

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):
{
  "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):
{
  "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}"
}

Andr3wid avatar Jan 20 '22 12:01 Andr3wid

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)

sawilde avatar Jul 23 '22 07:07 sawilde

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

Seth10001 avatar Oct 02 '22 14:10 Seth10001