Skip to content

Commit

Permalink
feat: improve performance of registrationTypesOfRoles function
Browse files Browse the repository at this point in the history
  • Loading branch information
Jakub Sydor committed Oct 12, 2021
1 parent 7d56d52 commit 8e39e28
Show file tree
Hide file tree
Showing 7 changed files with 160 additions and 7 deletions.
30 changes: 29 additions & 1 deletion docs/api/classes/GnosisIam.GnosisIam-1.md
Expand Up @@ -68,6 +68,7 @@ The domain ownership functionality has been redefined accordingly.
- [getProviderType](GnosisIam.GnosisIam-1.md#getprovidertype)
- [getRoleDIDs](GnosisIam.GnosisIam-1.md#getroledids)
- [getRolesByNamespace](GnosisIam.GnosisIam-1.md#getrolesbynamespace)
- [getRolesDefinition](GnosisIam.GnosisIam-1.md#getrolesdefinition)
- [getSigner](GnosisIam.GnosisIam-1.md#getsigner)
- [getSubOrgsByOrgNamespace](GnosisIam.GnosisIam-1.md#getsuborgsbyorgnamespace)
- [getSubdomains](GnosisIam.GnosisIam-1.md#getsubdomains)
Expand Down Expand Up @@ -870,7 +871,7 @@ ___

**getDefinition**(`__namedParameters`): `Promise`<`IRoleDefinition` \| `IAppDefinition` \| `IOrganizationDefinition`\>

getRoleDefinition
getDefinition

**`description`** get role definition form ens domain metadata record

Expand Down Expand Up @@ -1143,6 +1144,33 @@ array of subdomains or empty array when there is no subdomains

___

### getRolesDefinition

**getRolesDefinition**(`__namedParameters`): `Promise`<`Record`<`string`, `IRoleDefinition`\>\>

getRolesDefinition

**`description`** get roles definition form ens domain metadata record

#### Parameters

| Name | Type |
| :------ | :------ |
| `__namedParameters` | `Object` |
| `__namedParameters.namespaces` | `string`[] |

#### Returns

`Promise`<`Record`<`string`, `IRoleDefinition`\>\>

array of metadata strings

#### Inherited from

[IAM](iam.IAM.md).[getRolesDefinition](iam.IAM.md#getrolesdefinition)

___

### getSigner

**getSigner**(): `undefined` \| `JsonRpcSigner` \| `Signer`
Expand Down
Expand Up @@ -43,6 +43,7 @@
- [getPreviouslyOwnedAssets](cacheServerClient_cacheServerClient.CacheServerClient.md#getpreviouslyownedassets)
- [getRoleDefinition](cacheServerClient_cacheServerClient.CacheServerClient.md#getroledefinition)
- [getRolesByOwner](cacheServerClient_cacheServerClient.CacheServerClient.md#getrolesbyowner)
- [getRolesDefinition](cacheServerClient_cacheServerClient.CacheServerClient.md#getrolesdefinition)
- [getSubOrganizationsByOrganization](cacheServerClient_cacheServerClient.CacheServerClient.md#getsuborganizationsbyorganization)
- [handleRefreshToken](cacheServerClient_cacheServerClient.CacheServerClient.md#handlerefreshtoken)
- [handleUnauthorized](cacheServerClient_cacheServerClient.CacheServerClient.md#handleunauthorized)
Expand Down Expand Up @@ -574,6 +575,26 @@ ___

___

### getRolesDefinition

**getRolesDefinition**(`namespaces`): `Promise`<`Record`<`string`, `IRoleDefinition`\>\>

#### Parameters

| Name | Type |
| :------ | :------ |
| `namespaces` | `string`[] |

#### Returns

`Promise`<`Record`<`string`, `IRoleDefinition`\>\>

#### Implementation of

[ICacheServerClient](../interfaces/cacheServerClient_ICacheServerClient.ICacheServerClient.md).[getRolesDefinition](../interfaces/cacheServerClient_ICacheServerClient.ICacheServerClient.md#getrolesdefinition)

___

### getSubOrganizationsByOrganization

**getSubOrganizationsByOrganization**(`__namedParameters`): `Promise`<[`IOrganization`](../interfaces/cacheServerClient_cacheServerClient_types.IOrganization.md)[]\>
Expand Down
26 changes: 25 additions & 1 deletion docs/api/classes/iam.IAM.md
Expand Up @@ -66,6 +66,7 @@ Decentralized Identity and Access Management (IAM) Type
- [getProviderType](iam.IAM.md#getprovidertype)
- [getRoleDIDs](iam.IAM.md#getroledids)
- [getRolesByNamespace](iam.IAM.md#getrolesbynamespace)
- [getRolesDefinition](iam.IAM.md#getrolesdefinition)
- [getSigner](iam.IAM.md#getsigner)
- [getSubOrgsByOrgNamespace](iam.IAM.md#getsuborgsbyorgnamespace)
- [getSubdomains](iam.IAM.md#getsubdomains)
Expand Down Expand Up @@ -749,7 +750,7 @@ ___

**getDefinition**(`__namedParameters`): `Promise`<`IRoleDefinition` \| `IAppDefinition` \| `IOrganizationDefinition`\>

getRoleDefinition
getDefinition

**`description`** get role definition form ens domain metadata record

Expand Down Expand Up @@ -979,6 +980,29 @@ array of subdomains or empty array when there is no subdomains

___

### getRolesDefinition

**getRolesDefinition**(`__namedParameters`): `Promise`<`Record`<`string`, `IRoleDefinition`\>\>

getRolesDefinition

**`description`** get roles definition form ens domain metadata record

#### Parameters

| Name | Type |
| :------ | :------ |
| `__namedParameters` | `Object` |
| `__namedParameters.namespaces` | `string`[] |

#### Returns

`Promise`<`Record`<`string`, `IRoleDefinition`\>\>

array of metadata strings

___

### getSigner

**getSigner**(): `undefined` \| `JsonRpcSigner` \| `Signer`
Expand Down
Expand Up @@ -38,6 +38,7 @@
- [getPreviouslyOwnedAssets](cacheServerClient_ICacheServerClient.ICacheServerClient.md#getpreviouslyownedassets)
- [getRoleDefinition](cacheServerClient_ICacheServerClient.ICacheServerClient.md#getroledefinition)
- [getRolesByOwner](cacheServerClient_ICacheServerClient.ICacheServerClient.md#getrolesbyowner)
- [getRolesDefinition](cacheServerClient_ICacheServerClient.ICacheServerClient.md#getrolesdefinition)
- [getSubOrganizationsByOrganization](cacheServerClient_ICacheServerClient.ICacheServerClient.md#getsuborganizationsbyorganization)
- [isAuthEnabled](cacheServerClient_ICacheServerClient.ICacheServerClient.md#isauthenabled)
- [issueClaim](cacheServerClient_ICacheServerClient.ICacheServerClient.md#issueclaim)
Expand Down Expand Up @@ -438,6 +439,22 @@ ___

___

### getRolesDefinition

**getRolesDefinition**(`namespaces`): `Promise`<`Record`<`string`, `IRoleDefinition`\>\>

#### Parameters

| Name | Type |
| :------ | :------ |
| `namespaces` | `string`[] |

#### Returns

`Promise`<`Record`<`string`, `IRoleDefinition`\>\>

___

### getSubOrganizationsByOrganization

**getSubOrganizationsByOrganization**(`__namedParameters`): `Promise`<[`IOrganization`](cacheServerClient_cacheServerClient_types.IOrganization.md)[]\>
Expand Down
1 change: 1 addition & 0 deletions src/cacheServerClient/ICacheServerClient.ts
Expand Up @@ -19,6 +19,7 @@ export interface ICacheServerClient {
login: () => Promise<{ pubKeyAndIdentityToken: IPubKeyAndIdentityToken; token: string; refreshToken: string }>;
isAuthEnabled: () => boolean;
getRoleDefinition: ({ namespace }: Pick<ClaimsQueryParams, "namespace">) => Promise<IRoleDefinition>;
getRolesDefinition: (namespaces: Array<ClaimsQueryParams["namespace"]>) => Promise<Record<string, IRoleDefinition>>;
getOrgDefinition: ({ namespace }: Pick<ClaimsQueryParams, "namespace">) => Promise<IOrganizationDefinition>;
getAppDefinition: ({ namespace }: Pick<ClaimsQueryParams, "namespace">) => Promise<IAppDefinition>;
getApplicationRoles: ({ namespace }: Pick<ClaimsQueryParams, "namespace">) => Promise<IRole[]>;
Expand Down
9 changes: 9 additions & 0 deletions src/cacheServerClient/cacheServerClient.ts
Expand Up @@ -18,6 +18,7 @@ import { ICacheServerClient } from "./ICacheServerClient";
import { detectExecutionEnvironment, ExecutionEnvironment } from "../utils/detectEnvironment";
import { getPublicKeyAndIdentityToken, IPubKeyAndIdentityToken } from "../utils/getPublicKeyAndIdentityToken";
import { Signer } from "ethers";
import { IRoleDefinition } from "@energyweb/iam-contracts";

export interface CacheServerClientOptions {
url: string;
Expand Down Expand Up @@ -143,6 +144,14 @@ export class CacheServerClient implements ICacheServerClient {
return data?.definition;
}

async getRolesDefinition(namespaces: Array<ClaimsQueryParams["namespace"]>) {
const { data } = await this.httpClient.get<IRole[]>(`/role?namespaces=${namespaces.join(",")}`);
const rolesWithDefinitions = data?.map((entry) => ({ definition: entry.definition, role: entry.namespace }));
return rolesWithDefinitions.reduce((result, { role, definition }) => {
return { ...result, [role]: definition };
}, {} as Record<string, IRoleDefinition>);
}

async getOrgDefinition({ namespace }: Pick<ClaimsQueryParams, "namespace">) {
const { data } = await this.httpClient.get<IOrganization>(`/org/${namespace}`);
return data?.definition;
Expand Down
63 changes: 58 additions & 5 deletions src/iam.ts
Expand Up @@ -1093,7 +1093,7 @@ export class IAM extends IAMBase {
}

/**
* getRoleDefinition
* getDefinition
*
* @description get role definition form ens domain metadata record
* @returns metadata string or empty string when there is no metadata
Expand Down Expand Up @@ -1125,6 +1125,36 @@ export class IAM extends IAMBase {
throw new ENSResolverNotInitializedError();
}

/**
* getRolesDefinition
*
* @description get roles definition form ens domain metadata record
* @returns array of metadata strings
*
*/
async getRolesDefinition({ namespaces }: { namespaces: string[] }): Promise<Record<string, IRoleDefinition>> {
if (this._cacheClient) {
return this._cacheClient.getRolesDefinition(namespaces);
}
if (this._domainDefinitionReader) {
const rolesWithDefinitions = await Promise.all(
namespaces.map(async (namespace) => {
const roleHash = namehash(namespace);
return {
role: namespace,
definition: (await this._domainDefinitionReader.read({
node: roleHash,
})) as unknown as IRoleDefinition,
};
}),
);
return rolesWithDefinitions.reduce((result, { role, definition }) => {
return { ...result, [role]: definition };
}, {} as Record<string, IRoleDefinition>);
}
throw new ENSResolverNotInitializedError();
}

/**
* getRolesByNamespace
*
Expand Down Expand Up @@ -1648,18 +1678,41 @@ export class IAM extends IAMBase {
}
}

private async getRolesResolvers(roles: string[]) {
const rolesWithResolvers = await Promise.all(
roles.map(async (role) => {
const resolver = await this._ensRegistry.resolver(namehash(role));
return {
role,
resolver,
};
}),
);

return rolesWithResolvers.reduce((result, { role, resolver }) => {
return { ...result, [role]: resolver };
}, {} as Record<string, string>);
}

async registrationTypesOfRoles(roles: string[]): Promise<Record<string, Set<RegistrationTypes>>> {
const types: Record<string, Set<RegistrationTypes>> = roles.reduce(
(acc, role) => ({ ...acc, [role]: new Set() }),
{},
);
for await (const role of roles) {
const def = await this.getDefinition({ type: ENSNamespaceTypes.Roles, namespace: role });

const [{ chainId }, definitions, resolvers] = await Promise.all([
this._provider.getNetwork(),
this.getRolesDefinition({ namespaces: roles }),
this.getRolesResolvers(roles),
]);

for (const role of roles) {
const def = definitions[role];
const resolver = resolvers[role];
if (!DomainReader.isRoleDefinition(def)) {
continue;
}
const resolver = await this._ensRegistry.resolver(namehash(role));
const { chainId } = await this._provider.getNetwork();

const { ensResolverAddress, ensPublicResolverAddress } = chainConfigs[chainId];
if (resolver === ensResolverAddress) {
types[role].add(RegistrationTypes.OnChain);
Expand Down

0 comments on commit 8e39e28

Please sign in to comment.