diff --git a/app/config/providers.php b/app/config/providers.php index a377cae6f..36082433c 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -163,6 +163,24 @@ return [ // Ordered by ABC. 'beta' => false, 'mock' => false, ], + 'tradeshift' => [ + 'name' => 'Tradeshift', + 'developers' => 'https://developers.tradeshift.com/docs/api', + 'icon' => 'icon-tradeshift', + 'enabled' => true, + 'form' => false, + 'beta' => false, + 'mock' => false, + ], + 'tradeshiftBox' => [ + 'name' => 'Tradeshift Sandbox', + 'developers' => 'https://developers.tradeshift.com/docs/api', + 'icon' => 'icon-tradeshiftbox', + 'enabled' => true, + 'form' => false, + 'beta' => false, + 'mock' => false, + ], 'twitch' => [ 'name' => 'Twitch', 'developers' => 'https://dev.twitch.tv/docs/authentication', @@ -215,6 +233,15 @@ return [ // Ordered by ABC. // 'beta' => false, // 'mock' => false, // ], + 'wordpress' => [ + 'name' => 'WordPress', + 'developers' => 'https://developer.wordpress.com/docs/oauth2/', + 'icon' => 'icon-wordpress', + 'enabled' => true, + 'form' => false, + 'beta' => false, + 'mock' => false + ], // Keep Last 'mock' => [ 'name' => 'Mock', @@ -225,13 +252,4 @@ return [ // Ordered by ABC. 'beta' => false, 'mock' => true, ], - 'wordpress' => [ - 'name' => 'WordPress', - 'developers' => 'https://developer.wordpress.com/docs/oauth2/', - 'icon' => 'icon-wordpress', - 'enabled' => true, - 'form' => false, - 'beta' => false, - 'mock' => false - ] ]; diff --git a/public/images/oauth2/tradeshift.png b/public/images/oauth2/tradeshift.png new file mode 100644 index 000000000..9a5aaea12 Binary files /dev/null and b/public/images/oauth2/tradeshift.png differ diff --git a/public/images/oauth2/tradeshiftbox.png b/public/images/oauth2/tradeshiftbox.png new file mode 100644 index 000000000..9a5aaea12 Binary files /dev/null and b/public/images/oauth2/tradeshiftbox.png differ diff --git a/src/Appwrite/Auth/OAuth2/Tradeshift.php b/src/Appwrite/Auth/OAuth2/Tradeshift.php new file mode 100644 index 000000000..677dd5e04 --- /dev/null +++ b/src/Appwrite/Auth/OAuth2/Tradeshift.php @@ -0,0 +1,155 @@ + self::TRADESHIFT_SANDBOX_API_DOMAIN, + 'live' => self::TRADESHIFT_API_DOMAIN, + ]; + + private $endpoint = [ + 'sandbox' => 'https://' . self::TRADESHIFT_SANDBOX_API_DOMAIN . '/tradeshift/', + 'live' => 'https://' . self::TRADESHIFT_API_DOMAIN . '/tradeshift/', + ]; + + private $resourceEndpoint = [ + 'sandbox' => 'https://' . self::TRADESHIFT_SANDBOX_API_DOMAIN . '/tradeshift/rest/external/', + 'live' => 'https://' . self::TRADESHIFT_API_DOMAIN . '/tradeshift/rest/external/', + ]; + + protected $environment = 'live'; + + /** + * @var array + */ + protected $user = []; + + + protected $scopes = [ + 'openid', + 'offline', + ]; + + /** + * @return string + */ + public function getName(): string + { + return 'tradeshift'; + } + + /** + * @return string + */ + public function getLoginURL(): string + { + $httpQuery = \http_build_query([ + 'response_type' => 'code', + 'client_id' => $this->appID, + 'scope' => \implode(' ', $this->getScopes()), + 'redirect_uri' => \str_replace("localhost", "127.0.0.1", $this->callback), + 'state' => \json_encode($this->state), + ]); + + $url = $this->endpoint[$this->environment] . 'auth/login?' . $httpQuery; + + return $url; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $response = $this->request( + 'POST', + $this->endpoint[$this->environment] . 'auth/token', + ['Authorization: Basic ' . \base64_encode($this->appID . ':' . $this->appSecret)], + \http_build_query([ + 'grant_type' => 'authorization_code', + 'code' => $code, + ]) + ); + + $accessToken = \json_decode($response, true); + + return $accessToken['access_token'] ?? ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + return $user['Id'] ?? ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + return $user['Username'] ?? ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + $firstName = $user['FirstName'] ?? ''; + $lastName = $user['LastName'] ?? ''; + + return $firstName . ' ' . $lastName; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + $header = [ + 'Content-Type: application/json', + 'Accept: application/json', + 'Host: ' . urlencode($this->apiDomain[$this->environment]), + 'Authorization: Bearer ' . $accessToken, + ]; + + if (empty($this->user)) { + $response = $this->request( + 'GET', + $this->resourceEndpoint[$this->environment] . 'account/info/user', + $header + ); + $this->user = \json_decode($response, true); + } + + return $this->user; + } +} diff --git a/src/Appwrite/Auth/OAuth2/TradeshiftBox.php b/src/Appwrite/Auth/OAuth2/TradeshiftBox.php new file mode 100644 index 000000000..6ba3c29f0 --- /dev/null +++ b/src/Appwrite/Auth/OAuth2/TradeshiftBox.php @@ -0,0 +1,18 @@ +