WIP: Read endpoints for oauth

This commit is contained in:
Matej Bačo
2026-04-27 14:16:43 +02:00
parent a1a88ae57e
commit 2e57500d7e
3 changed files with 157 additions and 0 deletions
@@ -0,0 +1,74 @@
<?php
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2;
use Appwrite\Extend\Exception;
use Appwrite\SDK\AuthType;
use Appwrite\SDK\Method;
use Appwrite\SDK\Response as SDKResponse;
use Appwrite\Utopia\Response;
use Utopia\Config\Config;
use Utopia\Database\Document;
use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
use Utopia\Validator\Text;
class Get extends Action
{
use HTTP;
public static function getName()
{
return 'getProjectOAuth2';
}
public function __construct()
{
$this
->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET)
->setHttpPath('/v1/project/oauth2/:provider')
->desc('Get project OAuth2 provider')
->groups(['api', 'project'])
->label('scope', 'oauth2.read')
->label('sdk', new Method(
namespace: 'project',
group: 'oauth2',
name: 'getOAuth2Provider',
description: <<<EOT
Get a single OAuth2 provider configuration. The `secret` is write-only and is always returned empty.
EOT,
auth: [AuthType::ADMIN, AuthType::KEY],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_AUTH_PROVIDER,
)
]
))
->param('provider', '', new Text(128), 'OAuth2 provider key. For example: github, google, apple.')
->inject('response')
->inject('project')
->callback($this->action(...));
}
public function action(
string $provider,
Response $response,
Document $project,
): void {
$providers = Config::getParam('oAuthProviders', []);
if (!\array_key_exists($provider, $providers) || !($providers[$provider]['enabled'] ?? false)) {
throw new Exception(Exception::PROJECT_PROVIDER_UNSUPPORTED);
}
$providerValues = $project->getAttribute('oAuthProviders', []);
$response->dynamic(new Document([
'key' => $provider,
'name' => $providers[$provider]['name'] ?? '',
'appId' => $providerValues[$provider . 'Appid'] ?? '',
'secret' => '',
'enabled' => $providerValues[$provider . 'Enabled'] ?? false,
]), Response::MODEL_AUTH_PROVIDER);
}
}
@@ -0,0 +1,79 @@
<?php
namespace Appwrite\Platform\Modules\Project\Http\Project\OAuth2;
use Appwrite\SDK\AuthType;
use Appwrite\SDK\Method;
use Appwrite\SDK\Response as SDKResponse;
use Appwrite\Utopia\Response;
use Utopia\Config\Config;
use Utopia\Database\Document;
use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
class XList extends Action
{
use HTTP;
public static function getName()
{
return 'listProjectOAuth2';
}
public function __construct()
{
$this
->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET)
->setHttpPath('/v1/project/oauth2')
->desc('List project OAuth2 providers')
->groups(['api', 'project'])
->label('scope', 'oauth2.read')
->label('sdk', new Method(
namespace: 'project',
group: 'oauth2',
name: 'listOAuth2Providers',
description: <<<EOT
Get a list of all OAuth2 providers supported by the server, along with the project's configuration for each. The `secret` is write-only and is always returned empty.
EOT,
auth: [AuthType::ADMIN, AuthType::KEY],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_AUTH_PROVIDER_LIST,
)
]
))
->inject('response')
->inject('project')
->callback($this->action(...));
}
public function action(
Response $response,
Document $project,
): void {
$providers = Config::getParam('oAuthProviders', []);
$providerValues = $project->getAttribute('oAuthProviders', []);
$projectProviders = [];
foreach ($providers as $key => $provider) {
if (!($provider['enabled'] ?? false)) {
// Disabled by Appwrite configuration, exclude from response
continue;
}
$projectProviders[] = new Document([
'key' => $key,
'name' => $provider['name'] ?? '',
'appId' => $providerValues[$key . 'Appid'] ?? '',
'secret' => '',
'enabled' => $providerValues[$key . 'Enabled'] ?? false,
]);
}
$response->dynamic(new Document([
'total' => \count($projectProviders),
'platforms' => $projectProviders,
]), Response::MODEL_AUTH_PROVIDER_LIST);
}
}
@@ -30,6 +30,7 @@ use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Dropbox\Update as Upda
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Etsy\Update as UpdateOAuth2Etsy;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Facebook\Update as UpdateOAuth2Facebook;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Figma\Update as UpdateOAuth2Figma;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Get as GetOAuth2Provider;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\GitHub\Update as UpdateOAuth2GitHub;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Gitlab\Update as UpdateOAuth2Gitlab;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Google\Update as UpdateOAuth2Google;
@@ -50,6 +51,7 @@ use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\TradeshiftSandbox\Upda
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Twitch\Update as UpdateOAuth2Twitch;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\WordPress\Update as UpdateOAuth2WordPress;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\X\Update as UpdateOAuth2X;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\XList as ListOAuth2Providers;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Yahoo\Update as UpdateOAuth2Yahoo;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Yandex\Update as UpdateOAuth2Yandex;
use Appwrite\Platform\Modules\Project\Http\Project\OAuth2\Zoho\Update as UpdateOAuth2Zoho;
@@ -169,6 +171,8 @@ class Http extends Service
$this->addAction(UpdateAuthMethod::getName(), new UpdateAuthMethod());
// OAuth2
$this->addAction(ListOAuth2Providers::getName(), new ListOAuth2Providers());
$this->addAction(GetOAuth2Provider::getName(), new GetOAuth2Provider());
$this->addAction(UpdateOAuth2GitHub::getName(), new UpdateOAuth2GitHub());
$this->addAction(UpdateOAuth2Discord::getName(), new UpdateOAuth2Discord());
$this->addAction(UpdateOAuth2Figma::getName(), new UpdateOAuth2Figma());