Skip to content

Commit 4a662ec

Browse files
committed
feat: 🎸 get all eligible dividend distributions for did
1 parent b1aec9c commit 4a662ec

7 files changed

+83
-1
lines changed

‎src/corporate-actions/corporate-actions.controller.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ describe('CorporateActionsController', () => {
3131
linkDocuments: jest.fn(),
3232
reclaimRemainingFunds: jest.fn(),
3333
modifyCheckpoint: jest.fn(),
34+
findUnclaimedDistributionsByAsset: jest.fn(),
3435
};
3536

3637
beforeEach(async () => {

‎src/identities/identities.controller.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import { PendingAuthorizationsModel } from '~/authorizations/models/pending-auth
2121
import { ClaimsService } from '~/claims/claims.service';
2222
import { PaginatedResultsModel } from '~/common/models/paginated-results.model';
2323
import { ResultsModel } from '~/common/models/results.model';
24+
import { createDividendDistributionDetailsModel } from '~/corporate-actions/corporate-actions.util';
25+
import { MockDistributionWithDetails } from '~/corporate-actions/mocks/distribution-with-details.mock';
2426
import { RegisterIdentityDto } from '~/identities/dto/register-identity.dto';
2527
import { IdentitiesController } from '~/identities/identities.controller';
2628
import { IdentitiesService } from '~/identities/identities.service';
@@ -754,4 +756,23 @@ describe('IdentitiesController', () => {
754756
});
755757
});
756758
});
759+
760+
describe('getUnclaimedDividendDistributions', () => {
761+
it('should return unclaimed Dividend Distributions associated with Identity', async () => {
762+
const mockDistributions = [new MockDistributionWithDetails()];
763+
764+
mockIdentitiesService.getPendingDistributions.mockResolvedValue(mockDistributions);
765+
766+
const result = await controller.getPendingDistributions({ did });
767+
768+
expect(result).toEqual(
769+
new ResultsModel({
770+
results: mockDistributions.map(distributionWithDetails =>
771+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
772+
createDividendDistributionDetailsModel(distributionWithDetails as any)
773+
),
774+
})
775+
);
776+
});
777+
});
757778
});

‎src/identities/identities.controller.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ import { DidDto, IncludeExpiredFilterDto } from '~/common/dto/params.dto';
4848
import { PaginatedResultsModel } from '~/common/models/paginated-results.model';
4949
import { ResultsModel } from '~/common/models/results.model';
5050
import { handleServiceResult, TransactionResponseModel } from '~/common/utils';
51+
import { createDividendDistributionDetailsModel } from '~/corporate-actions/corporate-actions.util';
52+
import { DividendDistributionDetailsModel } from '~/corporate-actions/models/dividend-distribution-details.model';
5153
import { DeveloperTestingService } from '~/developer-testing/developer-testing.service';
5254
import { CreateMockIdentityDto } from '~/developer-testing/dto/create-mock-identity.dto';
5355
import { AddSecondaryAccountParamsDto } from '~/identities/dto/add-secondary-account-params.dto';
@@ -754,4 +756,35 @@ export class IdentitiesController {
754756
next,
755757
});
756758
}
759+
760+
@ApiTags('dividend-distributions')
761+
@ApiOperation({
762+
summary: 'Fetch eligible Dividend Distributions',
763+
description:
764+
'This endpoint will provide the list of Dividend Distributions that are eligible to be claimed by the current Identity',
765+
})
766+
@ApiParam({
767+
name: 'did',
768+
description: 'The DID of the Identity for which fetch pending Dividend Distributions for',
769+
type: 'string',
770+
required: true,
771+
example: '0x0600000000000000000000000000000000000000000000000000000000000000',
772+
})
773+
@ApiArrayResponse(DividendDistributionDetailsModel, {
774+
description:
775+
'List of Dividend Distributions that are eligible to be claimed by the specified Identity',
776+
paginated: false,
777+
})
778+
@Get(':did/pending-distributions')
779+
public async getPendingDistributions(
780+
@Param() { did }: DidDto
781+
): Promise<ResultsModel<DividendDistributionDetailsModel>> {
782+
const results = await this.identitiesService.getPendingDistributions(did);
783+
784+
return new ResultsModel({
785+
results: results.map(distributionWithDetails =>
786+
createDividendDistributionDetailsModel(distributionWithDetails)
787+
),
788+
});
789+
}
757790
}

‎src/identities/identities.service.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { BigNumber } from '@polymeshassociation/polymesh-sdk';
66
import { TxTags } from '@polymeshassociation/polymesh-sdk/types';
77

88
import { AccountsService } from '~/accounts/accounts.service';
9+
import { MockDistributionWithDetails } from '~/corporate-actions/mocks/distribution-with-details.mock';
910
import { RegisterIdentityDto } from '~/identities/dto/register-identity.dto';
1011
import { IdentitiesService } from '~/identities/identities.service';
1112
import { mockPolymeshLoggerProvider } from '~/logger/mock-polymesh-logger';
@@ -27,7 +28,7 @@ import {
2728
} from '~/test-utils/service-mocks';
2829
import * as transactionsUtilModule from '~/transactions/transactions.util';
2930

30-
const { signer } = testValues;
31+
const { signer, did } = testValues;
3132

3233
jest.mock('@polymeshassociation/polymesh-sdk/utils', () => ({
3334
...jest.requireActual('@polymeshassociation/polymesh-sdk/utils'),
@@ -290,4 +291,21 @@ describe('IdentitiesService', () => {
290291
expect(result).toEqual(mockAssets);
291292
});
292293
});
294+
295+
describe('getPendingDistributions', () => {
296+
it('should return the Dividend Distributions associated with an Asset that have not been claimed', async () => {
297+
const mockDistributions = [new MockDistributionWithDetails()];
298+
299+
const mockIdentity = new MockIdentity();
300+
301+
const findOneSpy = jest.spyOn(service, 'findOne');
302+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
303+
findOneSpy.mockResolvedValue(mockIdentity as any);
304+
mockIdentity.getPendingDistributions.mockResolvedValue(mockDistributions);
305+
306+
const result = await service.getPendingDistributions(did);
307+
308+
expect(result).toEqual(mockDistributions);
309+
});
310+
});
293311
});

‎src/identities/identities.service.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
22
import { BigNumber } from '@polymeshassociation/polymesh-sdk';
33
import {
44
AuthorizationRequest,
5+
DistributionWithDetails,
56
FungibleAsset,
67
Identity,
78
NftCollection,
@@ -152,4 +153,10 @@ export class IdentitiesService {
152153

153154
return identity.isAssetPreApproved(asset);
154155
}
156+
157+
public async getPendingDistributions(did: string): Promise<DistributionWithDetails[]> {
158+
const identity = await this.findOne(did);
159+
160+
return identity.getPendingDistributions();
161+
}
155162
}

‎src/test-utils/mocks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ export class MockIdentity {
320320
public getHeldAssets = jest.fn();
321321
public preApprovedAssets = jest.fn();
322322
public isAssetPreApproved = jest.fn();
323+
public getPendingDistributions = jest.fn();
323324
}
324325

325326
export class MockPortfolio {

‎src/test-utils/service-mocks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ export class MockIdentitiesService {
152152
attestPrimaryKeyRotation = jest.fn();
153153
isAssetPreApproved = jest.fn();
154154
getPreApprovedAssets = jest.fn();
155+
getPendingDistributions = jest.fn();
155156
}
156157

157158
export class MockSettlementsService {

0 commit comments

Comments
 (0)