Files
calendar/packages/features/ee/workflows/api/handleSMSResponse.ts
T
Joe Au-YeungandGitHub 6bbf263981 feat: Optout of SMS workflows (#20769)
* Do not call dub if API key isn't present

* Add `WorkflowOptOutContact` table

* Add `sendTo` column to `WorkflowReminder`

* Add `workflowOptOutContactRepository`

* Add `WorkflowReminderRepository`

* Write `sendTo` number when scheduling SMS messages

* Add `p-limit` package

* Add `determineOptOutType` to `TwilioProvider`

* Add `deleteMultipleScheduledSMS`

* Create `WorkflowOptOutService`

* Add endpoint handler for Twilio SMS responses

* Add `isOptedOut` method to `workflowOptOutContactRepository`

* Verify phone number is not opted out before scheduling SMS

* Use `smsReminderNumber` instead of `sendTo`

* Type fix

* Add .env variable if opt out is available

* Add opt out message to SMS

* Import `pLimit` directly in method

* Address select comment

* Guard against undefined phone number from form

* Add early return to `deleteWorkflowReminders`

* Add request validation from Twilio

* Add fallback message as i18N string

* Only delete SMS attendee scheduled reminders
2025-04-22 22:00:19 +01:00

29 lines
1.1 KiB
TypeScript

import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";
import { determineOptOutType } from "../lib/reminders/providers/twilioProvider";
import { WorkflowOptOutContactRepository } from "../lib/repository/workflowOptOutContact";
import { WorkflowOptOutService } from "../lib/service/workflowOptOutService";
const handleSMSResponse = async (request: NextRequest) => {
try {
const optOutResult = await determineOptOutType(request);
if ("error" in optOutResult) {
return NextResponse.json({ message: optOutResult.error }, { status: 400 });
}
if (optOutResult.optOutStatus) {
await WorkflowOptOutService.optOutPhoneNumber(optOutResult.phoneNumber);
} else {
await WorkflowOptOutContactRepository.removePhoneNumber(optOutResult.phoneNumber);
}
return NextResponse.json({ message: "Opt status updated successfully" }, { status: 200 });
} catch (e) {
console.error("Error processing user response webhook:", e);
return NextResponse.json({ message: "Internal server error" }, { status: 500 });
}
};
export default handleSMSResponse;