name: Docker Build and Push

on:
  workflow_dispatch:
  push:
    # branches: [ "main" ]
    paths:
      - "apps/api/**"
      - "apps/worker/**"
      - "apps/public/**"
      - "packages/**"
      - "!packages/sdks/**"
      - "**Dockerfile"
      - ".github/workflows/**"

env:
  repo_owner: "openpanel-dev"

jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      api: ${{ steps.filter.outputs.api }}
      worker: ${{ steps.filter.outputs.worker }}
      public: ${{ steps.filter.outputs.public }}
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@v2
        id: filter
        with:
          base: "main"
          filters: |
            api:
              - 'apps/api/**'
              - 'packages/**'
              - '.github/workflows/**'
            worker:
              - 'apps/worker/**'
              - 'packages/**'
              - '.github/workflows/**'
            public:
              - 'apps/public/**'
              - 'packages/**'
              - '.github/workflows/**'

  lint-and-test:
    needs: changes
    if: ${{ needs.changes.outputs.api == 'true' || needs.changes.outputs.worker == 'true' || needs.changes.outputs.public == 'true' }}
    runs-on: ubuntu-latest
    services:
      redis:
        image: redis:7-alpine
        ports:
          - 6379:6379
        options: >-
          --health-cmd "redis-cli ping || exit 1"
          --health-interval 5s
          --health-timeout 3s
          --health-retries 20
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: Install pnpm
        uses: pnpm/action-setup@v4

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - name: Setup pnpm cache
        uses: actions/cache@v3
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - name: Install dependencies
        run: pnpm install

      - name: Codegen
        run: pnpm codegen

      # - name: Run Biome
      #   run: pnpm lint

      - name: Run TypeScript checks
        run: pnpm typecheck

      - name: Run tests
        run: pnpm test

  build-and-push-api:
    permissions:
      packages: write
    needs: [changes, lint-and-test]
    if: ${{ needs.changes.outputs.api == 'true' }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: apps/api/Dockerfile
          push: true
          cache-from: type=gha
          cache-to: type=gha,mode=max
          tags: |
            ghcr.io/${{ env.repo_owner }}/api:latest
            ghcr.io/${{ env.repo_owner }}/api:${{ github.sha }}
          build-args: |
            DATABASE_URL=postgresql://dummy:dummy@localhost:5432/dummy

  build-and-push-worker:
    permissions:
      packages: write
    needs: [changes, lint-and-test]
    if: ${{ needs.changes.outputs.worker == 'true' }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: apps/worker/Dockerfile
          push: true
          cache-from: type=gha
          cache-to: type=gha,mode=max
          tags: |
            ghcr.io/${{ env.repo_owner }}/worker:latest
            ghcr.io/${{ env.repo_owner }}/worker:${{ github.sha }}
          build-args: |
            DATABASE_URL=postgresql://dummy:dummy@localhost:5432/dummy
