diff --git a/src/indexer/events/opinion-requestor/commands/opinion-requested/opinion-requested.command.ts b/src/indexer/events/opinion-requestor/commands/opinion-requested/opinion-requested.command.ts new file mode 100644 index 00000000..9ad0e6c3 --- /dev/null +++ b/src/indexer/events/opinion-requestor/commands/opinion-requested/opinion-requested.command.ts @@ -0,0 +1,11 @@ +import { BlockMetaData } from '../../../../models/block-meta-data'; +import { OpinionRequestor } from '@indexer/models/opinion-requestor'; + +export class OpinionRequestedCommandIndexer { + accountId: string; + opinionRequestor: OpinionRequestor; + constructor(data: Array, public readonly blockMetaData: BlockMetaData) { + this.accountId = data[0].toString(); + this.opinionRequestor = new OpinionRequestor(data[1].toHuman()); + } +} diff --git a/src/indexer/events/opinion-requestor/commands/opinion-requested/opinion-requested.handler.ts b/src/indexer/events/opinion-requestor/commands/opinion-requested/opinion-requested.handler.ts new file mode 100644 index 00000000..1feb0b81 --- /dev/null +++ b/src/indexer/events/opinion-requestor/commands/opinion-requested/opinion-requested.handler.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { ElasticsearchService } from '@nestjs/elasticsearch'; +import { OpinionRequestedCommandIndexer } from './opinion-requested.command'; + +@Injectable() +@CommandHandler(OpinionRequestedCommandIndexer) +export class OpinionRequestedHandler + implements ICommandHandler +{ + constructor(private readonly elasticsearchService: ElasticsearchService) {} + + async execute(command: OpinionRequestedCommandIndexer) { + const { opinionRequestor, blockMetaData } = command; + + await this.elasticsearchService.create({ + index: 'opinion-requestor', + id: opinionRequestor.id, + refresh: 'wait_for', + body: { + ...opinionRequestor, + blockMetaData: blockMetaData, + }, + }); + } +} diff --git a/src/indexer/events/opinion-requestor/commands/opinion-requestor-info-updated/opinion-requestor-info-updated.command.ts b/src/indexer/events/opinion-requestor/commands/opinion-requestor-info-updated/opinion-requestor-info-updated.command.ts new file mode 100644 index 00000000..fa818350 --- /dev/null +++ b/src/indexer/events/opinion-requestor/commands/opinion-requestor-info-updated/opinion-requestor-info-updated.command.ts @@ -0,0 +1,11 @@ +import { BlockMetaData } from '../../../../models/block-meta-data'; +import { OpinionRequestor } from '@indexer/models/opinion-requestor'; + +export class OpinionRequestorInfoUpdatedCommandIndexer { + accountId: string; + opinionRequestor: OpinionRequestor; + constructor(data: Array, public readonly blockMetaData: BlockMetaData) { + this.accountId = data[0].toString(); + this.opinionRequestor = new OpinionRequestor(data[1].toHuman()); + } +} diff --git a/src/indexer/events/opinion-requestor/commands/opinion-requestor-info-updated/opinion-requestor-info-updated.handler.ts b/src/indexer/events/opinion-requestor/commands/opinion-requestor-info-updated/opinion-requestor-info-updated.handler.ts new file mode 100644 index 00000000..386493b1 --- /dev/null +++ b/src/indexer/events/opinion-requestor/commands/opinion-requestor-info-updated/opinion-requestor-info-updated.handler.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@nestjs/common'; +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { ElasticsearchService } from '@nestjs/elasticsearch'; +import { OpinionRequestorInfoUpdatedCommandIndexer } from './opinion-requestor-info-updated.command'; + +@Injectable() +@CommandHandler(OpinionRequestorInfoUpdatedCommandIndexer) +export class OpinionRequestorInfoUpdatedHandler + implements ICommandHandler +{ + constructor(private readonly elasticsearchService: ElasticsearchService) {} + + async execute(command: OpinionRequestorInfoUpdatedCommandIndexer) { + const { opinionRequestor, blockMetaData } = command; + + await this.elasticsearchService.update({ + index: 'opinion-requestor', + id: opinionRequestor.id, + refresh: 'wait_for', + body: { + doc: { + blockMetaData: blockMetaData, + }, + }, + }); + } +} diff --git a/src/indexer/events/opinion-requestor/index.ts b/src/indexer/events/opinion-requestor/index.ts new file mode 100644 index 00000000..8232d92d --- /dev/null +++ b/src/indexer/events/opinion-requestor/index.ts @@ -0,0 +1,10 @@ +export * from './commands/opinion-requested/opinion-requested.command'; +export * from './commands/opinion-requestor-info-updated/opinion-requestor-info-updated.command'; + +import { OpinionRequestedHandler } from './commands/opinion-requested/opinion-requested.handler'; +import { OpinionRequestorInfoUpdatedHandler } from './commands/opinion-requestor-info-updated/opinion-requestor-info-updated.handler'; + +export const OpinionRequestorCommandHandlers = [ + OpinionRequestedHandler, + OpinionRequestorInfoUpdatedHandler, +]; diff --git a/src/indexer/events/opinion/commands/opinion-added/opinion-added.command.ts b/src/indexer/events/opinion/commands/opinion-added/opinion-added.command.ts new file mode 100644 index 00000000..1a9ef771 --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-added/opinion-added.command.ts @@ -0,0 +1,11 @@ +import { BlockMetaData } from '../../../../models/block-meta-data'; +import { Opinion } from '@indexer/models/opinion'; + +export class OpinionAddedCommandIndexer { + accountId: string; + opinion: Opinion; + constructor(data: Array, public readonly blockMetaData: BlockMetaData) { + this.accountId = data[0].toString(); + this.opinion = new Opinion(data[1].toHuman()); + } +} diff --git a/src/indexer/events/opinion/commands/opinion-added/opinion-added.handler.ts b/src/indexer/events/opinion/commands/opinion-added/opinion-added.handler.ts new file mode 100644 index 00000000..0add7f93 --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-added/opinion-added.handler.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { ElasticsearchService } from '@nestjs/elasticsearch'; +import { OpinionAddedCommandIndexer } from './opinion-added.command'; + +@Injectable() +@CommandHandler(OpinionAddedCommandIndexer) +export class OpinionAddedHandler + implements ICommandHandler +{ + constructor(private readonly elasticsearchService: ElasticsearchService) {} + + async execute(command: OpinionAddedCommandIndexer) { + const { opinion, blockMetaData } = command; + + await this.elasticsearchService.create({ + index: 'opinion', + id: opinion.id, + refresh: 'wait_for', + body: { + ...opinion, + blockMetaData: blockMetaData, + }, + }); + } +} diff --git a/src/indexer/events/opinion/commands/opinion-removed/opinion-removed.command.ts b/src/indexer/events/opinion/commands/opinion-removed/opinion-removed.command.ts new file mode 100644 index 00000000..81665940 --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-removed/opinion-removed.command.ts @@ -0,0 +1,10 @@ +import { BlockMetaData } from '../../../../models/block-meta-data'; + +export class OpinionRemovedCommandIndexer { + accountId: string; + hash: string; + constructor(data: Array, public readonly blockMetaData: BlockMetaData) { + this.accountId = data[0].toString(); + this.hash = data[1].toString(); + } +} diff --git a/src/indexer/events/opinion/commands/opinion-removed/opinion-removed.handler.ts b/src/indexer/events/opinion/commands/opinion-removed/opinion-removed.handler.ts new file mode 100644 index 00000000..4d3fc38e --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-removed/opinion-removed.handler.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@nestjs/common'; +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { ElasticsearchService } from '@nestjs/elasticsearch'; +import { OpinionRemovedCommandIndexer } from './opinion-removed.command'; + +@Injectable() +@CommandHandler(OpinionRemovedCommandIndexer) +export class OpinionRemovedHandler + implements ICommandHandler +{ + constructor(private readonly elasticsearchService: ElasticsearchService) {} + + async execute(command: OpinionRemovedCommandIndexer) { + const { hash } = command; + + await this.elasticsearchService.delete({ + index: 'opinion', + id: hash, + }); + } +} diff --git a/src/indexer/events/opinion/commands/opinion-status-updated/opinion-status-updated.command.ts b/src/indexer/events/opinion/commands/opinion-status-updated/opinion-status-updated.command.ts new file mode 100644 index 00000000..fd51926d --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-status-updated/opinion-status-updated.command.ts @@ -0,0 +1,12 @@ +import { BlockMetaData } from '../../../../models/block-meta-data'; + +export class OpinionStatusUpdatedCommandIndexer { + accountId: string; + hash: string; + status: string; + constructor(data: Array, public readonly blockMetaData: BlockMetaData) { + this.accountId = data[0].toString(); + this.hash = data[1].toString(); + this.status = data[2].toString(); + } +} diff --git a/src/indexer/events/opinion/commands/opinion-status-updated/opinion-status-updated.handler.ts b/src/indexer/events/opinion/commands/opinion-status-updated/opinion-status-updated.handler.ts new file mode 100644 index 00000000..896a63da --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-status-updated/opinion-status-updated.handler.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@nestjs/common'; +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { ElasticsearchService } from '@nestjs/elasticsearch'; +import { OpinionStatusUpdatedCommandIndexer } from './opinion-status-updated.command'; + +@Injectable() +@CommandHandler(OpinionStatusUpdatedCommandIndexer) +export class OpinionStatusUpdatedHandler + implements ICommandHandler +{ + constructor(private readonly elasticsearchService: ElasticsearchService) {} + + async execute(command: OpinionStatusUpdatedCommandIndexer) { + const { hash, status, blockMetaData } = command; + + await this.elasticsearchService.update({ + index: 'opinion', + id: hash, + refresh: 'wait_for', + body: { + doc: { + status: status, + blockMetaData: blockMetaData, + }, + }, + }); + } +} diff --git a/src/indexer/events/opinion/commands/opinion-updated/opinion-updated.command.ts b/src/indexer/events/opinion/commands/opinion-updated/opinion-updated.command.ts new file mode 100644 index 00000000..0e4049c6 --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-updated/opinion-updated.command.ts @@ -0,0 +1,11 @@ +import { BlockMetaData } from '../../../../models/block-meta-data'; +import { Opinion } from '@indexer/models/opinion'; + +export class OpinionUpdatedCommandIndexer { + accountId: string; + opinion: Opinion; + constructor(data: Array, public readonly blockMetaData: BlockMetaData) { + this.accountId = data[0].toString(); + this.opinion = new Opinion(data[1].toHuman()); + } +} diff --git a/src/indexer/events/opinion/commands/opinion-updated/opinion-updated.handler.ts b/src/indexer/events/opinion/commands/opinion-updated/opinion-updated.handler.ts new file mode 100644 index 00000000..af83fdef --- /dev/null +++ b/src/indexer/events/opinion/commands/opinion-updated/opinion-updated.handler.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { ElasticsearchService } from '@nestjs/elasticsearch'; +import { OpinionUpdatedCommandIndexer } from './opinion-updated.command'; + +@Injectable() +@CommandHandler(OpinionUpdatedCommandIndexer) +export class OpinionUpdatedHandler + implements ICommandHandler +{ + constructor(private readonly elasticsearchService: ElasticsearchService) {} + + async execute(command: OpinionUpdatedCommandIndexer) { + const { + opinion: { info, id }, + blockMetaData, + } = command; + + await this.elasticsearchService.update({ + index: 'opinion', + id: id, + refresh: 'wait_for', + body: { + doc: { + info: { + ...info, + }, + blockMetaData: blockMetaData, + }, + }, + }); + } +} diff --git a/src/indexer/events/opinion/index.ts b/src/indexer/events/opinion/index.ts new file mode 100644 index 00000000..07a0f09a --- /dev/null +++ b/src/indexer/events/opinion/index.ts @@ -0,0 +1,16 @@ +export * from './commands/opinion-added/opinion-added.command'; +export * from './commands/opinion-removed/opinion-removed.command'; +export * from './commands/opinion-status-updated/opinion-status-updated.command'; +export * from './commands/opinion-updated/opinion-updated.command'; + +import { OpinionAddedHandler } from './commands/opinion-added/opinion-added.handler'; +import { OpinionRemovedHandler } from './commands/opinion-removed/opinion-removed.handler'; +import { OpinionStatusUpdatedHandler } from './commands/opinion-status-updated/opinion-status-updated.handler'; +import { OpinionUpdatedHandler } from './commands/opinion-updated/opinion-updated.handler'; + +export const OpinionCommandHandlers = [ + OpinionAddedHandler, + OpinionRemovedHandler, + OpinionStatusUpdatedHandler, + OpinionUpdatedHandler, +]; diff --git a/src/indexer/indexer.handler.ts b/src/indexer/indexer.handler.ts index 78ac2044..36efd1c9 100644 --- a/src/indexer/indexer.handler.ts +++ b/src/indexer/indexer.handler.ts @@ -381,6 +381,8 @@ export class IndexerHandler 'menstrual-cycle-log', 'menstrual-subscription', 'health-professional', + 'opinion', + 'opinion-requestor', ]; for (const i of indices) { diff --git a/src/indexer/indexer.module.ts b/src/indexer/indexer.module.ts index 5c8eafbf..3a7be5e8 100644 --- a/src/indexer/indexer.module.ts +++ b/src/indexer/indexer.module.ts @@ -18,6 +18,8 @@ import { GeneticAnalysisOrderCommandHandlers } from './events/genetic-analysis-o import { MenstrualCalendarCommandHandlers } from './events/menstrual-calendar'; import { MenstrualSubscriptionCommandHandlers } from './events/menstrual-subscription'; import { HealthProfessionalHandlers } from './events/health-professional'; +import { OpinionCommandHandlers } from './events/opinion'; +import { OpinionRequestorCommandHandlers } from './events/opinion-requestor'; // eslint-disable-next-line @typescript-eslint/no-var-requires require('dotenv').config(); @@ -43,6 +45,8 @@ require('dotenv').config(); ...MenstrualCalendarCommandHandlers, ...MenstrualSubscriptionCommandHandlers, ...HealthProfessionalHandlers, + ...OpinionCommandHandlers, + ...OpinionRequestorCommandHandlers, ], }) export class IndexerModule {} diff --git a/src/indexer/indexer.routes.ts b/src/indexer/indexer.routes.ts index 15245bd7..99df5565 100644 --- a/src/indexer/indexer.routes.ts +++ b/src/indexer/indexer.routes.ts @@ -94,6 +94,16 @@ import { HealthProfessionalUnstakedCommandIndexer, HealthProfessionalVerificationStatusCommandIndexer, } from './events/health-professional'; +import { + OpinionAddedCommandIndexer, + OpinionRemovedCommandIndexer, + OpinionStatusUpdatedCommandIndexer, + OpinionUpdatedCommandIndexer, +} from './events/opinion'; +import { + OpinionRequestedCommandIndexer, + OpinionRequestorInfoUpdatedCommandIndexer, +} from './events/opinion-requestor'; export const eventRoutes = { certifications: { @@ -207,4 +217,14 @@ export const eventRoutes = { HealthProfessionalUnstakedAmount: HealthProfessionalUnstakedAmountCommandIndexer, }, + opinion: { + OpinionAdded: OpinionAddedCommandIndexer, + OpinionUpdated: OpinionUpdatedCommandIndexer, + OpinionRemoved: OpinionRemovedCommandIndexer, + OpinionStatusUpdated: OpinionStatusUpdatedCommandIndexer, + }, + opinionRequestor: { + OpinionRequested: OpinionRequestedCommandIndexer, + OpinionRequestorInfoUpdated: OpinionRequestorInfoUpdatedCommandIndexer, + }, }; diff --git a/src/indexer/models/opinion-requestor/index.ts b/src/indexer/models/opinion-requestor/index.ts new file mode 100644 index 00000000..2a73825a --- /dev/null +++ b/src/indexer/models/opinion-requestor/index.ts @@ -0,0 +1,21 @@ +import { RequestorInfo } from './info'; + +export class OpinionRequestor { + constructor(data: any) { + this.id = data.id; + this.account_id = data.account_id; + this.info = new RequestorInfo(data.info); + this.created_at = data.created_at + ? new Date(Number(String(data.created_at).split(',').join(''))) + : null; + this.updated_at = data.updated_at + ? new Date(Number(String(data.updated_at).split(',').join(''))) + : null; + } + + id: string; + account_id: string; + info: RequestorInfo; + created_at: Date; + updated_at: Date; +} diff --git a/src/indexer/models/opinion-requestor/info.ts b/src/indexer/models/opinion-requestor/info.ts new file mode 100644 index 00000000..d1946a40 --- /dev/null +++ b/src/indexer/models/opinion-requestor/info.ts @@ -0,0 +1,15 @@ +export class RequestorInfo { + constructor(data: any) { + this.category = data.category; + this.description = data.description; + this.genetic_data_ids = data.genetic_data_ids; + this.opinion_ids = data.opinion_ids; + this.myriad_url = data.myriad_url; + } + + category: string; + description: string; + genetic_data_ids: string[]; + opinion_ids: string[]; + myriad_url: string; +} diff --git a/src/indexer/models/opinion/index.ts b/src/indexer/models/opinion/index.ts new file mode 100644 index 00000000..8a645926 --- /dev/null +++ b/src/indexer/models/opinion/index.ts @@ -0,0 +1,19 @@ +import { OpinionInfo } from './info'; + +export class Opinion { + constructor(data: any) { + this.id = data.id; + this.requestor_id = data.requestor_id; + this.professional_id = data.professional_id; + this.info = new OpinionInfo(data.info); + this.status = data.status; + this.created_at = data.created_at; + } + + id: string; + requestor_id: string; + professional_id: string; + info: OpinionInfo; + status: string; + created_at: Date; +} diff --git a/src/indexer/models/opinion/info.ts b/src/indexer/models/opinion/info.ts new file mode 100644 index 00000000..7cd32dd4 --- /dev/null +++ b/src/indexer/models/opinion/info.ts @@ -0,0 +1,17 @@ +import { CurrencyType } from '../currency-type'; + +export class OpinionInfo { + constructor(data: any) { + this.description = data.description; + this.myriad_url = data.myriad_url; + this.asset_id = data.asset_id; + this.currency = data.currency; + this.amount = data.amount; + } + + description: string; + myriad_url: string; + asset_id: number; + currency: CurrencyType; + amount: string; +}