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;
|
2023-07-18 14:30:19 +00:00
|
|
|
use Utopia\Config\Config;
|
2026-04-09 05:11:04 +00:00
|
|
|
use Utopia\DI\Container;
|
2026-02-10 05:04:24 +00:00
|
|
|
use Utopia\Http\Route;
|
2020-11-11 22:02:42 +00:00
|
|
|
|
|
|
|
|
abstract class Format
|
|
|
|
|
{
|
2026-04-09 05:11:04 +00:00
|
|
|
protected Container $container;
|
2022-05-23 14:54:50 +00:00
|
|
|
|
2020-11-11 22:02:42 +00:00
|
|
|
/**
|
2025-03-27 08:04:14 +00:00
|
|
|
* @var array<Route>
|
2020-11-11 22:02:42 +00:00
|
|
|
*/
|
2022-06-29 23:41:49 +00:00
|
|
|
protected array $routes;
|
2022-05-23 14:54:50 +00:00
|
|
|
|
2020-11-11 22:02:42 +00:00
|
|
|
/**
|
2025-03-27 08:04:14 +00:00
|
|
|
* @var array<Model>
|
2020-11-11 22:02:42 +00:00
|
|
|
*/
|
2022-06-29 23:41:49 +00:00
|
|
|
protected array $models;
|
2022-05-23 14:54:50 +00:00
|
|
|
|
2022-06-29 23:41:49 +00:00
|
|
|
protected array $services;
|
|
|
|
|
protected array $keys;
|
|
|
|
|
protected int $authCount;
|
2025-07-24 04:37:46 +00:00
|
|
|
protected string $platform;
|
2022-06-29 23:41:49 +00:00
|
|
|
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' => '',
|
|
|
|
|
];
|
|
|
|
|
|
2026-01-14 11:37:33 +00:00
|
|
|
private const array OAUTH_PROVIDER_BLACKLIST = [
|
2026-01-14 11:17:21 +00:00
|
|
|
[
|
|
|
|
|
'namespace' => 'account',
|
2026-01-14 11:37:33 +00:00
|
|
|
'methods' => [
|
|
|
|
|
'createOAuth2Session',
|
|
|
|
|
'createOAuth2Token',
|
|
|
|
|
'updateMagicURLSession'
|
|
|
|
|
],
|
2026-01-14 11:17:21 +00:00
|
|
|
'parameter' => 'provider',
|
2026-01-14 11:37:33 +00:00
|
|
|
'excludeKeys' => [
|
|
|
|
|
'mock',
|
|
|
|
|
'mock-unverified'
|
|
|
|
|
],
|
2026-01-14 11:17:21 +00:00
|
|
|
],
|
|
|
|
|
[
|
2026-01-14 11:37:33 +00:00
|
|
|
'namespace' => 'projects',
|
|
|
|
|
'methods' => [
|
|
|
|
|
'updateOAuth2'
|
|
|
|
|
],
|
2026-01-14 11:17:21 +00:00
|
|
|
'parameter' => 'provider',
|
2026-01-14 11:37:33 +00:00
|
|
|
'excludeKeys' => [
|
|
|
|
|
'mock',
|
|
|
|
|
'mock-unverified'
|
|
|
|
|
],
|
2026-01-14 11:17:21 +00:00
|
|
|
],
|
2026-01-14 11:37:33 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
private const array PROVIDER_USAGE_BLACKLIST = [
|
2023-08-11 07:43:46 +00:00
|
|
|
[
|
|
|
|
|
'namespace' => 'users',
|
2026-01-14 11:37:33 +00:00
|
|
|
'methods' => [
|
|
|
|
|
'getUsage'
|
|
|
|
|
],
|
2026-01-14 11:17:21 +00:00
|
|
|
'parameter' => 'provider',
|
2026-01-14 11:37:33 +00:00
|
|
|
'exclude' => true, /* fully excluded */
|
|
|
|
|
],
|
2023-08-11 07:43:46 +00:00
|
|
|
];
|
|
|
|
|
|
2026-04-10 04:07:01 +00:00
|
|
|
private const array REQUEST_PARAMETER_OVERRIDES = [
|
|
|
|
|
[
|
|
|
|
|
'namespace' => 'project',
|
|
|
|
|
'methods' => [
|
|
|
|
|
'createWebPlatform',
|
|
|
|
|
'updateWebPlatform',
|
|
|
|
|
],
|
|
|
|
|
'parameter' => 'hostname',
|
|
|
|
|
'required' => true,
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
|
2026-01-14 11:37:33 +00:00
|
|
|
protected array $enumBlacklist = [];
|
|
|
|
|
|
2026-04-09 05:11:04 +00:00
|
|
|
public function __construct(Container $container, array $services, array $routes, array $models, array $keys, int $authCount, string $platform)
|
2020-11-11 22:02:42 +00:00
|
|
|
{
|
2026-04-09 05:11:04 +00:00
|
|
|
$this->container = $container;
|
2021-01-26 11:54:06 +00:00
|
|
|
$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;
|
2025-07-24 04:37:46 +00:00
|
|
|
$this->platform = $platform;
|
2026-01-14 11:37:33 +00:00
|
|
|
|
|
|
|
|
$this->enumBlacklist = $this->buildEnumBlacklist();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function buildEnumBlacklist(): array
|
|
|
|
|
{
|
|
|
|
|
$blacklist = [];
|
|
|
|
|
|
|
|
|
|
foreach (self::OAUTH_PROVIDER_BLACKLIST as $config) {
|
|
|
|
|
foreach ($config['methods'] as $method) {
|
|
|
|
|
$entry = [
|
|
|
|
|
'namespace' => $config['namespace'],
|
|
|
|
|
'method' => $method,
|
|
|
|
|
'parameter' => $config['parameter'],
|
|
|
|
|
];
|
|
|
|
|
if (isset($config['excludeKeys'])) {
|
|
|
|
|
$entry['excludeKeys'] = $config['excludeKeys'];
|
|
|
|
|
}
|
|
|
|
|
if (isset($config['exclude'])) {
|
|
|
|
|
$entry['exclude'] = $config['exclude'];
|
|
|
|
|
}
|
|
|
|
|
$blacklist[] = $entry;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (self::PROVIDER_USAGE_BLACKLIST as $config) {
|
|
|
|
|
foreach ($config['methods'] as $method) {
|
|
|
|
|
$entry = [
|
|
|
|
|
'namespace' => $config['namespace'],
|
|
|
|
|
'method' => $method,
|
|
|
|
|
'parameter' => $config['parameter'],
|
|
|
|
|
];
|
|
|
|
|
if (isset($config['excludeKeys'])) {
|
|
|
|
|
$entry['excludeKeys'] = $config['excludeKeys'];
|
|
|
|
|
}
|
|
|
|
|
if (isset($config['exclude'])) {
|
|
|
|
|
$entry['exclude'] = $config['exclude'];
|
|
|
|
|
}
|
|
|
|
|
$blacklist[] = $entry;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $blacklist;
|
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
|
|
|
|
|
{
|
2022-06-29 23:41:49 +00:00
|
|
|
return $this->params[$key] ?? $default;
|
2020-11-11 22:02:42 +00:00
|
|
|
}
|
2023-07-13 16:21:22 +00:00
|
|
|
|
2025-12-13 16:06:44 +00:00
|
|
|
/**
|
|
|
|
|
* Set Services.
|
|
|
|
|
*
|
|
|
|
|
* Set services value
|
|
|
|
|
*
|
|
|
|
|
* @param array $services
|
|
|
|
|
*
|
|
|
|
|
* @return self
|
|
|
|
|
*/
|
|
|
|
|
public function setServices(array $services): self
|
|
|
|
|
{
|
|
|
|
|
$this->services = $services;
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set Services.
|
|
|
|
|
*
|
|
|
|
|
* Get services value
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function getServices(): array
|
|
|
|
|
{
|
|
|
|
|
return $this->services;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-09 05:11:04 +00:00
|
|
|
/**
|
|
|
|
|
* @param list<string> $injections
|
|
|
|
|
* @return array<string, mixed>
|
|
|
|
|
*/
|
|
|
|
|
protected function getResources(array $injections): array
|
|
|
|
|
{
|
|
|
|
|
$resources = [];
|
|
|
|
|
|
|
|
|
|
foreach ($injections as $name) {
|
|
|
|
|
$resources[$name] = $this->container->get($name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $resources;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function getValidator(array $param): mixed
|
|
|
|
|
{
|
|
|
|
|
return \is_callable($param['validator'])
|
|
|
|
|
? ($param['validator'])(...$this->getResources($param['injections'] ?? []))
|
|
|
|
|
: $param['validator'];
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-05 14:07:29 +00:00
|
|
|
protected function getDescriptionContents(?string $description): string
|
|
|
|
|
{
|
|
|
|
|
if ($description === null || $description === '') {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!\str_ends_with($description, '.md')) {
|
|
|
|
|
return $description;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$contents = @\file_get_contents($description);
|
|
|
|
|
|
|
|
|
|
if ($contents === false) {
|
|
|
|
|
throw new \RuntimeException('Documentation file not found or unreadable: ' . $description);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $contents;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-16 05:37:07 +00:00
|
|
|
/**
|
|
|
|
|
* @param array<Model> $models
|
|
|
|
|
* @return array<string, mixed>|null
|
|
|
|
|
*/
|
2026-04-16 05:59:16 +00:00
|
|
|
protected function getDiscriminator(array $models, string $refPrefix): ?array
|
2026-04-16 05:37:07 +00:00
|
|
|
{
|
|
|
|
|
if (\count($models) < 2) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-16 05:45:08 +00:00
|
|
|
$candidateKeys = \array_keys($models[0]->conditions);
|
2026-04-16 05:37:07 +00:00
|
|
|
|
2026-04-16 05:45:08 +00:00
|
|
|
foreach (\array_slice($models, 1) as $model) {
|
|
|
|
|
$candidateKeys = \array_values(\array_intersect($candidateKeys, \array_keys($model->conditions)));
|
2026-04-16 05:37:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (empty($candidateKeys)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($candidateKeys as $key) {
|
|
|
|
|
$mapping = [];
|
2026-04-16 05:45:08 +00:00
|
|
|
$isValid = true;
|
2026-04-16 05:37:07 +00:00
|
|
|
|
|
|
|
|
foreach ($models as $model) {
|
|
|
|
|
$rules = $model->getRules();
|
2026-04-16 05:45:08 +00:00
|
|
|
$condition = $model->conditions[$key] ?? null;
|
2026-04-16 05:37:07 +00:00
|
|
|
|
|
|
|
|
if (!isset($rules[$key]) || ($rules[$key]['required'] ?? false) !== true) {
|
2026-04-16 05:45:08 +00:00
|
|
|
$isValid = false;
|
|
|
|
|
break;
|
2026-04-16 05:37:07 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-16 05:42:43 +00:00
|
|
|
if (!\is_array($condition)) {
|
|
|
|
|
if (!\is_scalar($condition)) {
|
2026-04-16 05:45:08 +00:00
|
|
|
$isValid = false;
|
|
|
|
|
break;
|
2026-04-16 05:42:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$values = [$condition];
|
|
|
|
|
} else {
|
|
|
|
|
if ($condition === []) {
|
2026-04-16 05:45:08 +00:00
|
|
|
$isValid = false;
|
|
|
|
|
break;
|
2026-04-16 05:42:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$values = $condition;
|
2026-04-16 05:45:08 +00:00
|
|
|
$hasInvalidValue = false;
|
2026-04-16 05:42:43 +00:00
|
|
|
|
|
|
|
|
foreach ($values as $value) {
|
|
|
|
|
if (!\is_scalar($value)) {
|
2026-04-16 05:45:08 +00:00
|
|
|
$hasInvalidValue = true;
|
|
|
|
|
break;
|
2026-04-16 05:42:43 +00:00
|
|
|
}
|
|
|
|
|
}
|
2026-04-16 05:45:08 +00:00
|
|
|
|
|
|
|
|
if ($hasInvalidValue) {
|
|
|
|
|
$isValid = false;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2026-04-16 05:42:43 +00:00
|
|
|
}
|
2026-04-16 05:37:07 +00:00
|
|
|
|
|
|
|
|
if (isset($rules[$key]['enum']) && \is_array($rules[$key]['enum'])) {
|
|
|
|
|
$values = \array_values(\array_filter(
|
|
|
|
|
$values,
|
|
|
|
|
fn (mixed $value) => \in_array($value, $rules[$key]['enum'], true)
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($values === []) {
|
2026-04-16 05:45:08 +00:00
|
|
|
$isValid = false;
|
|
|
|
|
break;
|
2026-04-16 05:37:07 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-16 05:45:08 +00:00
|
|
|
$ref = $refPrefix . $model->getType();
|
|
|
|
|
|
2026-04-16 05:37:07 +00:00
|
|
|
foreach ($values as $value) {
|
|
|
|
|
$mappingKey = \is_bool($value) ? ($value ? 'true' : 'false') : (string) $value;
|
|
|
|
|
|
2026-04-16 05:45:08 +00:00
|
|
|
if (isset($mapping[$mappingKey]) && $mapping[$mappingKey] !== $ref) {
|
|
|
|
|
$isValid = false;
|
|
|
|
|
break;
|
2026-04-16 05:37:07 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-16 05:45:08 +00:00
|
|
|
$mapping[$mappingKey] = $ref;
|
2026-04-16 05:37:07 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-16 05:45:08 +00:00
|
|
|
if (!$isValid) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2026-04-16 05:37:07 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-16 05:45:08 +00:00
|
|
|
if (!$isValid || $mapping === []) {
|
2026-04-16 05:37:07 +00:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
'propertyName' => $key,
|
|
|
|
|
'mapping' => $mapping,
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-23 05:17:39 +00:00
|
|
|
protected function getRequestEnumName(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';
|
2025-12-03 03:58:39 +00:00
|
|
|
case 'getScreenshot':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'permissions':
|
|
|
|
|
return 'BrowserPermission';
|
2025-12-24 08:09:51 +00:00
|
|
|
case 'output':
|
|
|
|
|
return 'ImageFormat';
|
2025-12-03 03:58:39 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2023-07-13 16:21:22 +00:00
|
|
|
}
|
2023-07-18 04:23:39 +00:00
|
|
|
break;
|
2023-08-11 07:43:46 +00:00
|
|
|
case 'databases':
|
|
|
|
|
switch ($method) {
|
2025-08-19 14:05:14 +00:00
|
|
|
case 'getUsage':
|
2025-06-23 06:19:43 +00:00
|
|
|
case 'listUsage':
|
2024-02-05 06:32:05 +00:00
|
|
|
case 'getCollectionUsage':
|
|
|
|
|
switch ($param) {
|
2024-02-05 07:25:34 +00:00
|
|
|
case 'range':
|
2025-08-19 14:05:14 +00:00
|
|
|
return 'UsageRange';
|
2024-02-05 06:32:05 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2023-08-11 07:43:46 +00:00
|
|
|
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':
|
2026-03-19 15:00:42 +00:00
|
|
|
return 'DatabasesIndexType';
|
2023-08-11 07:43:46 +00:00
|
|
|
case 'orders':
|
|
|
|
|
return 'OrderBy';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
2025-08-20 14:20:05 +00:00
|
|
|
case 'tablesDB':
|
2025-06-23 06:19:43 +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:19:43 +00:00
|
|
|
switch ($param) {
|
|
|
|
|
case 'range':
|
2025-08-19 14:05:14 +00:00
|
|
|
return 'UsageRange';
|
2025-06-23 06:19:43 +00:00
|
|
|
}
|
|
|
|
|
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':
|
2026-03-19 15:00:42 +00:00
|
|
|
return 'TablesDBIndexType';
|
|
|
|
|
case 'orders':
|
|
|
|
|
return 'OrderBy';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'documentsDB':
|
|
|
|
|
switch ($method) {
|
|
|
|
|
case 'getUsage':
|
|
|
|
|
case 'listUsage':
|
|
|
|
|
case 'getCollectionUsage':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'range':
|
|
|
|
|
return 'UsageRange';
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'createIndex':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'type':
|
|
|
|
|
return 'DocumentsDBIndexType';
|
|
|
|
|
case 'orders':
|
|
|
|
|
return 'OrderBy';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'vectorsDB':
|
|
|
|
|
switch ($method) {
|
|
|
|
|
case 'getUsage':
|
|
|
|
|
case 'listUsage':
|
|
|
|
|
case 'getCollectionUsage':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'range':
|
|
|
|
|
return 'UsageRange';
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'createIndex':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'type':
|
|
|
|
|
return 'VectorsDBIndexType';
|
2026-03-05 08:00:54 +00:00
|
|
|
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':
|
2025-08-19 14:05:14 +00:00
|
|
|
return 'UsageRange';
|
2024-02-05 07:25:34 +00:00
|
|
|
}
|
|
|
|
|
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':
|
2025-11-21 04:26:26 +00:00
|
|
|
return 'VCSReferenceType';
|
2025-03-08 23:35:55 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2025-11-20 05:12:13 +00:00
|
|
|
case 'createTemplateDeployment':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'type':
|
2025-11-20 09:53:16 +00:00
|
|
|
return 'TemplateReferenceType';
|
2025-03-08 23:35:55 +00:00
|
|
|
}
|
|
|
|
|
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':
|
2025-08-19 14:05:14 +00:00
|
|
|
return 'UsageRange';
|
2024-10-25 13:56:28 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2025-03-08 23:35:55 +00:00
|
|
|
case 'createVcsDeployment':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'type':
|
2025-11-21 04:26:26 +00:00
|
|
|
return 'VCSReferenceType';
|
2025-03-08 23:35:55 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2025-11-20 05:02:56 +00:00
|
|
|
case 'createTemplateDeployment':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'type':
|
2025-11-20 09:53:16 +00:00
|
|
|
return 'TemplateReferenceType';
|
2025-03-08 23:35:55 +00:00
|
|
|
}
|
|
|
|
|
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;
|
2026-02-24 12:11:14 +00:00
|
|
|
case 'migrations':
|
|
|
|
|
switch ($method) {
|
|
|
|
|
case 'createAppwriteMigration':
|
|
|
|
|
case 'getAppwriteReport':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'resources':
|
|
|
|
|
return 'AppwriteMigrationResource';
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'createFirebaseMigration':
|
|
|
|
|
case 'getFirebaseReport':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'resources':
|
|
|
|
|
return 'FirebaseMigrationResource';
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'createSupabaseMigration':
|
|
|
|
|
case 'getSupabaseReport':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'resources':
|
|
|
|
|
return 'SupabaseMigrationResource';
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'createNHostMigration':
|
|
|
|
|
case 'getNHostReport':
|
|
|
|
|
switch ($param) {
|
|
|
|
|
case 'resources':
|
|
|
|
|
return 'NHostMigrationResource';
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-02-05 06:32:05 +00:00
|
|
|
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':
|
2024-02-07 10:03:59 +00:00
|
|
|
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':
|
2025-08-19 14:05:14 +00:00
|
|
|
return 'UsageRange';
|
2024-02-05 07:25:34 +00:00
|
|
|
}
|
|
|
|
|
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':
|
2025-08-19 14:05:14 +00:00
|
|
|
return 'UsageRange';
|
2024-02-05 07:25:34 +00:00
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
}
|
2025-06-23 06:19:43 +00:00
|
|
|
|
2025-09-23 05:17:39 +00:00
|
|
|
public function getRequestEnumKeys(string $service, string $method, string $param): array
|
2023-07-18 14:30:19 +00:00
|
|
|
{
|
|
|
|
|
$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':
|
2026-03-19 15:00:42 +00:00
|
|
|
case 'documentsDB':
|
|
|
|
|
case 'vectorsDB':
|
2023-07-18 14:30:19 +00:00
|
|
|
switch ($method) {
|
2025-08-19 13:56:12 +00:00
|
|
|
case 'getUsage':
|
2025-06-23 06:19:43 +00:00
|
|
|
case 'listUsage':
|
2023-07-18 14:30:19 +00:00
|
|
|
case 'getCollectionUsage':
|
|
|
|
|
// Range Enum Keys
|
2024-02-05 06:32:05 +00:00
|
|
|
return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days'];
|
2023-07-18 14:30:19 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2025-08-20 14:20:05 +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':
|
2025-06-23 06:19:43 +00:00
|
|
|
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'];
|
2023-07-18 14:30:19 +00:00
|
|
|
}
|
|
|
|
|
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
|
|
|
}
|
2023-07-18 14:30:19 +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'];
|
2023-07-18 14:30:19 +00:00
|
|
|
}
|
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;
|
2023-07-18 14:30:19 +00:00
|
|
|
}
|
|
|
|
|
return $values;
|
|
|
|
|
}
|
2025-03-27 08:30:10 +00:00
|
|
|
|
2026-04-10 04:12:17 +00:00
|
|
|
protected function getRequestParameterConfig(string $service, string $method, string $param, bool $optional, bool $nullable, mixed $default): array
|
2026-04-10 04:07:01 +00:00
|
|
|
{
|
2026-04-10 04:12:17 +00:00
|
|
|
$config = [
|
|
|
|
|
'required' => !$optional,
|
|
|
|
|
'nullable' => $nullable,
|
|
|
|
|
];
|
|
|
|
|
|
2026-04-10 04:07:01 +00:00
|
|
|
foreach (self::REQUEST_PARAMETER_OVERRIDES as $override) {
|
|
|
|
|
if (
|
2026-04-10 04:12:17 +00:00
|
|
|
$override['namespace'] !== $service
|
|
|
|
|
|| !\in_array($method, $override['methods'], true)
|
|
|
|
|
|| $override['parameter'] !== $param
|
2026-04-10 04:07:01 +00:00
|
|
|
) {
|
2026-04-10 04:12:17 +00:00
|
|
|
continue;
|
2026-04-10 04:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-10 04:12:17 +00:00
|
|
|
$config['required'] = $override['required'] ?? $config['required'];
|
|
|
|
|
$config['nullable'] = $override['nullable'] ?? $config['nullable'];
|
|
|
|
|
break;
|
2026-04-10 04:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-10 04:39:33 +00:00
|
|
|
$config['emitDefault'] = !$config['required'] && !\is_null($default);
|
2026-04-10 04:07:01 +00:00
|
|
|
|
2026-04-10 04:12:17 +00:00
|
|
|
return $config;
|
2026-04-10 04:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2025-09-23 05:17:39 +00:00
|
|
|
public function getResponseEnumName(string $model, string $param): ?string
|
|
|
|
|
{
|
2026-04-10 04:07:01 +00:00
|
|
|
if ($param === 'type' && \str_starts_with($model, 'platform') && $model !== 'platformList') {
|
|
|
|
|
return 'PlatformType';
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-15 06:26:19 +00:00
|
|
|
if ($param !== 'status') {
|
|
|
|
|
return null;
|
2025-09-23 05:17:39 +00:00
|
|
|
}
|
2026-01-15 06:26:19 +00:00
|
|
|
|
|
|
|
|
return match (true) {
|
|
|
|
|
$model === 'healthStatus' => 'HealthCheckStatus',
|
|
|
|
|
str_starts_with($model, 'attribute') => 'AttributeStatus',
|
|
|
|
|
str_starts_with($model, 'column') => 'ColumnStatus',
|
|
|
|
|
default => null,
|
|
|
|
|
};
|
2025-09-23 05:17:39 +00:00
|
|
|
}
|
|
|
|
|
|
2025-03-27 08:30:10 +00:00
|
|
|
protected function getNestedModels(Model $model, array &$usedModels): void
|
|
|
|
|
{
|
|
|
|
|
foreach ($model->getRules() as $rule) {
|
2026-03-24 12:33:15 +00:00
|
|
|
if (($rule['hidden'] ?? false) === true) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2025-03-27 08:30:10 +00:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-01-15 06:26:19 +00:00
|
|
|
|
|
|
|
|
protected function parseDescription(string $description, array $excludedValues): string
|
|
|
|
|
{
|
|
|
|
|
if (empty($excludedValues)) {
|
|
|
|
|
return $description;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($excludedValues as $excludedValue) {
|
|
|
|
|
// remove from comma-separated list
|
|
|
|
|
$description = preg_replace(
|
|
|
|
|
'/,\s*' . preg_quote($excludedValue, '/') . '(?=\s*[,.]|$)/',
|
|
|
|
|
'',
|
|
|
|
|
$description
|
|
|
|
|
);
|
|
|
|
|
$description = preg_replace(
|
|
|
|
|
'/(?<=:\s|,\s)' . preg_quote($excludedValue, '/') . '\s*,\s*/',
|
|
|
|
|
'',
|
|
|
|
|
$description
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// clean up double commas and extra spaces
|
|
|
|
|
$description = preg_replace('/,\s*,/', ',', $description);
|
|
|
|
|
$description = preg_replace('/\s+/', ' ', $description);
|
|
|
|
|
|
|
|
|
|
return trim($description);
|
|
|
|
|
}
|
2020-11-11 22:02:42 +00:00
|
|
|
}
|