From 548da9ade30368289c5beaf0a8ee2ed2b5c1d81c Mon Sep 17 00:00:00 2001
From: timothycarambat <rambat1010@gmail.com>
Date: Tue, 27 Aug 2024 16:27:58 -0700
Subject: [PATCH] Exception handler on embed chat middleware

---
 server/utils/middleware/embedMiddleware.js | 193 +++++++++++----------
 1 file changed, 104 insertions(+), 89 deletions(-)

diff --git a/server/utils/middleware/embedMiddleware.js b/server/utils/middleware/embedMiddleware.js
index c87d87711..e9d1c3eae 100644
--- a/server/utils/middleware/embedMiddleware.js
+++ b/server/utils/middleware/embedMiddleware.js
@@ -41,31 +41,112 @@ async function validEmbedConfigId(request, response, next) {
 }
 
 async function canRespond(request, response, next) {
-  const embed = response.locals.embedConfig;
-  if (!embed) {
-    response.sendStatus(404).end();
-    return;
-  }
+  try {
+    const embed = response.locals.embedConfig;
+    if (!embed) {
+      response.sendStatus(404).end();
+      return;
+    }
 
-  // Block if disabled by admin.
-  if (!embed.enabled) {
-    response.status(503).json({
-      id: uuidv4(),
-      type: "abort",
-      textResponse: null,
-      sources: [],
-      close: true,
-      error:
-        "This chat has been disabled by the administrator - try again later.",
-    });
-    return;
-  }
+    // Block if disabled by admin.
+    if (!embed.enabled) {
+      response.status(503).json({
+        id: uuidv4(),
+        type: "abort",
+        textResponse: null,
+        sources: [],
+        close: true,
+        error:
+          "This chat has been disabled by the administrator - try again later.",
+      });
+      return;
+    }
 
-  // Check if requester hostname is in the valid allowlist of domains.
-  const host = request.headers.origin ?? "";
-  const allowedHosts = EmbedConfig.parseAllowedHosts(embed);
-  if (allowedHosts !== null && !allowedHosts.includes(host)) {
-    response.status(401).json({
+    // Check if requester hostname is in the valid allowlist of domains.
+    const host = request.headers.origin ?? "";
+    const allowedHosts = EmbedConfig.parseAllowedHosts(embed);
+    if (allowedHosts !== null && !allowedHosts.includes(host)) {
+      response.status(401).json({
+        id: uuidv4(),
+        type: "abort",
+        textResponse: null,
+        sources: [],
+        close: true,
+        error: "Invalid request.",
+      });
+      return;
+    }
+
+    const { sessionId, message } = reqBody(request);
+
+    if (!message?.length || !VALID_CHAT_MODE.includes(embed.chat_mode)) {
+      response.status(400).json({
+        id: uuidv4(),
+        type: "abort",
+        textResponse: null,
+        sources: [],
+        close: true,
+        error: !message?.length
+          ? "Message is empty."
+          : `${embed.chat_mode} is not a valid mode.`,
+      });
+      return;
+    }
+
+    if (
+      !isNaN(embed.max_chats_per_day) &&
+      Number(embed.max_chats_per_day) > 0
+    ) {
+      const dailyChatCount = await EmbedChats.count({
+        embed_id: embed.id,
+        createdAt: {
+          gte: new Date(new Date() - 24 * 60 * 60 * 1000),
+        },
+      });
+
+      if (dailyChatCount >= Number(embed.max_chats_per_day)) {
+        response.status(429).json({
+          id: uuidv4(),
+          type: "abort",
+          textResponse: null,
+          sources: [],
+          close: true,
+          error:
+            "The quota for this chat has been reached. Try again later or contact the site owner.",
+        });
+        return;
+      }
+    }
+
+    if (
+      !isNaN(embed.max_chats_per_session) &&
+      Number(embed.max_chats_per_session) > 0
+    ) {
+      const dailySessionCount = await EmbedChats.count({
+        embed_id: embed.id,
+        session_id: sessionId,
+        createdAt: {
+          gte: new Date(new Date() - 24 * 60 * 60 * 1000),
+        },
+      });
+
+      if (dailySessionCount >= Number(embed.max_chats_per_session)) {
+        response.status(429).json({
+          id: uuidv4(),
+          type: "abort",
+          textResponse: null,
+          sources: [],
+          close: true,
+          error:
+            "Your quota for this chat has been reached. Try again later or contact the site owner.",
+        });
+        return;
+      }
+    }
+
+    next();
+  } catch (e) {
+    response.status(500).json({
       id: uuidv4(),
       type: "abort",
       textResponse: null,
@@ -75,72 +156,6 @@ async function canRespond(request, response, next) {
     });
     return;
   }
-
-  const { sessionId, message } = reqBody(request);
-
-  if (!message?.length || !VALID_CHAT_MODE.includes(embed.chat_mode)) {
-    response.status(400).json({
-      id: uuidv4(),
-      type: "abort",
-      textResponse: null,
-      sources: [],
-      close: true,
-      error: !message?.length
-        ? "Message is empty."
-        : `${embed.chat_mode} is not a valid mode.`,
-    });
-    return;
-  }
-
-  if (!isNaN(embed.max_chats_per_day) && Number(embed.max_chats_per_day) > 0) {
-    const dailyChatCount = await EmbedChats.count({
-      embed_id: embed.id,
-      createdAt: {
-        gte: new Date(new Date() - 24 * 60 * 60 * 1000),
-      },
-    });
-
-    if (dailyChatCount >= Number(embed.max_chats_per_day)) {
-      response.status(429).json({
-        id: uuidv4(),
-        type: "abort",
-        textResponse: null,
-        sources: [],
-        close: true,
-        error:
-          "The quota for this chat has been reached. Try again later or contact the site owner.",
-      });
-      return;
-    }
-  }
-
-  if (
-    !isNaN(embed.max_chats_per_session) &&
-    Number(embed.max_chats_per_session) > 0
-  ) {
-    const dailySessionCount = await EmbedChats.count({
-      embed_id: embed.id,
-      session_id: sessionId,
-      createdAt: {
-        gte: new Date(new Date() - 24 * 60 * 60 * 1000),
-      },
-    });
-
-    if (dailySessionCount >= Number(embed.max_chats_per_session)) {
-      response.status(429).json({
-        id: uuidv4(),
-        type: "abort",
-        textResponse: null,
-        sources: [],
-        close: true,
-        error:
-          "Your quota for this chat has been reached. Try again later or contact the site owner.",
-      });
-      return;
-    }
-  }
-
-  next();
 }
 
 module.exports = {