diff --git a/src/subdomains/core/custody/dto/output/custody-order-history.dto.ts b/src/subdomains/core/custody/dto/output/custody-order-history.dto.ts index 4db68a4966..eeb930702f 100644 --- a/src/subdomains/core/custody/dto/output/custody-order-history.dto.ts +++ b/src/subdomains/core/custody/dto/output/custody-order-history.dto.ts @@ -16,6 +16,12 @@ export class CustodyOrderHistoryDto { @ApiProperty({ enum: CustodyOrderHistoryStatus }) status: CustodyOrderHistoryStatus; + @ApiProperty() + created: Date; + + @ApiPropertyOptional({ description: 'Valuta timestamp, set once the order is completed' }) + completedAt?: Date; + @ApiPropertyOptional() inputAmount?: number; diff --git a/src/subdomains/core/custody/mappers/__tests__/custody-order-history-dto.mapper.spec.ts b/src/subdomains/core/custody/mappers/__tests__/custody-order-history-dto.mapper.spec.ts new file mode 100644 index 0000000000..937f722fce --- /dev/null +++ b/src/subdomains/core/custody/mappers/__tests__/custody-order-history-dto.mapper.spec.ts @@ -0,0 +1,62 @@ +import { CustodyOrder } from '../../entities/custody-order.entity'; +import { CustodyOrderStatus, CustodyOrderType } from '../../enums/custody'; +import { CustodyOrderHistoryStatus } from '../../dto/output/custody-order-history.dto'; +import { CustodyOrderHistoryDtoMapper } from '../custody-order-history-dto.mapper'; + +describe('CustodyOrderHistoryDtoMapper', () => { + describe('map', () => { + it('passes through both timestamps for a completed order', () => { + const created = new Date('2026-01-08T10:00:00Z'); + const completedAt = new Date('2026-01-28T12:00:00Z'); + const order = Object.assign(new CustodyOrder(), { + type: CustodyOrderType.DEPOSIT, + status: CustodyOrderStatus.COMPLETED, + created, + completedAt, + }); + + const result = CustodyOrderHistoryDtoMapper.map(order); + + expect(result.created).toEqual(created); + expect(result.completedAt).toEqual(completedAt); + expect(result.status).toBe(CustodyOrderHistoryStatus.COMPLETED); + }); + + it('leaves completedAt undefined for an order that never completed', () => { + const created = new Date('2026-01-08T10:00:00Z'); + const order = Object.assign(new CustodyOrder(), { + type: CustodyOrderType.DEPOSIT, + status: CustodyOrderStatus.CONFIRMED, + created, + }); + + const result = CustodyOrderHistoryDtoMapper.map(order); + + // A fallback onto created would claim a valuta the order never had. + expect(result.created).toEqual(created); + expect(result.completedAt).toBeUndefined(); + }); + + it('keeps the timestamps of each order in mapList', () => { + const created1 = new Date('2026-01-01T00:00:00Z'); + const created2 = new Date('2026-01-15T00:00:00Z'); + const order1 = Object.assign(new CustodyOrder(), { + type: CustodyOrderType.DEPOSIT, + status: CustodyOrderStatus.COMPLETED, + created: created1, + completedAt: new Date('2026-01-02T00:00:00Z'), + }); + const order2 = Object.assign(new CustodyOrder(), { + type: CustodyOrderType.DEPOSIT, + status: CustodyOrderStatus.CONFIRMED, + created: created2, + }); + + const result = CustodyOrderHistoryDtoMapper.mapList([order1, order2]); + + expect(result).toHaveLength(2); + expect(result[0].created).toEqual(created1); + expect(result[1].created).toEqual(created2); + }); + }); +}); diff --git a/src/subdomains/core/custody/mappers/custody-order-history-dto.mapper.ts b/src/subdomains/core/custody/mappers/custody-order-history-dto.mapper.ts index 5795e0e1f0..29402026b6 100644 --- a/src/subdomains/core/custody/mappers/custody-order-history-dto.mapper.ts +++ b/src/subdomains/core/custody/mappers/custody-order-history-dto.mapper.ts @@ -14,6 +14,8 @@ export class CustodyOrderHistoryDtoMapper { return { type: order.type, status: this.mapStatus(order), + created: order.created, + completedAt: order.completedAt, inputAmount: isIncoming || isSwap ? (order.inputAmount ?? order.transactionRequest?.estimatedAmount) : order.inputAmount, inputAsset: order.inputAsset?.name,