name: Test Postgres and MySQL schemas

on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:
  pull_request:
    paths:
      - packages/cli/src/databases/**

concurrency:
  group: db-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  build:
    name: Install & Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4.1.1
      - run: corepack enable
      - uses: actions/setup-node@v4.0.1
        with:
          node-version: 18.x
          cache: 'pnpm'
      - run: pnpm install --frozen-lockfile

      - name: Build Backend
        run: pnpm build:backend

      - name: Cache build artifacts
        uses: actions/cache/save@v4.0.0
        with:
          path: ./packages/**/dist
          key: ${{ github.sha }}:db-tests

  sqlite-pooled:
    name: SQLite Pooled
    runs-on: ubuntu-latest
    needs: build
    timeout-minutes: 20
    env:
      DB_TYPE: sqlite
      DB_SQLITE_POOL_SIZE: 4
    steps:
      - uses: actions/checkout@v4.1.1
      - run: corepack enable
      - uses: actions/setup-node@v4.0.1
        with:
          node-version: 18.x
          cache: 'pnpm'
      - run: pnpm install --frozen-lockfile

      - name: Restore cached build artifacts
        uses: actions/cache/restore@v4.0.0
        with:
          path: ./packages/**/dist
          key: ${{ github.sha }}:db-tests

      - name: Test SQLite Pooled
        working-directory: packages/cli
        run: pnpm jest --coverage

  mysql:
    name: MySQL
    runs-on: ubuntu-latest
    needs: build
    timeout-minutes: 20
    env:
      DB_MYSQLDB_PASSWORD: password
    steps:
      - uses: actions/checkout@v4.1.1
      - run: corepack enable
      - uses: actions/setup-node@v4.0.1
        with:
          node-version: 18.x
          cache: 'pnpm'
      - run: pnpm install --frozen-lockfile

      - name: Restore cached build artifacts
        uses: actions/cache/restore@v4.0.0
        with:
          path: ./packages/**/dist
          key: ${{ github.sha }}:db-tests

      - name: Start MySQL
        uses: isbang/compose-action@v1.5.1
        with:
          compose-file: ./.github/docker-compose.yml
          services: |
            mysql

      - name: Test MySQL
        working-directory: packages/cli
        run: pnpm test:mysql

  postgres:
    name: Postgres
    runs-on: ubuntu-latest
    needs: build
    timeout-minutes: 20
    env:
      DB_POSTGRESDB_PASSWORD: password
    steps:
      - uses: actions/checkout@v4.1.1
      - run: corepack enable
      - uses: actions/setup-node@v4.0.1
        with:
          node-version: 18.x
          cache: 'pnpm'
      - run: pnpm install --frozen-lockfile

      - name: Restore cached build artifacts
        uses: actions/cache/restore@v4.0.0
        with:
          path: ./packages/**/dist
          key: ${{ github.sha }}:db-tests

      - name: Start Postgres
        uses: isbang/compose-action@v1.5.1
        with:
          compose-file: ./.github/docker-compose.yml
          services: |
            postgres

      - name: Test Postgres
        working-directory: packages/cli
        run: pnpm test:postgres

  notify-on-failure:
    name: Notify Slack on failure
    runs-on: ubuntu-latest
    needs: [mysql, postgres]
    steps:
      - name: Notify Slack on failure
        uses: act10ns/slack@v2.0.0
        if: failure() && github.ref == 'refs/heads/master'
        with:
          status: ${{ job.status }}
          channel: '#alerts-build'
          webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
          message: Postgres or MySQL tests failed (${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
