name: CI Pipeline for the Backend and Frontend

on:
  pull_request:
    types: [opened, review_requested, synchronize]

jobs:
  backend:
    if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')"
    strategy:
      matrix:
        node: ["16.16.0", "18.14.1"]
        flavor: ["dev", "prod"]
      fail-fast: false
    runs-on: "ubuntu-latest"

    name: Backend (${{ matrix.flavor }}) - node ${{ matrix.node }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          path: ${{ matrix.node }}/${{ matrix.flavor }}

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
          registry-url: "https://registry.npmjs.org"

      - name: Install
        if: ${{ matrix.flavor == 'dev'}}
        run: npm ci
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend

      - name: Install (Prod dependencies only)
        if: ${{ matrix.flavor == 'prod'}}
        run: npm ci --omit=dev --omit=optional
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend

      - name: Lint
        if: ${{ matrix.flavor == 'dev'}}
        run: npm run lint
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend

      - name: Unit Tests
        if: ${{ matrix.flavor == 'dev'}}
        run: npm run test
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend

      - name: Build
        run: npm run build
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend

  frontend:
    if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')"
    strategy:
      matrix:
        node: ["16.16.0", "18.14.1"]
        flavor: ["dev", "prod"]
      fail-fast: false
    runs-on: "ubuntu-latest"

    name: Frontend (${{ matrix.flavor }}) - node ${{ matrix.node }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          path: ${{ matrix.node }}/${{ matrix.flavor }}

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
          registry-url: "https://registry.npmjs.org"

      - name: Install (Prod dependencies only)
        run: npm ci --omit=dev --omit=optional
        if: ${{ matrix.flavor == 'prod'}}
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend

      - name: Install
        if: ${{ matrix.flavor == 'dev'}}
        run: npm ci
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend

      - name: Lint
        if: ${{ matrix.flavor == 'dev'}}
        run: npm run lint
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend

      # - name: Test
      #   run: npm run test

      - name: Build
        run: npm run build
        working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend
