Ok so here is the code for posterity. This is using the new node runtime.
function extractUUID(url) {
const regex = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/;
const match = url.match(regex);
return match ? match[0] : null;
}
//issueIdorKey is the issue on which I am operating, sanitizedContent in this case is the file I am attaching, and fileName is the original file name I am working with
async function createAttachment(issueIdOrKey, sanitizedContent, fileName) {
try {
var n = fileName.lastIndexOf(".");
var newFileName = fileName.substring(0, n) + "-cleaned" + fileName.substring(n);
const form = new FormData();
// Convert sanitizedContent to a Buffer if it's a string or an object
const fileBuffer = Buffer.from(JSON.stringify(sanitizedContent));
form.append('file', fileBuffer, { filename: newFileName });
console.log('uploading file to jira');
const response = await api.asApp().requestJira(route`/rest/api/3/issue/${issueIdOrKey}/attachments`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'X-Atlassian-Token': 'no-check', // This header is required for file uploads
...form.getHeaders()
},
body: form
});
console.log(`Response: ${response.status} ${response.statusText}`);
const responseJson = await response.json();
//console.log(JSON.stringify(responseJson[0].id));
const requestUrl = `/rest/api/3/attachment/content/${responseJson[0].id}`;
const attachmentResponse = await api.asApp().requestJira(route`${requestUrl}`, {
headers: {
'Accept': 'application/json'
}
});
console.log(`New Attachment Response: ${attachmentResponse.status} ${attachmentResponse.statusText} ${attachmentResponse.url}`);
const mediaURL = await attachmentResponse.url;
const newMediaId = extractUUID(mediaURL);
return {
status: response.status === 200,
id: newMediaId
};
} catch (error) {
console.error('Error creating attachment:', error);
}
}
Full app code is available OSS for review at GitHub - AbregaInc/securely