diff --git a/docs/api/classes/GnosisIam.GnosisIam-1.md b/docs/api/classes/GnosisIam.GnosisIam-1.md index ebe5c07e..3121f437 100644 --- a/docs/api/classes/GnosisIam.GnosisIam-1.md +++ b/docs/api/classes/GnosisIam.GnosisIam-1.md @@ -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) @@ -870,7 +871,7 @@ ___ ▸ **getDefinition**(`__namedParameters`): `Promise`<`IRoleDefinition` \| `IAppDefinition` \| `IOrganizationDefinition`\> -getRoleDefinition +getDefinition **`description`** get role definition form ens domain metadata record @@ -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` diff --git a/docs/api/classes/cacheServerClient_cacheServerClient.CacheServerClient.md b/docs/api/classes/cacheServerClient_cacheServerClient.CacheServerClient.md index f80acdff..e4cc4da9 100644 --- a/docs/api/classes/cacheServerClient_cacheServerClient.CacheServerClient.md +++ b/docs/api/classes/cacheServerClient_cacheServerClient.CacheServerClient.md @@ -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) @@ -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)[]\> diff --git a/docs/api/classes/iam.IAM.md b/docs/api/classes/iam.IAM.md index 976bf464..d6b7a6f7 100644 --- a/docs/api/classes/iam.IAM.md +++ b/docs/api/classes/iam.IAM.md @@ -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) @@ -749,7 +750,7 @@ ___ ▸ **getDefinition**(`__namedParameters`): `Promise`<`IRoleDefinition` \| `IAppDefinition` \| `IOrganizationDefinition`\> -getRoleDefinition +getDefinition **`description`** get role definition form ens domain metadata record @@ -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` diff --git a/docs/api/interfaces/cacheServerClient_ICacheServerClient.ICacheServerClient.md b/docs/api/interfaces/cacheServerClient_ICacheServerClient.ICacheServerClient.md index 61eb6111..290f7058 100644 --- a/docs/api/interfaces/cacheServerClient_ICacheServerClient.ICacheServerClient.md +++ b/docs/api/interfaces/cacheServerClient_ICacheServerClient.ICacheServerClient.md @@ -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) @@ -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)[]\> diff --git a/src/cacheServerClient/ICacheServerClient.ts b/src/cacheServerClient/ICacheServerClient.ts index 6a07cb8f..196eb5fb 100644 --- a/src/cacheServerClient/ICacheServerClient.ts +++ b/src/cacheServerClient/ICacheServerClient.ts @@ -19,6 +19,7 @@ export interface ICacheServerClient { login: () => Promise<{ pubKeyAndIdentityToken: IPubKeyAndIdentityToken; token: string; refreshToken: string }>; isAuthEnabled: () => boolean; getRoleDefinition: ({ namespace }: Pick) => Promise; + getRolesDefinition: (namespaces: Array) => Promise>; getOrgDefinition: ({ namespace }: Pick) => Promise; getAppDefinition: ({ namespace }: Pick) => Promise; getApplicationRoles: ({ namespace }: Pick) => Promise; diff --git a/src/cacheServerClient/cacheServerClient.ts b/src/cacheServerClient/cacheServerClient.ts index c78ac0a5..1697266d 100644 --- a/src/cacheServerClient/cacheServerClient.ts +++ b/src/cacheServerClient/cacheServerClient.ts @@ -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; @@ -143,6 +144,14 @@ export class CacheServerClient implements ICacheServerClient { return data?.definition; } + async getRolesDefinition(namespaces: Array) { + const { data } = await this.httpClient.get(`/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); + } + async getOrgDefinition({ namespace }: Pick) { const { data } = await this.httpClient.get(`/org/${namespace}`); return data?.definition; diff --git a/src/iam.ts b/src/iam.ts index a1c20e85..61ac2b2c 100644 --- a/src/iam.ts +++ b/src/iam.ts @@ -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 @@ -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> { + 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); + } + throw new ENSResolverNotInitializedError(); + } + /** * getRolesByNamespace * @@ -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); + } + async registrationTypesOfRoles(roles: string[]): Promise>> { const types: Record> = 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);