name: Continuous Integration

on: [push, pull_request]

jobs:
  build:
    if: github.repository_owner == 'TandoorRecipes'
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: ['3.10']
        node-version: ['18']

    steps:
    - uses: actions/checkout@v3
    - uses: awalsh128/cache-apt-pkgs-action@v1.3.1
      with:
        packages: libsasl2-dev python3-dev libldap2-dev libssl-dev
        version: 1.0

    # Setup python & dependencies
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
        cache: 'pip'

    - name: Install Python Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Cache StaticFiles
      uses: actions/cache@v3
      id: django_cache
      with:
        path: |
          ./cookbook/static
          ./vue/webpack-stats.json
          ./staticfiles
        key: |
          ${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.node-version }}-collectstatic-${{ hashFiles('**/*.css', '**/*.js', 'vue/src/*') }}

    # Build Vue frontend & Dependencies
    - name: Set up Node ${{ matrix.node-version }}
      if: steps.django_cache.outputs.cache-hit != 'true'
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'yarn'
        cache-dependency-path: ./vue/yarn.lock

    - name: Install Vue dependencies
      if: steps.django_cache.outputs.cache-hit != 'true'
      working-directory: ./vue
      run: yarn install

    - name: Build Vue dependencies
      if: steps.django_cache.outputs.cache-hit != 'true'
      working-directory: ./vue
      run: yarn build

    - name: Compile Django StatisFiles
      if: steps.django_cache.outputs.cache-hit != 'true'
      run: |
        python3 manage.py collectstatic --noinput
        python3 manage.py collectstatic_js_reverse

    - uses: actions/cache/save@v3
      if: steps.django_cache.outputs.cache-hit != 'true'
      with:
        path: |
          ./cookbook/static
          ./vue/webpack-stats.json
          ./staticfiles
        key: |
          ${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.node-version }}-collectstatic-${{ hashFiles('**/*.css', '**/*.js', 'vue/src/*') }}

    - name: Django Testing project
      timeout-minutes: 6
      run: pytest --junitxml=junit/test-results-${{ matrix.python-version }}.xml

    - name: Publish Test Results
      uses: EnricoMi/publish-unit-test-result-action@v2
      if: always()
      with:
        comment_mode: off
        files: |
          junit/test-results-${{ matrix.python-version }}.xml
