# VBV Lernwelt

Project setup is based
on [cookiecutter-django](https://github.com/cookiecutter/cookiecutter-django) project
template.

## Run for development

```bash
# run vue vite dev server
cd client && npm run dev

# reset db and run django dev server
./prepare_server.sh
```

## Installation

See `.tool-versions` file for used django and node version

You have to set up at least the following environment variables:

```bash
export IT_APP_ENVIRONMENT=development
```

See `.env_secrets/local_daniel.env` for more possible environment variables.
Especially set correct values for `POSTGRES_*` and `DATABASE_URL`

Install git-lfs

```bash
brew install git-lfs
git lfs install
```

### Server part

Install python dependencies:

```bash
pip install -r server/requirements/requirements-dev.txt
```

The "prepare_server.sh" script will create the database according to `POSTGRES_*`
environment variables.
It will also setup the tables for django and run the django development server.

```bash
# will run `migrate` and `runserver` etc...
./prepare_server.sh

# or async server
# uvicorn config.asgi:application --host 0.0.0.0 --reload
```

### Client part

```bash
cd client

npm install

# run dev server
npm run dev
```

### General part

Cypress is installed for client and server, so there is this package.json on the project
root directory

```bash
# in project root directory
npm install
```

### Git hooks

```bash
# install pre-push git hook
# add this line to the existing script in .git/hooks/pre-push
./git-pre-push.sh
```

### Actions on Save

You can enable some useful "Actions on Save" in your JetBrains IDE:

Preferences -> Tools -> Actions on Save

* Reformat Code
* Optimize Imports
* Run eslint --fix
* Run prettier

## Translations

We use (vue-i18n)[https://kazupon.github.io/vue-i18n/] for translations
and (vue-i18n-extract)[https://github.com/Spittal/vue-i18n-extract] for helper
scripts.

```
# will create a report on command line with missing translations
npm run vue-i18n-extract

# add missing translations to files, see docs for more options
cd client
npx vue-i18n-extract --add
```

## Deployment to CapRover

### CapRover Dev (vbv-lernwelt.control.iterativ.ch)

```
# run deploy script
./caprover_deploy.sh vbv-lernwelt

# of vbv-lernwelt is default value
./caprover_deploy.sh
```

### CapRover Stage (myvbv-stage.iterativ.ch)

```
./caprover_deploy.sh myvbv-stage
```

### CapRover Prod (myvbv.iterativ.ch)

```
./caprover_deploy.sh myvbv
```

## IntelliJ Configuration

* In the .idea/vbv_lernwelt.iml file change the module type to "PYTHON_MODULE".
* Add django facet in "Project Structure".
* Run configuration with "Python -> server.py" to have async debugging support.

### Optional

#### Install the EnvFile Plugin

![](docs/envfile_plugin_settings.png)

#### Install the tailwind css Plugin from Jetbrains

## currents.dev

This project uses [currents.dev](https://currents.dev) to run the Cypress tests concurrently.  
The following steps were taken to set it up:

- Create a new project on currents.dev
- Add the generated `projectId` to the cypress configuration file
- Install `@currents/cli` as a dev dependency
- Add the following script to the `package.json` file:
  ```json
  "cypress:ci": "currents run --parallel --record --key $CURRENTS_KEY",
  ```
- Create a new Bitbucket pipelines job that exports the `CURRENTS_KEY` and runs the `cypress:ci` script
- Refactor the pipeline steps so that the dependencies are installed first and then the other steps are run in
  parallel.  
  You can then run multiple instances of the previously created job in parallel.  
  See `.bitbucket-pipelines.yml` for an example.

> 💡 The number of cypress worker jobs depends on the number of cypress tests.
> Too many workers for too few tests will result in a lot of idle workers.
