on: [push, pull_request]
name: CI
env:
  GO_VERSION: 1.21.x
jobs:
  backend-psql:
    name: GoCryptoTrader back-end with PSQL
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_DB: gct_dev_ci
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432

    steps:
    - name: Cancel previous workflow runs
      uses: styfle/cancel-workflow-action@0.11.0
      with:
        access_token: ${{ github.token }}

    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup Go
      uses: actions/setup-go@v4
      with:
        go-version: ${{ env.GO_VERSION }}

    - name: Cache go modules  
      uses: actions/cache@v3
      with:
        path: |
          ~/go/pkg/mod
          ~/.cache/go-build
        key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
        restore-keys: ${{ runner.os }}-go-

    - name: Test
      run: go test -race -coverprofile coverage.txt -covermode atomic ./...
      env:
        PSQL_USER: postgres
        PSQL_PASS: postgres
        PSQL_HOST: localhost
        PSQL_DBNAME: gct_dev_ci
        PSQL_SKIPSQLCMD: true
        PSQL_TESTDBNAME: gct_dev_ci
        PSQL_SSLMODE: disable

    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v3

  backend-32bit:
    name: GoCryptoTrader back-end 32-bit with PSQL
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_DB: gct_dev_ci
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432

    steps:
    - name: Cancel previous workflow runs
      uses: styfle/cancel-workflow-action@0.11.0
      with:
        access_token: ${{ github.token }}

    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup Go
      uses: actions/setup-go@v4
      with:
        go-version: ${{ env.GO_VERSION }}

    - name: Cache go modules  
      uses: actions/cache@v3
      with:
        path: |
          ~/go/pkg/mod
          ~/.cache/go-build
        key: ${{ runner.os }}-go-386-${{ hashFiles('**/go.sum') }}
        restore-keys: ${{ runner.os }}-go-386-

    - name: Update apt-get
      run: sudo apt-get update

    - name: Install gcc-multilib
      run: sudo apt-get install gcc-multilib

    - name: Test
      run: go test -coverprofile coverage.txt -covermode atomic ./...
      env:
        PSQL_USER: postgres
        PSQL_PASS: postgres
        PSQL_HOST: localhost
        PSQL_DBNAME: gct_dev_ci
        PSQL_SKIPSQLCMD: true
        PSQL_TESTDBNAME: gct_dev_ci
        PSQL_SSLMODE: disable
        GOARCH: 386
        CGO_ENABLED: 1
        CGO_CFLAGS: -fno-stack-protector

    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v3

  frontend:
    name: GoCryptoTrader front-end
    runs-on: ubuntu-latest
    steps:
    - name: Cancel previous workflow runs
      uses: styfle/cancel-workflow-action@0.11.0
      with:
        access_token: ${{ github.token }}

    - uses: actions/checkout@v3

    - name: Use Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '10.8.x'

    - name: Cache Node.js modules
      uses: actions/cache@v3
      with:
        path: ~/.npm
        key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.OS }}-node-
          ${{ runner.OS }}-

    - name: Build
      run: | 
        cd web/
        npm install
        npm run lint
        npm run build
