fix: checks and rate limiting for email verification survey action (#6406)

This commit is contained in:
Dhruwang Jariwala
2025-08-13 12:12:08 +05:30
committed by GitHub
parent 14b7a69cea
commit 4d53291c8a
3 changed files with 16 additions and 1 deletions

View File

@@ -71,7 +71,7 @@ describe("rateLimitConfigs", () => {
test("should have all action configurations", () => {
const actionConfigs = Object.keys(rateLimitConfigs.actions);
expect(actionConfigs).toEqual(["emailUpdate", "surveyFollowUp"]);
expect(actionConfigs).toEqual(["emailUpdate", "surveyFollowUp", "sendLinkSurveyEmail"]);
});
});

View File

@@ -23,5 +23,10 @@ export const rateLimitConfigs = {
actions: {
emailUpdate: { interval: 3600, allowedPerInterval: 3, namespace: "action:email" }, // 3 per hour
surveyFollowUp: { interval: 3600, allowedPerInterval: 50, namespace: "action:followup" }, // 50 per hour
sendLinkSurveyEmail: {
interval: 3600,
allowedPerInterval: 10,
namespace: "action:send-link-survey-email",
}, // 10 per hour
},
};

View File

@@ -2,6 +2,8 @@
import { actionClient } from "@/lib/utils/action-client";
import { getOrganizationIdFromSurveyId } from "@/lib/utils/helper";
import { applyIPRateLimit } from "@/modules/core/rate-limit/helpers";
import { rateLimitConfigs } from "@/modules/core/rate-limit/rate-limit-configs";
import { getOrganizationLogoUrl } from "@/modules/ee/whitelabel/email-customization/lib/organization";
import { sendLinkSurveyToVerifiedEmail } from "@/modules/email";
import { getSurveyWithMetadata, isSurveyResponsePresent } from "@/modules/survey/link/lib/data";
@@ -12,6 +14,14 @@ import { InvalidInputError, ResourceNotFoundError } from "@formbricks/types/erro
export const sendLinkSurveyEmailAction = actionClient
.schema(ZLinkSurveyEmailData)
.action(async ({ parsedInput }) => {
await applyIPRateLimit(rateLimitConfigs.actions.sendLinkSurveyEmail);
const survey = await getSurveyWithMetadata(parsedInput.surveyId);
if (!survey.isVerifyEmailEnabled) {
throw new InvalidInputError("EMAIL_VERIFICATION_NOT_ENABLED");
}
const organizationId = await getOrganizationIdFromSurveyId(parsedInput.surveyId);
const organizationLogoUrl = await getOrganizationLogoUrl(organizationId);