Feature/support derived currencies in currency validation (#3529)
* Support derived currencies in currency validation * Update changelog
This commit is contained in:
parent
8386fec98a
commit
f08b0b570b
@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
- Added support for derived currencies in the currency validation
|
||||||
- Added support for automatic deletion of unused asset profiles when deleting activities
|
- Added support for automatic deletion of unused asset profiles when deleting activities
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
|
import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code';
|
||||||
|
|
||||||
import { Transform, TransformFnParams } from 'class-transformer';
|
import { Transform, TransformFnParams } from 'class-transformer';
|
||||||
import {
|
import {
|
||||||
IsBoolean,
|
IsBoolean,
|
||||||
IsISO4217CurrencyCode,
|
|
||||||
IsNumber,
|
IsNumber,
|
||||||
IsOptional,
|
IsOptional,
|
||||||
IsString,
|
IsString,
|
||||||
@ -20,7 +21,7 @@ export class CreateAccountDto {
|
|||||||
)
|
)
|
||||||
comment?: string;
|
comment?: string;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
currency: string;
|
currency: string;
|
||||||
|
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
|
import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code';
|
||||||
|
|
||||||
import { Transform, TransformFnParams } from 'class-transformer';
|
import { Transform, TransformFnParams } from 'class-transformer';
|
||||||
import {
|
import {
|
||||||
IsBoolean,
|
IsBoolean,
|
||||||
IsISO4217CurrencyCode,
|
|
||||||
IsNumber,
|
IsNumber,
|
||||||
IsOptional,
|
IsOptional,
|
||||||
IsString,
|
IsString,
|
||||||
@ -20,7 +21,7 @@ export class UpdateAccountDto {
|
|||||||
)
|
)
|
||||||
comment?: string;
|
comment?: string;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
currency: string;
|
currency: string;
|
||||||
|
|
||||||
@IsString()
|
@IsString()
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
|
import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code';
|
||||||
|
|
||||||
import { AssetClass, AssetSubClass, Prisma } from '@prisma/client';
|
import { AssetClass, AssetSubClass, Prisma } from '@prisma/client';
|
||||||
import {
|
import {
|
||||||
IsArray,
|
IsArray,
|
||||||
IsEnum,
|
IsEnum,
|
||||||
IsISO4217CurrencyCode,
|
|
||||||
IsObject,
|
IsObject,
|
||||||
IsOptional,
|
IsOptional,
|
||||||
IsString,
|
IsString,
|
||||||
@ -26,7 +27,7 @@ export class UpdateAssetProfileDto {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
countries?: Prisma.InputJsonArray;
|
countries?: Prisma.InputJsonArray;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
currency?: string;
|
currency?: string;
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code';
|
||||||
import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970';
|
import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -12,7 +13,6 @@ import {
|
|||||||
IsArray,
|
IsArray,
|
||||||
IsBoolean,
|
IsBoolean,
|
||||||
IsEnum,
|
IsEnum,
|
||||||
IsISO4217CurrencyCode,
|
|
||||||
IsISO8601,
|
IsISO8601,
|
||||||
IsNumber,
|
IsNumber,
|
||||||
IsOptional,
|
IsOptional,
|
||||||
@ -42,10 +42,10 @@ export class CreateOrderDto {
|
|||||||
)
|
)
|
||||||
comment?: string;
|
comment?: string;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
currency: string;
|
currency: string;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
customCurrency?: string;
|
customCurrency?: string;
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code';
|
||||||
import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970';
|
import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -11,7 +12,6 @@ import { Transform, TransformFnParams } from 'class-transformer';
|
|||||||
import {
|
import {
|
||||||
IsArray,
|
IsArray,
|
||||||
IsEnum,
|
IsEnum,
|
||||||
IsISO4217CurrencyCode,
|
|
||||||
IsISO8601,
|
IsISO8601,
|
||||||
IsNumber,
|
IsNumber,
|
||||||
IsOptional,
|
IsOptional,
|
||||||
@ -41,10 +41,10 @@ export class UpdateOrderDto {
|
|||||||
)
|
)
|
||||||
comment?: string;
|
comment?: string;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
currency: string;
|
currency: string;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
customCurrency?: string;
|
customCurrency?: string;
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code';
|
||||||
import type {
|
import type {
|
||||||
ColorScheme,
|
ColorScheme,
|
||||||
DateRange,
|
DateRange,
|
||||||
@ -7,7 +8,6 @@ import type {
|
|||||||
import {
|
import {
|
||||||
IsArray,
|
IsArray,
|
||||||
IsBoolean,
|
IsBoolean,
|
||||||
IsISO4217CurrencyCode,
|
|
||||||
IsISO8601,
|
IsISO8601,
|
||||||
IsIn,
|
IsIn,
|
||||||
IsNumber,
|
IsNumber,
|
||||||
@ -21,7 +21,7 @@ export class UpdateUserSettingDto {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
annualInterestRate?: number;
|
annualInterestRate?: number;
|
||||||
|
|
||||||
@IsISO4217CurrencyCode()
|
@IsCurrencyCode()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
baseCurrency?: string;
|
baseCurrency?: string;
|
||||||
|
|
||||||
|
44
apps/api/src/validators/is-currency-code.ts
Normal file
44
apps/api/src/validators/is-currency-code.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import { DERIVED_CURRENCIES } from '@ghostfolio/common/config';
|
||||||
|
|
||||||
|
import {
|
||||||
|
registerDecorator,
|
||||||
|
ValidationOptions,
|
||||||
|
ValidatorConstraint,
|
||||||
|
ValidatorConstraintInterface,
|
||||||
|
ValidationArguments
|
||||||
|
} from 'class-validator';
|
||||||
|
import { isISO4217CurrencyCode } from 'class-validator';
|
||||||
|
|
||||||
|
export function IsCurrencyCode(validationOptions?: ValidationOptions) {
|
||||||
|
return function (object: Object, propertyName: string) {
|
||||||
|
registerDecorator({
|
||||||
|
propertyName,
|
||||||
|
constraints: [],
|
||||||
|
options: validationOptions,
|
||||||
|
target: object.constructor,
|
||||||
|
validator: IsExtendedCurrencyConstraint
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@ValidatorConstraint({ async: false })
|
||||||
|
export class IsExtendedCurrencyConstraint
|
||||||
|
implements ValidatorConstraintInterface
|
||||||
|
{
|
||||||
|
public defaultMessage(args: ValidationArguments) {
|
||||||
|
return '$value must be a valid ISO4217 currency code';
|
||||||
|
}
|
||||||
|
|
||||||
|
public validate(currency: any) {
|
||||||
|
// Return true if currency is a standard ISO 4217 code or a derived currency
|
||||||
|
return (
|
||||||
|
isISO4217CurrencyCode(currency) ||
|
||||||
|
[
|
||||||
|
...DERIVED_CURRENCIES.map((derivedCurrency) => {
|
||||||
|
return derivedCurrency.currency;
|
||||||
|
}),
|
||||||
|
'USX'
|
||||||
|
].includes(currency)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
30
test/import/ok-derived-currency.json
Normal file
30
test/import/ok-derived-currency.json
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"date": "2024-06-28T00:00:00.000Z",
|
||||||
|
"version": "dev"
|
||||||
|
},
|
||||||
|
"accounts": [
|
||||||
|
{
|
||||||
|
"balance": 2000,
|
||||||
|
"currency": "USD",
|
||||||
|
"id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
|
||||||
|
"isExcluded": false,
|
||||||
|
"name": "My Online Trading Account",
|
||||||
|
"platformId": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"activities": [
|
||||||
|
{
|
||||||
|
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
|
||||||
|
"comment": null,
|
||||||
|
"fee": 0,
|
||||||
|
"quantity": 5,
|
||||||
|
"type": "BUY",
|
||||||
|
"unitPrice": 10875.00,
|
||||||
|
"currency": "ZAc",
|
||||||
|
"dataSource": "YAHOO",
|
||||||
|
"date": "2024-06-27T22:00:00.000Z",
|
||||||
|
"symbol": "JSE.JO"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user