# Backend

## Backend

### Installation with Docker

Run the following command to install everything through docker.

The installation takes a bit longer on the first pass or on rebuild ...

```bash
$ docker-compose up

# rebuild the containers for a cleanup
$ docker-compose up --build
```

Wait a little until your backend is up and running at <http://localhost:4000/>.

### Installation without Docker

For the local installation you need a recent version of [node](https://nodejs.org/en/) (>= `v10.12.0`).

Install node dependencies with [yarn](https://yarnpkg.com/en/):

```bash
$ cd backend
$ yarn install
```

Copy Environment Variables:

```bash
# in backend/
$ cp .env.template .env
```

Configure the new file according to your needs and your local setup. Make sure a [local Neo4J](http://localhost:7474) instance is up and running.

Start the backend for development with:

```bash
$ yarn run dev
```

or start the backend in production environment with:

```bash
yarn run start
```

For e-mail delivery, please configure at least `SMTP_HOST` and `SMTP_PORT` in your `.env` configuration file.

Your backend is up and running at <http://localhost:4000/> This will start the GraphQL service (by default on localhost:4000) where you can issue GraphQL requests or access GraphQL Playground in the browser.

![GraphQL Playground](https://4234572995-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LcGvGRsW6DrZn7FWRzF%2F-LcGv6EiVcsjYLfQ_2YE%2F-LcGvAjUKAlPBJswMQtx%2Fgraphql-playground.png?generation=1555078889764383\&alt=media)

#### Database Indices and Constraints

Database indices and constraints need to be created when the database and the backend is running:

{% tabs %}
{% tab title="Docker" %}

```bash
docker-compose exec backend yarn run db:migrate init
```

{% endtab %}

{% tab title="Without Docker" %}

```bash
# in folder backend/
# make sure your database is running on http://localhost:7474/browser/
yarn run db:migrate init
```

{% endtab %}
{% endtabs %}

**Seed Database**

If you want your backend to return anything else than an empty response, you need to seed your database:

{% tabs %}
{% tab title="Docker" %}
In another terminal run:

```bash
$ docker-compose exec backend yarn run db:seed
```

To reset the database run:

```bash
$ docker-compose exec backend yarn run db:reset
# you could also wipe out your neo4j database and delete all volumes with:
$ docker-compose down -v
# if container is not running, run this command to set up your database indeces and contstraints
$ docker-compose run backend yarn run db:migrate init
```

{% endtab %}

{% tab title="Without Docker" %}
Run:

```bash
$ yarn run db:seed
```

To reset the database run:

```bash
$ yarn run db:reset
```

{% endtab %}
{% endtabs %}

#### Data migrations

Although Neo4J is schema-less,you might find yourself in a situation in which you have to migrate your data e.g. because your data modeling has changed.

{% tabs %}
{% tab title="Docker" %}
Generate a data migration file:

```bash
$ docker-compose exec backend yarn run db:migrate:create your_data_migration
# Edit the file in ./src/db/migrations/
```

To run the migration:

```bash
$ docker-compose exec backend yarn run db:migrate up
```

{% endtab %}

{% tab title="Without Docker" %}
Generate a data migration file:

```bash
$ yarn run db:migrate:create your_data_migration
# Edit the file in ./src/db/migrations/
```

To run the migration:

```bash
$ yarn run db:migrate up
```

{% endtab %}
{% endtabs %}

## Testing

**Beware**: We have no multiple database setup at the moment. We clean the database after each test, running the tests will wipe out all your data!

{% tabs %}
{% tab title="Docker" %}
Run the ***jest*** tests:

```bash
$ docker-compose exec backend yarn run test:jest
```

Run the ***cucumber*** features:

```bash
$ docker-compose exec backend yarn run test:cucumber
```

{% endtab %}

{% tab title="Without Docker" %}
Run the ***jest*** tests:

```bash
$ yarn run test:jest
```

Run the ***cucumber*** features:

```bash
$ yarn run test:cucumber
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.human-connection.org/human-connection/backend.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
