From 883da22790d615a106c66117a3841305f28ff831 Mon Sep 17 00:00:00 2001 From: William Ryder Date: Thu, 11 Apr 2024 13:57:57 +0200 Subject: [PATCH 1/3] feat: append documentId to discord actions --- src/workers/discordReview.ts | 161 ++++++++++++++++++----------------- 1 file changed, 84 insertions(+), 77 deletions(-) diff --git a/src/workers/discordReview.ts b/src/workers/discordReview.ts index cb1d3d88..e1962e7a 100644 --- a/src/workers/discordReview.ts +++ b/src/workers/discordReview.ts @@ -28,21 +28,22 @@ class JobData extends Job { async function saveToDb(id: string, report: any) { return await elastic.indexReport(id, report) } - -const buttonRow = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setCustomId('approve') - .setLabel('Approve') - .setStyle(ButtonStyle.Success), - new ButtonBuilder() - .setCustomId('edit') - .setLabel('Edit') - .setStyle(ButtonStyle.Primary), - new ButtonBuilder() - .setCustomId('reject') - .setLabel('Reject') - .setStyle(ButtonStyle.Danger) -) +const createButtonRow = (documentId) => { + return new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId(`approve-${documentId}`) + .setLabel('Approve') + .setStyle(ButtonStyle.Success), + new ButtonBuilder() + .setCustomId(`edit-${documentId}`) + .setLabel('Edit') + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId(`reject-${documentId}`) + .setLabel('Reject') + .setStyle(ButtonStyle.Danger) + ); +}; const worker = new Worker( 'discordReview', @@ -57,6 +58,7 @@ const worker = new Worker( parsedJson.url = job.data.url job.log(`Saving to db: ${job.data.pdfHash}`) const documentId = await saveToDb(job.data.pdfHash, parsedJson) + const buttonRow = createButtonRow(documentId) const summary = await summaryTable(parsedJson) const scope3 = await scope3Table(parsedJson) @@ -88,69 +90,74 @@ ${job.data.url} discord.client.on('interactionCreate', async (interaction) => { let reportState = '' - if (interaction.isButton() && interaction.customId === 'approve') { - reportState = 'approved' - interaction.update({ - embeds: [ - new EmbedBuilder() - .setTitle('Godkänd') - .setDescription( - `Tack för din granskning, ${interaction?.user?.username}!` - ), - ], - components: [], - }) - } else if (interaction.isButton() && interaction.customId === 'edit') { - reportState = 'edited' - const input = new TextInputBuilder() - .setCustomId('editInput') - .setLabel(`Granska utsläppsdata`) - .setStyle(TextInputStyle.Paragraph) - - const actionRow = - new ActionRowBuilder().addComponents( - input - ) - - const modal = new ModalBuilder() - .setCustomId('editModal') - .setTitle(`Granska data för ${parsedJson.companyName}`) - .addComponents(actionRow) - // todo diskutera hur detta görs på bästa sätt för mänskliga granskaren. vad är alex input? - - await interaction.showModal(modal) - - const submitted = await interaction - .awaitModalSubmit({ - time: 60000 * 20, // user has to submit the modal within 20 minutes - filter: (i) => i.user.id === interaction.user.id, // only user who clicked button can interact with modal - }) - .catch((error) => { - console.error(error) - return null - }) - - if (submitted) { - const userInput = submitted.fields.getTextInputValue('editInput') - await submitted.reply({ - content: `Tack för din granskning: \n ${userInput}`, - }) + if (interaction.isButton()) { + const [action, interactionDocumentId] = interaction.customId.split('-') + switch (action) { + case 'approve': + reportState = 'approved'; + interaction.update({ + embeds: [ + new EmbedBuilder() + .setTitle('Godkänd') + .setDescription( + `Tack för din granskning, ${interaction?.user?.username}!` + ), + ], + components: [], + }) + break; + case 'edit': + reportState = 'edited'; + const input = new TextInputBuilder() + .setCustomId('editInput') + .setLabel(`Granska utsläppsdata`) + .setStyle(TextInputStyle.Paragraph) + + const actionRow = + new ActionRowBuilder().addComponents( + input + ) + + const modal = new ModalBuilder() + .setCustomId('editModal') + .setTitle(`Granska data för ${parsedJson.companyName}`) + .addComponents(actionRow) + // todo diskutera hur detta görs på bästa sätt för mänskliga granskaren. vad är alex input? + + await interaction.showModal(modal) + + const submitted = await interaction + .awaitModalSubmit({ + time: 60000 * 20, // user has to submit the modal within 20 minutes + filter: (i) => i.user.id === interaction.user.id, // only user who clicked button can interact with modal + }) + .catch((error) => { + console.error(error) + return null + }) + + if (submitted) { + const userInput = submitted.fields.getTextInputValue('editInput') + await submitted.reply({ + content: `Tack för din granskning: \n ${userInput}`, + }) + } + break; + case 'reject': + reportState = 'rejected'; + interaction.update({ + content: 'Rejected!', + embeds: [], + components: [], + }) + break; } - } else if (interaction.isButton() && interaction.customId === 'reject') { - // todo diskutera vad vill vill händer. ska man ens få rejecta? - reportState = 'rejected' - interaction.update({ - content: 'Rejected!', - embeds: [], - components: [], - }) - } - - if (reportState !== '') { - try { - await elastic.updateDocumentState(documentId, reportState) - } catch (error) { - job.log(`Error updating document state: ${error.message}`) + if (reportState !== '') { + try { + await elastic.updateDocumentState(interactionDocumentId, reportState) + } catch (error) { + job.log(`Error updating document state: ${error.message}`) + } } } }) From 663168b5c96cf57dae50bb9893430eda9c75ac17 Mon Sep 17 00:00:00 2001 From: William Ryder Date: Thu, 11 Apr 2024 14:03:52 +0200 Subject: [PATCH 2/3] feat: display reportId --- src/workers/discordReview.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/workers/discordReview.ts b/src/workers/discordReview.ts index e1962e7a..39cfe392 100644 --- a/src/workers/discordReview.ts +++ b/src/workers/discordReview.ts @@ -66,7 +66,7 @@ const worker = new Worker( job.log(`Sending message to Discord channel ${discord.channelId}`) try { discord.sendMessageToChannel(discord.channelId, { - content: `Ny företagsdata behöver manuell hantering: + content: `Ny företagsdata behöver manuell hantering (reportId: ${documentId}): # ${parsedJson.companyName} (*${parsedJson.industry}*) ${job.data.url} ## Tolkad data: @@ -98,7 +98,7 @@ ${job.data.url} interaction.update({ embeds: [ new EmbedBuilder() - .setTitle('Godkänd') + .setTitle(`Godkänd (reportId: ${interactionDocumentId})`) .setDescription( `Tack för din granskning, ${interaction?.user?.username}!` ), From c342c21e0c6f4535e2987df0cb36c5266c00a3e8 Mon Sep 17 00:00:00 2001 From: William Ryder Date: Thu, 11 Apr 2024 15:19:38 +0200 Subject: [PATCH 3/3] chore: semicolons --- src/workers/discordReview.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/workers/discordReview.ts b/src/workers/discordReview.ts index 90170ece..e5306ab7 100644 --- a/src/workers/discordReview.ts +++ b/src/workers/discordReview.ts @@ -103,7 +103,7 @@ ${job.data.url} ], components: [], }) - break; + break case 'edit': reportState = 'edited'; const input = new TextInputBuilder() @@ -140,7 +140,7 @@ ${job.data.url} content: `Tack för din granskning: \n ${userInput}`, }) } - break; + break case 'reject': reportState = 'rejected'; interaction.update({ @@ -148,7 +148,7 @@ ${job.data.url} embeds: [], components: [], }) - break; + break } if (reportState !== '') { try {