diff --git a/.github/workflows/test-repositories.yml b/.github/workflows/test-repositories.yml new file mode 100644 index 0000000..7a52599 --- /dev/null +++ b/.github/workflows/test-repositories.yml @@ -0,0 +1,91 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Generate OpenAPI in Repositories + +on: + pull_request: + push: + branches: + - main + - master + - stable* + +permissions: + contents: read + +concurrency: + group: openapi-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + openapi-repositories: + runs-on: ubuntu-latest + strategy: + matrix: + php-versions: [ "8.1" ] + repositories: [ "nextcloud/server", "nextcloud/spreed" ] + + name: openapi-repositories + + steps: + - name: Checkout + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@4bd44f22a98a19e0950cbad5f31095157cc9621b # v2 + with: + php-version: ${{ matrix.php-versions }} + coverage: none + ini-file: development + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Checkout repository for testing + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + with: + repository: ${{ matrix.repositories }} + path: temp-repository + + - name: Install dependencies + run: composer i + + - name: Generate OpenAPI + if: matrix.repositories != 'nextcloud/server' + working-directory: temp-repository/ + run: ../generate-spec + + - name: Generate OpenAPI - Core + if: matrix.repositories == 'nextcloud/server' + working-directory: temp-repository/ + run: ../generate-spec 'core' 'core/openapi.json' + + - name: Generate OpenAPI - Server apps + if: matrix.repositories == 'nextcloud/server' + working-directory: temp-repository/ + run: | + for path in apps/*/openapi.json; do + ../generate-spec "$(dirname "$path")" "$path" || exit 1 + done + + - name: Show changes of the API for assistance + working-directory: temp-repository/ + run: | + git status + git --no-pager diff + + summary: + permissions: + contents: none + runs-on: ubuntu-latest + needs: openapi-repositories + + if: always() + + name: openapi-repositories-summary + + steps: + - name: Summary status + run: if ${{ needs.openapi-repositories.result != 'success' && needs.openapi-repositories.result != 'skipped' }}; then exit 1; fi diff --git a/src/OpenApiType.php b/src/OpenApiType.php index fafe236..39fcbf9 100644 --- a/src/OpenApiType.php +++ b/src/OpenApiType.php @@ -68,13 +68,25 @@ public function toArray(string $openapiVersion, bool $isParameter = false): arra ] : [], ); } + + $type = $this->type; + $defaultValue = $this->defaultValue; + $enum = $this->enum; + if ($isParameter && $type == "boolean") { + $type = "integer"; + $enum = [0, 1]; + if ($this->hasDefaultValue) { + $defaultValue = $defaultValue === true ? 1 : 0; + } + } + $values = array_merge( $this->ref != null ? ["\$ref" => $this->ref] : [], - $this->type != null ? ["type" => $isParameter && $this->type == "boolean" ? "integer" : $this->type] : [], + $type != null ? ["type" => $type] : [], $this->format != null ? ["format" => $this->format] : [], $this->nullable ? ["nullable" => true] : [], - $this->hasDefaultValue && $this->defaultValue !== null ? ["default" => $isParameter && $this->type == "boolean" ? $this->defaultValue === true ? 1 : 0 : $this->defaultValue] : [], - $this->enum != null ? ["enum" => $this->enum] : [], + $this->hasDefaultValue && $defaultValue !== null ? ["default" => $defaultValue] : [], + $enum != null ? ["enum" => $enum] : [], $this->description != null && $this->description != "" && !$isParameter ? ["description" => $this->description] : [], $this->items != null ? ["items" => $this->items->toArray($openapiVersion)] : [], $this->minLength !== null ? ["minLength" => $this->minLength] : [], @@ -185,7 +197,7 @@ public static function resolve(string $context, array $definitions, ParamTagValu $values = []; /** @var ConstTypeNode $type */ foreach ($node->types as $type) { - $values[] = (int) $type->constExpr->value; + $values[] = (int)$type->constExpr->value; } if (count(array_filter($values, fn (string $value) => $value == '')) > 0) { @@ -250,7 +262,7 @@ enum: [$node->constExpr->value], return new OpenApiType( type: "integer", format: "int64", - enum: [(int) $node->constExpr->value], + enum: [(int)$node->constExpr->value], ); }