-
Notifications
You must be signed in to change notification settings - Fork 800
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Social | Add wpcom/v3/publicize/connections
endpoint
#40540
Changes from all commits
f8c3049
e6090ac
f4827a1
5b256d7
5b955e7
c994a30
a42252c
a8835c2
460db14
e76f8db
b0190a0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
Significance: minor | ||
Type: added | ||
|
||
Added wpcom/v3/publicize/connections endpoint |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
<?php | ||
/** | ||
* Publicize Connection Fields class. | ||
* | ||
* @package automattic/jetpack-publicize | ||
*/ | ||
|
||
namespace Automattic\Jetpack\Publicize; | ||
|
||
/** | ||
* Publicize Connection Fields class. | ||
*/ | ||
class Connection_Fields { | ||
|
||
/** | ||
* Get the publicize instance - properly typed | ||
* | ||
* @return Publicize | ||
*/ | ||
protected static function publicize() { | ||
/** | ||
* Publicize instance. | ||
* | ||
* @var Publicize $publicize | ||
*/ | ||
global $publicize; | ||
|
||
if ( ! $publicize && function_exists( 'publicize_init' ) ) { | ||
// @phan-suppress-next-line PhanUndeclaredFunction - phan is dumb not to see the function_exists check | ||
publicize_init(); | ||
} | ||
|
||
return $publicize; | ||
} | ||
|
||
/** | ||
* Get the meta of a connection. | ||
* | ||
* @param array|object $connection The connection. | ||
* @return array | ||
*/ | ||
protected static function get_connection_meta( $connection ) { | ||
|
||
return self::publicize()->get_connection_meta( $connection ); | ||
} | ||
|
||
/** | ||
* Get the ID of a connection. | ||
* | ||
* @param array $connection The connection. | ||
* @return string | ||
*/ | ||
public static function get_connection_id( $connection ) { | ||
return (string) self::publicize()->get_connection_id( $connection ); | ||
} | ||
|
||
/** | ||
* Returns a display name for the Connection | ||
* | ||
* @param string $service_name 'facebook', 'twitter', etc. | ||
* @param object|array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return string | ||
*/ | ||
public static function get_display_name( $service_name, $connection ) { | ||
return self::publicize()->get_display_name( $service_name, $connection ); | ||
} | ||
|
||
/** | ||
* Returns the external handle for the Connection. | ||
* | ||
* @param string $service_name 'facebook', 'linkedin', etc. | ||
* @param object|array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return string | ||
*/ | ||
public static function get_external_handle( $service_name, $connection ) { | ||
$cmeta = self::get_connection_meta( $connection ); | ||
|
||
switch ( $service_name ) { | ||
case 'mastodon': | ||
return $cmeta['external_display'] ?? ''; | ||
|
||
case 'bluesky': | ||
case 'threads': | ||
return $cmeta['external_name'] ?? ''; | ||
|
||
case 'instagram-business': | ||
return $cmeta['connection_data']['meta']['username'] ?? ''; | ||
|
||
default: | ||
return ''; | ||
} | ||
} | ||
|
||
/** | ||
* Returns the external ID for the Connection. | ||
* | ||
* @param object|array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return string | ||
*/ | ||
public static function get_external_id( $connection ) { | ||
$connection_meta = self::get_connection_meta( $connection ); | ||
|
||
return $connection_meta['external_id'] ?? ''; | ||
} | ||
|
||
/** | ||
* Returns an external URL to the Connection's profile | ||
* | ||
* @param string $service_name 'facebook', 'twitter', etc. | ||
* @param object|array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return false|string False on failure. URL on success. | ||
*/ | ||
public static function get_profile_link( $service_name, $connection ) { | ||
return self::publicize()->get_profile_link( $service_name, $connection ); | ||
} | ||
|
||
/** | ||
* Returns a profile picture for the Connection | ||
* | ||
* @param object|array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return string | ||
*/ | ||
public static function get_profile_picture( $connection ) { | ||
return self::publicize()->get_profile_picture( $connection ); | ||
} | ||
|
||
/** | ||
* Returns a display name for the Service | ||
* | ||
* @param string $service_name 'facebook', 'twitter', etc. | ||
* @return string | ||
*/ | ||
public static function get_service_label( $service_name ) { | ||
return self::publicize()->get_service_label( $service_name ); | ||
} | ||
|
||
/** | ||
* Returns whether the Connection is shared | ||
* | ||
* @param array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return bool | ||
*/ | ||
public static function is_shared( $connection ) { | ||
return empty( self::get_user_id( $connection ) ); | ||
} | ||
|
||
/** | ||
* Returns the status for the Connection | ||
* | ||
* @param array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return string | ||
*/ | ||
public static function get_status( $connection ) { | ||
return $connection['status'] ?? 'ok'; | ||
} | ||
|
||
/** | ||
* Returns the user ID for the Connection | ||
* | ||
* @param array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return int | ||
*/ | ||
public static function get_user_id( $connection ) { | ||
$connection_meta = self::get_connection_meta( $connection ); | ||
|
||
$connection_data = $connection_meta['connection_data']; | ||
|
||
return (int) $connection_data['user_id']; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -497,8 +497,8 @@ public function get_profile_link( $service_name, $connection ) { | |
return 'https://instagram.com/' . $cmeta['connection_data']['meta']['username']; | ||
} | ||
|
||
if ( 'threads' === $service_name && isset( $connection['external_name'] ) ) { | ||
return 'https://www.threads.net/@' . $connection['external_name']; | ||
if ( 'threads' === $service_name && isset( $cmeta['external_name'] ) ) { | ||
return 'https://www.threads.net/@' . $cmeta['external_name']; | ||
Comment on lines
-500
to
+501
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This change is to ensure it works on WPCOM sites where connection is not an array. |
||
} | ||
|
||
if ( 'mastodon' === $service_name && isset( $cmeta['external_name'] ) ) { | ||
|
@@ -527,7 +527,7 @@ public function get_profile_link( $service_name, $connection ) { | |
} | ||
|
||
$profile_url_query = wp_parse_url( $cmeta['connection_data']['meta']['profile_url'], PHP_URL_QUERY ); | ||
$profile_url_query_args = null; | ||
$profile_url_query_args = array(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Phan complained about this. |
||
wp_parse_str( $profile_url_query, $profile_url_query_args ); | ||
|
||
$id = null; | ||
|
@@ -608,7 +608,7 @@ public function get_username( $service_name, $connection ) { | |
* @param object|array $connection The Connection object (WordPress.com) or array (Jetpack). | ||
* @return string | ||
*/ | ||
private function get_profile_picture( $connection ) { | ||
public function get_profile_picture( $connection ) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This makes it available externally for facade. |
||
$cmeta = $this->get_connection_meta( $connection ); | ||
|
||
if ( isset( $cmeta['profile_picture'] ) ) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
<?php | ||
/** | ||
* Base Controller class. | ||
* | ||
* @package automattic/jetpack-publicize | ||
*/ | ||
|
||
namespace Automattic\Jetpack\Publicize\Rest_Endpoints; | ||
|
||
use Automattic\Jetpack\Status\Host; | ||
use WP_Error; | ||
use WP_REST_Controller; | ||
use WP_REST_Request; | ||
use WP_REST_Response; | ||
|
||
/** | ||
* Base controller for Publicize endpoints. | ||
*/ | ||
abstract class Base_Controller extends WP_REST_Controller { | ||
|
||
/** | ||
* Constructor. | ||
*/ | ||
public function __construct() { | ||
$this->namespace = 'wpcom/v3'; | ||
|
||
$this->wpcom_is_wpcom_only_endpoint = true; | ||
} | ||
|
||
/** | ||
* Check if we are on WPCOM. | ||
* | ||
* @return bool | ||
*/ | ||
public static function is_wpcom() { | ||
return ( new Host() )->is_wpcom_simple(); | ||
} | ||
|
||
/** | ||
* Filters out data based on ?_fields= request parameter | ||
* | ||
* @param array $item Item to prepare. | ||
* @param WP_REST_Request $request Full details about the request. | ||
* | ||
* @return WP_REST_Response filtered item | ||
*/ | ||
public function prepare_item_for_response( $item, $request ) { | ||
if ( ! is_callable( array( $this, 'get_fields_for_response' ) ) ) { | ||
return rest_ensure_response( $item ); | ||
} | ||
|
||
$fields = $this->get_fields_for_response( $request ); | ||
|
||
$response_data = array(); | ||
foreach ( $item as $field => $value ) { | ||
if ( in_array( $field, $fields, true ) ) { | ||
$response_data[ $field ] = $value; | ||
} | ||
} | ||
|
||
return rest_ensure_response( $response_data ); | ||
} | ||
|
||
/** | ||
* Verify that user can access Publicize data | ||
* | ||
* @return true|WP_Error | ||
*/ | ||
public function get_items_permission_check() { | ||
global $publicize; | ||
|
||
if ( ! $publicize ) { | ||
return new WP_Error( | ||
'publicize_not_available', | ||
__( 'Sorry, Jetpack Social is not available on your site right now.', 'jetpack-publicize-pkg' ), | ||
array( 'status' => rest_authorization_required_code() ) | ||
); | ||
} | ||
|
||
if ( $publicize->current_user_can_access_publicize_data() ) { | ||
return true; | ||
} | ||
|
||
return new WP_Error( | ||
'invalid_user_permission_publicize', | ||
__( 'Sorry, you are not allowed to access Jetpack Social data on this site.', 'jetpack-publicize-pkg' ), | ||
array( 'status' => rest_authorization_required_code() ) | ||
); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The methods in this class are copied from Publicize_Base class which we can later on clean up to these methods as fallback after deprecating them.