# Book Objects Database

## Usage
### Install
- Configure [SSH Config](http://nerderati.com/2011/03/17/simplify-your-life-with-an-ssh-config-file/) to access GitHub.
- Pick your version, from [releases](https://github.com/HeduApp/book-objects/releases).
```
npm install git+ssh://ssh-config-name:HeduApp/book-objects-db.git#v0.1.0
```

### DB Codec prerequisites
```
npm install objection knex mysql
```
```typescript
import { DBCodec } from '@heduapp/book-objects-db';
const dbCodec = new DBCodec({
    client: 'mysql',
    connection: {
        host: '127.0.0.1',
        user: 'bo',
        password: 'bo',
        database: 'bo-dev',
    },
    seeds: {
        directory: './seeds/production',
    }
});
```

### Decode business object from DB
```typescript
import * as BO from '@heduapp/book-objects/business-object'
import { DBCodec } form '@heduapp/book-objects-db'
const dbCodec = new DBCodec();
const book = (await dbCodec.decode(bookUUID)) as BO.Book;
```

### Encode business object into DB
```typescript
import { DBCodec, Model } form '@heduapp/book-objects-db'
const dbCodec = new DBCodec();
// Encoder can return either inserted ContentGroup or ContentLeaf
const insertedBook = (await dbCodec.encode(book)) as Model.ContentGroup;
await insertedBook.$loadRelated('[children.[contentLeafs.[locale], locale], locale]');
```

### Migrations
- Apply the latest migration
```
npx cross-env NODE_ENV=development knex --knexfile src/knexfile.ts --cwd ./ migrate:latest
```
- Rollback all migrations
```
npx knex --knexfile src/knexfile.ts --cwd ./ migrate:rollback
```
- Create new migration
- Migration file is created in `migrations/` directory
```
npx knex --knexfile src/knexfile.ts --cwd ./ migrate:make migration_name
```

### Seed
- Insert necessary data into the database (locales, etc...)
```
npx knex --knexfile src/knexfile.ts --cwd ./ seed:run
```
- Create new seed
```
npx knex --knexfile src/knexfile.ts --cwd ./ seed:make xxx-seed_name
```

### Copying remote databases to local
- Create a [`pgpass` config file](https://www.postgresql.org/docs/current/libpq-pgpass.html)
    - On unix based systems: `~/.pgpass`
    - On Windows `%APPDATA%\postgresql\pgpass.conf`
    - Add database [logins and passwords](https://github.com/HeduApp/doc/blob/master/rosti.md#content-api-database), one per line
        ```
        hostname:port:database:username:password
        ```
    - The config should look something like the following:
        ```
        localhost:5433:h_edu_sro1252:h_edu_sro1252:password
        localhost:5432:bo-dev:bo:bo
        ```
- Create an SSH tunnel to [_H-Edu content service_](https://github.com/HeduApp/doc/blob/master/rosti.md#content-api) (Back Office will work as well) server
    ```bash
    ssh -L 5433:store4.rosti.cz:5432 -p 14364 user@node-14.rosti.cz
    ```
- Run `scripts/copy-db.sh`
    ```bash
    ./scripts/copy-db.sh [remote-db-name] [local-db-name]
    ```
    - With no arguments, the script will clone `h_edu_sro1252@localhost:5433` to `bo-dev@localhost:5432`
    - It will **drop** the target database
    - It will create a `.backup` file in the current working directory, and name it like `remote-db-name_2019-01-10-16-48-19.backup`

## Contributing

### Running dev DB
Start the containers:
```
docker-compose -f docker/db-dev.yml up -d
```
Stop the containers:
```
docker-compose -f docker/db-dev.yml down
```
- Exposed ports:
  - `8080` Adminer for managing the DB
  - `3306` MySQL
- Database: `bo-dev`
- Credentials:
  - _User_: `bo`
  - _Password_: `bo`
- Root credentials:
  - _User_: `root`
  - _Password_: `root`

### Tests
[Alsatian](https://github.com/alsatian-test/alsatian) is used as a testing framework and test runner.
To run tests:

```
npm run test
npm run test-watch
```

### Code style
Code style is enforced by [prettier](https://prettier.io/)
To prettify code:
```
npm run prettier
npm run prettier-watch
```

### Before pushing to master
 - [ ] Are all tests passing?
 - [ ] Have you ran prettier?

### Release new version
```
git checkout dist
git merge master # Resolve conflicts, accepting changes from master
npm run build
git add --all
git commit -m "Add vX.X.X build"
npm version major|minor|patch # Should be same as the version in the commit message
git push origin dist
```
- Create a [new release](https://github.com/HeduApp/book-objects-db/releases/new) from the generated tag
