From b322f3c2f8708544ce3de4c8f8b09ba8bb336911 Mon Sep 17 00:00:00 2001 From: OneEuroQuestion Date: Wed, 1 Jan 2025 14:29:08 +0100 Subject: [PATCH] saving supply history --- drizzle/0045_organic_newton_destine.sql | 11 + drizzle/meta/0045_snapshot.json | 1783 +++++++++++++++++ .../handlers/ajax/supplyHistoryHandler.ts | 26 + .../resources/ajax/SupplyHistoryResource.ts | 20 + 4 files changed, 1840 insertions(+) create mode 100644 drizzle/0045_organic_newton_destine.sql create mode 100644 drizzle/meta/0045_snapshot.json create mode 100644 src/query/handlers/ajax/supplyHistoryHandler.ts create mode 100644 src/redis/resources/ajax/SupplyHistoryResource.ts diff --git a/drizzle/0045_organic_newton_destine.sql b/drizzle/0045_organic_newton_destine.sql new file mode 100644 index 0000000..e4d6fda --- /dev/null +++ b/drizzle/0045_organic_newton_destine.sql @@ -0,0 +1,11 @@ +CREATE TABLE IF NOT EXISTS "supply_history" ( + "key" text PRIMARY KEY NOT NULL, + "type" text NOT NULL, + "value" text NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "supply_history_key_idx" ON "supply_history" ("key");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "supply_history_type_idx" ON "supply_history" ("type"); + +# GRANT ALL PRIVILEGES ON TABLE supply_history TO jsinfo; \ No newline at end of file diff --git a/drizzle/meta/0045_snapshot.json b/drizzle/meta/0045_snapshot.json new file mode 100644 index 0000000..a4f6491 --- /dev/null +++ b/drizzle/meta/0045_snapshot.json @@ -0,0 +1,1783 @@ +{ + "id": "8d0f779e-d0fe-4588-bb0a-9d052b3eea6c", + "prevId": "b99fe300-a342-458e-8c0a-a8c98bc12e7a", + "version": "5", + "dialect": "pg", + "tables": { + "agg_consumer_alltime_relay_payments": { + "name": "agg_consumer_alltime_relay_payments", + "schema": "", + "columns": { + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cusum": { + "name": "cusum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "relaysum": { + "name": "relaysum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "rewardsum": { + "name": "rewardsum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "qossyncavg": { + "name": "qossyncavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityavg": { + "name": "qosavailabilityavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyavg": { + "name": "qoslatencyavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qossyncexcavg": { + "name": "qossyncexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityexcavg": { + "name": "qosavailabilityexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyexcavg": { + "name": "qoslatencyexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "aggConsumerAllTimeIdx": { + "name": "aggConsumerAllTimeIdx", + "columns": [ + "spec_id", + "consumer" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "agg_consumer_daily_relay_payments": { + "name": "agg_consumer_daily_relay_payments", + "schema": "", + "columns": { + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dateday": { + "name": "dateday", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cusum": { + "name": "cusum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "relaysum": { + "name": "relaysum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "rewardsum": { + "name": "rewardsum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "qossyncavg": { + "name": "qossyncavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityavg": { + "name": "qosavailabilityavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyavg": { + "name": "qoslatencyavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qossyncexcavg": { + "name": "qossyncexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityexcavg": { + "name": "qosavailabilityexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyexcavg": { + "name": "qoslatencyexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "aggConsumerDailyIdx": { + "name": "aggConsumerDailyIdx", + "columns": [ + "dateday", + "spec_id", + "consumer" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "agg_consumer_hourly_relay_payments": { + "name": "agg_consumer_hourly_relay_payments", + "schema": "", + "columns": { + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "datehour": { + "name": "datehour", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cusum": { + "name": "cusum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "relaysum": { + "name": "relaysum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "rewardsum": { + "name": "rewardsum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "qossyncavg": { + "name": "qossyncavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityavg": { + "name": "qosavailabilityavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyavg": { + "name": "qoslatencyavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qossyncexcavg": { + "name": "qossyncexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityexcavg": { + "name": "qosavailabilityexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyexcavg": { + "name": "qoslatencyexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "aggConsumerHourlyIdx": { + "name": "aggConsumerHourlyIdx", + "columns": [ + "datehour", + "spec_id", + "consumer" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "apr": { + "name": "apr", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "real", + "primaryKey": false, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "aprIdx": { + "name": "aprIdx", + "columns": [ + "key" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "apr_full_info": { + "name": "apr_full_info", + "schema": "", + "columns": { + "address": { + "name": "address", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "apr_full_info_address_type_pk": { + "name": "apr_full_info_address_type_pk", + "columns": [ + "address", + "type" + ] + } + }, + "uniqueConstraints": {} + }, + "apr_per_provider": { + "name": "apr_per_provider", + "schema": "", + "columns": { + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "estimated_rewards": { + "name": "estimated_rewards", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "apr_per_provider_provider_type_pk": { + "name": "apr_per_provider_provider_type_pk", + "columns": [ + "provider", + "type" + ] + } + }, + "uniqueConstraints": {} + }, + "blocks": { + "name": "blocks", + "schema": "", + "columns": { + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "datetime": { + "name": "datetime", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "blocks_height_unique": { + "name": "blocks_height_unique", + "nullsNotDistinct": false, + "columns": [ + "height" + ] + } + } + }, + "conflict_responses": { + "name": "conflict_responses", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tx": { + "name": "tx", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "vote_id": { + "name": "vote_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "request_block": { + "name": "request_block", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "vote_deadline": { + "name": "vote_deadline", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "api_interface": { + "name": "api_interface", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "api_URL": { + "name": "api_URL", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "connection_type": { + "name": "connection_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "request_data": { + "name": "request_data", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "conflict_votes": { + "name": "conflict_votes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "vote_id": { + "name": "vote_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tx": { + "name": "tx", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "conflict_votes_provider_idx": { + "name": "conflict_votes_provider_idx", + "columns": [ + "provider" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "consumer_subscription_list": { + "name": "consumer_subscription_list", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "plan": { + "name": "plan", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "fulltext": { + "name": "fulltext", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdat": { + "name": "createdat", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "cslidx": { + "name": "cslidx", + "columns": [ + "consumer" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "delegator_rewards": { + "name": "delegator_rewards", + "schema": "", + "columns": { + "delegator": { + "name": "delegator", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "events": { + "name": "events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "event_type": { + "name": "event_type", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "t1": { + "name": "t1", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "t2": { + "name": "t2", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "t3": { + "name": "t3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b1": { + "name": "b1", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "b2": { + "name": "b2", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "b3": { + "name": "b3", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "i1": { + "name": "i1", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "i2": { + "name": "i2", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "i3": { + "name": "i3", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "r1": { + "name": "r1", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "r2": { + "name": "r2", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "r3": { + "name": "r3", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tx": { + "name": "tx", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "fulltext": { + "name": "fulltext", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "events_provider_idx": { + "name": "events_provider_idx", + "columns": [ + "provider" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "key_value_store": { + "name": "key_value_store", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "key_value_store_key_idx": { + "name": "key_value_store_key_idx", + "columns": [ + "key" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "provider_health2": { + "name": "provider_health2", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "guid": { + "name": "guid", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spec": { + "name": "spec", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "geolocation": { + "name": "geolocation", + "type": "varchar(10)", + "primaryKey": false, + "notNull": false, + "default": "NULL" + }, + "interface": { + "name": "interface", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false, + "default": "NULL" + }, + "status": { + "name": "status", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true + }, + "data": { + "name": "data", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false, + "default": "NULL" + } + }, + "indexes": { + "ph2idx": { + "name": "ph2idx", + "columns": [ + "provider", + "spec", + "geolocation", + "interface", + "guid" + ], + "isUnique": true + }, + "provider_health2_provider_idx": { + "name": "provider_health2_provider_idx", + "columns": [ + "provider" + ], + "isUnique": false + }, + "provider_health2_timestamp_idx": { + "name": "provider_health2_timestamp_idx", + "columns": [ + "timestamp" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "provider_latest_block_reports": { + "name": "provider_latest_block_reports", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tx": { + "name": "tx", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "chain_id": { + "name": "chain_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chain_block_height": { + "name": "chain_block_height", + "type": "bigint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "provider_latest_block_reports_provider_idx": { + "name": "provider_latest_block_reports_provider_idx", + "columns": [ + "provider" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "provider_reported": { + "name": "provider_reported", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cu": { + "name": "cu", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "disconnections": { + "name": "disconnections", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "epoch": { + "name": "epoch", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "errors": { + "name": "errors", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "project": { + "name": "project", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "chain_id": { + "name": "chain_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "datetime": { + "name": "datetime", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "total_complaint_this_epoch": { + "name": "total_complaint_this_epoch", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tx": { + "name": "tx", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "provider_reported_provider_idx": { + "name": "provider_reported_provider_idx", + "columns": [ + "provider" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "provider_spec_moniker": { + "name": "provider_spec_moniker", + "schema": "", + "columns": { + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "moniker": { + "name": "moniker", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spec": { + "name": "spec", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "provider_spec_moniker_provider_spec_pk": { + "name": "provider_spec_moniker_provider_spec_pk", + "columns": [ + "provider", + "spec" + ] + } + }, + "uniqueConstraints": {} + }, + "provider_stakes": { + "name": "provider_stakes", + "schema": "", + "columns": { + "stake": { + "name": "stake", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "delegate_limit": { + "name": "delegate_limit", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "delegate_total": { + "name": "delegate_total", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "delegate_commission": { + "name": "delegate_commission", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "applied_height": { + "name": "applied_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "geolocation": { + "name": "geolocation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "addons": { + "name": "addons", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "extensions": { + "name": "extensions", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "providerStakesIdx": { + "name": "providerStakesIdx", + "columns": [ + "provider", + "spec_id" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "relay_payments": { + "name": "relay_payments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "relays": { + "name": "relays", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "cu": { + "name": "cu", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "pay": { + "name": "pay", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "datetime": { + "name": "datetime", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "qos_sync": { + "name": "qos_sync", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "qos_availability": { + "name": "qos_availability", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "qos_latency": { + "name": "qos_latency", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "qos_sync_exc": { + "name": "qos_sync_exc", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "qos_availability_exc": { + "name": "qos_availability_exc", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "qos_latency_exc": { + "name": "qos_latency_exc", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tx": { + "name": "tx", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "name_idx": { + "name": "name_idx", + "columns": [ + "spec_id" + ], + "isUnique": false + }, + "ts_idx": { + "name": "ts_idx", + "columns": [ + "datetime" + ], + "isUnique": false + }, + "consumer_idx": { + "name": "consumer_idx", + "columns": [ + "consumer" + ], + "isUnique": false + }, + "relay_payments_provider_idx": { + "name": "relay_payments_provider_idx", + "columns": [ + "provider" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "spec_tracked_info": { + "name": "spec_tracked_info", + "schema": "", + "columns": { + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chain_id": { + "name": "chain_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "iprpc_cu": { + "name": "iprpc_cu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "spec_tracked_info_provider_chain_id_pk": { + "name": "spec_tracked_info_provider_chain_id_pk", + "columns": [ + "provider", + "chain_id" + ] + } + }, + "uniqueConstraints": {} + }, + "subscription_buys": { + "name": "subscription_buys", + "schema": "", + "columns": { + "block_id": { + "name": "block_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "consumer": { + "name": "consumer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "number": { + "name": "number", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "plan": { + "name": "plan", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tx": { + "name": "tx", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "subscription_buys_consumer_idx": { + "name": "subscription_buys_consumer_idx", + "columns": [ + "consumer" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "supply": { + "name": "supply", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "supplyIdx": { + "name": "supplyIdx", + "columns": [ + "key" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "supply_history": { + "name": "supply_history", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "supply_history_key_idx": { + "name": "supply_history_key_idx", + "columns": [ + "key" + ], + "isUnique": false + }, + "supply_history_type_idx": { + "name": "supply_history_type_idx", + "columns": [ + "type" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "agg_alltime_relay_payments": { + "name": "agg_alltime_relay_payments", + "schema": "", + "columns": { + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cusum": { + "name": "cusum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "relaysum": { + "name": "relaysum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "rewardsum": { + "name": "rewardsum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "qossyncavg": { + "name": "qossyncavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityavg": { + "name": "qosavailabilityavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyavg": { + "name": "qoslatencyavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qossyncexcavg": { + "name": "qossyncexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityexcavg": { + "name": "qosavailabilityexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyexcavg": { + "name": "qoslatencyexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "aggAllTimeIdx": { + "name": "aggAllTimeIdx", + "columns": [ + "spec_id", + "provider" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "agg_daily_relay_payments": { + "name": "agg_daily_relay_payments", + "schema": "", + "columns": { + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dateday": { + "name": "dateday", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cusum": { + "name": "cusum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "relaysum": { + "name": "relaysum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "rewardsum": { + "name": "rewardsum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "qossyncavg": { + "name": "qossyncavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityavg": { + "name": "qosavailabilityavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyavg": { + "name": "qoslatencyavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qossyncexcavg": { + "name": "qossyncexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityexcavg": { + "name": "qosavailabilityexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyexcavg": { + "name": "qoslatencyexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "aggDailyIdx": { + "name": "aggDailyIdx", + "columns": [ + "dateday", + "spec_id", + "provider" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "agg_hourly_relay_payments": { + "name": "agg_hourly_relay_payments", + "schema": "", + "columns": { + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "datehour": { + "name": "datehour", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "spec_id": { + "name": "spec_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cusum": { + "name": "cusum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "relaysum": { + "name": "relaysum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "rewardsum": { + "name": "rewardsum", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "qossyncavg": { + "name": "qossyncavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityavg": { + "name": "qosavailabilityavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyavg": { + "name": "qoslatencyavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qossyncexcavg": { + "name": "qossyncexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qosavailabilityexcavg": { + "name": "qosavailabilityexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "qoslatencyexcavg": { + "name": "qoslatencyexcavg", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "aggHourlyIdx": { + "name": "aggHourlyIdx", + "columns": [ + "datehour", + "spec_id", + "provider" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/src/query/handlers/ajax/supplyHistoryHandler.ts b/src/query/handlers/ajax/supplyHistoryHandler.ts new file mode 100644 index 0000000..eeaa0ae --- /dev/null +++ b/src/query/handlers/ajax/supplyHistoryHandler.ts @@ -0,0 +1,26 @@ +// src/query/handlers/SupplyHistoryService.ts + +import { FastifyRequest, FastifyReply, RouteShorthandOptions } from 'fastify'; +import { SupplyHistoryService } from '@jsinfo/redis/resources/ajax/SupplyHistoryResource'; +import { JSONStringify } from '@jsinfo/utils/fmt'; + +export const SupplyHistoryHandlerOpts: RouteShorthandOptions = { + schema: { + response: { + 200: { + type: 'string' + } + } + } +} + +export async function supplyHistoryHandler(_: FastifyRequest, reply: FastifyReply) { + try { + const history = await SupplyHistoryService.fetch({}); + reply.header('Content-Type', 'application/json'); + return reply.send(JSONStringify(history)); + } catch (error) { + return reply.status(500).send({ error: 'Failed to fetch supply history' }); + } +} + diff --git a/src/redis/resources/ajax/SupplyHistoryResource.ts b/src/redis/resources/ajax/SupplyHistoryResource.ts new file mode 100644 index 0000000..c6caede --- /dev/null +++ b/src/redis/resources/ajax/SupplyHistoryResource.ts @@ -0,0 +1,20 @@ +import { RedisResourceBase } from '@jsinfo/redis/classes/RedisResourceBase'; +import { supplyHistory, type SupplyHistory } from '@jsinfo/schemas/jsinfoSchema/jsinfoSchema'; +import { queryJsinfo } from '@jsinfo/utils/db'; + +export class SupplyHistoryResource extends RedisResourceBase { + protected readonly redisKey = 'supply-history'; + protected readonly cacheExpirySeconds = 300; + + protected async fetchFromSource(): Promise { + return await queryJsinfo(async (db) => { + return await db + .select() + .from(supplyHistory) + .orderBy(supplyHistory.createdAt) + .execute(); + }, 'getSupplyHistory'); + } +} + +export const SupplyHistoryService = new SupplyHistoryResource(); \ No newline at end of file