PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-videopress / src / class-rest-controller.php
jetpack / jetpack_vendor / automattic / jetpack-videopress / src Last commit date
js 2 months ago tus 1 month ago videopress-divi 2 months ago videopress-divi-5 2 months ago class-access-control.php 5 days ago class-admin-ui.php 2 weeks ago class-ajax.php 1 month ago class-attachment-handler.php 1 month ago class-block-editor-content.php 1 month ago class-block-editor-extensions.php 2 weeks ago class-block-replacement.php 9 months ago class-caption-tracks.php 1 month ago class-data.php 1 month ago class-divi.php 2 months ago class-initial-state.php 2 weeks ago class-initializer.php 5 days ago class-jwt-token-bridge.php 2 years ago class-module-control.php 3 years ago class-options.php 2 years ago class-package-version.php 5 days ago class-plan.php 2 years ago class-rest-controller.php 1 month ago class-site.php 3 years ago class-stats.php 1 year ago class-status.php 9 months ago class-upload-exception.php 3 years ago class-uploader-rest-endpoints.php 2 weeks ago class-uploader.php 1 month ago class-utils.php 3 months ago class-video-block-email-renderer.php 2 months ago class-videopress-rest-api-v1-features.php 6 months ago class-videopress-rest-api-v1-settings.php 1 month ago class-videopress-rest-api-v1-site.php 2 weeks ago class-videopress-rest-api-v1-stats.php 3 years ago class-videopresstoken.php 1 month ago class-wpcom-rest-api-v2-attachment-field-videopress.php 9 months ago class-wpcom-rest-api-v2-attachment-videopress-data.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress-caption-tracks.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress.php 2 weeks ago class-xmlrpc.php 1 month ago utility-functions.php 4 weeks ago
class-rest-controller.php
176 lines
1 <?php
2 /**
3 * The VideoPress REST Controller.
4 *
5 * Registers the `/jetpack/v4/videopress/*` routes backing the
6 * modernized wp-build dashboard. Currently exposes one route — a
7 * user-signed proxy to the WPCOM `sites/{id}/stats/video-plays`
8 * endpoint — needed by the Overview screen's KPI / trends / top-N
9 * cards.
10 *
11 * @package automattic/jetpack-videopress
12 */
13
14 namespace Automattic\Jetpack\VideoPress;
15
16 use Automattic\Jetpack\Connection\Client;
17 use Jetpack_Options;
18 use WP_Error;
19 use WP_REST_Request;
20 use WP_REST_Server;
21
22 /**
23 * REST routes for the modernized VideoPress admin UI.
24 */
25 class Rest_Controller {
26
27 /**
28 * REST namespace used by this package's modernization routes.
29 *
30 * @var string
31 */
32 const REST_NAMESPACE = 'jetpack/v4/videopress';
33
34 /**
35 * Hook the route registration on `rest_api_init`.
36 *
37 * @return void
38 */
39 public static function init() {
40 add_action( 'rest_api_init', array( __CLASS__, 'register_rest_routes' ) );
41 }
42
43 /**
44 * Register the VideoPress REST routes.
45 *
46 * @return void
47 */
48 public static function register_rest_routes() {
49 register_rest_route(
50 self::REST_NAMESPACE,
51 '/stats/video-plays',
52 array(
53 'methods' => WP_REST_Server::READABLE,
54 'callback' => array( __CLASS__, 'get_stats_video_plays' ),
55 'permission_callback' => array( __CLASS__, 'permissions_callback' ),
56 'args' => self::stats_video_plays_args(),
57 )
58 );
59 }
60
61 /**
62 * Query params accepted by the video-plays proxy. Forwarded verbatim
63 * to WPCOM after permission and shape validation. `complete_stats` and
64 * `check_stats_module` are always forced by the callback and are
65 * therefore not exposed as incoming params.
66 *
67 * @return array
68 */
69 private static function stats_video_plays_args() {
70 return array(
71 'period' => array(
72 'description' => __( 'Period unit: day, week, month, or year.', 'jetpack-videopress-pkg' ),
73 'type' => 'string',
74 'enum' => array( 'day', 'week', 'month', 'year' ),
75 ),
76 'num' => array(
77 'description' => __( 'Number of periods to include.', 'jetpack-videopress-pkg' ),
78 'type' => 'integer',
79 'minimum' => 1,
80 'maximum' => 365,
81 ),
82 'date' => array(
83 'description' => __( 'Most recent day to include in results (YYYY-MM-DD).', 'jetpack-videopress-pkg' ),
84 'type' => 'string',
85 'format' => 'date',
86 ),
87 'start_date' => array(
88 'description' => __( 'Starting date for range queries (YYYY-MM-DD).', 'jetpack-videopress-pkg' ),
89 'type' => 'string',
90 'format' => 'date',
91 ),
92 );
93 }
94
95 /**
96 * Permission callback. Admin-gated. The upstream call is blog-signed,
97 * matching the existing `Stats::fetch_video_plays` path; no user-level
98 * WPCOM connection is required.
99 *
100 * @return bool
101 */
102 public static function permissions_callback() {
103 return current_user_can( 'manage_options' );
104 }
105
106 /**
107 * Proxy the video-plays stats endpoint.
108 *
109 * Forwards the allowed query params to WPCOM (REST v1.1, blog-signed
110 * — matching the existing `Stats::fetch_video_plays` path) and forces
111 * `complete_stats=true`. `check_stats_module=false` is also forced so the
112 * report loads for standalone VideoPress sites without the Jetpack Stats
113 * module active, matching `Stats::fetch_video_plays`. In complete-stats
114 * mode, each day entry carries
115 * `total.views`, `total.impressions`, and `total.watch_time` (in hours)
116 * plus a per-video `data[]` array whose entries have `post_id`, `title`,
117 * `views`, `impressions`, `watch_time` (hours), and `retention_rate`.
118 * The `plays` field is NOT returned in complete-stats mode.
119 *
120 * @param WP_REST_Request $request Incoming request.
121 * @return mixed Decoded JSON response from WPCOM, or WP_Error on failure.
122 */
123 public static function get_stats_video_plays( WP_REST_Request $request ) {
124 $blog_id = (int) Jetpack_Options::get_option( 'id' );
125 if ( ! $blog_id ) {
126 return new WP_Error(
127 'videopress_stats_not_connected',
128 esc_html__( 'This site is not connected to WordPress.com.', 'jetpack-videopress-pkg' ),
129 array( 'status' => 400 )
130 );
131 }
132
133 $params = array(
134 'complete_stats' => 'true',
135 'check_stats_module' => 'false',
136 );
137 foreach ( array_keys( self::stats_video_plays_args() ) as $key ) {
138 $value = $request->get_param( $key );
139 if ( $value !== null && $value !== '' ) {
140 $params[ $key ] = $value;
141 }
142 }
143
144 $path = sprintf(
145 'sites/%d/stats/video-plays?%s',
146 $blog_id,
147 http_build_query( $params )
148 );
149 $response = Client::wpcom_json_api_request_as_blog( $path );
150
151 if ( is_wp_error( $response ) ) {
152 return new WP_Error(
153 'videopress_stats_request_failed',
154 $response->get_error_message(),
155 array( 'status' => 500 )
156 );
157 }
158
159 $status = (int) wp_remote_retrieve_response_code( $response );
160 $body = json_decode( wp_remote_retrieve_body( $response ), true );
161
162 if ( 200 !== $status ) {
163 $message = is_array( $body ) && isset( $body['message'] )
164 ? (string) $body['message']
165 : esc_html__( 'Unable to fetch VideoPress stats.', 'jetpack-videopress-pkg' );
166 return new WP_Error(
167 'videopress_stats_request_failed',
168 $message,
169 array( 'status' => $status ? $status : 500 )
170 );
171 }
172
173 return rest_ensure_response( $body );
174 }
175 }
176