From 29d9765a8167d55b9c34db96b45fd126029e3b9d Mon Sep 17 00:00:00 2001
From: bytedream <bytedream@protonmail.com>
Date: Sun, 24 Dec 2023 00:58:38 +0100
Subject: [PATCH] fix webhook only working when reported user is changed

---
 src/lib/server/webhook.ts           |  2 +-
 src/routes/admin/reports/+server.ts | 21 ++++++++++++++++-----
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/lib/server/webhook.ts b/src/lib/server/webhook.ts
index d91e0d5..f2b7d67 100644
--- a/src/lib/server/webhook.ts
+++ b/src/lib/server/webhook.ts
@@ -1,4 +1,4 @@
-async function webhookUserReported(endpoint: string, uuid: string) {
+export async function webhookUserReported(endpoint: string, uuid: string) {
 	await fetch(endpoint, {
 		method: 'POST',
 		headers: {
diff --git a/src/routes/admin/reports/+server.ts b/src/routes/admin/reports/+server.ts
index aa346f1..e9e52a3 100644
--- a/src/routes/admin/reports/+server.ts
+++ b/src/routes/admin/reports/+server.ts
@@ -6,6 +6,7 @@ import type { Attributes } from 'sequelize';
 import { Op } from 'sequelize';
 import { env } from '$env/dynamic/private';
 import crypto from 'crypto';
+import { webhookUserReported } from '$lib/server/webhook';
 
 export const POST = (async ({ request, cookies }) => {
 	if (getSession(cookies, { permissions: [Permissions.ReportRead] }) == null) {
@@ -114,9 +115,17 @@ export const PATCH = (async ({ request, cookies }) => {
 	if (report === null || (admin === null && data.auditor != -1) || reported === null)
 		return new Response(null, { status: 400 });
 
-	let reportedChanged: string | undefined;
+	const webhookTriggerUsers: string[] = [];
 	if (report.reported_id != reported?.id) {
-		reportedChanged = reported ? reported.uuid : (await User.findByPk(report.reported_id))?.uuid;
+		const oldReportUser = await User.findByPk(report.reported_id);
+		if (oldReportUser) webhookTriggerUsers.push(oldReportUser.uuid);
+		if (reported) webhookTriggerUsers.push(reported.uuid);
+	} else if (
+		reported &&
+		report.reported_id != null &&
+		report.strike_reason_id != data.strike_reason
+	) {
+		webhookTriggerUsers.push(reported.uuid);
 	}
 
 	report.reported_id = reported?.id ?? null;
@@ -147,9 +156,11 @@ export const PATCH = (async ({ request, cookies }) => {
 
 	await report.save();
 
-	if (reportedChanged != null && data.status == 'reviewed' && env.REPORTED_WEBHOOK) {
-		// no `await` to avoid blocking
-		webhookUserReported(env.REPORTED_WEBHOOK, reportedChanged);
+	if (webhookTriggerUsers.length > 0 && data.status == 'reviewed' && env.REPORTED_WEBHOOK) {
+		for (const webhookTriggerUser in webhookTriggerUsers) {
+			// no `await` to avoid blocking
+			webhookUserReported(env.REPORTED_WEBHOOK, webhookTriggerUser);
+		}
 	}
 
 	return new Response();