formService = $formService; $this->fieldService = $fieldService; $this->notificationService = $notificationService; $this->confirmationService = $confirmationService; $this->templateService = $templateService; } /** * @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 { Sanitizer::verifyNonce($data->get_header('X-WP-Nonce')); // Check if the form data is provided if (empty($data->get_params())) { throw new InvalidArgumentException( BackendStrings::getExceptionStrings()['invalid_request_data'] ); } // TODO Add validation for template_id with Sanitizer //$templateId = Sanitizer::sanitizeText($data->get_param('id')); $templateId = sanitize_text_field($data->get_param('template_id')); if (empty($templateId)) { throw new InvalidArgumentException( BackendStrings::getTemplateStrings()['template_not_found'] ); } $formData = $this->templateService->getFormDataFromTemplate($templateId); $params = Sanitizer::sanitizeFormData($formData); $form = FormFactory::create($params); $formId = $this->formService->createForm($form); if (!$formId) { throw new QueryExecutionException( BackendStrings::getAllFormsStrings()['failed_to_create_form'] ); } $adminEmail = get_option('admin_email'); // Create default notification $this->notificationService->createDefaultNotificationForForm( $formId, $params['name'], $adminEmail ); // Create default confirmation using the service $confirmationId = $this->confirmationService->createDefaultConfirmationForForm($formId); // Save form fields and their options using the service if (!empty($params['fields'])) { $this->fieldService->saveFieldsWithOptions($params['fields'], $formId); } $form->setId($formId); return new WP_REST_Response([ 'message' => BackendStrings::getCommonStrings()['ok'], 'data' => array_merge($form->toArray(), ['confirmationId' => $confirmationId]) ], 200); } }