# This is a basic workflow to help you get started with Actions

name: CI

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

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [main]
    tags:
      - v*
  pull_request:
    branches: [main]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

env:
  CacheFolders: |
    common
    deploy
    dev
    models
    packages
    plugins
    pods
    products
    server
    server-plugins
    templates
    tests
    qms-tests
    rush.json
    .prettierrc
    tools
    
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0        
          filter: tree:0
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
      - name: Cache node modules
        uses: actions/cache@v4
        env:
          cache-name: cache-node-platform
        with:
          path: |
            common/temp
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}

      - name: Checking for mis-matching dependencies...
        run: node common/scripts/install-run-rush.js check

      - name: Installing...
        run: node common/scripts/install-run-rush.js install

      - name: Model version from git tags
        run: node common/scripts/install-run-rush.js model-version
      
      - name: Building...
        run: node common/scripts/install-run-rush.js build -p 20

      - name: Bundle...
        run: node common/scripts/install-run-rush.js bundle -p 20

      - name: Validate...
        run: node common/scripts/install-run-rush.js validate -p 20

      - name: Cache build results
        uses: actions/cache@v4
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
  svelte-check:
    needs: build
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          filter: tree:0

      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'

      - name: Cache build results
        uses: actions/cache@v4
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
      - name: Checking svelte sources...
        run: node common/scripts/install-run-rush.js svelte-check
  formatting:
    needs: build
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
      - name: Cache build results
        uses: actions/cache@v4
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}

      - name: Apply templates...
        run: node common/scripts/install-run-rush.js apply-templates

      - name: Check templates
        run: |
          echo '================================================================'
          echo 'Checking for diff files'
          echo '================================================================'
          git diff '*.js' '*.ts' '*.svelte' '*.json' | cat
          [ -z "$(git diff --name-only '*.js' '*.ts' '*.svelte' '*.json' | cat)" ]
          echo '================================================================'
      - name: Formatting...
        run: node common/scripts/install-run-rush.js fast-format
      - name: Check files formatting
        run: |
          echo '================================================================'
          echo 'Checking for diff files'
          echo '================================================================'
          git diff '*.js' '*.ts' '*.svelte' '*.json' | cat
          [ -z "$(git diff --name-only '*.js' '*.ts' '*.svelte' '*.json' | cat)" ]
          echo '================================================================'
  test:
    needs: build
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          filter: tree:0
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
      - name: Cache build results
        uses: actions/cache@v4
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}

      - name: Prepare server
        run: |
          cd ./tests
          ./prepare-tests.sh
      - name: Testing...
        run: node common/scripts/install-run-rush.js test
        env:
          ELASTIC_URL: 'http://localhost:9201'
          MONGO_URL: 'mongodb://localhost:27018'
  uitest:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          filter: tree:0
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
      - name: Cache node modules
        uses: actions/cache@v4
        env:
          cache-name: cache-node-platform
        with:
          path: |
            common/temp
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
  
      - name: Checking for mis-matching dependencies...
        run: node common/scripts/install-run-rush.js check
    
      - name: Installing...
        run: node common/scripts/install-run-rush.js install
  
      - name: Docker Build
        run: node common/scripts/install-run-rush.js docker:build  -p 20
        env:
          DOCKER_CLI_HINTS: false
      - name: Prepare server
        run: |
          cd ./tests
          export DO_CLEAN=true
          ./prepare.sh
      - name: Install Playwright
        run: |
          cd ./tests/sanity
          node ../../common/scripts/install-run-rushx.js ci
      - name: Run UI tests
        run: |
          cd ./tests/sanity
          node ../../common/scripts/install-run-rushx.js uitest
      - name: "Store docker logs"
        if: always()
        run: |
          cd ./tests/sanity
          mkdir logs
          docker logs $(docker ps | grep transactor | cut -f 1 -d ' ') > logs/transactor.log
          docker logs $(docker ps | grep account | cut -f 1 -d ' ') > logs/account.log
          docker logs $(docker ps | grep front | cut -f 1 -d ' ') > logs/front.log
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-results
          path: ./tests/sanity/playwright-report/
      # - name: Get Allure history
      #   uses: actions/checkout@v4
      #   if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
      #   continue-on-error: true
      #   with:
      #     ref: gh-pages
      #     path: gh-pages
      # - name: Generates Allure Report
      #   uses: simple-elf/allure-report-action@master
      #   if: always()
      #   id: allure-report
      #   with:
      #     allure_results: ./tests/sanity/allure-results/
      #     gh_pages: gh-pages
      #     allure_report: allure-report
      #     allure_history: allure-history
      # - name: Upload allure test results
      #   if: always()
      #   uses: actions/upload-artifact@v4
      #   with:
      #     name: allure-report
      #     path: ./allure-report/
      # - name: Deploy report to Github Pages
      #   if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
      #   uses: peaceiris/actions-gh-pages@v4
      #   with:
      #     PERSONAL_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      #     PUBLISH_BRANCH: gh-pages
      #     PUBLISH_DIR: allure-history
      - name: Upload Logs
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: docker-logs
          path: ./tests/sanity/logs
      # - name: Upload DB snapshot
      #   if: always()
      #   uses: actions/upload-artifact@v3
      #   with:
      #     name: db-snapshot
      #     path: ./tests/db_dump
  uitest-qms:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          filter: tree:0
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
      - name: Cache node modules
        uses: actions/cache@v4
        env:
          cache-name: cache-node-platform
        with:
          path: |
            common/temp
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
  
      - name: Checking for mis-matching dependencies...
        run: node common/scripts/install-run-rush.js check
    
      - name: Installing...
        run: node common/scripts/install-run-rush.js install
  
      - name: Docker Build
        run: node common/scripts/install-run-rush.js docker:build  -p 20
        env:
          DOCKER_CLI_HINTS: false
      - name: Prepare server
        run: |
          cd ./qms-tests
          export DO_CLEAN=true
          ./prepare.sh
      - name: Install Playwright
        run: |
          cd ./qms-tests/sanity
          node ../../common/scripts/install-run-rushx.js ci
      - name: Run UI tests
        run: |
          cd ./qms-tests/sanity
          node ../../common/scripts/install-run-rushx.js uitest
      - name: "Store docker logs"
        if: always()
        run: |
          cd ./qms-tests/sanity
          mkdir logs
          docker logs $(docker ps | grep transactor | cut -f 1 -d ' ') > logs/transactor.log
          docker logs $(docker ps | grep account | cut -f 1 -d ' ') > logs/account.log
          docker logs $(docker ps | grep front | cut -f 1 -d ' ') > logs/front.log
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-results-qms
          path: ./qms-tests/sanity/playwright-report/
      # - name: Get Allure history
      #   uses: actions/checkout@v4
      #   if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
      #   continue-on-error: true
      #   with:
      #     ref: gh-pages
      #     path: gh-pages
      # - name: Generates Allure Report
      #   uses: simple-elf/allure-report-action@master
      #   if: always()
      #   id: allure-report
      #   with:
      #     allure_results: ./qms-tests/sanity/allure-results/
      #     gh_pages: gh-pages
      #     allure_report: allure-report
      #     allure_history: allure-history
      # - name: Upload allure test results
      #   if: always()
      #   uses: actions/upload-artifact@v4
      #   with:
      #     name: allure-report-qms
      #     path: ./allure-report/
      # - name: Deploy report to Github Pages
      #   if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
      #   uses: peaceiris/actions-gh-pages@v4
      #   with:
      #     PERSONAL_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      #     PUBLISH_BRANCH: gh-pages
      #     PUBLISH_DIR: allure-history
      - name: Upload Logs
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: docker-logs-qms
          path: ./qms-tests/sanity/logs
  uitest-uweb:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          filter: tree:0
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
      - name: Cache node modules
        uses: actions/cache@v4
        env:
          cache-name: cache-node-platform
        with:
          path: |
            common/temp
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
  
      - name: Checking for mis-matching dependencies...
        run: node common/scripts/install-run-rush.js check
    
      - name: Installing...
        run: node common/scripts/install-run-rush.js install
  
      - name: Docker Build
        run: node common/scripts/install-run-rush.js docker:build  -p 20
        env:
          DOCKER_CLI_HINTS: false
      - name: Prepare server
        env: 
          SERVER_PROVIDER: uweb
        run: |
          cd ./tests
          ./prepare.sh 
      - name: Install Playwright
        run: |
          cd ./tests/sanity
          node ../../common/scripts/install-run-rushx.js ci
      - name: Run UI tests
        run: |
          cd ./tests/sanity
          node ../../common/scripts/install-run-rushx.js uitest
      - name: "Store docker logs"
        if: always()
        run: |
          cd ./tests/sanity
          mkdir logs
          docker logs $(docker ps | grep transactor | cut -f 1 -d ' ') > logs/uweb-transactor.log
          docker logs $(docker ps | grep account | cut -f 1 -d ' ') > logs/uweb-account.log
          docker logs $(docker ps | grep front | cut -f 1 -d ' ') > logs/uweb-front.log
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-results-uweb
          path: ./tests/sanity/playwright-report/
      - name: Upload Logs
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: docker-logs-uweb
          path: ./tests/sanity/logs
      # - name: Upload DB snapshot
      #   if: always()
      #   uses: actions/upload-artifact@v3
      #   with:
      #     name: db-snapshot
      #     path: ./tests/db_dump      
  docker-build:    
    needs: [build, test, svelte-check, uitest]
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          filter: tree:0
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
      - name: Cache node modules
        uses: actions/cache@v4
        env:
          cache-name: cache-node-platform
        with:
          path: |
            common/temp
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
  
      - name: Installing...
        run: node common/scripts/install-run-rush.js install

      - name: Model version from git tags
        run: node common/scripts/install-run-rush.js model-version
  
      - name: Docker build
        run: node common/scripts/install-run-rush.js docker:build -p 20
        env:
          DOCKER_CLI_HINTS: false
      - name: Login to Docker Hub
        if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
        uses: docker/login-action@v3
        with:
          username: hardcoreeng
          password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
      - name: Docker push staging
        if: ${{ github.ref == 'refs/heads/main' }}
        run: node common/scripts/install-run-rush.js docker:staging
      - name: Docker push tag
        if: ${{ startsWith(github.ref, 'refs/tags/v') }}
        run: |
          echo Pushing release of tag ${{ github.ref }}
          node common/scripts/install-run-rush.js docker:push