name: Docker Build and Push

on:
  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
    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