appwrite/src/Appwrite/SDK/Specification/Format.php

567 lines
19 KiB
PHP
Raw Normal View History

2020-11-11 22:02:42 +00:00
<?php
2025-02-04 11:08:56 +00:00
namespace Appwrite\SDK\Specification;
2020-11-11 22:02:42 +00:00
2024-03-06 17:34:21 +00:00
use Appwrite\Utopia\Response\Model;
2024-10-08 07:54:40 +00:00
use Utopia\App;
use Utopia\Config\Config;
2024-10-08 07:54:40 +00:00
use Utopia\Route;
2020-11-11 22:02:42 +00:00
abstract class Format
{
2024-10-08 07:54:40 +00:00
protected App $app;
2022-05-23 14:54:50 +00:00
2020-11-11 22:02:42 +00:00
/**
* @var array<Route>
2020-11-11 22:02:42 +00:00
*/
protected array $routes;
2022-05-23 14:54:50 +00:00
2020-11-11 22:02:42 +00:00
/**
* @var array<Model>
2020-11-11 22:02:42 +00:00
*/
protected array $models;
2022-05-23 14:54:50 +00:00
protected array $services;
protected array $keys;
protected int $authCount;
protected string $platform;
protected array $params = [
2020-11-11 22:02:42 +00:00
'name' => '',
'description' => '',
'endpoint' => 'https://localhost',
'version' => '1.0.0',
'terms' => '',
'support.email' => '',
'support.url' => '',
'contact.name' => '',
'contact.email' => '',
'contact.url' => '',
'license.name' => '',
'license.url' => '',
];
/*
* Blacklist to omit the enum types for the given route's parameter
*/
2023-08-11 17:20:40 +00:00
protected array $enumBlacklist = [
[
'namespace' => 'users',
'method' => 'getUsage',
'parameter' => 'provider'
]
];
public function __construct(App $app, array $services, array $routes, array $models, array $keys, int $authCount, string $platform)
2020-11-11 22:02:42 +00:00
{
2024-10-08 07:54:40 +00:00
$this->app = $app;
$this->services = $services;
2020-11-11 22:02:42 +00:00
$this->routes = $routes;
$this->models = $models;
$this->keys = $keys;
2021-05-19 14:26:06 +00:00
$this->authCount = $authCount;
$this->platform = $platform;
2020-11-11 22:02:42 +00:00
}
/**
* Get Name.
*
* Get format name
*
* @return string
*/
abstract public function getName(): string;
/**
* Parse
*
* Parses Appwrite App to given format
*
* @return array
*/
abstract public function parse(): array;
/**
* Set Param.
*
* Set param value
*
* @param string $key
* @param string $value
2022-05-23 14:54:50 +00:00
*
2020-11-11 22:02:42 +00:00
* @return self
*/
public function setParam(string $key, string $value): self
{
$this->params[$key] = $value;
return $this;
}
/**
* Get Param.
*
* Get param value
*
* @param string $key
* @param string $default
2022-05-23 14:54:50 +00:00
*
2020-11-11 22:02:42 +00:00
* @return string
*/
public function getParam(string $key, string $default = ''): string
{
return $this->params[$key] ?? $default;
2020-11-11 22:02:42 +00:00
}
2023-07-13 16:21:22 +00:00
protected function getEnumName(string $service, string $method, string $param): ?string
2023-07-13 16:21:22 +00:00
{
2025-07-27 06:35:40 +00:00
/* `$service` is `$namespace` */
2023-07-13 16:21:22 +00:00
switch ($service) {
2025-06-09 10:12:08 +00:00
case 'proxy':
switch ($method) {
case 'createRedirectRule':
switch ($param) {
case 'resourceType':
return 'ProxyResourceType';
}
break;
}
break;
2025-02-27 09:04:11 +00:00
case 'console':
switch ($method) {
case 'getResource':
switch ($param) {
case 'type':
return 'ConsoleResourceType';
case 'value':
return 'ConsoleResourceValue';
}
break;
}
break;
2023-07-13 16:21:22 +00:00
case 'account':
switch ($method) {
case 'createOAuth2Session':
2024-02-24 01:16:05 +00:00
case 'createOAuth2Token':
2024-02-05 07:25:34 +00:00
switch ($param) {
case 'provider':
return 'OAuthProvider';
}
break;
2024-03-04 09:29:47 +00:00
case 'createMfaAuthenticator':
case 'updateMfaAuthenticator':
case 'deleteMfaAuthenticator':
2024-02-05 07:25:34 +00:00
switch ($param) {
2024-02-19 03:53:43 +00:00
case 'type':
return 'AuthenticatorType';
2024-02-05 07:25:34 +00:00
}
break;
2024-03-04 09:29:47 +00:00
case 'createMfaChallenge':
2024-02-05 07:25:34 +00:00
switch ($param) {
2024-02-19 03:53:43 +00:00
case 'factor':
return 'AuthenticationFactor';
2024-02-05 07:25:34 +00:00
}
break;
2023-07-13 16:21:22 +00:00
}
break;
case 'avatars':
switch ($method) {
case 'getBrowser':
return 'Browser';
case 'getCreditCard':
return 'CreditCard';
case 'getFlag':
return 'Flag';
}
2023-07-18 04:23:39 +00:00
break;
case 'databases':
switch ($method) {
/*case 'getUsage':*/
case 'listUsage':
2024-02-05 06:32:05 +00:00
case 'getCollectionUsage':
case 'getDatabaseUsage':
switch ($param) {
2024-02-05 07:25:34 +00:00
case 'range':
return 'DatabaseUsageRange';
2024-02-05 06:32:05 +00:00
}
break;
case 'createRelationshipAttribute':
switch ($param) {
case 'type':
return 'RelationshipType';
case 'onDelete':
return 'RelationMutate';
}
break;
case 'updateRelationshipAttribute':
switch ($param) {
case 'onDelete':
return 'RelationMutate';
}
break;
case 'createIndex':
switch ($param) {
case 'type':
return 'IndexType';
case 'orders':
return 'OrderBy';
}
}
break;
2025-08-19 13:02:58 +00:00
case 'tablesDb':
switch ($method) {
2025-08-18 13:50:32 +00:00
case 'getUsage':
case 'listUsage':
2025-07-27 06:35:40 +00:00
case 'getTableUsage':
switch ($param) {
case 'range':
2025-07-27 06:35:40 +00:00
return 'GridUsageRange';
}
break;
case 'createRelationshipColumn':
switch ($param) {
case 'type':
return 'RelationshipType';
case 'onDelete':
return 'RelationMutate';
}
break;
case 'updateRelationshipColumn':
switch ($param) {
case 'onDelete':
return 'RelationMutate';
}
break;
case 'createIndex':
switch ($param) {
case 'type':
return 'IndexType';
case 'orders':
return 'OrderBy';
}
}
break;
2024-02-05 06:32:05 +00:00
case 'functions':
switch ($method) {
case 'getUsage':
2025-03-08 23:19:54 +00:00
case 'listUsage':
2024-02-05 07:25:34 +00:00
switch ($param) {
case 'range':
return 'FunctionUsageRange';
}
break;
case 'createExecution':
switch ($param) {
case 'method':
return 'ExecutionMethod';
}
break;
2025-03-04 12:43:13 +00:00
case 'getDeploymentDownload':
switch ($param) {
case 'type':
return 'DeploymentDownloadType';
}
break;
2025-03-08 23:35:55 +00:00
case 'createVcsDeployment':
switch ($param) {
case 'type':
return 'VCSDeploymentType';
}
break;
2025-03-04 12:43:13 +00:00
}
break;
2024-10-25 13:56:28 +00:00
case 'sites':
switch ($method) {
2025-03-04 12:43:13 +00:00
case 'getDeploymentDownload':
switch ($param) {
case 'type':
2025-03-04 13:31:00 +00:00
return 'DeploymentDownloadType';
2025-03-04 12:43:13 +00:00
}
break;
2024-10-25 13:56:28 +00:00
case 'getUsage':
2025-02-05 12:15:17 +00:00
case 'listUsage':
2024-10-25 13:56:28 +00:00
switch ($param) {
case 'range':
return 'SiteUsageRange';
}
break;
2025-03-08 23:35:55 +00:00
case 'createVcsDeployment':
switch ($param) {
case 'type':
return 'VCSDeploymentType';
}
break;
}
break;
2025-03-09 12:57:19 +00:00
case 'vcs':
2025-03-08 23:35:55 +00:00
switch ($method) {
case 'createRepositoryDetection':
case 'listRepositories':
switch ($param) {
case 'type':
return 'VCSDetectionType';
}
break;
2024-10-25 13:56:28 +00:00
}
2024-10-25 14:23:29 +00:00
break;
2024-02-05 07:25:34 +00:00
case 'messaging':
switch ($method) {
case 'getUsage':
2024-02-05 06:32:05 +00:00
switch ($param) {
case 'period':
2024-02-05 07:25:34 +00:00
return 'MessagingUsageRange';
}
break;
2024-02-21 09:04:27 +00:00
case 'createSms':
2024-02-05 07:25:34 +00:00
case 'createPush':
case 'createEmail':
2024-02-21 09:04:27 +00:00
case 'updateSms':
2024-02-05 07:25:34 +00:00
case 'updatePush':
case 'updateEmail':
switch ($param) {
case 'status':
2024-02-07 10:50:05 +00:00
return 'MessageStatus';
2024-12-10 11:26:58 +00:00
case 'priority':
return 'MessagePriority';
2024-02-05 07:25:34 +00:00
}
break;
2024-02-24 01:16:05 +00:00
case 'createSmtpProvider':
case 'updateSmtpProvider':
2024-02-05 07:25:34 +00:00
switch ($param) {
case 'encryption':
2024-02-24 01:16:05 +00:00
return 'SmtpEncryption';
2024-02-05 06:32:05 +00:00
}
break;
}
break;
2024-02-05 07:25:34 +00:00
case 'project':
2023-08-14 08:33:30 +00:00
switch ($method) {
2024-02-05 06:32:05 +00:00
case 'getUsage':
switch ($param) {
case 'period':
2024-02-05 07:25:34 +00:00
return 'ProjectUsageRange';
}
break;
}
break;
case 'projects':
switch ($method) {
case 'getEmailTemplate':
case 'updateEmailTemplate':
case 'deleteEmailTemplate':
switch ($param) {
case 'type':
return 'EmailTemplateType';
case 'locale':
return 'EmailTemplateLocale';
}
break;
case 'getSmsTemplate':
case 'updateSmsTemplate':
case 'deleteSmsTemplate':
switch ($param) {
case 'type':
2024-02-21 09:04:27 +00:00
return 'SmsTemplateType';
2024-02-05 07:25:34 +00:00
case 'locale':
2024-02-21 09:04:27 +00:00
return 'SmsTemplateLocale';
2024-02-05 06:32:05 +00:00
}
break;
2023-08-14 08:33:30 +00:00
case 'createPlatform':
switch ($param) {
case 'type':
return 'PlatformType';
}
break;
2024-02-05 07:25:34 +00:00
case 'createSmtpTest':
case 'updateSmtp':
switch ($param) {
case 'secure':
return 'SMTPSecure';
}
break;
case 'updateOAuth2':
switch ($param) {
case 'provider':
return 'OAuthProvider';
}
break;
case 'updateAuthStatus':
switch ($param) {
case 'method':
return 'AuthMethod';
}
break;
2024-02-05 11:39:52 +00:00
case 'updateServiceStatus':
switch ($param) {
case 'service':
2024-02-21 09:04:27 +00:00
return 'ApiService';
2024-02-05 11:39:52 +00:00
}
break;
2024-02-05 07:25:34 +00:00
}
break;
case 'storage':
switch ($method) {
case 'getUsage':
case 'getBucketUsage':
switch ($param) {
case 'range':
return 'StorageUsageRange';
}
break;
case 'getFilePreview':
switch ($param) {
case 'gravity':
return 'ImageGravity';
case 'output':
return 'ImageFormat';
}
break;
}
break;
case 'users':
switch ($method) {
case 'getUsage':
switch ($param) {
case 'range':
return 'UserUsageRange';
}
break;
2024-03-04 10:01:12 +00:00
case 'createMfaAuthenticator':
case 'updateMfaAuthenticator':
case 'deleteMfaAuthenticator':
2024-02-05 07:25:34 +00:00
switch ($param) {
2024-02-19 03:53:43 +00:00
case 'type':
return 'AuthenticatorType';
2024-02-05 07:25:34 +00:00
}
break;
case 'createTarget':
switch ($param) {
case 'providerType':
return 'MessagingProviderType';
}
break;
2024-02-07 11:17:38 +00:00
case 'createSHAUser':
switch ($param) {
case 'passwordVersion':
return 'PasswordHash';
}
break;
2023-08-14 08:33:30 +00:00
}
break;
2023-07-13 16:21:22 +00:00
}
return null;
}
2023-07-18 16:24:06 +00:00
public function getEnumKeys(string $service, string $method, string $param): array
{
$values = [];
switch ($service) {
case 'avatars':
switch ($method) {
case 'getBrowser':
$codes = Config::getParam('avatar-browsers');
foreach ($codes as $code => $value) {
$values[] = $value['name'];
}
return $values;
case 'getCreditCard':
$codes = Config::getParam('avatar-credit-cards');
foreach ($codes as $code => $value) {
$values[] = $value['name'];
}
return $values;
case 'getFlag':
$codes = Config::getParam('avatar-flags');
foreach ($codes as $code => $value) {
$values[] = $value['name'];
}
return $values;
}
break;
case 'databases':
switch ($method) {
2025-08-19 13:56:12 +00:00
case 'getUsage':
case 'listUsage':
case 'getCollectionUsage':
// Range Enum Keys
2024-02-05 06:32:05 +00:00
return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days'];
}
break;
2025-08-19 13:02:58 +00:00
case 'tablesDb':
2025-06-23 06:33:45 +00:00
switch ($method) {
2025-08-18 13:50:32 +00:00
case 'getUsage':
case 'listUsage':
2025-07-27 06:35:40 +00:00
case 'getTableUsage':
2025-06-23 06:33:45 +00:00
// Range Enum Keys
return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days'];
}
break;
2025-03-08 23:19:54 +00:00
case 'proxy':
switch ($method) {
case 'createRedirectRule':
2025-06-09 10:12:08 +00:00
switch ($param) {
case 'statusCode':
return ['Moved Permanently 301', 'Found 302', 'Temporary Redirect 307', 'Permanent Redirect 308'];
case 'resourceType':
return ['Site', 'Function'];
}
break;
2025-03-08 23:19:54 +00:00
}
break;
2024-10-25 14:23:29 +00:00
case 'sites':
case 'functions':
2024-10-25 14:23:29 +00:00
switch ($method) {
case 'getUsage':
2025-03-08 23:19:54 +00:00
case 'listUsage':
2024-10-25 14:23:29 +00:00
// Range Enum Keys
return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days'];
}
break;
case 'users':
switch ($method) {
case 'getUsage':
// Range Enum Keys
2023-07-18 16:24:06 +00:00
if ($param == 'range') {
2024-02-05 06:32:05 +00:00
return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days'];
2023-07-18 16:24:06 +00:00
}
}
break;
case 'storage':
switch ($method) {
case 'getUsage':
case 'getBucketUsage':
// Range Enum Keys
2024-02-05 06:32:05 +00:00
return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days'];
}
2024-02-05 08:12:57 +00:00
break;
2024-02-05 06:32:05 +00:00
case 'project':
switch ($method) {
case 'getUsage':
// Range Enum Keys
return ['One Hour', 'One Day'];
}
break;
}
return $values;
}
2025-03-27 08:30:10 +00:00
protected function getNestedModels(Model $model, array &$usedModels): void
{
foreach ($model->getRules() as $rule) {
if (!in_array($model->getType(), $usedModels)) {
continue;
}
$types = (array)$rule['type'];
foreach ($types as $ruleType) {
if (!in_array($ruleType, ['string', 'integer', 'boolean', 'json', 'float'])) {
$usedModels[] = $ruleType;
foreach ($this->models as $m) {
if ($m->getType() === $ruleType) {
$this->getNestedModels($m, $usedModels);
}
}
}
}
}
}
2020-11-11 22:02:42 +00:00
}