Skip to content

Commit

Permalink
feat(combine-api): add dynamic module for combine api-client
Browse files Browse the repository at this point in the history
adds a dyamic module that selects the basepath for the combine api client based on the current
environment.

closes #3180
  • Loading branch information
bilalshaikh42 committed Nov 4, 2021
1 parent ccf7056 commit 4af997e
Show file tree
Hide file tree
Showing 16 changed files with 492 additions and 180 deletions.
3 changes: 2 additions & 1 deletion angular.json
Expand Up @@ -14,6 +14,7 @@
"auth-nest": "libs/auth/nest",
"combine-api": "apps/combine-api",
"combine-api-client": "libs/combine/api-client",
"combine-nest-client": "libs/combine/nest-client",
"config-angular": "libs/config/angular",
"config-common": "libs/config/common",
"config-nest": "libs/config/nest",
Expand Down Expand Up @@ -62,4 +63,4 @@
"view-service": "libs/view/service",
"view-visualizations": "libs/view/visualizations"
}
}
}
20 changes: 16 additions & 4 deletions apps/dispatch-service/src/app/app.module.ts
Expand Up @@ -23,15 +23,16 @@ import { MonitorProcessor } from './submission/monitor.processor';
import { SimulationStatusService } from './services/simulationStatus.service';

import {
ApiModule as CombineApiModule,
Configuration as combineConfig,
} from '@biosimulations/combine-api-client';
CombineNestClientModule,
CombineAPIConfiguration,
} from '@biosimulations/combine-nest-client';
import { JobQueue } from '@biosimulations/messages/messages';
import { MetadataService } from '../metadata/metadata.service';
import { CombineWrapperService } from '../combineWrapper.service';
import { FileService } from '../file/file.service';
import { SedmlService } from '../sedml/sedml.service';
import { ProjectService } from '@biosimulations/api-nest-client';
import { Endpoints } from '@biosimulations/config/common';

@Module({
imports: [
Expand All @@ -41,7 +42,18 @@ import { ProjectService } from '@biosimulations/api-nest-client';
AuthClientModule,
SharedNatsClientModule,
DispatchNestClientModule,
CombineApiModule.forRoot(() => new combineConfig({})),
CombineNestClientModule.forRootAsync({
imports: [BiosimulationsConfigModule],
useFactory: (configService: ConfigService) => {
const env = configService.get('server.env');
const endpoints = new Endpoints(env);
const combineBaseURl = endpoints.getCombineApiEndpoint();
return new CombineAPIConfiguration({
basePath: combineBaseURl,
});
},
inject: [ConfigService],
}),
ScheduleModule.forRoot(),
BullModule.forRootAsync({
imports: [BiosimulationsConfigModule],
Expand Down
1 change: 1 addition & 0 deletions libs/combine/api-client/src/lib/.openapi-generator-ignore
Expand Up @@ -21,3 +21,4 @@
#docs/*.md
# Then explicitly reverse the ignore rule for a single file:
#!docs/README.md

3 changes: 3 additions & 0 deletions libs/combine/nest-client/.babelrc
@@ -0,0 +1,3 @@
{
"presets": [["@nrwl/web/babel", { "useBuiltIns": "usage" }]]
}
33 changes: 33 additions & 0 deletions libs/combine/nest-client/.eslintrc.json
@@ -0,0 +1,33 @@
{
"extends": [
"../../../.eslintrc.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}
10 changes: 10 additions & 0 deletions libs/combine/nest-client/README.md
@@ -0,0 +1,10 @@
# combine-nest-client

This library was generated with [Nx](https://nx.dev).


## Running unit tests

Run `nx test combine-nest-client` to execute the unit tests via [Jest](https://jestjs.io).


15 changes: 15 additions & 0 deletions libs/combine/nest-client/jest.config.js
@@ -0,0 +1,15 @@
module.exports = {
displayName: 'combine-nest-client',
preset: '../../../jest.preset.js',
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
testEnvironment: 'node',
transform: {
'^.+\\.[tj]sx?$': 'ts-jest',
},
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
coverageDirectory: '../../../coverage/libs/combine/nest-client',
};
34 changes: 34 additions & 0 deletions libs/combine/nest-client/project.json
@@ -0,0 +1,34 @@
{
"root": "libs/combine/nest-client",
"sourceRoot": "libs/combine/nest-client/src",
"projectType": "library",
"targets": {
"lint": {
"executor": "@nrwl/linter:eslint",
"outputs": [
"{options.outputFile}"
],
"options": {
"lintFilePatterns": [
"libs/combine/nest-client/**/*.ts"
]
}
},
"test": {
"executor": "@nrwl/jest:jest",
"outputs": [
"coverage/libs/combine/nest-client"
],
"options": {
"jestConfig": "libs/combine/nest-client/jest.config.js",
"passWithNoTests": true
}
}
},
"tags": [
"shared:true",
"scope:combine",
"platform:server",
"type:client"
]
}
1 change: 1 addition & 0 deletions libs/combine/nest-client/src/index.ts
@@ -0,0 +1 @@
export * from './lib/combine-nest-client.module';
84 changes: 84 additions & 0 deletions libs/combine/nest-client/src/lib/combine-nest-client.module.ts
@@ -0,0 +1,84 @@
import {
Module,
Global,
DynamicModule,
Provider,
Abstract,
Type,
} from '@nestjs/common';
import {
Configuration as CombineAPIConfiguration,
ApiModule,
} from '@biosimulations/combine-api-client';

export { CombineAPIConfiguration };
export interface CombineAPIConnectionOptions {
username: string;
password: string;
basePath: string;
withCredentials?: boolean;
}
export type CombineAPIConnectionOptionsFactory = (
...args: any[]
) => CombineAPIConfiguration;

export interface CombineAPIConnectionAsyncOptions {
imports: any[];
// eslint-disable-next-line @typescript-eslint/ban-types
inject: (string | symbol | Function | Type<any> | Abstract<any>)[];
useFactory: CombineAPIConnectionOptionsFactory;
}

import { ConfigService } from '@nestjs/config';
@Global()
@Module({
controllers: [],
providers: [],
exports: [ApiModule],
})
export class CombineNestClientModule {
public static async forRootAsync(
options: CombineAPIConnectionAsyncOptions,
): Promise<DynamicModule> {
const imports = options.imports || [];
const dynamicImports = await this.getImports(options);
const finalImports = imports.concat(dynamicImports);

const providers = await this.getProviders(options);
return {
module: CombineNestClientModule,
providers: providers,
imports: finalImports,
};
}
private static async getImports(
options: CombineAPIConnectionAsyncOptions,
): Promise<DynamicModule[]> {
return [
...options.imports,
{
module: ApiModule,
providers: [
{
provide: CombineAPIConfiguration,
useFactory: options.useFactory,
inject: [ConfigService],
},
],
},
];
}
private static async getProviders(
options: CombineAPIConnectionAsyncOptions,
): Promise<Provider<CombineAPIConfiguration>[]> {
{
return [
{
provide: CombineAPIConfiguration,
useFactory: options.useFactory,
inject: options.inject || [],
},
];
}
}
}
19 changes: 19 additions & 0 deletions libs/combine/nest-client/tsconfig.json
@@ -0,0 +1,19 @@
{
"extends": "../../../tsconfig.base.json",
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
],
"compilerOptions": {
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
}
}
22 changes: 22 additions & 0 deletions libs/combine/nest-client/tsconfig.lib.json
@@ -0,0 +1,22 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../dist/out-tsc",
"declaration": true,
"types": [
"node"
],
"target": "es6",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"exclude": [
"**/*.spec.ts"
],
"include": [
"**/*.ts"
]
}
15 changes: 15 additions & 0 deletions libs/combine/nest-client/tsconfig.spec.json
@@ -0,0 +1,15 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../dist/out-tsc",
"module": "commonjs",
"types": ["jest", "node"]
},
"include": [
"**/*.spec.ts",
"**/*.spec.tsx",
"**/*.spec.js",
"**/*.spec.jsx",
"**/*.d.ts"
]
}

0 comments on commit 4af997e

Please sign in to comment.