'GET', 'callback' => array( $this, 'index' ), 'permission_callback' => array( Routes::class, 'can_edit' ), ), array( 'methods' => 'POST', 'callback' => array( $this, 'create' ), 'args' => Args::kb_fields( true ), 'permission_callback' => $manage, ), ) ); register_rest_route( Routes::NS, '/kbs/(?P\d+)', array( array( 'methods' => 'PUT, PATCH, POST', 'callback' => array( $this, 'update' ), 'args' => array( 'id' => Args::id() ) + Args::kb_fields( false ), 'permission_callback' => $manage, ), array( 'methods' => 'DELETE', 'callback' => array( $this, 'delete' ), 'args' => array( 'id' => Args::id(), 'articles' => Args::enum( array( 'keep', 'trash' ), false, 'keep' ), ), 'permission_callback' => $manage, ), ) ); register_rest_route( Routes::NS, '/kbs/reorder', array( 'methods' => 'POST', 'callback' => array( $this, 'reorder' ), 'args' => array( 'ids' => array( 'type' => 'array', 'required' => true, 'items' => array( 'type' => 'integer', 'minimum' => 1, ), ), ), 'permission_callback' => $manage, ) ); register_rest_route( Routes::NS, '/kbs/sample', array( 'methods' => 'POST', 'callback' => array( $this, 'sample' ), 'args' => array( 'set' => Args::enum( array_keys( \KarmaDocs\Demo\Importer::sets() ), false, 'guide' ) ), 'permission_callback' => $manage, ) ); } /** * Lists knowledge bases. * * @return \WP_REST_Response */ public function index() { return rest_ensure_response( array( 'items' => array_map( array( KnowledgeBase::class, 'format' ), Taxonomies::get_kbs() ), 'limit' => Features::kb_limit(), 'canCreate' => Features::can_create_kb(), ) ); } /** * Limit error. * * @return \WP_Error */ private function limit_error() { return new \WP_Error( 'kdocs_pro_required', __( 'The free plan includes one knowledge base. Upgrade to Pro for unlimited knowledge bases.', 'karma-docs' ), array( 'status' => 402, 'upgradeUrl' => Features::upgrade_url(), ) ); } /** * Creates a KB. * * @param \WP_REST_Request $request Request. * @return \WP_REST_Response|\WP_Error */ public function create( $request ) { if ( ! Features::can_create_kb() ) { return $this->limit_error(); } $id = KnowledgeBase::save( (array) $request->get_json_params() ); if ( is_wp_error( $id ) ) { $id->add_data( array( 'status' => 400 ) ); return $id; } return rest_ensure_response( KnowledgeBase::format( get_term( $id, Taxonomies::KB ) ) ); } /** * Updates a KB. * * @param \WP_REST_Request $request Request. * @return \WP_REST_Response|\WP_Error */ public function update( $request ) { $id = (int) $request['id']; $term = get_term( $id, Taxonomies::KB ); if ( ! $term || is_wp_error( $term ) ) { return new \WP_Error( 'kdocs_not_found', __( 'Knowledge base not found.', 'karma-docs' ), array( 'status' => 404 ) ); } $result = KnowledgeBase::save( (array) $request->get_json_params(), $id ); if ( is_wp_error( $result ) ) { $result->add_data( array( 'status' => 400 ) ); return $result; } update_option( 'kdocs_flush_rewrite', 1 ); return rest_ensure_response( KnowledgeBase::format( get_term( $id, Taxonomies::KB ) ) ); } /** * Deletes a KB (and optionally trashes its articles). * * @param \WP_REST_Request $request Request. * @return \WP_REST_Response|\WP_Error */ public function delete( $request ) { $id = (int) $request['id']; if ( 'trash' === $request->get_param( 'articles' ) ) { $posts = get_posts( array( 'post_type' => PostTypes::ARTICLE, 'post_status' => 'any', 'posts_per_page' => -1, 'fields' => 'ids', 'tax_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery array( 'taxonomy' => Taxonomies::KB, 'terms' => $id, ), ), ) ); foreach ( $posts as $post_id ) { wp_trash_post( $post_id ); } } $result = wp_delete_term( $id, Taxonomies::KB ); if ( is_wp_error( $result ) || ! $result ) { return new \WP_Error( 'kdocs_delete_failed', __( 'Could not delete the knowledge base.', 'karma-docs' ), array( 'status' => 400 ) ); } return rest_ensure_response( array( 'deleted' => true ) ); } /** * Reorders KBs. * * @param \WP_REST_Request $request Request. * @return \WP_REST_Response */ public function reorder( $request ) { $ids = array_map( 'intval', (array) $request->get_param( 'ids' ) ); foreach ( $ids as $index => $id ) { update_term_meta( $id, 'kdocs_order', $index ); } return $this->index(); } /** * Creates a sample knowledge base from a bundled content set. * * @param \WP_REST_Request $request Request. * @return \WP_REST_Response|\WP_Error */ public function sample( $request ) { $set = sanitize_key( (string) $request->get_param( 'set' ) ); $id = Install::create_sample_content( $set ? $set : 'guide' ); if ( is_wp_error( $id ) ) { if ( 'kdocs_pro_required' === $id->get_error_code() ) { return $this->limit_error(); } return $id; } return rest_ensure_response( KnowledgeBase::format( get_term( $id, Taxonomies::KB ) ) ); } }