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

Creates an issue or, where the option to create subtasks is enabled in Jira, a subtask.

Created by hugo697 879 days ago Picked 13 times
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
8
 * Creates an issue or, where the option to create subtasks is enabled in Jira, a subtask.
9
 */
10
export async function main(
11
  auth: Jira,
12
  updateHistory: string | undefined,
13
  body: {
14
    fields?: { [k: string]: unknown };
15
    historyMetadata?: {
16
      activityDescription?: string;
17
      activityDescriptionKey?: string;
18
      actor?: {
19
        avatarUrl?: string;
20
        displayName?: string;
21
        displayNameKey?: string;
22
        id?: string;
23
        type?: string;
24
        url?: string;
25
        [k: string]: unknown;
26
      };
27
      cause?: {
28
        avatarUrl?: string;
29
        displayName?: string;
30
        displayNameKey?: string;
31
        id?: string;
32
        type?: string;
33
        url?: string;
34
        [k: string]: unknown;
35
      };
36
      description?: string;
37
      descriptionKey?: string;
38
      emailDescription?: string;
39
      emailDescriptionKey?: string;
40
      extraData?: { [k: string]: string };
41
      generator?: {
42
        avatarUrl?: string;
43
        displayName?: string;
44
        displayNameKey?: string;
45
        id?: string;
46
        type?: string;
47
        url?: string;
48
        [k: string]: unknown;
49
      };
50
      type?: string;
51
      [k: string]: unknown;
52
    };
53
    properties?: { key?: string; value?: { [k: string]: unknown } }[];
54
    transition?: {
55
      expand?: string;
56
      fields?: {
57
        [k: string]: {
58
          allowedValues?: { [k: string]: unknown }[];
59
          autoCompleteUrl?: string;
60
          configuration?: { [k: string]: { [k: string]: unknown } };
61
          defaultValue?: { [k: string]: unknown };
62
          hasDefaultValue?: boolean;
63
          key: string;
64
          name: string;
65
          operations: string[];
66
          required: boolean;
67
          schema: {
68
            configuration?: { [k: string]: { [k: string]: unknown } };
69
            custom?: string;
70
            customId?: number;
71
            items?: string;
72
            system?: string;
73
            type: string;
74
          };
75
        };
76
      };
77
      hasScreen?: boolean;
78
      id?: string;
79
      isAvailable?: boolean;
80
      isConditional?: boolean;
81
      isGlobal?: boolean;
82
      isInitial?: boolean;
83
      looped?: boolean;
84
      name?: string;
85
      to?: {
86
        description?: string;
87
        iconUrl?: string;
88
        id?: string;
89
        name?: string;
90
        scope?: {
91
          project?: {
92
            avatarUrls?: {
93
              "16x16"?: string;
94
              "24x24"?: string;
95
              "32x32"?: string;
96
              "48x48"?: string;
97
            };
98
            id?: string;
99
            key?: string;
100
            name?: string;
101
            projectCategory?: {
102
              description?: string;
103
              id?: string;
104
              name?: string;
105
              self?: string;
106
            };
107
            projectTypeKey?: "software" | "service_desk" | "business";
108
            self?: string;
109
            simplified?: boolean;
110
          };
111
          type?: "PROJECT" | "TEMPLATE";
112
          [k: string]: unknown;
113
        };
114
        self?: string;
115
        statusCategory?: {
116
          colorName?: string;
117
          id?: number;
118
          key?: string;
119
          name?: string;
120
          self?: string;
121
          [k: string]: unknown;
122
        };
123
        [k: string]: unknown;
124
      };
125
      [k: string]: unknown;
126
    };
127
    update?: {
128
      [k: string]: {
129
        add?: { [k: string]: unknown };
130
        copy?: { [k: string]: unknown };
131
        edit?: { [k: string]: unknown };
132
        remove?: { [k: string]: unknown };
133
        set?: { [k: string]: unknown };
134
      }[];
135
    };
136
    [k: string]: unknown;
137
  }
138
) {
139
  const url = new URL(`https://${auth.domain}.atlassian.net/rest/api/2/issue`);
140
  for (const [k, v] of [["updateHistory", updateHistory]]) {
141
    if (v !== undefined && v !== "") {
142
      url.searchParams.append(k, v);
143
    }
144
  }
145
  const response = await fetch(url, {
146
    method: "POST",
147
    headers: {
148
      "Content-Type": "application/json",
149
      Authorization: "Basic " + btoa(`${auth.username}:${auth.password}`),
150
    },
151
    body: JSON.stringify(body),
152
  });
153
  if (!response.ok) {
154
    const text = await response.text();
155
    throw new Error(`${response.status} ${text}`);
156
  }
157
  return await response.json();
158
}
159