formService = $formService; $this->fieldService = $fieldService; $this->notificationService = $notificationService; $this->mailerService = $mailerService; $this->entryService = $entryService; $this->securityService = $securityService; } /** * @param WP_REST_Request $data * * @return WP_REST_Response * * @throws InvalidArgumentException|NotFoundException|ForbiddenException * @throws ValidationException */ public function handle(WP_REST_Request $data): WP_REST_Response { Sanitizer::verifyNonce($data->get_header('X-WP-Nonce')); if (empty($data->get_params())) { throw new InvalidArgumentException( BackendStrings::getExceptionStrings()['invalid_request_data'] ); } $formId = Sanitizer::sanitizeId($data->get_param('formId')); Sanitizer::verifySubmissionNonce($data->get_param('nonce'), $formId); if ($formId <= 0) { throw new InvalidArgumentException( BackendStrings::getExceptionStrings()['invalid_form_id'] ); } $form = $this->formService->getFormById($formId); $formFields = $this->fieldService->getAllFields($form->getId()); // Validate CAPTCHA if present using SecurityService (automatically determines provider and validates) $this->securityService->validateFormSubmission($data->get_params(), $formFields); // Sanitize form submission data based on field types $submissionData = Sanitizer::sanitizeFormSubmissionData($data->get_params(), $formFields); $entry = [ 'stored' => false ]; if ($form->isStoreEntries()) { $entryData = $this->entryService->buildEntryData($formId); $entryObj = EntryFactory::create($entryData); $entryId = $this->entryService->createEntry($entryObj); $this->entryService->addEntryFields($formFields, $entryId, $submissionData); $entry = [ 'stored' => true, 'id' => $entryId, ]; } $notificationsResult = $this->processNotifications($formId, $submissionData); return new WP_REST_Response([ 'message' => BackendStrings::getCommonStrings()['ok'], 'data' => [ 'success' => $notificationsResult, 'entry' => $entry, ], ], 200); } /** * Process notifications for the form. * * @param int $formId * @param array $submissionData * @return bool * @throws NotFoundException */ private function processNotifications(int $formId, array $submissionData): bool { $activeNotifications = $this->notificationService->getActiveNotificationsByFormId($formId); // Process each active notification foreach ($activeNotifications as $notification) { // Skip notifications with empty receivers if (empty($notification->getReceiver())) { continue; } // Send email using our mailer service $sent = $this->mailerService->sendEmail($notification, $submissionData); if (!$sent) { error_log('Failed to send email notification for form ID: ' . $formId); } } return true; } }