name: dockerize-server

on:
  workflow_dispatch:
  pull_request_target:
    branches: [main]
    types: [opened, synchronize, reopened]
    paths:
      - "server/**"
      - ".github/workflows/dockerize-server.yml"
      - "!**/*.md"
      - "!server/package-lock.json"
  push:
    branches: [main]
    paths:
      - "server/**"
      - ".github/workflows/dockerize-server.yml"
      - "!**/*.md"
      - "!server/package-lock.json"

# permissions:
#   pull-requests: write
#   packages: write
#   contents: read

concurrency:
  group: dockerize-server-${{ github.ref }}
  cancel-in-progress: true

jobs:
  dockerize-server:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.ref }}
          repository: ${{ github.event.pull_request.head.repo.full_name }}

      - name: Cache node modules
        id: cache-node-modules
        uses: actions/cache@v3
        with:
          path: server/node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('server/package-lock.json') }}

      - name: Use Node
        uses: actions/setup-node@v3
        with:
          node-version: 18.x

      - name: Install Package
        working-directory: server
        if: steps.cache-node-modules.outputs.cache-hit != 'true'
        run: npm ci && npm rebuild --arch=arm64 sharp

      - name: Build server
        working-directory: server
        run: npm run build

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: |
            ghcr.io/${{ github.repository_owner }}/laf-server
            docker.io/${{ secrets.DOCKER_USERNAME }}/laf-server
          # https://github.com/docker/metadata-action#typesemver
          tags: |
            type=ref,event=pr
            type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') && github.event_name != 'pull_request_target' }}
            type=sha,format=short,enable=${{ github.ref == format('refs/heads/{0}', 'main') && github.event_name != 'pull_request_target' }}
            type=raw,value={{branch}}-{{sha}},enable=${{ github.ref != format('refs/heads/{0}', 'main') && !startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request_target' }}

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

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

      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Login to Github Container Hub
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push
        id: docker-build
        uses: docker/build-push-action@v3
        with:
          context: ./server
          file: ./server/Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          platforms: linux/amd64, linux/arm64

      - name: Comment docker image tags to PR
        if: github.event_name == 'pull_request_target'
        uses: mshick/add-pr-comment@v2
        with:
          message-id: "dockerize-server"
          message: |
            **:boom: laf server image built successfully for pr ${{ github.event.pull_request.number }}**
            ```
            ${{ steps.meta.outputs.tags }}
            ```
            digest: `${{ steps.docker-build.outputs.digest }}`

  trigger-workflow-build-cluster-image:
    needs: [dockerize-server]
    if: github.ref == format('refs/heads/{0}', 'main') && github.event_name != 'pull_request_target'
    runs-on: ubuntu-latest
    steps:
      - name: trigger cluster image workflow
        uses: peter-evans/repository-dispatch@v2
        with:
          event-type: docker_build_success
          client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "version": "latest"}'
