Create issue link
One script reply has been approved by the moderators Verified

Creates a link between two issues.

Created by hugo697 879 days ago Picked 1 time
Submitted by hugo697 Typescript (fetch-only)
Verified 327 days ago
1
type Jira = {
2
  username: string;
3
  password: string;
4
  domain: string;
5
};
6
/**
7
 * Create issue link
8
 * Creates a link between two issues.
9
 */
10
export async function main(
11
  auth: Jira,
12
  body: {
13
    comment?: {
14
      author?: {
15
        accountId?: string;
16
        accountType?: string;
17
        active?: boolean;
18
        avatarUrls?: {
19
          "16x16"?: string;
20
          "24x24"?: string;
21
          "32x32"?: string;
22
          "48x48"?: string;
23
        };
24
        displayName?: string;
25
        emailAddress?: string;
26
        key?: string;
27
        name?: string;
28
        self?: string;
29
        timeZone?: string;
30
      };
31
      body?: string;
32
      created?: string;
33
      id?: string;
34
      jsdAuthorCanSeeRequest?: boolean;
35
      jsdPublic?: boolean;
36
      properties?: { key?: string; value?: { [k: string]: unknown } }[];
37
      renderedBody?: string;
38
      self?: string;
39
      updateAuthor?: {
40
        accountId?: string;
41
        accountType?: string;
42
        active?: boolean;
43
        avatarUrls?: {
44
          "16x16"?: string;
45
          "24x24"?: string;
46
          "32x32"?: string;
47
          "48x48"?: string;
48
        };
49
        displayName?: string;
50
        emailAddress?: string;
51
        key?: string;
52
        name?: string;
53
        self?: string;
54
        timeZone?: string;
55
      };
56
      updated?: string;
57
      visibility?: {
58
        identifier?: string;
59
        type?: "group" | "role";
60
        value?: string;
61
        [k: string]: unknown;
62
      };
63
      [k: string]: unknown;
64
    };
65
    inwardIssue: {
66
      fields?: {
67
        assignee?: {
68
          accountId?: string;
69
          accountType?: string;
70
          active?: boolean;
71
          avatarUrls?: {
72
            "16x16"?: string;
73
            "24x24"?: string;
74
            "32x32"?: string;
75
            "48x48"?: string;
76
          };
77
          displayName?: string;
78
          emailAddress?: string;
79
          key?: string;
80
          name?: string;
81
          self?: string;
82
          timeZone?: string;
83
        };
84
        issueType?: {
85
          avatarId?: number;
86
          description?: string;
87
          entityId?: string;
88
          hierarchyLevel?: number;
89
          iconUrl?: string;
90
          id?: string;
91
          name?: string;
92
          scope?: {
93
            project?: {
94
              avatarUrls?: {
95
                "16x16"?: string;
96
                "24x24"?: string;
97
                "32x32"?: string;
98
                "48x48"?: string;
99
              };
100
              id?: string;
101
              key?: string;
102
              name?: string;
103
              projectCategory?: {
104
                description?: string;
105
                id?: string;
106
                name?: string;
107
                self?: string;
108
              };
109
              projectTypeKey?: "software" | "service_desk" | "business";
110
              self?: string;
111
              simplified?: boolean;
112
            };
113
            type?: "PROJECT" | "TEMPLATE";
114
            [k: string]: unknown;
115
          };
116
          self?: string;
117
          subtask?: boolean;
118
        };
119
        issuetype?: {
120
          avatarId?: number;
121
          description?: string;
122
          entityId?: string;
123
          hierarchyLevel?: number;
124
          iconUrl?: string;
125
          id?: string;
126
          name?: string;
127
          scope?: {
128
            project?: {
129
              avatarUrls?: {
130
                "16x16"?: string;
131
                "24x24"?: string;
132
                "32x32"?: string;
133
                "48x48"?: string;
134
              };
135
              id?: string;
136
              key?: string;
137
              name?: string;
138
              projectCategory?: {
139
                description?: string;
140
                id?: string;
141
                name?: string;
142
                self?: string;
143
              };
144
              projectTypeKey?: "software" | "service_desk" | "business";
145
              self?: string;
146
              simplified?: boolean;
147
            };
148
            type?: "PROJECT" | "TEMPLATE";
149
            [k: string]: unknown;
150
          };
151
          self?: string;
152
          subtask?: boolean;
153
        };
154
        priority?: {
155
          description?: string;
156
          iconUrl?: string;
157
          id?: string;
158
          isDefault?: boolean;
159
          name?: string;
160
          self?: string;
161
          statusColor?: string;
162
          [k: string]: unknown;
163
        };
164
        status?: {
165
          description?: string;
166
          iconUrl?: string;
167
          id?: string;
168
          name?: string;
169
          self?: string;
170
          statusCategory?: {
171
            colorName?: string;
172
            id?: number;
173
            key?: string;
174
            name?: string;
175
            self?: string;
176
            [k: string]: unknown;
177
          };
178
          [k: string]: unknown;
179
        };
180
        summary?: string;
181
        timetracking?: {
182
          originalEstimate?: string;
183
          originalEstimateSeconds?: number;
184
          remainingEstimate?: string;
185
          remainingEstimateSeconds?: number;
186
          timeSpent?: string;
187
          timeSpentSeconds?: number;
188
        };
189
      };
190
      id?: string;
191
      key?: string;
192
      self?: string;
193
    };
194
    outwardIssue: {
195
      fields?: {
196
        assignee?: {
197
          accountId?: string;
198
          accountType?: string;
199
          active?: boolean;
200
          avatarUrls?: {
201
            "16x16"?: string;
202
            "24x24"?: string;
203
            "32x32"?: string;
204
            "48x48"?: string;
205
          };
206
          displayName?: string;
207
          emailAddress?: string;
208
          key?: string;
209
          name?: string;
210
          self?: string;
211
          timeZone?: string;
212
        };
213
        issueType?: {
214
          avatarId?: number;
215
          description?: string;
216
          entityId?: string;
217
          hierarchyLevel?: number;
218
          iconUrl?: string;
219
          id?: string;
220
          name?: string;
221
          scope?: {
222
            project?: {
223
              avatarUrls?: {
224
                "16x16"?: string;
225
                "24x24"?: string;
226
                "32x32"?: string;
227
                "48x48"?: string;
228
              };
229
              id?: string;
230
              key?: string;
231
              name?: string;
232
              projectCategory?: {
233
                description?: string;
234
                id?: string;
235
                name?: string;
236
                self?: string;
237
              };
238
              projectTypeKey?: "software" | "service_desk" | "business";
239
              self?: string;
240
              simplified?: boolean;
241
            };
242
            type?: "PROJECT" | "TEMPLATE";
243
            [k: string]: unknown;
244
          };
245
          self?: string;
246
          subtask?: boolean;
247
        };
248
        issuetype?: {
249
          avatarId?: number;
250
          description?: string;
251
          entityId?: string;
252
          hierarchyLevel?: number;
253
          iconUrl?: string;
254
          id?: string;
255
          name?: string;
256
          scope?: {
257
            project?: {
258
              avatarUrls?: {
259
                "16x16"?: string;
260
                "24x24"?: string;
261
                "32x32"?: string;
262
                "48x48"?: string;
263
              };
264
              id?: string;
265
              key?: string;
266
              name?: string;
267
              projectCategory?: {
268
                description?: string;
269
                id?: string;
270
                name?: string;
271
                self?: string;
272
              };
273
              projectTypeKey?: "software" | "service_desk" | "business";
274
              self?: string;
275
              simplified?: boolean;
276
            };
277
            type?: "PROJECT" | "TEMPLATE";
278
            [k: string]: unknown;
279
          };
280
          self?: string;
281
          subtask?: boolean;
282
        };
283
        priority?: {
284
          description?: string;
285
          iconUrl?: string;
286
          id?: string;
287
          isDefault?: boolean;
288
          name?: string;
289
          self?: string;
290
          statusColor?: string;
291
          [k: string]: unknown;
292
        };
293
        status?: {
294
          description?: string;
295
          iconUrl?: string;
296
          id?: string;
297
          name?: string;
298
          self?: string;
299
          statusCategory?: {
300
            colorName?: string;
301
            id?: number;
302
            key?: string;
303
            name?: string;
304
            self?: string;
305
            [k: string]: unknown;
306
          };
307
          [k: string]: unknown;
308
        };
309
        summary?: string;
310
        timetracking?: {
311
          originalEstimate?: string;
312
          originalEstimateSeconds?: number;
313
          remainingEstimate?: string;
314
          remainingEstimateSeconds?: number;
315
          timeSpent?: string;
316
          timeSpentSeconds?: number;
317
        };
318
      };
319
      id?: string;
320
      key?: string;
321
      self?: string;
322
    };
323
    type: {
324
      id?: string;
325
      inward?: string;
326
      name?: string;
327
      outward?: string;
328
      self?: string;
329
    };
330
  }
331
) {
332
  const url = new URL(
333
    `https://${auth.domain}.atlassian.net/rest/api/2/issueLink`
334
  );
335

336
  const response = await fetch(url, {
337
    method: "POST",
338
    headers: {
339
      "Content-Type": "application/json",
340
      Authorization: "Basic " + btoa(`${auth.username}:${auth.password}`),
341
    },
342
    body: JSON.stringify(body),
343
  });
344
  if (!response.ok) {
345
    const text = await response.text();
346
    throw new Error(`${response.status} ${text}`);
347
  }
348
  return await response.json();
349
}
350