A LoopBack microservice used for creating survey using different entities like questions, question-templates,sections.
- Questions - A Question can be created of multiple types like Multi Selection,Single Selection,Text , Drop Down , Scale.
- Question Template - A question template consists of a group of questions which can be directly used in a survey.
- Survey - Questions can be added to survey via question-templates or individual questions itself.
- Section -Section can be created inside a survey and questions can be added to it.
- Survey cycles - If there is a need for periodic re-assessment of the survey we need to create survey cycles which can be quarterly, monhtly,annually etc as per the business requirement.
- Survey responder -Responders are users who can respond to the survey. Survey responders can be created ,updated,deleted for a survey.
Install SurveyServiceComponent using npm
;
$ [npm install | yarn add] @sourceloop/survey-service
- Install the audit service
npm i @sourceloop/survey-service
- Set the environment variables.
- Run the migrations.
- Add the
SurveyServiceComponent
to your Loopback4 Application (inapplication.ts
).// import the SurveyServiceComponent import {SurveyServiceComponent} from '@sourceloop/survey-service'; // add Component for SurveyServiceComponent this.component(SurveyServiceComponent);
- Set up a Loopback4 Datasource with
dataSourceName
property set toSurveyDbSourceName
. You can see an example datasource here. - Start the application
npm start
This service supports Sequelize as the underlying ORM using @loopback/sequelize extension. And in order to use it, you'll need to do following changes.
- Change the import statements from
@sourceloop/survey-service
to@sourceloop/survey-service/sequelize
. This can be done easily with your IDEs find and replace feature.
For example, from this:
import {SurveyServiceComponent} from '@sourceloop/survey-service';
to this:
import {SurveyServiceComponent} from '@sourceloop/survey-service/sequelize';
- Use the
SequelizeDataSource
in your audit datasource as the parent class. Refer this for more.
Do not forget to set Environment variables. The examples below show a common configuration for a MySQL Database running locally.
NODE_ENV=dev
LOG_LEVEL=DEBUG
HOST=0.0.0.0
PORT=3000
DB_HOST=localhost
DB_PORT=3306
DB_USER=pg_service_user
DB_PASSWORD=pg_service_user_password
DB_DATABASE=survey_db
DB_SCHEMA=main
JWT_SECRET=super_secret_string
JWT_ISSUER=issuer_name
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 MYSQL, this will be main 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. |
Here is a Sample Implementation DataSource
implementation using environment variables.
import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core';
import {juggler} from '@loopback/repository';
import {SurveyDbSourceName} from '@sourceloop/survey-service';
const config = {
name: SurveyDbSourceName,
connector: 'mysql',
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,
};
// Observe application's life cycle to disconnect the datasource when
// application is stopped. This allows the application to be shut down
// gracefully. The `stop()` method is inherited from `juggler.DataSource`.
// Learn more at https://loopback.io/doc/en/lb4/Life-cycle.html
@lifeCycleObserver('datasource')
export class MysqlDataSource
extends juggler.DataSource
implements LifeCycleObserver
{
static dataSourceName = SurveyDbSourceName;
static readonly defaultConfig = config;
constructor(
@inject('datasources.config.mysql', {optional: true})
dsConfig: object = config,
) {
super(dsConfig);
}
}
The migrations required for this service are processed during the installation automatically if you set the SURVEY_MIGRATION
or SOURCELOOP_MIGRATION
env variable. The migrations use [db-migrate
] with [db-migrate-mysql
] 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 databases, they may be affected. In such a scenario, it is advised that you copy the migration files in your project root, using the SURVEY_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.
Authorization: Bearer where is a JWT token signed using JWT issuer and secret.
Content-Type: application/json
in the response and in request if the API method is NOT GET
200: Successful Response. Response body varies w.r.t API 401: Unauthorized: The JWT token is missing or invalid 403: Forbidden : Not allowed to execute the concerned API 404: Entity Not Found 400: Bad Request (Error message varies w.r.t API) 201: No content: Empty Response
Visit the OpenAPI spec docs