formService = $formService; $this->fieldService = $fieldService; $this->notificationService = $notificationService; $this->confirmationService = $confirmationService; } /** * @param WP_REST_Request $data * * @return WP_REST_Response * * @throws QueryExecutionException * @throws InvalidArgumentException * @throws ValidationException * @throws ForbiddenException */ public function handle(WP_REST_Request $data): WP_REST_Response { // Verify the nonce Sanitizer::verifyNonce($data->get_header('X-WP-Nonce')); // Check if the form data is provided if (empty($data->get_params())) { throw new InvalidArgumentException('Invalid request data.'); } // Sanitize the input data $params = Sanitizer::sanitizeFormData($data->get_params()); $form = FormFactory::create($params); $formId = $this->formService->createForm($form); if (!$formId) { throw new QueryExecutionException('Failed to create form.'); } // Create default notification $adminEmail = get_option('admin_email'); $defaultNotification = [ 'formId' => $formId, 'name' => 'Admin Notification Email', 'sender' => $adminEmail, 'receiver' => $adminEmail, 'status' => 1, 'subject' => $params['name'], 'message' => '{all_data}', 'smartLogic' => 0, ]; $notification = NotificationFactory::create($defaultNotification); $notificationId = $this->notificationService->createNotification($notification); if (!$notificationId) { throw new QueryExecutionException('Failed to create default notification.'); } $notification->setId($notificationId); $defaultConfirmation = [ 'formId' => $formId, 'type' => 'successMessage', 'status' => 1, 'showForm' => 0, 'message' => 'Thanks for reaching out! We’ve received your message and will get back to you shortly.', 'url' => '', 'page' => '', ]; $confirmation = ConfirmationFactory::create($defaultConfirmation); $confirmationId = $this->confirmationService->createConfirmation($confirmation); if (!$confirmationId) { throw new QueryExecutionException('Failed to create confirmation.'); } $confirmation->setId($confirmationId); // Save form fields if (!empty($params['fields'])) { foreach ($params['fields'] as $fieldData) { $fieldData['formId'] = $fieldData['formId'] ?? $formId; $field = FieldFactory::create($fieldData); $this->fieldService->addField($field); } } $form->setId($formId); return new WP_REST_Response([ 'message' => 'OK', 'data' => array_merge($form->toArray(), ['confirmationId' => $confirmationId]) ], 200); } }