From b43f01d4fc74dd74ad64602c19317edbac08efb1 Mon Sep 17 00:00:00 2001 From: Dmitry Osipov Date: Wed, 19 Jul 2023 15:53:13 +0400 Subject: [PATCH] update: handle indexer requests --- idea/api-gateway/src/server.ts | 5 +- idea/common/src/enums/api-methods.enum.ts | 7 ++- .../src/interfaces/rpc-request/index.ts | 4 +- idea/indexer/src/one-time-sync.ts | 2 +- idea/indexer/src/rabbitmq/index.ts | 49 +++++++------------ idea/indexer/src/services/block.service.ts | 2 +- idea/tests/src/e2e/e2e.test.ts | 8 +-- 7 files changed, 35 insertions(+), 42 deletions(-) diff --git a/idea/api-gateway/src/server.ts b/idea/api-gateway/src/server.ts index a79884a69d..bc0b90961d 100644 --- a/idea/api-gateway/src/server.ts +++ b/idea/api-gateway/src/server.ts @@ -14,6 +14,7 @@ import { IRpcRequest, IRpcResponse, JSONRPC_ERRORS, + API_GATEWAY_METHODS, } from '@gear-js/common'; import { nanoid } from 'nanoid'; @@ -123,11 +124,11 @@ export class Server { return getResponse(procedure, JSONRPC_ERRORS.MethodNotFound.name); } - if (method === TEST_BALANCE_METHODS.TEST_BALANCE_AVAILABLE) { + if (method === API_GATEWAY_METHODS.TEST_BALANCE_AVAILABLE) { return getResponse(procedure, null, this.rmq.isExistTBChannel(params.genesis)); } - if (procedure.method === INDEXER_METHODS.NETWORK_DATA_AVAILABLE) { + if (method === API_GATEWAY_METHODS.NETWORK_DATA_AVAILABLE) { return getResponse(procedure, null, this.rmq.isExistIndexerChannel(params.genesis)); } diff --git a/idea/common/src/enums/api-methods.enum.ts b/idea/common/src/enums/api-methods.enum.ts index 6e5f651af2..3caf8216fa 100644 --- a/idea/common/src/enums/api-methods.enum.ts +++ b/idea/common/src/enums/api-methods.enum.ts @@ -1,3 +1,8 @@ +export enum API_GATEWAY_METHODS { + NETWORK_DATA_AVAILABLE = 'networkData.available', + TEST_BALANCE_AVAILABLE = 'testBalance.available', +} + export enum INDEXER_METHODS { BLOCKS_STATUS = 'blocks.status', CODE_ALL = 'code.all', @@ -6,7 +11,6 @@ export enum INDEXER_METHODS { CODE_STATE_GET = 'code.state.get', MESSAGE_ALL = 'message.all', MESSAGE_DATA = 'message.data', - NETWORK_DATA_AVAILABLE = 'networkData.available', PROGRAM_ALL = 'program.all', PROGRAM_DATA = 'program.data', PROGRAM_NAME_ADD = 'program.name.add', @@ -27,5 +31,4 @@ export enum META_STORAGE_INTERNAL_METHODS { export enum TEST_BALANCE_METHODS { TEST_BALANCE_GET = 'testBalance.get', - TEST_BALANCE_AVAILABLE = 'testBalance.available', } diff --git a/idea/common/src/interfaces/rpc-request/index.ts b/idea/common/src/interfaces/rpc-request/index.ts index ff78d92278..1cd702ffa4 100644 --- a/idea/common/src/interfaces/rpc-request/index.ts +++ b/idea/common/src/interfaces/rpc-request/index.ts @@ -1,4 +1,4 @@ -import { INDEXER_METHODS, META_STORAGE_METHODS, TEST_BALANCE_METHODS } from '../../enums'; +import { API_GATEWAY_METHODS, INDEXER_METHODS, META_STORAGE_METHODS, TEST_BALANCE_METHODS } from '../../enums'; export * from './indexer'; export * from './meta-storage'; @@ -7,6 +7,6 @@ export * from './test-balance'; export interface IRpcRequest { jsonrpc: '2.0'; id: number; - method: INDEXER_METHODS | META_STORAGE_METHODS | TEST_BALANCE_METHODS; + method: INDEXER_METHODS | META_STORAGE_METHODS | TEST_BALANCE_METHODS | API_GATEWAY_METHODS; params: any; } diff --git a/idea/indexer/src/one-time-sync.ts b/idea/indexer/src/one-time-sync.ts index ad5acc0be1..9bfe4f8d43 100644 --- a/idea/indexer/src/one-time-sync.ts +++ b/idea/indexer/src/one-time-sync.ts @@ -45,7 +45,7 @@ async function bootstrap() { fromBlock = Number(status.height) + 1; } - const lastBlock = await blockService.getLastBlock(genesis); + const lastBlock = await blockService.getLastBlock({ genesis }); const toBlock = Number(lastBlock.number); let syncedBlocks = await blockService.getSyncedBlockNumbers(fromBlock, toBlock, genesis); diff --git a/idea/indexer/src/rabbitmq/index.ts b/idea/indexer/src/rabbitmq/index.ts index 13c6024d15..870f6f2b8b 100644 --- a/idea/indexer/src/rabbitmq/index.ts +++ b/idea/indexer/src/rabbitmq/index.ts @@ -1,18 +1,6 @@ import { Channel, connect, Connection } from 'amqplib'; import { - AddCodeNameParams, - AddProgramNameParams, - AddStateParams, INDEXER_METHODS, - FindMessageParams, - FindProgramParams, - GetAllCodeParams, - GetAllProgramsParams, - GetAllStateParams, - GetCodeParams, - GetMessagesParams, - GetStateByCodeParams, - GetStateParams, RabbitMQExchanges, RabbitMQueues, RMQServiceActions, @@ -29,6 +17,7 @@ export class RMQService { private mainChannel: Channel; private topicChannel: Channel; private connection: Connection; + private methods: Record void>; constructor( private blockService?: BlockService, @@ -36,7 +25,23 @@ export class RMQService { private messageService?: MessageService, private programService?: ProgramService, private stateService?: StateService, - ) {} + ) { + this.methods = { + [INDEXER_METHODS.BLOCKS_STATUS]: () => this.blockService.getLastBlock.bind(this.blockService), + [INDEXER_METHODS.CODE_ALL]: () => this.codeService.getMany.bind(this.codeService), + [INDEXER_METHODS.CODE_DATA]: () => this.codeService.get.bind(this.codeService), + [INDEXER_METHODS.CODE_NAME_ADD]: () => this.codeService.setName.bind(this.codeService), + [INDEXER_METHODS.CODE_STATE_GET]: () => this.stateService.getByCodeIdAndStateId.bind(this.stateService), + [INDEXER_METHODS.MESSAGE_ALL]: () => this.messageService.getMany.bind(this.messageService), + [INDEXER_METHODS.MESSAGE_DATA]: () => this.messageService.get.bind(this.messageService), + [INDEXER_METHODS.PROGRAM_ALL]: () => this.programService.getAllPrograms.bind(this.programService), + [INDEXER_METHODS.PROGRAM_DATA]: () => this.programService.getWithMessages.bind(this.programService), + [INDEXER_METHODS.PROGRAM_NAME_ADD]: () => this.programService.setName.bind(this.programService), + [INDEXER_METHODS.PROGRAM_STATE_ALL]: () => this.stateService.listByProgramId.bind(this.stateService), + [INDEXER_METHODS.PROGRAM_STATE_ADD]: () => this.stateService.create.bind(this.stateService), + [INDEXER_METHODS.STATE_GET]: () => this.stateService.get.bind(this.stateService), + }; + } public async init(consumeMessages = true): Promise { this.connection = await connect(config.rabbitmq.url); @@ -146,23 +151,7 @@ export class RMQService { @FormResponse private async handleIncomingMsg(method: INDEXER_METHODS, params: any): Promise { - const methods = { - [INDEXER_METHODS.BLOCKS_STATUS]: () => this.blockService.getLastBlock(params.genesis as string), - [INDEXER_METHODS.CODE_ALL]: () => this.codeService.getMany(params as GetAllCodeParams), - [INDEXER_METHODS.CODE_DATA]: () => this.codeService.get(params as GetCodeParams), - [INDEXER_METHODS.CODE_NAME_ADD]: () => this.codeService.setName(params as AddCodeNameParams), - [INDEXER_METHODS.CODE_STATE_GET]: () => this.stateService.getByCodeIdAndStateId(params as GetStateByCodeParams), - [INDEXER_METHODS.MESSAGE_ALL]: () => this.messageService.getMany(params as GetMessagesParams), - [INDEXER_METHODS.MESSAGE_DATA]: () => this.messageService.get(params as FindMessageParams), - [INDEXER_METHODS.PROGRAM_ALL]: () => this.programService.getAllPrograms(params as GetAllProgramsParams), - [INDEXER_METHODS.PROGRAM_DATA]: () => this.programService.getWithMessages(params as FindProgramParams), - [INDEXER_METHODS.PROGRAM_NAME_ADD]: () => this.programService.setName(params as AddProgramNameParams), - [INDEXER_METHODS.PROGRAM_STATE_ALL]: () => this.stateService.listByProgramId(params as GetAllStateParams), - [INDEXER_METHODS.PROGRAM_STATE_ADD]: () => this.stateService.create(params as AddStateParams), - [INDEXER_METHODS.STATE_GET]: () => this.stateService.get(params as GetStateParams), - }; - - return methods[method](); + return this.methods[method](params); } public async sendMsgToMetaStorage(metahashes: Map>) { diff --git a/idea/indexer/src/services/block.service.ts b/idea/indexer/src/services/block.service.ts index 03007e28a8..2de2e27430 100644 --- a/idea/indexer/src/services/block.service.ts +++ b/idea/indexer/src/services/block.service.ts @@ -9,7 +9,7 @@ export class BlockService { this.repo = dataSource.getRepository(Block); } - public async getLastBlock(genesis: string): Promise { + public async getLastBlock({ genesis }: { genesis: string }): Promise { const [block] = await this.repo.find({ where: { genesis, diff --git a/idea/tests/src/e2e/e2e.test.ts b/idea/tests/src/e2e/e2e.test.ts index c5dd4ad284..d46afdfe59 100644 --- a/idea/tests/src/e2e/e2e.test.ts +++ b/idea/tests/src/e2e/e2e.test.ts @@ -40,7 +40,7 @@ import { errorStateAlreadyExists, unknownNetworkError, } from './json-rpc.errors'; -import { INDEXER_METHODS, META_STORAGE_METHODS, TEST_BALANCE_METHODS } from '@gear-js/common'; +import { API_GATEWAY_METHODS, INDEXER_METHODS, META_STORAGE_METHODS, TEST_BALANCE_METHODS } from '@gear-js/common'; let genesis: HexString; let prepared: IPrepared; @@ -71,7 +71,7 @@ afterAll(async () => { }); describe('Indexer methods', () => { - test(INDEXER_METHODS.NETWORK_DATA_AVAILABLE, async () => { + test(API_GATEWAY_METHODS.NETWORK_DATA_AVAILABLE, async () => { expect(await networkDataAvailable(genesis)).toBeTruthy(); }); @@ -214,8 +214,8 @@ describe('Meta storage methods', () => { test(META_STORAGE_METHODS.CODE_META_GET, () => {}); }); -describe.skip('Test balance methods', () => { - test(TEST_BALANCE_METHODS.TEST_BALANCE_AVAILABLE, async () => { +describe('Test balance methods', () => { + test(API_GATEWAY_METHODS.TEST_BALANCE_AVAILABLE, async () => { expect(await getTestBalance(genesis)).toBeTruthy(); expect(await getTestBalanceSeveralTimesAtATime(genesis)).toBeTruthy(); });