Skip to content

Commit

Permalink
Also export schemas that are only referenced by other schemas
Browse files Browse the repository at this point in the history
Signed-off-by: Joas Schilling <[email protected]>
  • Loading branch information
nickvergessen committed Dec 7, 2023
1 parent d9e3844 commit bf187cd
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 12 deletions.
14 changes: 13 additions & 1 deletion generate-spec
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,7 @@ foreach ($scopePaths as $scope => $paths) {
}

$scopedSchemas = [];
foreach ($usedSchemas as $usedSchema) {
while ($usedSchema = array_shift($usedSchemas)) {
if (!str_starts_with($usedSchema, '#/components/schemas/')) {
continue;
}
Expand All @@ -756,6 +756,18 @@ foreach ($scopePaths as $scope => $paths) {
Logger::error("app", "Schema $schemaName used by scope $scope is not defined");
}

// Queue potential sub-refs for exporting as well
if (isset($schemas[$schemaName]['allOf'])) {
foreach ($schemas[$schemaName]['allOf'] as $subType) {
$newRefs = Helpers::collectUsedRefs($subType);
foreach ($newRefs as $newRef) {
if (!isset($scopedSchemas[substr($newRef, strlen('#/components/schemas/'))])) {
$usedSchemas[] = $newRef;
}
}
}
}

$scopedSchemas[$schemaName] = $schemas[$schemaName];
}

Expand Down
121 changes: 121 additions & 0 deletions tests/lib/Controller/ApiController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2021, Julien Barnoin <[email protected]>
*
* @author Julien Barnoin <[email protected]>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Notifications\Controller;

use OCA\Notifications\ResponseDefinitions;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;

/**
* @psalm-import-type NotificationsPushDevice from ResponseDefinitions
*/
#[OpenAPI(scope: OpenAPI::SCOPE_FEDERATION)]
class ApiController extends OCSController {

/**
* @NoAdminRequired
*
* Route is ignored because of scope on the controller
*
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
*
* 200: OK
*/
public function federationByController(): DataResponse {
return new DataResponse();
}

/**
* @NoAdminRequired
*
* Route is ignored because of scope on the method
*
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
*
* 200: OK
*/
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
public function ignoreByMethod(): DataResponse {
return new DataResponse();
}

/**
* @NoAdminRequired
*
* Route is only in the default scope
*
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
*
* 200: Personal settings updated
*/
#[OpenAPI]
public function defaultScope(): DataResponse {
return new DataResponse();
}

/**
* @NoAdminRequired
*
* Route is only in the admin scope due to defined scope
*
* @return DataResponse<Http::STATUS_OK, NotificationsPushDevice, array{}>
*
* 200: Admin settings updated
*/
#[OpenAPI(scope: OpenAPI::SCOPE_ADMINISTRATION)]
public function adminScope(): DataResponse {
return new DataResponse($this->createNotificationsPushDevice());
}

/**
* @return NotificationsPushDevice
*/
protected function createNotificationsPushDevice(): array {
return [
'publicKey' => 'publicKey',
'deviceIdentifier' => 'deviceIdentifier',
'signature' => 'signature',
];
}

/**
* @NoAdminRequired
*
* Route is in admin and default scope
*
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
*
* 200: Admin settings updated
*/
#[OpenAPI]
#[OpenAPI(scope: OpenAPI::SCOPE_ADMINISTRATION)]
public function doubleScope(): DataResponse {
return new DataResponse();
}
}
7 changes: 5 additions & 2 deletions tests/lib/ResponseDefinitions.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,12 @@
* shouldNotify?: bool,
* }
*
* @psalm-type NotificationsPushDevice = array{
* publicKey: string,
* @psalm-type NotificationsPushDeviceBase = array{
* deviceIdentifier: string,
* }
*
* @psalm-type NotificationsPushDevice = NotificationsPushDeviceBase&array{
* publicKey: string,
* signature: string,
* }
*/
Expand Down
32 changes: 23 additions & 9 deletions tests/openapi-administration.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,21 +45,35 @@
}
},
"PushDevice": {
"allOf": [
{
"$ref": "#/components/schemas/PushDeviceBase"
},
{
"type": "object",
"required": [
"publicKey",
"signature"
],
"properties": {
"publicKey": {
"type": "string"
},
"signature": {
"type": "string"
}
}
}
]
},
"PushDeviceBase": {
"type": "object",
"required": [
"publicKey",
"deviceIdentifier",
"signature"
"deviceIdentifier"
],
"properties": {
"publicKey": {
"type": "string"
},
"deviceIdentifier": {
"type": "string"
},
"signature": {
"type": "string"
}
}
}
Expand Down

0 comments on commit bf187cd

Please sign in to comment.