namespace, '/helpscout/conversation', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => [ $this, 'create_conversation' ], 'permission_callback' => [ $this, 'check_admin_permissions' ], ] ); register_rest_route( $this->namespace, '/helpscout/reply', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => [ $this, 'add_reply' ], 'permission_callback' => [ $this, 'check_admin_permissions' ], ] ); register_rest_route( $this->namespace, '/helpscout/messages/(?P\d+)', [ 'methods' => WP_REST_Server::READABLE, 'callback' => [ $this, 'get_messages' ], 'permission_callback' => [ $this, 'check_admin_permissions' ], ] ); } /** * Permission callback: admin-only. * * @return bool|WP_Error */ public function check_admin_permissions(): bool|WP_Error { if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { return new WP_Error( 'aisentic_forbidden', __( 'You do not have permission to manage settings.', 'aisentic' ), [ 'status' => 403 ] ); } return true; } /** * POST /helpscout/conversation * * Creates a new HelpScout conversation from the user's first message. * * @param WP_REST_Request $request * @return \WP_HTTP_Response */ public function create_conversation( WP_REST_Request $request ) { $subject = sanitize_text_field( $request->get_param( 'subject' ) ?? '' ); $customer_email = sanitize_email( $request->get_param( 'customer_email' ) ?? '' ); $first_name = sanitize_text_field( $request->get_param( 'first_name' ) ?? '' ); $message = sanitize_textarea_field( $request->get_param( 'message' ) ?? '' ); $conversation_uuid = sanitize_text_field( $request->get_param( 'ai_conversation_id' ) ?? '' ); if ( empty( $customer_email ) || empty( $message ) ) { return $this->error( __( 'customer_email and message are required.', 'aisentic' ), 400 ); } $threads = []; if ( ! empty( $conversation_uuid ) ) { $message_repo = new Message_Repository(); $history = $message_repo->getByConversation( $conversation_uuid, 1000 ); foreach ( $history as $msg ) { if ( 'user' === $msg->role ) { $threads[] = [ 'type' => 'customer', 'text' => $msg->content, 'imported' => true, 'customer' => [ 'email' => $customer_email, 'firstName' => $first_name, ], ]; } elseif ( 'assistant' === $msg->role ) { $threads[] = [ 'type' => 'chat', 'text' => $msg->content, 'imported' => true, 'customer' => [ 'email' => $customer_email, 'firstName' => $first_name, ], ]; } } } try { $api = new Api(); $conversation_id = $api->create_conversation( $subject, $customer_email, $first_name, $message, $threads ); return $this->response( [ 'conversation_id' => $conversation_id ], __( 'Conversation created successfully.', 'aisentic' ), 201 ); } catch ( \RuntimeException $e ) { return $this->error( $e->getMessage(), 502 ); } } /** * POST /helpscout/reply * * Sends a customer message to an existing HelpScout conversation. * * @param WP_REST_Request $request * @return \WP_HTTP_Response */ public function add_reply( WP_REST_Request $request ) { $conversation_id = (int) ( $request->get_param( 'conversation_id' ) ?? 0 ); $customer_email = sanitize_email( $request->get_param( 'customer_email' ) ?? '' ); $message = sanitize_textarea_field( $request->get_param( 'message' ) ?? '' ); if ( $conversation_id <= 0 ) { return $this->error( __( 'A valid conversation_id is required.', 'aisentic' ), 400 ); } if ( empty( $customer_email ) ) { return $this->error( __( 'customer_email is required.', 'aisentic' ), 400 ); } if ( empty( $message ) ) { return $this->error( __( 'message is required.', 'aisentic' ), 400 ); } try { $api = new Api(); $api->add_reply( $conversation_id, $customer_email, $message ); return $this->response( [], __( 'Reply sent successfully.', 'aisentic' ) ); } catch ( \RuntimeException $e ) { return $this->error( $e->getMessage(), 502 ); } } /** * GET /helpscout/messages/{conversation_id} * * Retrieves buffered agent messages from the proxy (cursor-consumed on proxy side). * * @param WP_REST_Request $request * @return \WP_HTTP_Response */ public function get_messages( WP_REST_Request $request ) { $conversation_id = (int) $request->get_param( 'conversation_id' ); try { $api = new Api(); $messages = $api->get_messages( $conversation_id ); return $this->response( [ 'messages' => $messages ] ); } catch ( \RuntimeException $e ) { return $this->error( $e->getMessage(), 502 ); } } }