'POST', 'callback' => [ $this, 'create_form' ], 'permission_callback' => [ Helper::class, 'get_items_permissions_check' ], ] ); } /** * Get default post metas for form when creating using template. * * @return array Default meta keys. * @since 2.0.0 updated the return type. * @since 0.0.2 */ public static function get_default_meta_keys() { $default_values = [ '_srfm_submit_button_text' => __( 'Submit', 'sureforms' ), '_srfm_use_label_as_placeholder' => false, '_srfm_single_page_form_title' => 1, '_srfm_instant_form' => '', '_srfm_form_container_width' => 650, '_srfm_bg_type' => 'image', '_srfm_bg_image' => '', '_srfm_cover_image' => '', '_srfm_bg_color' => '#ffffff', '_srfm_submit_width_backend' => 'max-content', '_srfm_submit_alignment' => 'left', '_srfm_submit_alignment_backend' => '100%', '_srfm_submit_width' => '', '_srfm_inherit_theme_button' => false, '_srfm_additional_classes' => '', '_srfm_submit_type' => 'message', '_srfm_form_recaptcha' => 'none', '_srfm_is_inline_button' => false, // @since 2.0.0 -- adding required default value. ]; return apply_filters( 'srfm_add_post_meta_defaults', $default_values ); } /** * Create new form post from selected template. * * @param \WP_REST_Request $data Form Markup Data. * * @return WP_Error|WP_REST_Response * @since 0.0.1 */ public static function create_form( $data ) { $nonce = Helper::get_string_value( $data->get_header( 'X-WP-Nonce' ) ); $nonce = sanitize_text_field( $nonce ); if ( ! wp_verify_nonce( $nonce, 'wp_rest' ) ) { wp_send_json_error( [ 'message' => __( 'Nonce verification failed.', 'sureforms' ), ] ); } $form_info = $data->get_body(); $form_info_obj = json_decode( $form_info ); // Check if JSON decoding was successful and $form_info_obj is an object. if ( json_last_error() !== JSON_ERROR_NONE || ! is_object( $form_info_obj ) ) { wp_send_json_error( [ 'message' => __( 'Invalid JSON format.', 'sureforms' ), ] ); } $required_properties = [ 'template_name', 'form_data' ]; // Check if required properties exist in the $form_info_obj. foreach ( $required_properties as $property ) { if ( ! property_exists( $form_info_obj, $property ) ) { wp_send_json_error( [ 'message' => __( 'Missing required properties in form info.', 'sureforms' ), ] ); } } $title = $form_info_obj->template_name ?? ''; $content = $form_info_obj->form_data ?? ''; // Create post metas for the creating form. $post_metas = apply_filters( 'srfm_modify_ai_post_metas', [], $form_info_obj, ); $post_id = wp_insert_post( [ 'post_title' => $title, 'post_content' => $content, 'meta_input' => $post_metas, 'post_status' => 'draft', 'post_type' => 'sureforms_form', ], true ); if ( is_wp_error( $post_id ) ) { // Pass the raw WP_Error through the shared sanitizer so any URLs, // request IDs, or model names injected by a filter on // wp_insert_post don't leak via the REST response. The raw message // is still logged server-side (gated on WP_DEBUG / WP_DEBUG_LOG). $sanitized = AI_Helper::sanitize_ai_error_message( $post_id->get_error_message(), 'wp_insert_post' ); if ( '' === $sanitized ) { $sanitized = __( 'Error creating SureForms Form.', 'sureforms' ); } return new WP_REST_Response( [ 'message' => $sanitized, ], 500 ); } if ( ! is_int( $post_id ) || $post_id <= 0 ) { return new WP_REST_Response( [ 'message' => __( 'Error creating SureForms Form.', 'sureforms' ), ], 500 ); } /** * Update _srfm_is_ai_generated meta to true. * If the request is coming here then the form is AI generated. */ update_post_meta( $post_id, '_srfm_is_ai_generated', true ); return new WP_REST_Response( [ 'message' => __( 'SureForms Form created successfully.', 'sureforms' ), 'id' => $post_id, ] ); } }