name: "Spec"
on:
  push:
    branches:
      - main
    tags:
      - v*
  pull_request:
  workflow_dispatch:

jobs:
  validate-openapi:
    name: "🔎 Validate OpenAPI specifications"
    runs-on: ubuntu-latest
    steps:
      - name: "📥 Source checkout"
        uses: actions/checkout@v2
      - name: "➕ Setup Node"
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - name: "⚙️ npm"
        working-directory: "./scripts"
        run: |
          npm install
      - name: "🔎 Run validator"
        working-directory: "./scripts"
        run: |
          node validator.js -s "../data/api/client-server"

  check-examples:
    name: "🔎 Check Event schema examples"
    runs-on: ubuntu-latest
    container: uhoreg/matrix-doc-build
    steps:
      - name: "📥 Source checkout"
        uses: actions/checkout@v2
      - name: "🔎 Run validator"
        run: |
          /env/bin/python scripts/check-event-schema-examples.py

  calculate-baseurl:
    name: "⚙️ Calculate baseURL for later jobs"
    runs-on: ubuntu-latest
    outputs:
      baseURL: "${{ steps.set-baseurl.outputs.baseURL }}"
    steps:
      # For PRs, set the baseURL to `/`.
      # For releases, set the baseURL to `/$tag` (eg: `/v1.2`).
      # Otherwise, set it to `/unstable`.
      - name: "⚙️ Calculate baseURL"
        id: set-baseurl
        # Double brackets on the elif to avoid auto-escaping refs/tags/* because we need
        # the asterisk matching behaviour, not the literal string.
        run: |
          if [ "${GITHUB_EVENT_NAME}" == "pull_request" ]; then
              echo ::set-output name=baseURL::/
          elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then
              echo ::set-output name=baseURL::"/${GITHUB_REF/refs\/tags\//}"
          else
              echo ::set-output name=baseURL::/unstable
          fi

  build-openapi:
    name: "🐍 Build OpenAPI definitions"
    runs-on: ubuntu-latest
    container: "python:3.9"
    needs: [calculate-baseurl]
    steps:
      - name: "📥 Source checkout"
        uses: actions/checkout@v2
      - name: "📦 Asset creation"
        run: |
          python3 -m venv env && . env/bin/activate
          pip install -r scripts/requirements.txt
          # The output path matches the final deployment path at spec.matrix.org
          scripts/dump-swagger.py \
            --base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
            -o spec/client-server-api/api.json
          tar -czf openapi.tar.gz spec
      - name: "📤 Artifact upload"
        uses: actions/upload-artifact@v2
        with:
          name: openapi-artifact
          path: openapi.tar.gz

  build-spec:
    name: "📖 Build the spec"
    runs-on: ubuntu-latest
    needs: [calculate-baseurl, build-openapi]
    steps:
      - name: "➕ Setup Node"
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - name: "➕ Setup Hugo"
        uses: peaceiris/actions-hugo@c03b5dbed22245418539b65eb9a3b1d5fdd9a0a6
        with:
          hugo-version: '0.85.0'
          extended: true
      - name: "📥 Source checkout"
        uses: actions/checkout@v2
        with:
          submodules: 'recursive'
      - name: "⚙️ npm"
        run: |
          npm i
          npm run get-proposals
      - name: "⚙️ hugo"
        run: hugo --baseURL "${{ needs.calculate-baseurl.outputs.baseURL }}" -d "spec"

      # We manually unpack the spec OpenAPI definition JSON to the website tree
      # to make it available to the world in a canonical place:
      # https://spec.matrix.org/latest/client-server-api/api.json
      # Works for /unstable/ and /v1.1/ as well.
      - name: "📥 Spec definition download"
        uses: actions/download-artifact@v2
        with:
          name: openapi-artifact
      - name: "📝 Unpack the OpenAPI definitions in the right location"
        run: |
          tar -xzf openapi.tar.gz

      - name: "📦 Tarball creation"
        run: tar -czf spec.tar.gz spec
      - name: "📤 Artifact upload"
        uses: actions/upload-artifact@v2
        with:
          name: spec-artifact
          path: spec.tar.gz

  build-historical-spec:
    name: "📖 Build the historical backup spec"
    runs-on: ubuntu-latest
    needs: [build-openapi]
    if: ${{ startsWith(github.ref, 'refs/tags/') }}
    steps:
      - name: "➕ Setup Node"
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - name: "➕ Setup Hugo"
        uses: peaceiris/actions-hugo@c03b5dbed22245418539b65eb9a3b1d5fdd9a0a6
        with:
          hugo-version: '0.85.0'
          extended: true
      - name: "📥 Source checkout"
        uses: actions/checkout@v2
        with:
          submodules: 'recursive'
      - name: "⚙️ npm"
        run: |
          npm i
          npm run get-proposals
      - name: "⚙️ hugo"
        # Create a baseURL like `/v1.2` out of the `v1.2` tag
        run: |
          echo -e '[params.version]\nstatus="historical"' > historical.toml
          hugo --config config.toml,historical.toml --baseURL "/${GITHUB_REF/refs\/tags\//}" -d "spec"

      - name: "📥 Spec definition download"
        uses: actions/download-artifact@v2
        with:
          name: openapi-artifact
      - name: "📝 Unpack the OpenAPI definitions in the right location"
        run: |
          tar -xzf openapi.tar.gz

      - name: "📦 Tarball creation"
        run: tar -czf spec-historical.tar.gz spec
      - name: "📤 Artifact upload"
        uses: actions/upload-artifact@v2
        with:
          name: spec-historical-artifact
          path: spec-historical.tar.gz
