Skip to content
56 changes: 56 additions & 0 deletions src/SDK/Language.php
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,60 @@ protected function toUpperSnakeCase($str): string
{
return \strtoupper($this->toSnakeCase($str));
}

public function isPermissionString(string $string): bool
{
$pattern = '/^\["(read|update|delete|write)\(\\"[^\\"]+\\"\)"(,\s*"(read|update|delete|write)\(\\"[^\\"]+\\"\)")*\]$/';
return preg_match($pattern, $string) === 1;
}

public function extractPermissionParts(string $string): array
{
$inner = substr($string, 1, -1);
preg_match_all('/"(read|update|delete|write)\(\\"([^\\"]+)\\"\)"/', $inner, $matches, PREG_SET_ORDER);

$result = [];
foreach ($matches as $match) {
$action = $match[1];
$roleString = $match[2];

$role = null;
$id = null;
$innerRole = null;

if (strpos($roleString, ':') !== false) {
$role = explode(':', $roleString, 2)[0];
$idString = explode(':', $roleString, 2)[1];

if (strpos($idString, '/') !== false) {
$id = explode('/', $idString, 2)[0];
$innerRole = explode('/', $idString, 2)[1];
} else {
$id = $idString;
}
} else {
$role = $roleString;
}

$result[] = [
'action' => $action,
'role' => $role,
'id' => $id ?? null,
'innerRole' => $innerRole
];
}

return $result;
}

public function hasPermissionParam(array $parameters): bool
{
foreach ($parameters as $param) {
$example = $param['example'] ?? '';
if (!empty($example) && is_string($example) && $this->isPermissionString($example)) {
return true;
}
}
return false;
}
}
20 changes: 19 additions & 1 deletion src/SDK/Language/Dart.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,8 @@ public function getParamExample(array $param): string
}

return match ($type) {
self::TYPE_ARRAY, self::TYPE_FILE, self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_ARRAY => $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example,
self::TYPE_FILE, self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_BOOLEAN => ($example) ? 'true' : 'false',
self::TYPE_OBJECT => ($decoded = json_decode($example, true)) !== null
? (empty($decoded) && $example === '{}'
Expand All @@ -251,6 +252,23 @@ public function getParamExample(array $param): string
};
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = "'" . $permission['id'] . "'";
}
if ($permission['innerRole'] !== null) {
$args[] = "'" . $permission['innerRole'] . "'";
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . $permission['action'] . '(Role.' . $permission['role'] . '(' . $argsString . '))';
}
return '[' . implode(', ', $permissions) . ']';
}
Comment on lines +255 to +270
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can put this in the root language class, and add a couple of getters for each language, getStaticAccessOperator (e.g. . for JS, :: for PHP) and getArrayOf(string), then it'll be much easier to maintain


/**
* @return array
*/
Expand Down
20 changes: 19 additions & 1 deletion src/SDK/Language/Deno.php
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ public function getParamExample(array $param): string
}

return match ($type) {
self::TYPE_ARRAY, self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_ARRAY => $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example,
self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_FILE => 'InputFile.fromPath(\'/path/to/file.png\', \'file.png\')',
self::TYPE_BOOLEAN => ($example) ? 'true' : 'false',
self::TYPE_OBJECT => ($example === '{}')
Expand All @@ -187,4 +188,21 @@ public function getParamExample(array $param): string
self::TYPE_STRING => "'{$example}'",
};
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = "'" . $permission['id'] . "'";
}
if ($permission['innerRole'] !== null) {
$args[] = "'" . $permission['innerRole'] . "'";
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . $permission['action'] . '(Role.' . $permission['role'] . '(' . $argsString . '))';
}
return '[' . implode(', ', $permissions) . ']';
}
}
21 changes: 20 additions & 1 deletion src/SDK/Language/DotNet.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,9 +282,11 @@ public function getParamExample(array $param): string
case self::TYPE_FILE:
case self::TYPE_NUMBER:
case self::TYPE_INTEGER:
case self::TYPE_ARRAY:
$output .= $example;
break;
case self::TYPE_ARRAY:
$output .= $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example;
break;
case self::TYPE_OBJECT:
if ($example === '{}') {
$output .= '[object]';
Expand All @@ -310,6 +312,23 @@ public function getParamExample(array $param): string
return $output;
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = '"' . $permission['id'] . '"';
}
if ($permission['innerRole'] !== null) {
$args[] = '"' . $permission['innerRole'] . '"';
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . ucfirst($permission['action']) . '(Role.' . ucfirst($permission['role']) . '(' . $argsString . '))';
}
return 'new List<string> { ' . implode(', ', $permissions) . ' }';
}

/**
* @return array
*/
Expand Down
33 changes: 27 additions & 6 deletions src/SDK/Language/Kotlin.php
Original file line number Diff line number Diff line change
Expand Up @@ -257,13 +257,17 @@ public function getParamExample(array $param): string
$output .= $example;
break;
case self::TYPE_ARRAY:
if (\str_starts_with($example, '[')) {
$example = \substr($example, 1);
}
if (\str_ends_with($example, ']')) {
$example = \substr($example, 0, -1);
if ($this->isPermissionString($example)) {
$output .= $this->getPermissionExample($example);
} else {
if (\str_starts_with($example, '[')) {
$example = \substr($example, 1);
}
if (\str_ends_with($example, ']')) {
$example = \substr($example, 0, -1);
}
$output .= 'listOf(' . $example . ')';
}
$output .= 'listOf(' . $example . ')';
break;
case self::TYPE_BOOLEAN:
$output .= ($example) ? 'true' : 'false';
Expand All @@ -277,6 +281,23 @@ public function getParamExample(array $param): string
return $output;
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = '"' . $permission['id'] . '"';
}
if ($permission['innerRole'] !== null) {
$args[] = '"' . $permission['innerRole'] . '"';
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . $permission['action'] . '(Role.' . $permission['role'] . '(' . $argsString . '))';
}
return 'listOf(' . implode(', ', $permissions) . ')';
}

/**
* @return array
*/
Expand Down
21 changes: 20 additions & 1 deletion src/SDK/Language/PHP.php
Original file line number Diff line number Diff line change
Expand Up @@ -356,9 +356,11 @@ public function getParamExample(array $param): string
switch ($type) {
case self::TYPE_NUMBER:
case self::TYPE_INTEGER:
case self::TYPE_ARRAY:
$output .= $example;
break;
case self::TYPE_ARRAY:
$output .= $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example;
break;
case self::TYPE_OBJECT:
$output .= $this->jsonToAssoc(json_decode($example, true));
break;
Expand All @@ -377,6 +379,23 @@ public function getParamExample(array $param): string
return $output;
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = '"' . $permission['id'] . '"';
}
if ($permission['innerRole'] !== null) {
$args[] = '"' . $permission['innerRole'] . '"';
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission::' . $permission['action'] . '(Role::' . $permission['role'] . '(' . $argsString . '))';
}
return '[' . implode(', ', $permissions) . ']';
}

/**
* Converts JSON Object To PHP Native Assoc Array
*
Expand Down
20 changes: 19 additions & 1 deletion src/SDK/Language/Python.php
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,8 @@ public function getParamExample(array $param): string
}

return match ($type) {
self::TYPE_ARRAY, self::TYPE_FILE, self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_ARRAY => $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example,
self::TYPE_FILE, self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_BOOLEAN => ($example) ? 'True' : 'False',
self::TYPE_OBJECT => ($example === '{}')
? '{}'
Expand All @@ -353,6 +354,23 @@ public function getParamExample(array $param): string
};
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = '"' . $permission['id'] . '"';
}
if ($permission['innerRole'] !== null) {
$args[] = '"' . $permission['innerRole'] . '"';
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . $permission['action'] . '(Role.' . $permission['role'] . '(' . $argsString . '))';
}
return '[' . implode(', ', $permissions) . ']';
}

public function getFilters(): array
{
return [
Expand Down
21 changes: 20 additions & 1 deletion src/SDK/Language/Ruby.php
Original file line number Diff line number Diff line change
Expand Up @@ -302,9 +302,11 @@ public function getParamExample(array $param): string
switch ($type) {
case self::TYPE_NUMBER:
case self::TYPE_INTEGER:
case self::TYPE_ARRAY:
$output .= $example;
break;
case self::TYPE_ARRAY:
$output .= $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example;
break;
case self::TYPE_OBJECT:
$output .= $this->jsonToHash(json_decode($example, true));
break;
Expand All @@ -323,6 +325,23 @@ public function getParamExample(array $param): string
return $output;
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = "'" . $permission['id'] . "'";
}
if ($permission['innerRole'] !== null) {
$args[] = "'" . $permission['innerRole'] . "'";
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . $permission['action'] . '(Role.' . $permission['role'] . '(' . $argsString . '))';
}
return '[' . implode(', ', $permissions) . ']';
}

/**
* Converts JSON Object To Ruby Native Hash
*
Expand Down
21 changes: 20 additions & 1 deletion src/SDK/Language/Swift.php
Original file line number Diff line number Diff line change
Expand Up @@ -425,9 +425,11 @@ public function getParamExample(array $param): string
case self::TYPE_FILE:
case self::TYPE_NUMBER:
case self::TYPE_INTEGER:
case self::TYPE_ARRAY:
$output .= $example;
break;
case self::TYPE_ARRAY:
$output .= $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example;
break;
case self::TYPE_BOOLEAN:
$output .= ($example) ? 'true' : 'false';
break;
Expand All @@ -448,6 +450,23 @@ public function getParamExample(array $param): string
return $output;
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = '"' . $permission['id'] . '"';
}
if ($permission['innerRole'] !== null) {
$args[] = '"' . $permission['innerRole'] . '"';
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . $permission['action'] . '(Role.' . $permission['role'] . '(' . $argsString . '))';
}
return '[' . implode(', ', $permissions) . ']';
}

/**
* Converts JSON Object To Swift Native Dictionary
*
Expand Down
20 changes: 19 additions & 1 deletion src/SDK/Language/Web.php
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ public function getParamExample(array $param): string
}

return match ($type) {
self::TYPE_ARRAY, self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_ARRAY => $this->isPermissionString($example) ? $this->getPermissionExample($example) : $example,
self::TYPE_INTEGER, self::TYPE_NUMBER => $example,
self::TYPE_FILE => 'document.getElementById(\'uploader\').files[0]',
self::TYPE_BOOLEAN => ($example) ? 'true' : 'false',
self::TYPE_OBJECT => ($example === '{}')
Expand All @@ -162,6 +163,23 @@ public function getParamExample(array $param): string
};
}

public function getPermissionExample(string $example): string
{
$permissions = [];
foreach ($this->extractPermissionParts($example) as $permission) {
$args = [];
if ($permission['id'] !== null) {
$args[] = "'" . $permission['id'] . "'";
}
if ($permission['innerRole'] !== null) {
$args[] = "'" . $permission['innerRole'] . "'";
}
$argsString = implode(', ', $args);
$permissions[] = 'Permission.' . $permission['action'] . '(Role.' . $permission['role'] . '(' . $argsString . '))';
}
return '[' . implode(', ', $permissions) . ']';
}

public function getReadOnlyProperties(array $parameter, string $responseModel, array $spec = []): array
{
$properties = [];
Expand Down
Loading
Loading