# Development

``` bash
git clone https://github.com/gr4yj3d1/toolshed.git
```

or

``` bash
git clone https://git.neulandlabor.de/j3d1/toolshed.git
```

## Native

To a certain extent, the frontend and backend can be developed independently. The frontend is a Vue.js project and the
backend is a DRF (Django-Rest-Framework) project. If you want to develop the frontend, you can do so without the backend
and vice
versa. However, especially for the frontend, it is recommended to use the backend as well, as the frontend does not have
a lot of 'offline' functionality.
If you want to run the fullstack application, it is recommended to use the [docker-compose](#docker) method.

### Frontend

install `node.js` and `npm`

on Debian* for example: `sudo apt install npm`

``` bash
cd toolshed/frontend
npm install
npm run dev
```

### Backend

Install `python3`, `pip` and `virtualenv`

on Debian* for example: `sudo apt install python3 python3-pip python3-venv`

Prepare backend environment

``` bash
cd toolshed/backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```

Run the test suite:

``` bash
python manage.py test
```

optionally with coverage:

``` bash
coverage run manage.py test
coverage report
```

Start the backend in development mode:

``` bash
python manage.py migrate
cp .env.dist .env
echo "DEBUG = True" >> .env
python manage.py runserver 0.0.0.0:8000
```

provides the api docs at `http://localhost:8000/docs/`

### Docs (Wiki)

Install `mkdocs`

on Debian* for example: `sudo apt install mkdocs`

Start the docs server:

``` bash
cd toolshed/docs
mkdocs serve -a 0.0.0.0:8080
```

## Docker

### Fullstack

Install `docker` and `docker-compose`

on Debian* for example: `sudo apt install docker.io docker-compose`

Start the fullstack application:

``` bash
docker-compose -f deploy/docker-compose.override.yml up --build
```

Run backend tests in Docker:

``` bash
docker compose -f deploy/docker-compose.override.yml run --rm backend-a bash -lc "python configure.py && python manage.py test"
```

This will start an instance of the frontend and wiki, a limited DoH (DNS over HTTPS) server and **two** instances of the backend.
The two backend instances are set up to use the domains `a.localhost` and `b.localhost`, the local DoH
server is used to direct the frontend to the correct backend instance.
The frontend is configured to act as if it was served from the domain `a.localhost`.
Access the frontend at `http://localhost:8080/`, backend at `http://localhost:8080/api/`, api docs
at `http://localhost:8080/docs/` and the wiki at `http://localhost:8080/wiki/`.