From 330be86efbdf7982b00fc0c1252fd88f00767a8c Mon Sep 17 00:00:00 2001 From: "Ch3rry B@ry" Date: Tue, 15 Oct 2024 10:10:31 +0530 Subject: [PATCH] fix(api): remove cache from account token inventory --- apps/api/src/libs/schema/legacy.ts | 37 ++++++++++++++++ apps/api/src/libs/schema/node.ts | 41 ------------------ apps/api/src/routes/index.ts | 2 - apps/api/src/routes/legacy.ts | 2 + apps/api/src/routes/node.ts | 15 ------- apps/api/src/services/account/index.ts | 12 +----- apps/api/src/services/legacy.ts | 56 +++++++++++++++++++++++-- apps/api/src/services/node.ts | 58 -------------------------- 8 files changed, 94 insertions(+), 129 deletions(-) delete mode 100644 apps/api/src/libs/schema/node.ts delete mode 100644 apps/api/src/routes/node.ts delete mode 100644 apps/api/src/services/node.ts diff --git a/apps/api/src/libs/schema/legacy.ts b/apps/api/src/libs/schema/legacy.ts index c314e86a..fb3be9c8 100644 --- a/apps/api/src/libs/schema/legacy.ts +++ b/apps/api/src/libs/schema/legacy.ts @@ -9,10 +9,47 @@ const fees = z.object({ period: z.enum(['day', 'week']).optional().default('day'), }); +const nodes = z.object({ + agent: z.object({ + build: z.string(), + name: z.string(), + version: z.string(), + }), + chain: z.object({ + account_id: z + .string() + .min(2) + .max(64) + .regex(/^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/i) + .transform((value) => value.toLowerCase()) + .nullish(), + block_production_tracking_delay: z.number().optional(), + is_validator: z.boolean(), + latest_block_hash: z.string().min(43).max(44), + latest_block_height: z.number(), + max_block_production_delay: z.number().optional(), + max_block_wait_delay: z.number().optional(), + min_block_production_delay: z.number().optional(), + node_id: z.string(), + num_peers: z.number(), + status: z.string(), + }), + signature: z.string().optional(), + system: z.object({ + bandwidth_download: z.number(), + bandwidth_upload: z.number(), + boot_time_seconds: z.number().optional(), + cpu_usage: z.number(), + memory_usage: z.number(), + }), +}); + export type Supply = z.infer; export type Fees = z.infer; +export type Nodes = z.infer; export default { fees, + nodes, supply, }; diff --git a/apps/api/src/libs/schema/node.ts b/apps/api/src/libs/schema/node.ts deleted file mode 100644 index 15f66c9c..00000000 --- a/apps/api/src/libs/schema/node.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { z } from 'zod'; - -const accountId = z - .string() - .min(2) - .max(64) - .regex(/^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/i) - .transform((value) => value.toLowerCase()); - -const telemetry = z.object({ - agent: z.object({ - build: z.string(), - name: z.string(), - version: z.string(), - }), - chain: z.object({ - account_id: accountId.nullish(), - block_production_tracking_delay: z.number().optional(), - is_validator: z.boolean(), - latest_block_hash: z.string().min(43).max(44), - latest_block_height: z.number(), - max_block_production_delay: z.number().optional(), - max_block_wait_delay: z.number().optional(), - min_block_production_delay: z.number().optional(), - node_id: z.string(), - num_peers: z.number(), - status: z.string(), - }), - signature: z.string().optional(), - system: z.object({ - bandwidth_download: z.number(), - bandwidth_upload: z.number(), - boot_time_seconds: z.number().optional(), - cpu_usage: z.number(), - memory_usage: z.number(), - }), -}); - -export type NodeTelemetry = z.infer; - -export default { telemetry }; diff --git a/apps/api/src/routes/index.ts b/apps/api/src/routes/index.ts index bfc218fa..f6b3217d 100644 --- a/apps/api/src/routes/index.ts +++ b/apps/api/src/routes/index.ts @@ -12,7 +12,6 @@ import keys from '#routes/keys'; import kitwallet from '#routes/kitwallet'; import legacy from '#routes/legacy'; import nfts from '#routes/nfts'; -import node from '#routes/node'; import search from '#routes/search'; import stats from '#routes/stats'; import sync from '#routes/sync'; @@ -33,7 +32,6 @@ const routes = () => { kitwallet(app); legacy(app); nfts(app); - node(app); search(app); stats(app); sync(app); diff --git a/apps/api/src/routes/legacy.ts b/apps/api/src/routes/legacy.ts index 5a078433..c125ad0a 100644 --- a/apps/api/src/routes/legacy.ts +++ b/apps/api/src/routes/legacy.ts @@ -44,6 +44,8 @@ const routes = (app: Router) => { route.get('/fees', validator(schema.fees), legacy.fees); route.get('/ping', legacy.ping); + + route.post('/nodes', validator(schema.nodes), legacy.nodes); }; export default routes; diff --git a/apps/api/src/routes/node.ts b/apps/api/src/routes/node.ts deleted file mode 100644 index 563fe24e..00000000 --- a/apps/api/src/routes/node.ts +++ /dev/null @@ -1,15 +0,0 @@ -import express, { Router } from 'express'; - -import schema from '#libs/schema/node'; -import validator from '#middlewares/validator'; -import node from '#services/node'; - -const route = Router(); - -const routes = (app: Router) => { - app.use('/node', express.json(), route); - - route.post('/telemetry', validator(schema.telemetry), node.telemetry); -}; - -export default routes; diff --git a/apps/api/src/services/account/index.ts b/apps/api/src/services/account/index.ts index d2189e5a..e0a8a6b0 100644 --- a/apps/api/src/services/account/index.ts +++ b/apps/api/src/services/account/index.ts @@ -318,17 +318,9 @@ const inventory = catchAsync( ) AS meta ON TRUE `; - const inventory = await redis.cache( - `account:${account}:inventory`, - async () => { - const [fts, nfts] = await Promise.all([ftQuery, nftQuery]); - - return { fts, nfts }; - }, - EXPIRY * 1, // 1 mins - ); + const [fts, nfts] = await Promise.all([ftQuery, nftQuery]); - return res.status(200).json({ inventory }); + return res.status(200).json({ inventory: { fts, nfts } }); }, ); diff --git a/apps/api/src/services/legacy.ts b/apps/api/src/services/legacy.ts index d89a51c3..9b4bb2a7 100644 --- a/apps/api/src/services/legacy.ts +++ b/apps/api/src/services/legacy.ts @@ -1,10 +1,11 @@ import { Response } from 'express'; +import geoip from 'geoip-lite'; import catchAsync from '#libs/async'; import dayjs from '#libs/dayjs'; import db from '#libs/db'; -import sql from '#libs/postgres'; -import { Fees, Supply } from '#libs/schema/legacy'; +import sql, { writeSql } from '#libs/postgres'; +import { Fees, Nodes, Supply } from '#libs/schema/legacy'; import { msToNsTime, yoctoToNear } from '#libs/utils'; import { RequestValidator } from '#types/types'; @@ -130,4 +131,53 @@ const ping = catchAsync(async (_req: Request, res: Response) => { return res.send('pong'); }); -export default { fees, ping, supply, total }; +const nodes = catchAsync( + async (req: RequestValidator, res: Response) => { + const data = req.validator.data; + const geo = geoip.lookup(req.ip!); + const node = { + account_id: data.chain.account_id ?? null, + agent_build: data.agent.build, + agent_name: data.agent.name, + agent_version: data.agent.version, + bandwidth_download: data.system.bandwidth_download, + bandwidth_upload: data.system.bandwidth_upload, + block_production_tracking_delay: + data.chain.block_production_tracking_delay ?? null, + boot_time_seconds: data.system.boot_time_seconds + ? new Date(data.system.boot_time_seconds * 1000) + : null, + city: geo ? geo.city : null, + cpu_usage: data.system.cpu_usage, + ip_address: req.ip!, + is_validator: data.chain.is_validator, + last_hash: data.chain.latest_block_hash, + last_height: data.chain.latest_block_height, + last_seen: new Date(), + latitude: geo ? geo.ll[0] : null, + longitude: geo ? geo.ll[1] : null, + max_block_production_delay: data.chain.max_block_production_delay ?? null, + max_block_wait_delay: data.chain.max_block_wait_delay ?? null, + memory_usage: data.system.memory_usage, + min_block_production_delay: data.chain.min_block_production_delay ?? null, + moniker: data.chain.account_id ?? null, + node_id: data.chain.node_id, + peer_count: data.chain.num_peers, + signature: data.signature ?? null, + status: data.chain.status, + }; + + await writeSql` + INSERT INTO + nodes ${writeSql(node)} + ON CONFLICT (node_id) DO + UPDATE + SET + ${writeSql(node)} + `; + + return res.status(200).json(); + }, +); + +export default { fees, nodes, ping, supply, total }; diff --git a/apps/api/src/services/node.ts b/apps/api/src/services/node.ts deleted file mode 100644 index ac5e98b5..00000000 --- a/apps/api/src/services/node.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Response } from 'express'; -import geoip from 'geoip-lite'; - -import catchAsync from '#libs/async'; -import { writeSql } from '#libs/postgres'; -import { NodeTelemetry } from '#libs/schema/node'; -import { RequestValidator } from '#types/types'; - -const telemetry = catchAsync( - async (req: RequestValidator, res: Response) => { - const data = req.validator.data; - const geo = geoip.lookup(req.ip!); - const node = { - account_id: data.chain.account_id ?? null, - agent_build: data.agent.build, - agent_name: data.agent.name, - agent_version: data.agent.version, - bandwidth_download: data.system.bandwidth_download, - bandwidth_upload: data.system.bandwidth_upload, - block_production_tracking_delay: - data.chain.block_production_tracking_delay ?? null, - boot_time_seconds: data.system.boot_time_seconds - ? new Date(data.system.boot_time_seconds * 1000) - : null, - city: geo ? geo.city : null, - cpu_usage: data.system.cpu_usage, - ip_address: req.ip!, - is_validator: data.chain.is_validator, - last_hash: data.chain.latest_block_hash, - last_height: data.chain.latest_block_height, - last_seen: new Date(), - latitude: geo ? geo.ll[0] : null, - longitude: geo ? geo.ll[1] : null, - max_block_production_delay: data.chain.max_block_production_delay ?? null, - max_block_wait_delay: data.chain.max_block_wait_delay ?? null, - memory_usage: data.system.memory_usage, - min_block_production_delay: data.chain.min_block_production_delay ?? null, - moniker: data.chain.account_id ?? null, - node_id: data.chain.node_id, - peer_count: data.chain.num_peers, - signature: data.signature ?? null, - status: data.chain.status, - }; - - await writeSql` - INSERT INTO - nodes ${writeSql(node)} - ON CONFLICT (node_id) DO - UPDATE - SET - ${writeSql(node)} - `; - - return res.status(200).json(); - }, -); - -export default { telemetry };