Skip to content

Commit

Permalink
docs(all-services): fix readme of all services (#245)
Browse files Browse the repository at this point in the history
  • Loading branch information
akshatdubeysf authored Jul 12, 2021
1 parent 09fa8a0 commit b8937fa
Show file tree
Hide file tree
Showing 38 changed files with 11,780 additions and 577 deletions.
14 changes: 10 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Install the Loopback4 CLI
npm install -g @loopback/cli
```

Generate an application
Generate an application (If you don't have one already).

```bash
lb4 app
Expand Down Expand Up @@ -137,7 +137,7 @@ npm i --save dotenv dotenv-extended @sourceloop/example-service
touch .env.example
```

Update `src/application.ts` to use the new service and the environment variables.
Update `src/application.ts` to use the new service component and the environment variables. You may also need to bind configurations depending on the service component you are using. You find these configurations in the individual README of the service.

```typescript
import {BootMixin} from '@loopback/boot';
Expand Down Expand Up @@ -185,7 +185,7 @@ export class ExampleApplicationApplication extends BootMixin(
path: '/explorer',
});
this.component(RestExplorerComponent);
this.component(ExampleServiceComponent)
this.component(ExampleServiceComponent); // OUR EXAMPLE SERVICE COMPONENT

this.projectRoot = __dirname;
// Customize @loopback/boot Booter Conventions here
Expand All @@ -212,12 +212,18 @@ You can now run the example service with `npm start`.

### DataSources and Migrations

The `Sourceloop` can support any Loopback 4 [DataSource](https://loopback.io/doc/en/lb4/DataSource.html). While you may see existing `DataSource`s and [Database Migrations](https://loopback.io/doc/en/lb4/Database-migrations.html#overview), it is not mandatory to use them.
The `Sourceloop` can support any Loopback 4 [DataSource](https://loopback.io/doc/en/lb4/DataSource.html). While you may see existing `DataSource`s, it is not mandatory to use them.

The migrations required for this service are processed during the installation automatically if you set the `SOURCELOOP_MIGRATION` env variable. The migrations use [`db-migrate`](https://www.npmjs.com/package/db-migrate) with [`db-migrate-pg`](https://www.npmjs.com/package/db-migrate-pg) driver for migrations, so you will have to install these packages to use auto-migration. Please note that if you are using some pre-existing migrations or database, they may be effected. In such scenario, it is advised that you copy the migration files in your project root, using the `SOURCELOOP_MIGRATION_COPY` env variables. You can customize or cherry-pick the migrations in the copied files according to your specific requirements and then apply them to the DB.

### Production Deployment

Inside of the `sandbox` folder, you will find example applications and Dockerfiles for each application. The `Sourceloop` is agnostic of the Docker deployment strategy. Deploy the services into the platform of your choice.

## Sandbox

`sandbox` folder contains example applications and docker files that can be run independently to see the services in action. You can use [Docker Compose](https://docs.docker.com/compose/) to run the sandbox applications.

### Related Projects

The `Sourceloop` utilizes many extensions created by SourceFuse.
Expand Down
175 changes: 75 additions & 100 deletions services/audit-service/README.md
Original file line number Diff line number Diff line change
@@ -1,78 +1,50 @@

# audit-service

[![LoopBack](https://github.com/strongloop/loopback-next/raw/master/docs/site/imgs/branding/Powered-by-LoopBack-Badge-(blue)[email protected])](http://loopback.io/)

A LoopBack microservice used for auditing user actions.
A LoopBack microservice used for auditing user actions. It uses [@sourceloop/audit-log](https://www.npmjs.com/package/@sourceloop/audit-log) to store the logs to a datasource. This service provides REST endpoints to perform CRUD operations for the audit logs.


## Installation

```bash

npm i @sourceloop/audit-service
```

## Implementation

Create a new Application using Loopback CLI and add the Component for `AuditService` in `application.ts`

```typescript
import {BootMixin} from '@loopback/boot';
import {ApplicationConfig} from '@loopback/core';
import {RepositoryMixin} from '@loopback/repository';
import {RestApplication} from '@loopback/rest';
import {
RestExplorerBindings,
RestExplorerComponent,
} from '@loopback/rest-explorer';
import {ServiceMixin} from '@loopback/service-proxy';
import { AuditServiceComponent } from '@sourceloop/audit-service';
import * as dotenv from 'dotenv';
import * as dotenvExt from 'dotenv-extended';
import path from 'path';

export {ApplicationConfig};

const port = 3000;
export class Client extends BootMixin(
ServiceMixin(RepositoryMixin(RestApplication)),
) {
constructor(options: ApplicationConfig = {}) {
dotenv.config();
dotenvExt.load({
schema: '.env.example',
errorOnMissing: true,
includeProcessEnv: true,
});
options.rest = options.rest || {};
options.rest.port = +(process.env.PORT || port);
options.rest.host = process.env.HOST;
super(options);
// Set up default home page
this.static('/', path.join(__dirname, '../public'));

// Customize @loopback/rest-explorer configuration here
this.configure(RestExplorerBindings.COMPONENT).to({
path: '/explorer',
});
this.component(RestExplorerComponent);
// add Component for AuditService
this.component(AuditServiceComponent);

this.projectRoot = __dirname;
// Customize @loopback/boot Booter Conventions here
this.bootOptions = {
controllers: {
// Customize ControllerBooter Conventions here
dirs: ['controllers'],
extensions: ['.controller.js'],
nested: true,
},
};
}
}
```


## Usage

- Create a new Loopback4 Application (If you don't have one already)
`lb4 testapp`
- Install the audit service
`npm i @sourceloop/audit-service`
- Set the [environment variables](#environment-variables).
- Run the [migrations](#migrations).
- Add the `AuditServiceComponent` to your Loopback4 Application (in `application.ts`).
``` typescript
// import the AuditServiceComponent
import {AuditServiceComponent} from '@sourceloop/audit-service';
// add Component for AuditServiceComponent
this.component(AuditServiceComponent);
```
- Set up a [Loopback4 Datasource](https://loopback.io/doc/en/lb4/DataSource.html) with `dataSourceName` property set to `AuditDbSourceName`. You can see an example datasource [here](#setting-up-a-datasource).
- Start the application
`npm start`


### Creating Logs

The logs in this service can either be created through the REST endpoint, or through a repository mixin provided with the [@sourceloop/audit-log](https://www.npmjs.com/package/@sourceloop/audit-log) npm module. This mixin, by default, creates logs for all the inbuilt actions done through the extended repository.
You can read more about how to use this package [here](https://github.com/sourcefuse/loopback4-audit-log#readme).


### Environment Variables

Do not forget to set Environment variables. The examples below show a common configuration for a PostgreSQL Database running locally.

```environment
NODE_ENV=dev
LOG_LEVEL=DEBUG
Expand All @@ -82,67 +54,71 @@ DB_HOST=localhost
DB_PORT=5432
DB_USER=pg_service_user
DB_PASSWORD=pg_service_user_password
DB_DATABASE=in_mail_db
DB_DATABASE=audit_db
DB_SCHEMA=public
JWT_SECRET=super_secret_string
JWT_ISSUER=https://authentication.service
```



| Name | Required | Default Value | Description |
| ------------- | -------- | ------------- | ------------------------------------------------------------ |
| `NODE_ENV` | Y | | Node environment value, i.e. `dev`, `test`, `prod` |
| `LOG_LEVEL` | Y | | Log level value, i.e. `error`, `warn`, `info`, `verbose`, `debug` |
| `HOST` | Y | | Host for the service to run under, i.e. `0.0.0.0` |
| `PORT` | Y | `3000` | Port for the service to listen on. |
| `DB_HOST` | Y | | Hostname for the database server. |
| `DB_PORT` | Y | | Port for the database server. |
| `DB_USER` | Y | | User for the database. |
| `DB_PASSWORD` | Y | | Password for the database user. |
| `DB_DATABASE` | Y | | Database to connect to on the database server. |
| Name | Required | Default Value | Description |
| ------------- | -------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `NODE_ENV` | Y | | Node environment value, i.e. `dev`, `test`, `prod` |
| `LOG_LEVEL` | Y | | Log level value, i.e. `error`, `warn`, `info`, `verbose`, `debug` |
| `HOST` | Y | | Host for the service to run under, i.e. `0.0.0.0` |
| `PORT` | Y | `3000` | Port for the service to listen on. |
| `DB_HOST` | Y | | Hostname for the database server. |
| `DB_PORT` | Y | | Port for the database server. |
| `DB_USER` | Y | | User for the database. |
| `DB_PASSWORD` | Y | | Password for the database user. |
| `DB_DATABASE` | Y | | Database to connect to on the database server. |
| `DB_SCHEMA` | Y | `public` | Database schema used for the data source. In PostgreSQL, this will be `public` unless a schema is made explicitly for the service. |
| `JWT_SECRET` | Y | | Symmetric signing key of the JWT token. |
| `JWT_ISSUER` | Y | | Issuer of the JWT token. |
| `JWT_SECRET` | Y | | Symmetric signing key of the JWT token. |
| `JWT_ISSUER` | Y | | Issuer of the JWT token. |

### Setting up a `DataSource`

### Setting up a `DataSource`

Here is a Sample Implementation `DataSource` implementation using environment variables.
```TypeScript
import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core';
import {juggler} from '@loopback/repository';

const config = {
name: 'auditDb',
connector: 'postgresql',
url: '',
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
schema: process.env.DB_SCHEMA,
``` TypeScript
import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core';
import {juggler} from '@loopback/repository';
import {AuditDbSourceName} from '@sourceloop/audit-log';

const config = {
name: AuditDbSourceName,
connector: 'postgresql',
url: '',
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
schema: process.env.DB_SCHEMA,
};


@lifeCycleObserver('datasource')
export class AuditDbDataSource extends juggler.DataSource
implements LifeCycleObserver {
static dataSourceName = 'audit';
static readonly defaultConfig = config;
export class AuditDbDataSource extends juggler.DataSource implements LifeCycleObserver {
static dataSourceName = AuditDbSourceName;
static readonly defaultConfig = config;

constructor(
// You need to set datasource configuration name as 'datasources.config.audit' otherwise you might get Errors
@inject('datasources.config.audit', {optional: true})
@inject('datasources.config.audit', {optional: true})
dsConfig: object = config,
) {
super(dsConfig);
super(dsConfig);
}
}

```


### Migrations

The migrations required for this service are processed during the installation automatically if you set the `AUDIT_MIGRATION` or `SOURCELOOP_MIGRATION` env variable. The migrations use (`db-migrate`)[https://www.npmjs.com/package/db-migrate] with (`db-migrate-pg`)[https://www.npmjs.com/package/db-migrate-pg] driver for migrations, so you will have to install these packages to use auto-migration. Please note that if you are using some pre-existing migrations or database, they may be effected. In such scenario, it is advised that you copy the migration files in your project root, using the `AUDIT_MIGRATION_COPY` or `SOURCELOOP_MIGRATION_COPY` env variables. You can customize or cherry-pick the migrations in the copied files according to your specific requirements and then apply them to the DB.
The migrations required for this service are processed during the installation automatically if you set the `AUDIT_MIGRATION` or `SOURCELOOP_MIGRATION` env variable. The migrations use [`db-migrate`](https://www.npmjs.com/package/db-migrate) with [`db-migrate-pg`](https://www.npmjs.com/package/db-migrate-pg) driver for migrations, so you will have to install these packages to use auto-migration. Please note that if you are using some pre-existing migrations or database, they may be effected. In such scenario, it is advised that you copy the migration files in your project root, using the `AUDIT_MIGRATION_COPY` or `SOURCELOOP_MIGRATION_COPY` env variables. You can customize or cherry-pick the migrations in the copied files according to your specific requirements and then apply them to the DB.


### API Documentation

Expand All @@ -166,5 +142,4 @@ Authorization: Bearer <token> where <token> is a JWT token signed using JWT issu

#### API Details

Visit the [OpenAPI spec docs](./openapi.md)

Visit the [OpenAPI spec docs](./openapi.md)
Loading

0 comments on commit b8937fa

Please sign in to comment.