From 91336d974f3ee3a128d343e12ba8abfe4c4aa69e Mon Sep 17 00:00:00 2001
From: Berend Sliedrecht <berend@animo.id>
Date: Thu, 1 Feb 2024 11:25:40 +0100
Subject: [PATCH] feat: get all tenant ids

Signed-off-by: Berend Sliedrecht <berend@animo.id>
---
 .../__tests__/tenants.controller.spec.ts      | 33 +++++++++++--------
 .../src/agent/tenants/tenants.controller.ts   | 22 ++++++++++---
 .../src/agent/tenants/tenants.service.ts      | 19 ++++++++++-
 apps/ssi-abstraction/test/tenants.e2e-spec.ts | 28 ++++++++++++++--
 4 files changed, 81 insertions(+), 21 deletions(-)

diff --git a/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts b/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts
index d2f9a73..8478656 100644
--- a/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts
+++ b/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts
@@ -21,21 +21,28 @@ describe('TenantsController', () => {
     tenantsController = moduleRef.get(TenantsController);
   });
 
-  describe('resolve', () => {
-    it('should resolve a basic did', async () => {
-      const result = new TenantRecord({
-        config: {
-          label: 'my-label',
-          walletConfig: { key: 'some-key', id: 'some-id' },
-        },
-      });
-      jest.spyOn(tenantsService, 'create').mockResolvedValue(result);
-
-      const event = await tenantsController.create({
+  it('create', async () => {
+    const result = new TenantRecord({
+      config: {
         label: 'my-label',
-      });
+        walletConfig: { key: 'some-key', id: 'some-id' },
+      },
+    });
+    jest.spyOn(tenantsService, 'create').mockResolvedValue(result);
 
-      expect(event.data).toStrictEqual(result);
+    const event = await tenantsController.create({
+      label: 'my-label',
     });
+
+    expect(event.data).toStrictEqual(result);
+  });
+
+  it('get All', async () => {
+    const result = ['some-id', 'another-id'];
+    jest.spyOn(tenantsService, 'getAllTenantIds').mockResolvedValue(result);
+
+    const event = await tenantsController.getAllTenantIds();
+
+    expect(event.data).toStrictEqual(result);
   });
 });
diff --git a/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts b/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts
index 89dc001..ef867a1 100644
--- a/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts
+++ b/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts
@@ -1,6 +1,10 @@
 import { Controller } from '@nestjs/common';
 import { MessagePattern } from '@nestjs/microservices';
-import { EventTenantsCreate, EventTenantsCreateInput } from '@ocm/shared';
+import {
+  EventTenantsCreate,
+  EventTenantsCreateInput,
+  EventTenantsGetAllTenantIds,
+} from '@ocm/shared';
 
 import { TenantsService } from './tenants.service.js';
 
@@ -9,11 +13,19 @@ export class TenantsController {
   public constructor(private tenantsService: TenantsService) {}
 
   @MessagePattern(EventTenantsCreate.token)
-  public async create({
-    label,
-  }: EventTenantsCreateInput): Promise<EventTenantsCreate> {
+  public async create(
+    options: EventTenantsCreateInput,
+  ): Promise<EventTenantsCreate> {
     return new EventTenantsCreate(
-      await this.tenantsService.create(label),
+      await this.tenantsService.create(options),
+      undefined,
+    );
+  }
+
+  @MessagePattern(EventTenantsGetAllTenantIds.token)
+  public async getAllTenantIds(): Promise<EventTenantsGetAllTenantIds> {
+    return new EventTenantsGetAllTenantIds(
+      await this.tenantsService.getAllTenantIds(),
       undefined,
     );
   }
diff --git a/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts b/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts
index 483a64a..ddc79ff 100644
--- a/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts
+++ b/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts
@@ -1,5 +1,11 @@
 import type { AppAgent } from '../agent.service.js';
+import type {
+  EventTenantsCreate,
+  EventTenantsCreateInput,
+  EventTenantsGetAllTenantIds,
+} from '@ocm/shared';
 
+import { TenantRepository } from '@aries-framework/tenants/build/repository/TenantRepository.js';
 import { Injectable } from '@nestjs/common';
 
 import { AgentService } from '../agent.service.js';
@@ -12,7 +18,18 @@ export class TenantsService {
     this.agent = agentService.agent;
   }
 
-  public async create(label: string) {
+  public async create({
+    label,
+  }: EventTenantsCreateInput): Promise<EventTenantsCreate['data']> {
     return await this.agent.modules.tenants.createTenant({ config: { label } });
   }
+
+  public async getAllTenantIds(): Promise<EventTenantsGetAllTenantIds['data']> {
+    const tenantRepository =
+      this.agent.dependencyManager.resolve(TenantRepository);
+
+    const tenantRecords = await tenantRepository.getAll(this.agent.context);
+
+    return tenantRecords.map((t) => t.id);
+  }
 }
diff --git a/apps/ssi-abstraction/test/tenants.e2e-spec.ts b/apps/ssi-abstraction/test/tenants.e2e-spec.ts
index a0d372f..8924e04 100644
--- a/apps/ssi-abstraction/test/tenants.e2e-spec.ts
+++ b/apps/ssi-abstraction/test/tenants.e2e-spec.ts
@@ -1,10 +1,13 @@
 import type { INestApplication } from '@nestjs/common';
 import type { ClientProxy } from '@nestjs/microservices';
-import type { EventTenantsCreateInput } from '@ocm/shared';
+import type {
+  EventTenantsCreateInput,
+  EventTenantsGetAllTenantIdsInput,
+} from '@ocm/shared';
 
 import { ClientsModule, Transport } from '@nestjs/microservices';
 import { Test } from '@nestjs/testing';
-import { EventTenantsCreate } from '@ocm/shared';
+import { EventTenantsGetAllTenantIds, EventTenantsCreate } from '@ocm/shared';
 import { firstValueFrom } from 'rxjs';
 
 import { AgentModule } from '../src/agent/agent.module.js';
@@ -62,4 +65,25 @@ describe('Tenants', () => {
       },
     });
   });
+
+  it(EventTenantsGetAllTenantIds.token, async () => {
+    const createResponse$ = client.send<
+      EventTenantsCreate,
+      EventTenantsCreateInput
+    >(EventTenantsCreate.token, {
+      label: 'my-new-tenant',
+    });
+
+    await firstValueFrom(createResponse$);
+
+    const response$ = client.send<
+      EventTenantsGetAllTenantIds,
+      EventTenantsGetAllTenantIdsInput
+    >(EventTenantsGetAllTenantIds.token, {});
+
+    const response = await firstValueFrom(response$);
+    const eventInstance = EventTenantsGetAllTenantIds.fromEvent(response);
+
+    expect(eventInstance.instance.length).toBeGreaterThanOrEqual(1);
+  });
 });
-- 
GitLab