name: CI Server
on:
  push:
    branches:
      - main

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

jobs:
  server-setup:
    timeout-minutes: 30
    runs-on: ubuntu-latest
    env:
      NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
    services:
      postgres:
        image: twentycrm/twenty-postgres
        env:
          POSTGRES_PASSWORD: postgres
          POSTGRES_USER: postgres
        ports:
          - 5432:5432
      redis:
        image: redis
        ports:
          - 6379:6379
    steps:
      - name: Fetch custom Github Actions and base branch history
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Check for changed files
        id: changed-files
        uses: tj-actions/changed-files@v11
        with:
          files: |
            package.json
            packages/twenty-server/**
            packages/twenty-emails/**

      - name: Install dependencies
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/yarn-install
      - name: Server / Restore Task Cache
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/task-cache
        with:
          tag: scope:backend
      - name: Server / Run lint & typecheck
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/nx-affected
        with:
          tag: scope:backend
          tasks: lint,typecheck
      - name: Server / Build
        if: steps.changed-files.outputs.any_changed == 'true'
        run: npx nx build twenty-server
      - name: Server / Write .env
        if: steps.changed-files.outputs.any_changed == 'true'
        run: npx nx reset:env twenty-server
      - name: Worker / Run
        if: steps.changed-files.outputs.any_changed == 'true'
        run: npx nx run twenty-server:worker:ci

  server-test:
    timeout-minutes: 30
    runs-on: ubuntu-latest
    needs: server-setup
    env:
      NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
    steps:
      - name: Fetch custom Github Actions and base branch history
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Check for changed files
        id: changed-files
        uses: tj-actions/changed-files@v11
        with:
          files: |
            package.json
            packages/twenty-server/**
            packages/twenty-emails/**

      - name: Install dependencies
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/yarn-install
      - name: Server / Restore Task Cache
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/task-cache
        with:
          tag: scope:backend
      - name:  Server / Run Tests
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/nx-affected
        with:
          tag: scope:backend
          tasks: test

  server-integration-test:
    timeout-minutes: 30
    runs-on: ubuntu-latest
    needs: server-setup
    services:
      postgres:
        image: twentycrm/twenty-postgres
        env:
          POSTGRES_PASSWORD: postgres
          POSTGRES_USER: postgres
        ports:
          - 5432:5432
      redis:
        image: redis
        ports:
          - 6379:6379
    env:
      NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
    steps:
      - name: Fetch custom Github Actions and base branch history
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Check for changed files
        id: changed-files
        uses: tj-actions/changed-files@v11
        with:
          files: |
            package.json
            packages/twenty-server/**
            packages/twenty-emails/**

      - name: Install dependencies
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/yarn-install
      - name: Server / Restore Task Cache
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/task-cache
        with:
          tag: scope:backend
      - name: Server / Run Integration Tests
        if: steps.changed-files.outputs.any_changed == 'true'
        uses: ./.github/workflows/actions/nx-affected
        with:
          tag: scope:backend
          tasks: "test:integration:with-db-reset"
      - name: Server / Upload reset-logs file
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: reset-logs
          path: reset-logs.log