From 7d0a0333d7a78cd05fed45fe92b04f4c90314a55 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 23 Dec 2024 17:23:49 +0000 Subject: [PATCH] Allow adding multiple types of rules at the same time (#1595) --- packages/cli/src/commands/addBlockRules.ts | 32 ++++++---- .../provider/src/tasks/client/clientTasks.ts | 64 +++++++++++-------- packages/types/src/provider/api.ts | 20 +++--- 3 files changed, 66 insertions(+), 50 deletions(-) diff --git a/packages/cli/src/commands/addBlockRules.ts b/packages/cli/src/commands/addBlockRules.ts index fc917180d..376baba33 100644 --- a/packages/cli/src/commands/addBlockRules.ts +++ b/packages/cli/src/commands/addBlockRules.ts @@ -95,25 +95,29 @@ export default ( if (argv.ips) { await tasks.clientTaskManager.addIPBlockRules( - AddBlockRulesIPSpec.parse({ - ips: argv.ips, - global: argv.global, - hardBlock: argv.hardBlock, - dapp: argv.dapp, - captchaConfig, - }), + AddBlockRulesIPSpec.parse([ + { + ips: argv.ips, + global: argv.global, + hardBlock: argv.hardBlock, + dapp: argv.dapp, + captchaConfig, + }, + ]), ); logger.info("IP Block rules added"); } if (argv.users) { await tasks.clientTaskManager.addUserBlockRules( - AddBlockRulesUserSpec.parse({ - users: argv.users, - global: argv.global, - hardBlock: argv.hardBlock, - dapp: argv.dapp, - captchaConfig, - }), + AddBlockRulesUserSpec.parse([ + { + users: argv.users, + global: argv.global, + hardBlock: argv.hardBlock, + dapp: argv.dapp, + captchaConfig, + }, + ]), ); logger.info("User Block rules added"); } diff --git a/packages/provider/src/tasks/client/clientTasks.ts b/packages/provider/src/tasks/client/clientTasks.ts index 84fcba5c2..65f9fa07b 100644 --- a/packages/provider/src/tasks/client/clientTasks.ts +++ b/packages/provider/src/tasks/client/clientTasks.ts @@ -223,20 +223,24 @@ export class ClientTaskManager { /** * @description Add IP block rules to the database. Allows specifying mutiple IPs for a single configuration - * @param {AddBlockRulesIP} opts + * @param {AddBlockRulesIP} rulesets */ - async addIPBlockRules(opts: AddBlockRulesIP): Promise { - const rules: IPAddressBlockRule[] = opts.ips.map((ip) => { - return { - ip: Number(getIPAddress(ip).bigInt()), - global: opts.global, - type: BlockRuleType.ipAddress, - dappAccount: opts.dappAccount, - hardBlock: opts.hardBlock, - ...(opts.captchaConfig && { captchaConfig: opts.captchaConfig }), - }; - }); - await this.providerDB.storeIPBlockRuleRecords(rules); + async addIPBlockRules(rulesets: AddBlockRulesIP): Promise { + for (const ruleset of rulesets) { + const rules: IPAddressBlockRule[] = ruleset.ips.map((ip) => { + return { + ip: Number(getIPAddress(ip).bigInt()), + global: ruleset.global, + type: BlockRuleType.ipAddress, + dappAccount: ruleset.dappAccount, + hardBlock: ruleset.hardBlock, + ...(ruleset.captchaConfig && { + captchaConfig: ruleset.captchaConfig, + }), + }; + }); + await this.providerDB.storeIPBlockRuleRecords(rules); + } } /** @@ -252,22 +256,26 @@ export class ClientTaskManager { /** * @description Add user block rules to the database. Allows specifying multiple users for a single configuration - * @param {AddBlockRulesUser} opts + * @param {AddBlockRulesUser} rulesets */ - async addUserBlockRules(opts: AddBlockRulesUser): Promise { - validateAddress(opts.dappAccount, false, 42); - const rules: UserAccountBlockRule[] = opts.users.map((userAccount) => { - validateAddress(userAccount, false, 42); - return { - dappAccount: opts.dappAccount, - userAccount, - type: BlockRuleType.userAccount, - global: opts.global, - hardBlock: opts.hardBlock, - ...(opts.captchaConfig && { captchaConfig: opts.captchaConfig }), - }; - }); - await this.providerDB.storeUserBlockRuleRecords(rules); + async addUserBlockRules(rulesets: AddBlockRulesUser): Promise { + for (const ruleset of rulesets) { + validateAddress(ruleset.dappAccount, false, 42); + const rules: UserAccountBlockRule[] = ruleset.users.map((userAccount) => { + validateAddress(userAccount, false, 42); + return { + dappAccount: ruleset.dappAccount, + userAccount, + type: BlockRuleType.userAccount, + global: ruleset.global, + hardBlock: ruleset.hardBlock, + ...(ruleset.captchaConfig && { + captchaConfig: ruleset.captchaConfig, + }), + }; + }); + await this.providerDB.storeUserBlockRuleRecords(rules); + } } /** diff --git a/packages/types/src/provider/api.ts b/packages/types/src/provider/api.ts index 92611fa44..39cb3e5f0 100644 --- a/packages/types/src/provider/api.ts +++ b/packages/types/src/provider/api.ts @@ -387,10 +387,12 @@ export const BlockRuleSpec = object({ export type BlockRule = zInfer; -export const AddBlockRulesIPSpec = BlockRuleSpec.merge( - object({ - ips: array(string()), - }), +export const AddBlockRulesIPSpec = array( + BlockRuleSpec.merge( + object({ + ips: array(string()), + }), + ), ); export type AddBlockRulesIP = zInfer; @@ -404,10 +406,12 @@ export type RemoveBlockRulesIP = zInfer; export const BlockRuleIPAddBody = array(AddBlockRulesIPSpec); -export const AddBlockRulesUserSpec = BlockRuleSpec.merge( - object({ - users: array(string()), - }), +export const AddBlockRulesUserSpec = array( + BlockRuleSpec.merge( + object({ + users: array(string()), + }), + ), ); export type AddBlockRulesUser = zInfer;