From b44a1b6557ecd64ccb925daaaa2afcad919b30a2 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Wed, 16 Aug 2023 17:15:01 -0700 Subject: [PATCH] feat(project): refactor project structure --- src/blockchain/constants.ts | 2 + src/blockchain/types.ts | 65 ++++++++++++++++++ src/{models => blockchain}/utils.ts | 9 +-- src/consensus/config.ts | 1 + src/consensus/mina-consensus.ts | 2 +- ...x.ts => archive-node-adapter.interface.ts} | 23 ++++--- .../archive-node-adapter.ts | 12 ++++ src/db/index.ts | 13 ---- .../events-actions}/queries.ts | 4 +- .../sql/events-actions}/types.ts | 67 ------------------- src/resolvers-types.ts | 2 +- .../actions-service.interface.ts | 6 ++ .../actions-service}/actions-service.ts | 20 +++--- .../events-service.interface.ts | 6 ++ .../events-service}/events-service.ts | 21 +++--- .../tracing-service.interface.ts | 4 ++ .../tracing-service/tracing-service.ts} | 7 +- .../utils}/utils.ts | 10 +-- .../consensus/select-consensus-precomputed.ts | 5 +- 19 files changed, 149 insertions(+), 130 deletions(-) create mode 100644 src/blockchain/constants.ts create mode 100644 src/blockchain/types.ts rename src/{models => blockchain}/utils.ts (88%) rename src/db/archive-node-adapter/{index.ts => archive-node-adapter.interface.ts} (75%) create mode 100644 src/db/archive-node-adapter/archive-node-adapter.ts delete mode 100644 src/db/index.ts rename src/db/{archive-node-adapter => sql/events-actions}/queries.ts (98%) rename src/{models => db/sql/events-actions}/types.ts (65%) create mode 100644 src/services/actions-service/actions-service.interface.ts rename src/{db/archive-node-adapter => services/actions-service}/actions-service.ts (84%) create mode 100644 src/services/events-service/events-service.interface.ts rename src/{db/archive-node-adapter => services/events-service}/events-service.ts (80%) create mode 100644 src/services/tracing-service/tracing-service.interface.ts rename src/{tracing/tracing.ts => services/tracing-service/tracing-service.ts} (72%) rename src/{db/archive-node-adapter => services/utils}/utils.ts (97%) diff --git a/src/blockchain/constants.ts b/src/blockchain/constants.ts new file mode 100644 index 0000000..9e03f55 --- /dev/null +++ b/src/blockchain/constants.ts @@ -0,0 +1,2 @@ +export const DEFAULT_TOKEN_ID = + 'wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf' as const; diff --git a/src/blockchain/types.ts b/src/blockchain/types.ts new file mode 100644 index 0000000..dd367be --- /dev/null +++ b/src/blockchain/types.ts @@ -0,0 +1,65 @@ +import { ArchiveNodeDatabaseRow } from 'src/db/sql/events-actions/types'; + +export type Transactions = Map; + +export type BlocksWithTransactionsMap = Map; + +export type FieldElementIdWithValueMap = Map; + +export enum BlockStatusFilter { + all = 'ALL', + pending = 'PENDING', + canonical = 'CANONICAL', +} + +export type Event = { + transactionInfo: TransactionInfo; + data: string[]; +}; + +export type Action = { + accountUpdateId: string; + transactionInfo: TransactionInfo; + data: string[]; +}; + +export type BlockInfo = { + height: number; + stateHash: string; + parentHash: string; + ledgerHash: string; + chainStatus: string; + timestamp: string; + globalSlotSinceHardfork: number; + globalSlotSinceGenesis: number; + distanceFromMaxBlockHeight: number; + lastVrfOutput: string; + minWindowDensity: number; + subWindowDensities: number[]; +}; + +export type TransactionInfo = { + status: string; + hash: string; + memo: string; + authorizationKind: string; +}; + +export type Events = { + eventData: Event[]; + blockInfo: BlockInfo; +}[]; + +export type ActionStates = { + actionStateOne: string; + actionStateTwo: string; + actionStateThree: string; + actionStateFour: string; + actionStateFive: string; +}; + +export type Actions = { + actionState: ActionStates; + actionData: Action[]; + blockInfo: BlockInfo; +}[]; diff --git a/src/models/utils.ts b/src/blockchain/utils.ts similarity index 88% rename from src/models/utils.ts rename to src/blockchain/utils.ts index 75b1476..43f2740 100644 --- a/src/models/utils.ts +++ b/src/blockchain/utils.ts @@ -1,10 +1,5 @@ -import type { - BlockInfo, - TransactionInfo, - Event, - Action, - ArchiveNodeDatabaseRow, -} from './types'; +import type { BlockInfo, TransactionInfo, Event, Action } from './types'; +import type { ArchiveNodeDatabaseRow } from 'src/db/sql/events-actions/types'; export function createBlockInfo(row: ArchiveNodeDatabaseRow): BlockInfo { return { diff --git a/src/consensus/config.ts b/src/consensus/config.ts index faf2bb9..c19ea32 100644 --- a/src/consensus/config.ts +++ b/src/consensus/config.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; + export { CONFIG }; type Config = { diff --git a/src/consensus/mina-consensus.ts b/src/consensus/mina-consensus.ts index a582980..0517569 100644 --- a/src/consensus/mina-consensus.ts +++ b/src/consensus/mina-consensus.ts @@ -1,6 +1,6 @@ import { CONFIG } from './config'; import { blake2bHex } from 'blakejs'; -import { type BlockInfo } from 'src/models/types'; +import { type BlockInfo } from 'src/blockchain/types'; export { select, getAllPredicate, filterBestTip }; diff --git a/src/db/archive-node-adapter/index.ts b/src/db/archive-node-adapter/archive-node-adapter.interface.ts similarity index 75% rename from src/db/archive-node-adapter/index.ts rename to src/db/archive-node-adapter/archive-node-adapter.interface.ts index 40add29..7b97c63 100644 --- a/src/db/archive-node-adapter/index.ts +++ b/src/db/archive-node-adapter/archive-node-adapter.interface.ts @@ -1,15 +1,18 @@ import postgres from 'postgres'; -import { Actions, Events } from 'src/models/types'; -import { getTables, USED_TABLES } from './queries'; -import type { DatabaseAdapter } from 'src/db/index'; +import type { Actions, Events } from 'src/blockchain/types'; +import type { DatabaseAdapter } from './archive-node-adapter'; import type { ActionFilterOptionsInput, EventFilterOptionsInput, } from 'src/resolvers-types'; -import { EventsService } from './events-service'; -import { ActionsService } from './actions-service'; -import { getTraceInfoFromOptions } from '../../tracing'; -import { TracingService } from '../../tracing/tracing'; +import { getTraceInfoFromOptions } from 'src/tracing'; +import { getTables, USED_TABLES } from 'src/db/sql/events-actions/queries'; +import { EventsService } from 'src/services/events-service/events-service'; +import { IEventsService } from 'src/services/events-service/events-service.interface'; +import { ActionsService } from 'src/services/actions-service/actions-service'; +import { IActionsService } from 'src/services/actions-service/actions-service.interface'; +import { TracingService } from 'src/services/tracing-service/tracing-service'; +import { ITracingService } from 'src/services/tracing-service/tracing-service.interface'; export class ArchiveNodeAdapter implements DatabaseAdapter { /** @@ -19,9 +22,9 @@ export class ArchiveNodeAdapter implements DatabaseAdapter { * `postgres.Sql` instance across the adapter is safe. */ private client: postgres.Sql; - private tracingService: TracingService | null; - private eventsService: EventsService | null; - private actionsService: ActionsService | null; + private tracingService: ITracingService | null; + private eventsService: IEventsService | null; + private actionsService: IActionsService | null; constructor(connectionString: string | undefined) { if (!connectionString) diff --git a/src/db/archive-node-adapter/archive-node-adapter.ts b/src/db/archive-node-adapter/archive-node-adapter.ts new file mode 100644 index 0000000..ca9a18e --- /dev/null +++ b/src/db/archive-node-adapter/archive-node-adapter.ts @@ -0,0 +1,12 @@ +import type { EventFilterOptionsInput } from 'src/resolvers-types'; +import type { Actions, Events } from 'src/blockchain/types'; + +export { DatabaseAdapter }; + +interface DatabaseAdapter { + getEvents(input: EventFilterOptionsInput, options?: unknown): Promise; + getActions( + input: EventFilterOptionsInput, + options?: unknown + ): Promise; +} diff --git a/src/db/index.ts b/src/db/index.ts deleted file mode 100644 index d1309b2..0000000 --- a/src/db/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { EventFilterOptionsInput } from '../resolvers-types'; -import type { Actions, Events } from '../models/types'; -import { ArchiveNodeAdapter } from './archive-node-adapter'; - -interface DatabaseAdapter { - getEvents(input: EventFilterOptionsInput, options?: unknown): Promise; - getActions( - input: EventFilterOptionsInput, - options?: unknown - ): Promise; -} - -export { DatabaseAdapter, ArchiveNodeAdapter }; diff --git a/src/db/archive-node-adapter/queries.ts b/src/db/sql/events-actions/queries.ts similarity index 98% rename from src/db/archive-node-adapter/queries.ts rename to src/db/sql/events-actions/queries.ts index 5d04b85..beacaa0 100644 --- a/src/db/archive-node-adapter/queries.ts +++ b/src/db/sql/events-actions/queries.ts @@ -1,6 +1,6 @@ import type postgres from 'postgres'; -import { ArchiveNodeDatabaseRow } from 'src/models/types'; -import { BlockStatusFilter } from '../../resolvers-types'; +import { ArchiveNodeDatabaseRow } from './types'; +import { BlockStatusFilter } from 'src/blockchain/types'; function fullChainCTE(db_client: postgres.Sql) { return db_client` diff --git a/src/models/types.ts b/src/db/sql/events-actions/types.ts similarity index 65% rename from src/models/types.ts rename to src/db/sql/events-actions/types.ts index 9516961..62bbb8e 100644 --- a/src/models/types.ts +++ b/src/db/sql/events-actions/types.ts @@ -1,70 +1,3 @@ -export const DEFAULT_TOKEN_ID = - 'wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf' as const; - -export type Transactions = Map; - -export type BlocksWithTransactionsMap = Map; - -export type FieldElementIdWithValueMap = Map; - -export enum BlockStatusFilter { - all = 'ALL', - pending = 'PENDING', - canonical = 'CANONICAL', -} - -export type Event = { - transactionInfo: TransactionInfo; - data: string[]; -}; - -export type Action = { - accountUpdateId: string; - transactionInfo: TransactionInfo; - data: string[]; -}; - -export type BlockInfo = { - height: number; - stateHash: string; - parentHash: string; - ledgerHash: string; - chainStatus: string; - timestamp: string; - globalSlotSinceHardfork: number; - globalSlotSinceGenesis: number; - distanceFromMaxBlockHeight: number; - lastVrfOutput: string; - minWindowDensity: number; - subWindowDensities: number[]; -}; - -export type TransactionInfo = { - status: string; - hash: string; - memo: string; - authorizationKind: string; -}; - -export type Events = { - eventData: Event[]; - blockInfo: BlockInfo; -}[]; - -export type ActionStates = { - actionStateOne: string; - actionStateTwo: string; - actionStateThree: string; - actionStateFour: string; - actionStateFive: string; -}; - -export type Actions = { - actionState: ActionStates; - actionData: Action[]; - blockInfo: BlockInfo; -}[]; - /** * Type representing a database row with detailed information related to the archive node. * This includes fields such as block-related hashes, account information, action states, and more. diff --git a/src/resolvers-types.ts b/src/resolvers-types.ts index 3ed483f..04c7bca 100644 --- a/src/resolvers-types.ts +++ b/src/resolvers-types.ts @@ -1,4 +1,4 @@ -import { BlockStatusFilter } from './models/types'; +import { BlockStatusFilter } from './blockchain/types'; import { GraphQLResolveInfo } from 'graphql'; import { GraphQLContext } from './context'; export type Maybe = T | null; diff --git a/src/services/actions-service/actions-service.interface.ts b/src/services/actions-service/actions-service.interface.ts new file mode 100644 index 0000000..9c32278 --- /dev/null +++ b/src/services/actions-service/actions-service.interface.ts @@ -0,0 +1,6 @@ +import { Actions } from 'src/blockchain/types'; +import { ActionFilterOptionsInput } from 'src/resolvers-types'; + +export interface IActionsService { + getActions(input: ActionFilterOptionsInput): Promise; +} diff --git a/src/db/archive-node-adapter/actions-service.ts b/src/services/actions-service/actions-service.ts similarity index 84% rename from src/db/archive-node-adapter/actions-service.ts rename to src/services/actions-service/actions-service.ts index 3bb114e..27ac8da 100644 --- a/src/db/archive-node-adapter/actions-service.ts +++ b/src/services/actions-service/actions-service.ts @@ -1,30 +1,32 @@ import type postgres from 'postgres'; + import { BlockStatusFilter, BlocksWithTransactionsMap, - DEFAULT_TOKEN_ID, FieldElementIdWithValueMap, Action, Actions, -} from '../../models/types'; -import { ActionFilterOptionsInput } from 'src/resolvers-types'; -import { TracingService } from 'src/tracing/tracing'; -import { getActionsQuery } from './queries'; +} from 'src/blockchain/types'; +import type { ActionFilterOptionsInput } from 'src/resolvers-types'; +import type { ITracingService } from 'src/services/tracing-service/tracing-service.interface'; +import { DEFAULT_TOKEN_ID } from 'src/blockchain/constants'; +import { createBlockInfo } from 'src/blockchain/utils'; +import { getActionsQuery } from 'src/db/sql/events-actions/queries'; import { partitionBlocks, getElementIdFieldValues, mapActionOrEvent, removeRedundantEmittedFields, sortAndFilterBlocks, -} from './utils'; -import { createBlockInfo } from '../../models/utils'; +} from 'src/services/utils/utils'; +import { IActionsService } from './actions-service.interface'; export { ActionsService }; -class ActionsService { +class ActionsService implements IActionsService { constructor( private client: postgres.Sql, - private tracingService: TracingService + private tracingService: ITracingService ) { this.client = client; this.tracingService = tracingService; diff --git a/src/services/events-service/events-service.interface.ts b/src/services/events-service/events-service.interface.ts new file mode 100644 index 0000000..d0c3869 --- /dev/null +++ b/src/services/events-service/events-service.interface.ts @@ -0,0 +1,6 @@ +import { Events } from 'src/blockchain/types'; +import { EventFilterOptionsInput } from 'src/resolvers-types'; + +export interface IEventsService { + getEvents(input: EventFilterOptionsInput): Promise; +} diff --git a/src/db/archive-node-adapter/events-service.ts b/src/services/events-service/events-service.ts similarity index 80% rename from src/db/archive-node-adapter/events-service.ts rename to src/services/events-service/events-service.ts index e233371..4caa431 100644 --- a/src/db/archive-node-adapter/events-service.ts +++ b/src/services/events-service/events-service.ts @@ -2,34 +2,35 @@ import type postgres from 'postgres'; import { BlockStatusFilter, BlocksWithTransactionsMap, - DEFAULT_TOKEN_ID, FieldElementIdWithValueMap, Events, Event, -} from '../../models/types'; -import { EventFilterOptionsInput } from 'src/resolvers-types'; -import { TracingService } from 'src/tracing/tracing'; -import { getEventsQuery } from './queries'; +} from 'src/blockchain/types'; +import type { ITracingService } from 'src/services/tracing-service/tracing-service.interface'; +import type { EventFilterOptionsInput } from 'src/resolvers-types'; +import { createBlockInfo } from 'src/blockchain/utils'; +import { DEFAULT_TOKEN_ID } from 'src/blockchain/constants'; +import { getEventsQuery } from 'src/db/sql/events-actions/queries'; import { partitionBlocks, getElementIdFieldValues, mapActionOrEvent, removeRedundantEmittedFields, sortAndFilterBlocks, -} from './utils'; -import { createBlockInfo } from '../../models/utils'; +} from 'src/services/utils/utils'; +import { IEventsService } from './events-service.interface'; export { EventsService }; -class EventsService { +class EventsService implements IEventsService { constructor( private client: postgres.Sql, - private tracingService: TracingService + private tracingService: ITracingService ) { this.client = client; } - setTracingService(tracingService: TracingService) { + setTracingService(tracingService: ITracingService) { this.tracingService = tracingService; } diff --git a/src/services/tracing-service/tracing-service.interface.ts b/src/services/tracing-service/tracing-service.interface.ts new file mode 100644 index 0000000..afd8672 --- /dev/null +++ b/src/services/tracing-service/tracing-service.interface.ts @@ -0,0 +1,4 @@ +export interface ITracingService { + startSpan(name: string): void; + endSpan(): void; +} diff --git a/src/tracing/tracing.ts b/src/services/tracing-service/tracing-service.ts similarity index 72% rename from src/tracing/tracing.ts rename to src/services/tracing-service/tracing-service.ts index 4889b72..dc7e009 100644 --- a/src/tracing/tracing.ts +++ b/src/services/tracing-service/tracing-service.ts @@ -1,9 +1,10 @@ -import { TraceInfo } from './index'; -import { Span } from '@opentelemetry/api'; +import type { Span } from '@opentelemetry/api'; +import type { TraceInfo } from 'src/tracing'; +import type { ITracingService } from './tracing-service.interface'; export { TracingService }; -class TracingService { +class TracingService implements ITracingService { private spanStack: Span[]; private traceInfo: TraceInfo; diff --git a/src/db/archive-node-adapter/utils.ts b/src/services/utils/utils.ts similarity index 97% rename from src/db/archive-node-adapter/utils.ts rename to src/services/utils/utils.ts index 955e85f..1813d89 100644 --- a/src/db/archive-node-adapter/utils.ts +++ b/src/services/utils/utils.ts @@ -1,17 +1,17 @@ -import { +import type { Action, Event, - ArchiveNodeDatabaseRow, BlocksWithTransactionsMap, FieldElementIdWithValueMap, BlockInfo, -} from 'src/models/types'; +} from 'src/blockchain/types'; +import type { ArchiveNodeDatabaseRow } from 'src/db/sql/events-actions/types'; import { createTransactionInfo, createEvent, createAction, -} from '../../models/utils'; -import { filterBestTip } from '../../consensus/mina-consensus'; +} from 'src/blockchain/utils'; +import { filterBestTip } from 'src/consensus/mina-consensus'; export { partitionBlocks, diff --git a/tests/consensus/select-consensus-precomputed.ts b/tests/consensus/select-consensus-precomputed.ts index 6427b8f..a6f9976 100644 --- a/tests/consensus/select-consensus-precomputed.ts +++ b/tests/consensus/select-consensus-precomputed.ts @@ -4,9 +4,10 @@ import fs from 'fs'; import path from 'path'; -import { BlockInfo } from '../../src/models/types'; -import { BlockFileOutput, GetSlot, PrecomputedBlock } from './types'; + import { select } from '../../src/consensus/mina-consensus'; +import type { BlockInfo } from '../../src/blockchain/types'; +import { type BlockFileOutput, type PrecomputedBlock, GetSlot } from './types'; const outputDir = process.env.OUTPUT_DIR || 'ts_blocks';