diff --git a/packages/gridproxy_client/src/builders/public_api.ts b/packages/gridproxy_client/src/builders/public_api.ts index 8e28b178a8..cbfff937eb 100644 --- a/packages/gridproxy_client/src/builders/public_api.ts +++ b/packages/gridproxy_client/src/builders/public_api.ts @@ -5,3 +5,4 @@ export * from "./gateways"; export * from "./nodes"; export * from "./stats"; export * from "./twins"; +export * from "./public_ips"; diff --git a/packages/gridproxy_client/src/builders/public_ips.ts b/packages/gridproxy_client/src/builders/public_ips.ts new file mode 100644 index 0000000000..33ece59fee --- /dev/null +++ b/packages/gridproxy_client/src/builders/public_ips.ts @@ -0,0 +1,54 @@ +import { assertBoolean, assertId, assertNatural, assertString } from "../utils"; +import { AbstractBuilder, BuilderMapper, BuilderMethods, BuilderValidator } from "./abstract_builder"; +import { SortBy, SortOrder } from "./nodes"; + +export interface PublicIpQuery { + page: number; + size: number; + retCount: boolean; + randomize: boolean; + sortBy: SortBy; + sortOrder: SortOrder; + farmIds: number; + ip: string; + gateway: string; + free: boolean; +} + +const PUBLICIPS_MAPPER: BuilderMapper = { + page: "page", + size: "size", + retCount: "ret_count", + randomize: "randomize", + sortBy: "sort_by", + sortOrder: "sort_order", + farmIds: "farm_ids", + ip: "ip", + gateway: "gateway", + free: "free", +}; + +const PUBLICIPS_VALIDATOR: BuilderValidator = { + page: assertNatural, + size: assertNatural, + retCount: assertBoolean, + randomize: assertBoolean, + sortBy: assertString, + sortOrder: assertString, + farmIds: assertId, + ip: assertString, + gateway: assertString, + free: assertBoolean, +}; + +export class PublicIpBuilder extends AbstractBuilder { + constructor(public uri: string, queries: Partial = {}) { + super({ + mapper: PUBLICIPS_MAPPER, + validator: PUBLICIPS_VALIDATOR, + queries, + }); + } +} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PublicIpBuilder extends BuilderMethods {} diff --git a/packages/gridproxy_client/src/modules/client.ts b/packages/gridproxy_client/src/modules/client.ts index 2e702b09c6..0a43deba9f 100644 --- a/packages/gridproxy_client/src/modules/client.ts +++ b/packages/gridproxy_client/src/modules/client.ts @@ -2,9 +2,9 @@ import { ContractsClient } from "./contracts"; import { FarmsClient } from "./farms"; import { GatewaysClient } from "./gateways"; import { NodesClient } from "./nodes"; +import { PublicIpsClient } from "./public_ips"; import { StatsClient } from "./stats"; import { TwinsClient } from "./twins"; - export default class GridProxyClient { private readonly __uri: string; @@ -20,6 +20,7 @@ export default class GridProxyClient { this.twins = new TwinsClient(this.__uri); this.nodes = new NodesClient(this.__uri, this.farms, this.twins); this.stats = new StatsClient(this.__uri); + this.publicIps = new PublicIpsClient(this.__uri); } public contracts: ContractsClient; @@ -28,4 +29,5 @@ export default class GridProxyClient { public nodes: NodesClient; public stats: StatsClient; public twins: TwinsClient; + public publicIps: PublicIpsClient; } diff --git a/packages/gridproxy_client/src/modules/public_api.ts b/packages/gridproxy_client/src/modules/public_api.ts index b886b8807c..b8abb7a52b 100644 --- a/packages/gridproxy_client/src/modules/public_api.ts +++ b/packages/gridproxy_client/src/modules/public_api.ts @@ -8,3 +8,4 @@ export * from "./gateways"; export * from "./nodes"; export * from "./stats"; export * from "./twins"; +export * from "./public_ips"; diff --git a/packages/gridproxy_client/src/modules/public_ips.ts b/packages/gridproxy_client/src/modules/public_ips.ts new file mode 100644 index 0000000000..8c01a36931 --- /dev/null +++ b/packages/gridproxy_client/src/modules/public_ips.ts @@ -0,0 +1,35 @@ +import type { Pagination } from "../builders/abstract_builder"; +import { PublicIpBuilder, PublicIpQuery } from "../builders/public_api"; +import { resolvePaginator } from "../utils"; +import { AbstractClient } from "./abstract_client"; +import { PublicIp } from "./farms"; + +export class PublicIpsClient extends AbstractClient { + constructor(uri: string) { + super({ + uri, + Builder: PublicIpBuilder, + }); + } + + public async list(queries: Partial = {}) { + const res = await this.builder(queries).build("/public_ips"); + return resolvePaginator(res); + } + + public async listAll(queries: Partial = {}) { + const { count } = await this.list({ + ...queries, + size: 50, + page: 1, + retCount: true, + }); + const promises: Promise>[] = []; + const pages = Math.ceil(count! / 50); + for (let i = 0; i < pages; i++) { + promises.push(this.list({ ...queries, size: 50, page: i + 1 })); + } + const publicIps = await Promise.all(promises); + return publicIps.map(node => node.data).flat(1); + } +} diff --git a/packages/playground/src/dashboard/components/add_ip.vue b/packages/playground/src/dashboard/components/add_ip.vue index bb90fdeaed..675c95d621 100644 --- a/packages/playground/src/dashboard/components/add_ip.vue +++ b/packages/playground/src/dashboard/components/add_ip.vue @@ -307,7 +307,7 @@ export default { }); } context.emit("ip-added-successfully"); - createCustomToast("IP is added successfully.", ToastType.success); + createCustomToast("IP is added successfully. It may takes a few seconds to reflect", ToastType.success); showDialogue.value = false; } catch (error) { if (error instanceof TFChainError && error.keyError === "IpExists") { diff --git a/packages/playground/src/dashboard/components/public_ips_table.vue b/packages/playground/src/dashboard/components/public_ips_table.vue index 4c26fc94a9..7507f5e3eb 100644 --- a/packages/playground/src/dashboard/components/public_ips_table.vue +++ b/packages/playground/src/dashboard/components/public_ips_table.vue @@ -1,9 +1,19 @@