name: Node-CI


on:
  push:
    branches: [main]
    paths-ignore:
      - '**.md'
      - 'docs/**'
  pull_request:
    branches: [main]

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

permissions:
  contents: read

jobs:
  lint:
    runs-on: ubuntu-24.04
    steps:
      - name: Gitea Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Setup Node.js
        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
        with:
          node-version: '22'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Notify Google Chat
        if: ${{ failure() }} # Use always to ensure that the notification is also send on failure of former steps
        uses: SimonScholz/google-chat-action@3b3519e5102dba8aa5046fd711c4b553586409bb # v1.1.0
        with:
          webhookUrl: '${{ secrets.GOOGLE_CHAT_WEBHOOK }}'
          jobStatus: ${{ job.status }}
          title: Lint failed

  test:
    runs-on: ubuntu-24.04
    steps:
      - name: Gitea Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Setup Node.js
        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
        with:
          node-version: '22'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test -- --passWithNoTests

      - name: Notify Google Chat
        if: ${{ failure() }} # Use always to ensure that the notification is also send on failure of former steps
        uses: SimonScholz/google-chat-action@3b3519e5102dba8aa5046fd711c4b553586409bb # v1.1.0
        with:
          webhookUrl: '${{ secrets.GOOGLE_CHAT_WEBHOOK }}'
          jobStatus: ${{ job.status }}
          title: Test failed

  build:
    runs-on: ubuntu-24.04
    steps:
      - name: Gitea Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Setup Node.js
        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
        with:
          node-version: '22'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Generate Prisma
        run: npm run prisma:generate

      - name: Run build
        run: npm run build

      - name: Create and deploy Container image
        if: ${{ success() }}
        run:  |
          VERSION_NUMBER=$(date +'%y%m%d.%H%M%S')
          docker build -t git.targo.ca/targo/targo-backend-staging:2.${VERSION_NUMBER} .
          docker tag git.targo.ca/targo/targo-backend-staging:2.${VERSION_NUMBER} git.targo.ca/targo/targo-backend-staging:latest
          docker login -u ${{ secrets.CI_USER }} -p ${{ secrets.CI_PASSWORD }} git.targo.ca
          docker push git.targo.ca/targo/targo-backend-staging:2.${VERSION_NUMBER}
          docker push git.targo.ca/targo/targo-backend-staging:latest
          curl --location 'https://n8napi.targo.ca/webhook/portainer' --header 'Authorization: Basic ${{ secrets.API_SECRET}}' --form 'stack="new_targo_app_staging"'

      - name: Notify Google Chat
        if: ${{ failure() }} # Use always to ensure that the notification is also send on failure of former steps
        uses: SimonScholz/google-chat-action@3b3519e5102dba8aa5046fd711c4b553586409bb # v1.1.0
        with:
          webhookUrl: '${{ secrets.GOOGLE_CHAT_WEBHOOK }}'
          jobStatus: ${{ job.status }}
          title: Build failed
