From fdd3fc03d88a53d46ac8d7234ce4f03b63ddd070 Mon Sep 17 00:00:00 2001 From: Aaron Cook Date: Mon, 29 Apr 2024 11:27:38 +0200 Subject: [PATCH] Merge balance entities and schemas (#1476) Merges all balance-related entities with their schemas: - Combines and `balance.schema.ts` and `balance.entity.ts` - Moves `BalanceTokenSchema` to `balance.token.entity` - Updates associated imports, builders and tests --- src/domain/balances/balances.repository.ts | 2 +- .../entities/__tests__/balance.builder.ts | 2 +- ....schema.spec.ts => balance.entity.spec.ts} | 55 +------------------ .../balances/entities/balance.entity.ts | 30 ++++++++-- .../entities/balance.token.entity.spec.ts | 52 ++++++++++++++++++ .../balances/entities/balance.token.entity.ts | 8 ++- .../entities/schemas/balance.schema.ts | 32 ----------- 7 files changed, 88 insertions(+), 93 deletions(-) rename src/domain/balances/entities/{schemas/__tests__/balance.schema.spec.ts => balance.entity.spec.ts} (82%) create mode 100644 src/domain/balances/entities/balance.token.entity.spec.ts delete mode 100644 src/domain/balances/entities/schemas/balance.schema.ts diff --git a/src/domain/balances/balances.repository.ts b/src/domain/balances/balances.repository.ts index 220a711905..668867e8fc 100644 --- a/src/domain/balances/balances.repository.ts +++ b/src/domain/balances/balances.repository.ts @@ -1,7 +1,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { IBalancesRepository } from '@/domain/balances/balances.repository.interface'; import { Balance } from '@/domain/balances/entities/balance.entity'; -import { BalanceSchema } from '@/domain/balances/entities/schemas/balance.schema'; +import { BalanceSchema } from '@/domain/balances/entities/balance.entity'; import { IBalancesApiManager } from '@/domain/interfaces/balances-api.manager.interface'; @Injectable() diff --git a/src/domain/balances/entities/__tests__/balance.builder.ts b/src/domain/balances/entities/__tests__/balance.builder.ts index a805637199..ccc1841afc 100644 --- a/src/domain/balances/entities/__tests__/balance.builder.ts +++ b/src/domain/balances/entities/__tests__/balance.builder.ts @@ -1,6 +1,6 @@ import { Builder, IBuilder } from '@/__tests__/builder'; import { faker } from '@faker-js/faker'; -import { balanceTokenBuilder } from './balance.token.builder'; +import { balanceTokenBuilder } from '@/domain/balances/entities/__tests__/balance.token.builder'; import { Balance } from '@/domain/balances/entities/balance.entity'; import { getAddress } from 'viem'; diff --git a/src/domain/balances/entities/schemas/__tests__/balance.schema.spec.ts b/src/domain/balances/entities/balance.entity.spec.ts similarity index 82% rename from src/domain/balances/entities/schemas/__tests__/balance.schema.spec.ts rename to src/domain/balances/entities/balance.entity.spec.ts index cce4f0b7fc..66353cd5bd 100644 --- a/src/domain/balances/entities/schemas/__tests__/balance.schema.spec.ts +++ b/src/domain/balances/entities/balance.entity.spec.ts @@ -1,16 +1,14 @@ import { balanceBuilder } from '@/domain/balances/entities/__tests__/balance.builder'; -import { balanceTokenBuilder } from '@/domain/balances/entities/__tests__/balance.token.builder'; import { BalanceSchema, - BalanceTokenSchema, Erc20BalanceSchema, NativeBalanceSchema, -} from '@/domain/balances/entities/schemas/balance.schema'; +} from '@/domain/balances/entities/balance.entity'; import { faker } from '@faker-js/faker'; import { getAddress } from 'viem'; import { ZodError } from 'zod'; -describe('Balances schema', () => { +describe('Balance entity schemas', () => { describe('NativeBalanceSchema', () => { it('should validate a valid native balance', () => { const nativeBalance = balanceBuilder() @@ -55,55 +53,6 @@ describe('Balances schema', () => { }); }); - describe('BalanceTokenSchema', () => { - it('should validate a valid balance token', () => { - const balanceToken = balanceTokenBuilder().build(); - - const result = BalanceTokenSchema.safeParse(balanceToken); - - expect(result.success).toBe(true); - }); - - it('should not allow an invalid balance token', () => { - const balanceToken = { invalid: 'balanceToken' }; - - const result = BalanceTokenSchema.safeParse(balanceToken); - - expect(!result.success && result.error).toStrictEqual( - new ZodError([ - { - code: 'invalid_type', - expected: 'string', - received: 'undefined', - path: ['name'], - message: 'Required', - }, - { - code: 'invalid_type', - expected: 'string', - received: 'undefined', - path: ['symbol'], - message: 'Required', - }, - { - code: 'invalid_type', - expected: 'number', - received: 'undefined', - path: ['decimals'], - message: 'Required', - }, - { - code: 'invalid_type', - expected: 'string', - received: 'undefined', - path: ['logoUri'], - message: 'Required', - }, - ]), - ); - }); - }); - describe('Erc20BalanceSchema', () => { it('should validate a valid ERC-20 balance', () => { const erc20Balance = balanceBuilder().build(); diff --git a/src/domain/balances/entities/balance.entity.ts b/src/domain/balances/entities/balance.entity.ts index 1ae7d36b40..5ebc104ec3 100644 --- a/src/domain/balances/entities/balance.entity.ts +++ b/src/domain/balances/entities/balance.entity.ts @@ -1,8 +1,5 @@ -import { - BalanceSchema, - Erc20BalanceSchema, - NativeBalanceSchema, -} from '@/domain/balances/entities/schemas/balance.schema'; +import { BalanceTokenSchema } from '@/domain/balances/entities/balance.token.entity'; +import { AddressSchema } from '@/validation/entities/schemas/address.schema'; import { z } from 'zod'; export type NativeBalance = z.infer; @@ -10,3 +7,26 @@ export type NativeBalance = z.infer; export type Erc20Balance = z.infer; export type Balance = z.infer; + +export const NativeBalanceSchema = z.object({ + // Likely `null` but for safety we allow optional defaulting + tokenAddress: z.null().optional().default(null), + token: z.null().optional().default(null), + balance: z.string(), +}); + +export const Erc20BalanceSchema = z.object({ + tokenAddress: AddressSchema, + token: BalanceTokenSchema, + balance: z.string(), +}); + +const FiatSchema = z.object({ + fiatBalance: z.string().nullish().default(null), + fiatConversion: z.string().nullish().default(null), +}); + +export const BalanceSchema = z.union([ + NativeBalanceSchema.merge(FiatSchema), + Erc20BalanceSchema.merge(FiatSchema), +]); diff --git a/src/domain/balances/entities/balance.token.entity.spec.ts b/src/domain/balances/entities/balance.token.entity.spec.ts new file mode 100644 index 0000000000..0de36a511a --- /dev/null +++ b/src/domain/balances/entities/balance.token.entity.spec.ts @@ -0,0 +1,52 @@ +import { balanceTokenBuilder } from '@/domain/balances/entities/__tests__/balance.token.builder'; +import { BalanceTokenSchema } from '@/domain/balances/entities/balance.token.entity'; +import { ZodError } from 'zod'; + +describe('BalanceTokenSchema', () => { + it('should validate a valid balance token', () => { + const balanceToken = balanceTokenBuilder().build(); + + const result = BalanceTokenSchema.safeParse(balanceToken); + + expect(result.success).toBe(true); + }); + + it('should not allow an invalid balance token', () => { + const balanceToken = { invalid: 'balanceToken' }; + + const result = BalanceTokenSchema.safeParse(balanceToken); + + expect(!result.success && result.error).toStrictEqual( + new ZodError([ + { + code: 'invalid_type', + expected: 'string', + received: 'undefined', + path: ['name'], + message: 'Required', + }, + { + code: 'invalid_type', + expected: 'string', + received: 'undefined', + path: ['symbol'], + message: 'Required', + }, + { + code: 'invalid_type', + expected: 'number', + received: 'undefined', + path: ['decimals'], + message: 'Required', + }, + { + code: 'invalid_type', + expected: 'string', + received: 'undefined', + path: ['logoUri'], + message: 'Required', + }, + ]), + ); + }); +}); diff --git a/src/domain/balances/entities/balance.token.entity.ts b/src/domain/balances/entities/balance.token.entity.ts index 2fd53bb7b0..4ab8a27173 100644 --- a/src/domain/balances/entities/balance.token.entity.ts +++ b/src/domain/balances/entities/balance.token.entity.ts @@ -1,4 +1,10 @@ -import { BalanceTokenSchema } from '@/domain/balances/entities/schemas/balance.schema'; import { z } from 'zod'; export type BalanceToken = z.infer; + +export const BalanceTokenSchema = z.object({ + name: z.string(), + symbol: z.string(), + decimals: z.number(), + logoUri: z.string(), +}); diff --git a/src/domain/balances/entities/schemas/balance.schema.ts b/src/domain/balances/entities/schemas/balance.schema.ts deleted file mode 100644 index 04e0b831e4..0000000000 --- a/src/domain/balances/entities/schemas/balance.schema.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { z } from 'zod'; -import { AddressSchema } from '@/validation/entities/schemas/address.schema'; - -export const NativeBalanceSchema = z.object({ - // Likely `null` but for safety we allow optional defaulting - tokenAddress: z.null().optional().default(null), - token: z.null().optional().default(null), - balance: z.string(), -}); - -export const BalanceTokenSchema = z.object({ - name: z.string(), - symbol: z.string(), - decimals: z.number(), - logoUri: z.string(), -}); - -export const Erc20BalanceSchema = z.object({ - tokenAddress: AddressSchema, - token: BalanceTokenSchema, - balance: z.string(), -}); - -const FiatSchema = z.object({ - fiatBalance: z.string().nullish().default(null), - fiatConversion: z.string().nullish().default(null), -}); - -export const BalanceSchema = z.union([ - NativeBalanceSchema.merge(FiatSchema), - Erc20BalanceSchema.merge(FiatSchema), -]);