Skip to content

Commit

Permalink
feat: implement feedback from peer-review.
Browse files Browse the repository at this point in the history
  • Loading branch information
benoitdevos committed Jun 18, 2024
1 parent 05a2461 commit 984b95f
Show file tree
Hide file tree
Showing 18 changed files with 85 additions and 84 deletions.
4 changes: 2 additions & 2 deletions packages/client-node/integration/LegalOfficer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ export async function updateLegalOfficer(state: State) {
additionalDetails: "Some new details",
} as LegalOfficer;
const aliceClient = client.withCurrentAccount(alice.account);
await aliceClient.directoryClient.createOrUpdate(updatedAlice);
const legalOfficers = await client.directoryClient.getLegalOfficers();
await aliceClient.legalOfficerClient.createOrUpdate(updatedAlice);
const legalOfficers = await client.legalOfficerClient.getLegalOfficers();
const legalOfficer = legalOfficers.find(legalOfficer => legalOfficer.account.equals(alice.account))
expect(legalOfficer?.userIdentity).toEqual(updatedAlice.userIdentity);
expect(legalOfficer?.postalAddress).toEqual(updatedAlice.postalAddress);
Expand Down
6 changes: 3 additions & 3 deletions packages/client/src/ComponentFactory.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { LogionNodeApiClass, Hash } from "@logion/node-api";
import { AuthenticationClient } from "./AuthenticationClient.js";
import { AxiosFactory } from "./AxiosFactory.js";
import { DirectoryClient } from "./DirectoryClient.js";
import { LegalOfficerClient } from "./LegalOfficerClient.js";
import { NetworkState } from "./NetworkState.js";
import { LegalOfficerEndpoint } from "./SharedClient.js";
import { LegalOfficerClass } from "./Types.js";
Expand Down Expand Up @@ -83,15 +83,15 @@ export abstract class AxiosFileUploader implements FileUploader {

export interface CoreComponentFactory {
buildAxiosFactory: () => AxiosFactory;
buildDirectoryClient: (api: LogionNodeApiClass, axiosFactory: AxiosFactory, token?: string) => DirectoryClient;
buildLegalOfficerClient: (api: LogionNodeApiClass, axiosFactory: AxiosFactory, token?: string) => LegalOfficerClient;
buildAuthenticationClient: (api: LogionNodeApiClass, legalOfficers: LegalOfficerClass[]) => AuthenticationClient;
buildNetworkState(nodesUp: LegalOfficerEndpoint[], nodesDown: LegalOfficerEndpoint[]): NetworkState<LegalOfficerEndpoint>;
buildNodeApi(rpcEndpoints: string[]): Promise<LogionNodeApiClass>;
}

export const CoreComponentFactoryInstance: CoreComponentFactory = {
buildAxiosFactory: () => new AxiosFactory(),
buildDirectoryClient: (api: LogionNodeApiClass, axiosFactory: AxiosFactory, token?: string) => new DirectoryClient(api, axiosFactory, token),
buildLegalOfficerClient: (api: LogionNodeApiClass, axiosFactory: AxiosFactory, token?: string) => new LegalOfficerClient(api, axiosFactory, token),
buildAuthenticationClient: (api: LogionNodeApiClass, legalOfficers: LegalOfficerClass[]) => new AuthenticationClient(api, legalOfficers),
buildNetworkState: (nodesUp: LegalOfficerEndpoint[], nodesDown: LegalOfficerEndpoint[]) => new NetworkState(nodesUp, nodesDown),
buildNodeApi: (rpcEndpoints: string[]) => LogionNodeApiClass.connect(rpcEndpoints),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { LegalOfficer, LegalOfficerClass, LegalOfficerPostalAddress, UserIdentit
import { MultiSourceHttpClient, aggregateArrays, Endpoint, MultiSourceHttpClientState } from "./Http.js";
import { newBackendError } from "./Error.js";

export interface DirectoryLegalOfficer {
interface BackendLegalOfficer {
userIdentity: UserIdentity;
postalAddress: LegalOfficerPostalAddress;
address: string;
Expand All @@ -23,7 +23,7 @@ export interface CreateOrUpdateLegalOfficer {
additionalDetails: string;
}

export class DirectoryClient {
export class LegalOfficerClient {

constructor(api: LogionNodeApiClass, axiosFactory: AxiosFactory, token?: string) {
this.authenticated = token !== undefined;
Expand Down Expand Up @@ -56,7 +56,7 @@ export class DirectoryClient {
onchainMap: Record<string, PalletLoAuthorityListLegalOfficerData>
): Promise<LegalOfficerClass[]> {
const offchain = (await axios.get("/api/legal-officer")
.then(response => response.data.legalOfficers)) as DirectoryLegalOfficer[];
.then(response => response.data.legalOfficers)) as BackendLegalOfficer[];
const offchainMap = this.toOffchainMap(offchain);
const legalOfficers = [];
for(const address in offchainMap) {
Expand All @@ -72,14 +72,15 @@ export class DirectoryClient {
legalOfficers.push(new LegalOfficerClass({
legalOfficer,
axiosFactory: this.axiosFactory,
token: this.token,
}));
}
}
return legalOfficers;
}

private toOffchainMap(array: DirectoryLegalOfficer[]): Record<string, DirectoryLegalOfficer> {
const map: Record<string, DirectoryLegalOfficer> = {};
private toOffchainMap(array: BackendLegalOfficer[]): Record<string, BackendLegalOfficer> {
const map: Record<string, BackendLegalOfficer> = {};
array.forEach(item => { map[item.address] = item; });
return map;
}
Expand Down
24 changes: 12 additions & 12 deletions packages/client/src/LogionClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { LogionNodeApiClass, UUID, ValidAccountId } from "@logion/node-api";
import { AccountTokens } from "./AuthenticationClient.js";
import { BalanceState, getBalanceState } from "./Balance.js";
import { ComponentFactory, buildComponentFactory } from "./ComponentFactory.js";
import { DirectoryClient } from "./DirectoryClient.js";
import { LegalOfficerClient } from "./LegalOfficerClient.js";
import { initMultiSourceHttpClientState, MultiSourceHttpClient, Token } from "./Http.js";
import { getInitialState, ProtectionState } from "./AccountRecovery.js";
import { AccountRecoveryClient } from "./AccountRecoveryClient.js";
Expand Down Expand Up @@ -45,18 +45,18 @@ export class LogionClient {
const componentFactory = getComponentFactory(config);
const axiosFactory = componentFactory.buildAxiosFactory();
const nodeApi = await componentFactory.buildNodeApi(config.rpcEndpoints);
const directoryClient = componentFactory.buildDirectoryClient(
const legalOfficerClient = componentFactory.buildLegalOfficerClient(
nodeApi,
axiosFactory,
);
const allLegalOfficers = await directoryClient.getLegalOfficers();
const allLegalOfficers = await legalOfficerClient.getLegalOfficers();
const legalOfficers = allLegalOfficers.filter(legalOfficer => legalOfficer.node);
const nodesUp: LegalOfficerEndpoint[] = legalOfficers.map(legalOfficer => ({ url: legalOfficer.node, legalOfficer: legalOfficer.account.address }));
const sharedState: SharedState = {
config,
componentFactory,
axiosFactory,
directoryClient,
legalOfficerClient,
nodeApi,
legalOfficers,
allLegalOfficers,
Expand Down Expand Up @@ -122,8 +122,8 @@ export class LogionClient {
/**
* An instance of Directory client.
*/
get directoryClient(): DirectoryClient {
return this.sharedState.directoryClient;
get legalOfficerClient(): LegalOfficerClient {
return this.sharedState.legalOfficerClient;
}

/**
Expand Down Expand Up @@ -216,15 +216,15 @@ export class LogionClient {
*/
withCurrentAccount(currentAccount?: ValidAccountId): LogionClient {
this.ensureConnected();
let directoryClient: DirectoryClient;
let legalOfficerClient: LegalOfficerClient;
if(currentAccount !== undefined) {
directoryClient = this.sharedState.componentFactory.buildDirectoryClient(
legalOfficerClient = this.sharedState.componentFactory.buildLegalOfficerClient(
this.sharedState.nodeApi,
this.sharedState.axiosFactory,
this.sharedState.tokens.get(currentAccount)?.value,
);
} else {
directoryClient = this.sharedState.componentFactory.buildDirectoryClient(
legalOfficerClient = this.sharedState.componentFactory.buildLegalOfficerClient(
this.sharedState.nodeApi,
this.sharedState.axiosFactory,
);
Expand All @@ -234,7 +234,7 @@ export class LogionClient {
return new LogionClient({
...sharedState,
currentAccount,
directoryClient,
legalOfficerClient,
});
}

Expand All @@ -244,15 +244,15 @@ export class LogionClient {
*/
logout(): LogionClient {
this.ensureConnected();
const directoryClient = this.sharedState.componentFactory.buildDirectoryClient(
const legalOfficerClient = this.sharedState.componentFactory.buildLegalOfficerClient(
this.sharedState.nodeApi,
this.sharedState.axiosFactory
);
return new LogionClient({
...this.sharedState,
tokens: new AccountTokens(this.sharedState.nodeApi, {}),
currentAccount: undefined,
directoryClient,
legalOfficerClient,
});
}

Expand Down
4 changes: 2 additions & 2 deletions packages/client/src/SharedClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { AccountTokens } from "./AuthenticationClient.js";
import { AxiosFactory } from "./AxiosFactory.js";
import { findOrThrow } from "./Collections.js";
import { ComponentFactory, FileUploader } from "./ComponentFactory.js";
import { DirectoryClient } from "./DirectoryClient.js";
import { LegalOfficerClient } from "./LegalOfficerClient.js";
import { Endpoint, Token } from "./Http.js";
import { NetworkState } from "./NetworkState.js";
import { LegalOfficerClass } from "./Types.js";
Expand All @@ -25,7 +25,7 @@ export interface SharedState {
config: LogionClientConfig;
componentFactory: ComponentFactory;
axiosFactory: AxiosFactory;
directoryClient: DirectoryClient;
legalOfficerClient: LegalOfficerClient;
networkState: NetworkState<LegalOfficerEndpoint>;
nodeApi: LogionNodeApiClass;
legalOfficers: LegalOfficerClass[];
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export * from './Balance.js';
export * from './CollectionItem.js';
export * from './ComponentFactory.js';
export * from './DateTimeUtil.js';
export * from './DirectoryClient.js';
export * from './LegalOfficerClient.js';
export * from './Environment.js';
export * from './Ethereum.js';
export * from './Hash.js';
Expand Down
14 changes: 7 additions & 7 deletions packages/client/test/AccountRecovery.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ async function buildSharedState(): Promise<SharedState> {
(factory: TestConfigFactory) => {
factory.setupDefaultAxiosInstanceFactory();
factory.setupDefaultNetworkState();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);
factory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
},
currentAccount,
Expand Down Expand Up @@ -284,7 +284,7 @@ describe("NoProtection", () => {
setupFetchProtectionRequests(bobAxios, [], [], []);

factory.setupDefaultNetworkState();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);

const nodeApi = factory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
nodeApi.setup(instance => instance.queries.getRecoveryConfig(currentAccount))
Expand Down Expand Up @@ -339,7 +339,7 @@ describe("NoProtection", () => {
const sharedState = await buildTestAuthenticatedSharedSate(
(factory: TestConfigFactory) => {
factory.setupDefaultNetworkState();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);

const nodeApi = factory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
nodeApi.setup(instance => instance.queries.getActiveRecovery(RECOVERED_ADDRESS, currentAccount))
Expand Down Expand Up @@ -453,7 +453,7 @@ describe("PendingRecovery", () => {
setupFetchProtectionRequests(bobAxios, [ bobRequest ], [], []);

factory.setupDefaultNetworkState();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);

const nodeApi = factory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
nodeApi.setup(instance => instance.queries.getRecoveryConfig(currentAccount))
Expand Down Expand Up @@ -506,7 +506,7 @@ describe("PendingRecovery", () => {
setupFetchProtectionRequests(bobAxios, [], [ bobRequest ], []);

factory.setupDefaultNetworkState();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);

const nodeApi = factory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
nodeApi.setup(instance => instance.queries.getRecoveryConfig(currentAccount))
Expand Down Expand Up @@ -594,7 +594,7 @@ describe("AcceptedProtection", () => {
setupFetchProtectionRequests(bobAxios, [], [ bobRequest ], []);

factory.setupDefaultNetworkState();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);

const nodeApi = factory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
nodeApi.setup(instance => instance.queries.getRecoveryConfig(currentAccount))
Expand Down Expand Up @@ -662,7 +662,7 @@ describe("PendingRecovery", () => {
setupFetchProtectionRequests(bobAxios, [], [ bobRequest ], []);

factory.setupDefaultNetworkState();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);

const nodeApi = factory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
const recoveryConfig = {
Expand Down
20 changes: 10 additions & 10 deletions packages/client/test/Balance.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ describe("Balance", () => {
testConfigFactory.setupDefaultAxiosInstanceFactory();
testConfigFactory.setupDefaultNetworkState();
const nodeApi = testConfigFactory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
const directoryClient = testConfigFactory.setupDirectoryClientMock();
const legalOfficerClient = testConfigFactory.setupLegalOfficerClientMock();

directoryClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));
legalOfficerClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));

nodeApi.setup(instance => instance.queries.getAccountData(REQUESTER_ADDRESS))
.returns(Promise.resolve(BALANCE));
Expand Down Expand Up @@ -73,11 +73,11 @@ describe("Balance", () => {
const axiosFactory = testConfigFactory.setupAxiosFactoryMock();
testConfigFactory.setupDefaultNetworkState();
const nodeApi = testConfigFactory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
const directoryClient = testConfigFactory.setupDirectoryClientMock();
const legalOfficerClient = testConfigFactory.setupLegalOfficerClientMock();

setupFetchTransactions(axiosFactory, transactions, REQUESTER_ADDRESS.address)

directoryClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([ new LegalOfficerClass({
legalOfficerClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([ new LegalOfficerClass({
legalOfficer: ALICE,
axiosFactory: axiosFactory.object(),
}) ]));
Expand Down Expand Up @@ -132,9 +132,9 @@ describe("Balance", () => {
const axiosFactory = testConfigFactory.setupAxiosFactoryMock();
testConfigFactory.setupDefaultNetworkState();
const nodeApi = testConfigFactory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
const directoryClient = testConfigFactory.setupDirectoryClientMock();
const legalOfficerClient = testConfigFactory.setupLegalOfficerClientMock();

directoryClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));
legalOfficerClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));

nodeApi.setup(instance => instance.queries.getAccountData(REQUESTER_ADDRESS))
.returns(Promise.resolve(BALANCE));
Expand Down Expand Up @@ -201,9 +201,9 @@ describe("Balance", () => {
const axiosFactory = testConfigFactory.setupAxiosFactoryMock();
testConfigFactory.setupDefaultNetworkState();
const nodeApi = testConfigFactory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
const directoryClient = testConfigFactory.setupDirectoryClientMock();
const legalOfficerClient = testConfigFactory.setupLegalOfficerClientMock();

directoryClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));
legalOfficerClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));

nodeApi.setup(instance => instance.queries.getAccountData(REQUESTER_ADDRESS))
.returns(Promise.resolve(BALANCE));
Expand Down Expand Up @@ -279,9 +279,9 @@ describe("Balance", () => {
const axiosFactory = testConfigFactory.setupAxiosFactoryMock();
testConfigFactory.setupDefaultNetworkState();
const nodeApi = testConfigFactory.setupNodeApiMock(LOGION_CLIENT_CONFIG);
const directoryClient = testConfigFactory.setupDirectoryClientMock();
const legalOfficerClient = testConfigFactory.setupLegalOfficerClientMock();

directoryClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));
legalOfficerClient.setup(instance => instance.getLegalOfficers()).returns(Promise.resolve([]));

nodeApi.setup(instance => instance.queries.getAccountData(REQUESTER_ADDRESS))
.returns(Promise.resolve(BALANCE));
Expand Down
8 changes: 4 additions & 4 deletions packages/client/test/DirectoryClient.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import { Mock } from "moq.ts";
import { AccountId32 } from "@polkadot/types/interfaces/types.js";
import type { Bytes } from '@polkadot/types-codec';
import { PalletLoAuthorityListLegalOfficerData, PalletLoAuthorityListHostData, PalletLoAuthorityListGuestData, LogionRuntimeRegion } from "@polkadot/types/lookup";
import { AxiosFactory, DirectoryClient, DirectoryLegalOfficer } from "../src/index.js";
import { AxiosFactory, LegalOfficerClient } from "../src/index.js";
import { EMPTY_POSTAL_ADDRESS, EMPTY_USER_IDENTITY, mockCodecWithToString, mockCodecWithToUtf8, mockOption, mockStorageKey } from "./Utils.js";

describe("DirectoryClient", () => {
describe("LegalOfficerClient", () => {

it("handles guest LLOs", async () => {
const api = mockApi();
const axiosFactory = mockAxiosFactory();
const client = new DirectoryClient(api, axiosFactory);
const client = new LegalOfficerClient(api, axiosFactory);

const legalOfficers = await client.getLegalOfficers();

Expand Down Expand Up @@ -72,7 +72,7 @@ function mockAxiosFactory(): AxiosFactory {
function mockAxios(addresses: string[]): AxiosInstance {
const axios = new Mock<AxiosInstance>();
const response = new Mock<AxiosResponse>();
const legalOfficers: DirectoryLegalOfficer[] = addresses.map(address => ( {
const legalOfficers = addresses.map(address => ( {
address,
additionalDetails: "",
postalAddress: EMPTY_POSTAL_ADDRESS,
Expand Down
2 changes: 1 addition & 1 deletion packages/client/test/Loc.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1002,7 +1002,7 @@ async function buildSharedState(isVerifiedIssuer: boolean = false): Promise<Shar
(factory: TestConfigFactory) => {
factory.setupDefaultNetworkState();
factory.setupFileUploaderMock();
factory.setupAuthenticatedDirectoryClientMock(token);
factory.setupAuthenticatedLegalOfficerClientMock(token);

const axiosFactoryMock = factory.setupAxiosFactoryMock();
uploaderMock = factory.setupFileUploaderMock();
Expand Down
Loading

0 comments on commit 984b95f

Please sign in to comment.