Skip to content

Commit

Permalink
feat(cactus-sdk): introduces typed (compiler supported) extensibility…
Browse files Browse the repository at this point in the history
… between different SDK backends

An SDK backend is the generated codebase that the openapi-generator tool spits out. There are
multiple ones of these because plugins need to be able to declare their own web services and still
have easy programmatically generated SDKs for them.

Signed-off-by: Peter Somogyvari <peter.somogyvari@accenture.com>
  • Loading branch information
petermetz committed May 19, 2020
1 parent 2299cff commit 0799900
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 42 deletions.
1 change: 1 addition & 0 deletions packages/cactus-cockpit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"@angular/router": "8.2.14",
"@capacitor/core": "1.5.1",
"@hyperledger/cactus-common": "0.2.0",
"@hyperledger/cactus-plugin-web-service-consortium": "0.2.0",
"@hyperledger/cactus-sdk": "0.2.0",
"@ionic-native/core": "5.0.0",
"@ionic-native/splash-screen": "5.0.0",
Expand Down
27 changes: 23 additions & 4 deletions packages/cactus-cockpit/src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import { SplashScreen } from "@ionic-native/splash-screen/ngx";
import { StatusBar } from "@ionic-native/status-bar/ngx";

import { LoggerProvider, Logger } from "@hyperledger/cactus-common";
import { DefaultApi, Configuration } from "@hyperledger/cactus-sdk";
import { DefaultApi as DefaultApiConsortium } from "@hyperledger/cactus-plugin-web-service-consortium";
import { ApiClient, Configuration } from "@hyperledger/cactus-sdk";

@Component({
selector: "app-root",
Expand Down Expand Up @@ -84,8 +85,26 @@ export class AppComponent implements OnInit {
async testApi(): Promise<void> {
const CACTUS_API_HOST = "http://localhost:4000";
const configuration = new Configuration({ basePath: CACTUS_API_HOST });
const api = new DefaultApi(configuration);
const response = await api.apiV1ApiServerHealthcheckGet();
this.logger.info(`HealthcheckResponse: `, response.data);
const apiClient = new ApiClient(configuration).extendWith(
DefaultApiConsortium
);
const dummyConsortium = {
configurationEndpoint: "some-host",
id: "some-id",
name: "some-name",
cactusNodes: [{ host: "some-host", publicKey: "some-fake-public-key" }],
};
const createConsortiumResponse = await apiClient.apiV1PluginsHyperledgerCactusPluginWebServiceConsortiumConsortiumPost(
dummyConsortium
);
const healthCheckResponse = await apiClient.apiV1ApiServerHealthcheckGet();
this.logger.info(
`apiV1PluginsHyperledgerCactusPluginWebServiceConsortiumConsortiumPost: `,
createConsortiumResponse.data
);
this.logger.info(
`apiV1ApiServerHealthcheckGet: `,
healthCheckResponse.data
);
}
}
30 changes: 18 additions & 12 deletions packages/cactus-sdk/src/main/typescript/api-client.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
import { Logger, LoggerProvider } from "@hyperledger/cactus-common";
import { Objects } from "@hyperledger/cactus-common";
import {
Configuration,
DefaultApi,
} from "./generated/openapi/typescript-axios";

export interface IApiClientOptions {
apiHost: string;
apiPort: number;
}
export class ApiClient extends DefaultApi {
public extendWith<T extends {}>(
ctor: new (configuration?: Configuration) => T
): T & this {
const instance = new ctor(this.configuration) as any;
const self = this as any;

export class ApiClient {
private readonly log: Logger;
Objects.getAllMethodNames(instance).forEach(
(method: string) => (self[method] = instance[method])
);

constructor(public readonly options: IApiClientOptions) {
this.log = LoggerProvider.getOrCreate({ label: "api-client " });
}
Objects.getAllFieldNames(instance).forEach(
(field: string) => (self[field] = instance[field])
);

public async call(): Promise<void> {
this.log.debug(`call()`);
return this as T & this;
}
}

This file was deleted.

1 change: 0 additions & 1 deletion packages/cactus-sdk/src/main/typescript/public-api.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export { ApiClient } from "./api-client";
export { ConsortiumService } from "./consortium/consortium-service";
export * from "./generated/openapi/typescript-axios/index";
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
// tslint:disable-next-line: no-var-requires
const tap = require("tap");
import {
ApiClient,
ConsortiumService,
} from "../../../main/typescript/public-api";
import { ApiClient } from "../../../main/typescript/public-api";

tap.pass("Test file can be executed");

tap.test("Library can be loaded", (assert: any) => {
assert.plan(2);
assert.plan(1);
assert.ok(ApiClient);
assert.ok(ConsortiumService);
});
8 changes: 2 additions & 6 deletions packages/cactus-sdk/src/test/typescript/unit/api-surface.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
// tslint:disable-next-line: no-var-requires
const tap = require("tap");
import {
ApiClient,
ConsortiumService,
} from "../../../main/typescript/public-api";
import { ApiClient } from "../../../main/typescript/public-api";

tap.pass("Test file can be executed");

tap.test("Library can be loaded", (assert: any) => {
assert.plan(2);
assert.plan(1);
assert.ok(ApiClient);
assert.ok(ConsortiumService);
});

0 comments on commit 0799900

Please sign in to comment.