Skip to content

Commit 0799900

Browse files
committed
feat(cactus-sdk): introduces typed (compiler supported) extensibility 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 <[email protected]>
1 parent 2299cff commit 0799900

File tree

7 files changed

+46
-42
lines changed

7 files changed

+46
-42
lines changed

packages/cactus-cockpit/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"@angular/router": "8.2.14",
2424
"@capacitor/core": "1.5.1",
2525
"@hyperledger/cactus-common": "0.2.0",
26+
"@hyperledger/cactus-plugin-web-service-consortium": "0.2.0",
2627
"@hyperledger/cactus-sdk": "0.2.0",
2728
"@ionic-native/core": "5.0.0",
2829
"@ionic-native/splash-screen": "5.0.0",

packages/cactus-cockpit/src/app/app.component.ts

+23-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { SplashScreen } from "@ionic-native/splash-screen/ngx";
55
import { StatusBar } from "@ionic-native/status-bar/ngx";
66

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

1011
@Component({
1112
selector: "app-root",
@@ -84,8 +85,26 @@ export class AppComponent implements OnInit {
8485
async testApi(): Promise<void> {
8586
const CACTUS_API_HOST = "http://localhost:4000";
8687
const configuration = new Configuration({ basePath: CACTUS_API_HOST });
87-
const api = new DefaultApi(configuration);
88-
const response = await api.apiV1ApiServerHealthcheckGet();
89-
this.logger.info(`HealthcheckResponse: `, response.data);
88+
const apiClient = new ApiClient(configuration).extendWith(
89+
DefaultApiConsortium
90+
);
91+
const dummyConsortium = {
92+
configurationEndpoint: "some-host",
93+
id: "some-id",
94+
name: "some-name",
95+
cactusNodes: [{ host: "some-host", publicKey: "some-fake-public-key" }],
96+
};
97+
const createConsortiumResponse = await apiClient.apiV1PluginsHyperledgerCactusPluginWebServiceConsortiumConsortiumPost(
98+
dummyConsortium
99+
);
100+
const healthCheckResponse = await apiClient.apiV1ApiServerHealthcheckGet();
101+
this.logger.info(
102+
`apiV1PluginsHyperledgerCactusPluginWebServiceConsortiumConsortiumPost: `,
103+
createConsortiumResponse.data
104+
);
105+
this.logger.info(
106+
`apiV1ApiServerHealthcheckGet: `,
107+
healthCheckResponse.data
108+
);
90109
}
91110
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
1-
import { Logger, LoggerProvider } from "@hyperledger/cactus-common";
1+
import { Objects } from "@hyperledger/cactus-common";
2+
import {
3+
Configuration,
4+
DefaultApi,
5+
} from "./generated/openapi/typescript-axios";
26

3-
export interface IApiClientOptions {
4-
apiHost: string;
5-
apiPort: number;
6-
}
7+
export class ApiClient extends DefaultApi {
8+
public extendWith<T extends {}>(
9+
ctor: new (configuration?: Configuration) => T
10+
): T & this {
11+
const instance = new ctor(this.configuration) as any;
12+
const self = this as any;
713

8-
export class ApiClient {
9-
private readonly log: Logger;
14+
Objects.getAllMethodNames(instance).forEach(
15+
(method: string) => (self[method] = instance[method])
16+
);
1017

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

15-
public async call(): Promise<void> {
16-
this.log.debug(`call()`);
22+
return this as T & this;
1723
}
1824
}

packages/cactus-sdk/src/main/typescript/consortium/consortium-service.ts

-13
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
export { ApiClient } from "./api-client";
2-
export { ConsortiumService } from "./consortium/consortium-service";
32
export * from "./generated/openapi/typescript-axios/index";
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
// tslint:disable-next-line: no-var-requires
22
const tap = require("tap");
3-
import {
4-
ApiClient,
5-
ConsortiumService,
6-
} from "../../../main/typescript/public-api";
3+
import { ApiClient } from "../../../main/typescript/public-api";
74

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

107
tap.test("Library can be loaded", (assert: any) => {
11-
assert.plan(2);
8+
assert.plan(1);
129
assert.ok(ApiClient);
13-
assert.ok(ConsortiumService);
1410
});
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
// tslint:disable-next-line: no-var-requires
22
const tap = require("tap");
3-
import {
4-
ApiClient,
5-
ConsortiumService,
6-
} from "../../../main/typescript/public-api";
3+
import { ApiClient } from "../../../main/typescript/public-api";
74

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

107
tap.test("Library can be loaded", (assert: any) => {
11-
assert.plan(2);
8+
assert.plan(1);
129
assert.ok(ApiClient);
13-
assert.ok(ConsortiumService);
1410
});

0 commit comments

Comments
 (0)