diff --git a/migration/1771431313000-AddIpExempt.js b/migration/1771431313000-AddIpExempt.js new file mode 100644 index 0000000000..97b54ac232 --- /dev/null +++ b/migration/1771431313000-AddIpExempt.js @@ -0,0 +1,20 @@ +/** + * @typedef {import('typeorm').MigrationInterface} MigrationInterface + */ + +/** + * @class + * @implements {MigrationInterface} + */ +module.exports = class AddIpExempt1771431313000 { + name = 'AddIpExempt1771431313000' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user_data" ADD "ipExempt" bit NOT NULL CONSTRAINT "DF_UserData_ipExempt" DEFAULT 0`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "user_data" DROP CONSTRAINT "DF_UserData_ipExempt"`); + await queryRunner.query(`ALTER TABLE "user_data" DROP COLUMN "ipExempt"`); + } +} diff --git a/src/shared/models/ip-log/ip-log.service.ts b/src/shared/models/ip-log/ip-log.service.ts index 96aed1d9eb..6a41c2776c 100644 --- a/src/shared/models/ip-log/ip-log.service.ts +++ b/src/shared/models/ip-log/ip-log.service.ts @@ -38,7 +38,7 @@ export class IpLogService { walletType?: WalletType, userData?: UserData, ): Promise { - const { country, result, user } = await this.checkIpCountry(ip, address); + const { country, result, user } = await this.checkIpCountry(ip, address, userData); const ipLog = this.ipLogRepo.create({ ip, country, @@ -116,6 +116,7 @@ export class IpLogService { private async checkIpCountry( userIp: string, address: string, + userData?: UserData, ): Promise<{ country: string; result: boolean; user: User }> { if (Config.environment === Environment.LOC || userIp?.includes(Config.azureIpSubstring)) return { country: 'INTERN', result: true, user: undefined }; @@ -127,6 +128,8 @@ export class IpLogService { if (!countryObject || (user && user.role != UserRole.USER)) return { country, result: true, user }; + if (userData?.ipExempt || user?.userData?.ipExempt) return { country, result: true, user }; + return { country, result: countryObject?.ipEnable, user }; } } diff --git a/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts b/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts index 5e605151c5..cd4b3c7697 100644 --- a/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts +++ b/src/subdomains/generic/user/models/user-data/dto/update-user-data.dto.ts @@ -281,6 +281,10 @@ export class UpdateUserDataDto { @IsBoolean() isTrustedReferrer?: boolean; + @IsOptional() + @IsBoolean() + ipExempt?: boolean; + @IsOptional() @IsString() postAmlCheck?: string; diff --git a/src/subdomains/generic/user/models/user-data/user-data.entity.ts b/src/subdomains/generic/user/models/user-data/user-data.entity.ts index d5430deb17..c1a2a2c40e 100644 --- a/src/subdomains/generic/user/models/user-data/user-data.entity.ts +++ b/src/subdomains/generic/user/models/user-data/user-data.entity.ts @@ -346,6 +346,10 @@ export class UserData extends IEntity { @Column({ default: false }) isTrustedReferrer: boolean; + // IP check + @Column({ default: false }) + ipExempt: boolean; + // References @ManyToOne(() => Wallet, { nullable: true }) wallet?: Wallet;