Skip to content

Commit 034be83

Browse files
committed
fix!: convert tokens.quantity column to numeric
it does not fit to Postgres bigint also, fix the parseBigInt transformer by serializing to str: TypeORM seems to be working incosistently and accepts js BigInt on INSERT, but not WHERE
1 parent 64b8d77 commit 034be83

File tree

6 files changed

+29
-13
lines changed

6 files changed

+29
-13
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm';
2+
import { TokensEntity } from '@cardano-sdk/projection-typeorm';
3+
4+
export class TokensQuantityNumericMigrations1691042603934 implements MigrationInterface {
5+
static entity = TokensEntity;
6+
7+
public async up(queryRunner: QueryRunner): Promise<void> {
8+
await queryRunner.query('ALTER TABLE "tokens" ALTER COLUMN "quantity" TYPE numeric(20,0) USING quantity::numeric');
9+
}
10+
11+
public async down(queryRunner: QueryRunner): Promise<void> {
12+
await queryRunner.query('ALTER TABLE "tokens" ALTER COLUMN "quantity" TYPE bigint USING quantity::bigint');
13+
}
14+
}

packages/cardano-services/src/Projection/migrations/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { PoolMetricsMigrations1685011799580 } from './1685011799580-stake-pool-m
1212
import { PoolRegistrationTableMigration1682519108360 } from './1682519108360-pool-registration-table';
1313
import { PoolRetirementTableMigration1682519108361 } from './1682519108361-pool-retirement-table';
1414
import { StakePoolTableMigration1682519108362 } from './1682519108362-stake-pool-table';
15+
import { TokensQuantityNumericMigrations1691042603934 } from './1691042603934-tokens-quantity-numeric';
1516
import { TokensTableMigration1682519108368 } from './1682519108368-tokens-table';
1617

1718
type ProjectionMigration = Function & {
@@ -33,5 +34,6 @@ export const migrations: ProjectionMigration[] = [
3334
PoolMetricsMigrations1685011799580,
3435
HandleTableMigration1686138943349,
3536
CostPledgeNumericMigration1689091319930,
36-
NftMetadataTableMigration1690269355640
37+
NftMetadataTableMigration1690269355640,
38+
TokensQuantityNumericMigrations1691042603934
3739
];

packages/projection-typeorm/src/entity/PoolRegistration.entity.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable brace-style */
2-
import { BigIntColumnOptions, ImaginaryCoinsColumnOptions, OnDeleteCascadeRelationOptions } from './util';
2+
import { BigIntColumnOptions, OnDeleteCascadeRelationOptions, UInt64ColumnOptions } from './util';
33
import { BlockEntity } from './Block.entity';
44
import { Cardano } from '@cardano-sdk/core';
55
import { Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryColumn } from 'typeorm';
@@ -17,9 +17,9 @@ export class PoolRegistrationEntity {
1717
id?: bigint;
1818
@Column()
1919
rewardAccount?: Cardano.RewardAccount;
20-
@Column(ImaginaryCoinsColumnOptions)
20+
@Column(UInt64ColumnOptions)
2121
pledge?: bigint;
22-
@Column(ImaginaryCoinsColumnOptions)
22+
@Column(UInt64ColumnOptions)
2323
cost?: bigint;
2424
// Review: should we store this as 'double' instead?
2525
// Maybe both formats? If we'll need to do computations with this

packages/projection-typeorm/src/entity/Tokens.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { AssetEntity } from './Asset.entity';
2-
import { BigIntColumnOptions, OnDeleteCascadeRelationOptions } from './util';
32
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
3+
import { OnDeleteCascadeRelationOptions, UInt64ColumnOptions } from './util';
44
import { OutputEntity } from './Output.entity';
55

66
@Entity()
@@ -13,6 +13,6 @@ export class TokensEntity {
1313
@JoinColumn()
1414
@ManyToOne(() => OutputEntity, (output) => output.tokens, OnDeleteCascadeRelationOptions)
1515
output?: OutputEntity;
16-
@Column(BigIntColumnOptions)
16+
@Column(UInt64ColumnOptions)
1717
quantity?: bigint;
1818
}

packages/projection-typeorm/src/entity/transformers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const parseBigInt: ValueTransformer = {
4343
return typeof obj === 'string' ? BigInt(obj) : obj;
4444
},
4545
to(obj: any) {
46-
// Works as-is
47-
return obj;
46+
// It can also be a FindOperator object
47+
return typeof obj === 'bigint' ? obj.toString() : obj;
4848
}
4949
};

packages/projection-typeorm/src/entity/util.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ export const BigIntColumnOptions: Pick<ColumnOptions, 'transformer' | 'type'> =
2222
};
2323

2424
/**
25-
* To be used for user-specified coin quantities that are not validated by the node
26-
* to not exceed max lovelace supply (up to unsigned 64 bit integer):
27-
* - pool registration cost
28-
* - pool registration pledge
25+
* To be used for
26+
* - user-specified coin quantities that are not validated by the node
27+
* to not exceed max lovelace supply
28+
* - native asset quantities
2929
*/
30-
export const ImaginaryCoinsColumnOptions: Pick<ColumnOptions, 'transformer' | 'type' | 'precision' | 'scale'> = {
30+
export const UInt64ColumnOptions: Pick<ColumnOptions, 'transformer' | 'type' | 'precision' | 'scale'> = {
3131
precision: 20,
3232
scale: 0,
3333
transformer: parseBigInt,

0 commit comments

Comments
 (0)