Skip to content

Commit

Permalink
feat: middleware class
Browse files Browse the repository at this point in the history
  • Loading branch information
shuffledex committed Nov 24, 2020
1 parent f083411 commit 3bc59bd
Show file tree
Hide file tree
Showing 3 changed files with 148 additions and 0 deletions.
102 changes: 102 additions & 0 deletions src/Middleware.ts
@@ -0,0 +1,102 @@
import BigNumber from 'bignumber.js';

import { Context } from '~/base';
import { eventByIndexedArgs } from '~/middleware/queries';
import { EventIdEnum, ModuleIdEnum, Query } from '~/middleware/types';
import { Ensured, EventIdentifier, ResultSet } from '~/types';

/**
* Handles all Middleware related functionality
*/
export class Middleware {
private context: Context;

/**
* @hidden
*/
constructor(context: Context) {
this.context = context;
}

/**
* Retrieve a single event by any of its indexed arguments Can be filtered using parameters
*
* @param opts.moduleId - type of the module to fetch
* @param opts.eventId - type of the event to fetch
* @param opts.eventArg0 - event value to filter in position 0
* @param opts.eventArg1 - event value to filter in position 1
* @param opts.eventArg2 - event value to filter in position 2
*/
public async getEventByIndexedArgs(opts: {
moduleId: ModuleIdEnum;
eventId: EventIdEnum;
eventArg0?: string;
eventArg1?: string;
eventArg2?: string;
}): Promise<EventIdentifier | null> {
const { context } = this;

const { moduleId, eventId, eventArg0, eventArg1, eventArg2 } = opts;

const result = await context.queryMiddleware<Ensured<Query, 'eventByIndexedArgs'>>(
eventByIndexedArgs({
moduleId,
eventId,
eventArg0,
eventArg1,
eventArg2,
})
);

if (result.data.eventByIndexedArgs) {
/* eslint-disable @typescript-eslint/no-non-null-assertion */
return {
blockNumber: new BigNumber(result.data.eventByIndexedArgs.block_id),
blockDate: result.data.eventByIndexedArgs.block!.datetime,
eventIndex: result.data.eventByIndexedArgs.event_idx,
};
/* eslint-enabled @typescript-eslint/no-non-null-assertion */
}

return null;
}

/**
* Retrieve a list of event indentifiers. Can be filtered using parameters
*
* @param opts.moduleId - type of the module to fetch
* @param opts.eventId - type of the event to fetch
* @param opts.eventArg0 - event value to filter in position 0
* @param opts.eventArg1 - event value to filter in position 1
* @param opts.eventArg2 - event value to filter in position 2
* @param opts.size - page size
* @param opts.start - page offset
*/
public async getEventsByIndexedArgs(opts: {
moduleId: ModuleIdEnum;
eventId: EventIdEnum;
eventArg0?: string;
eventArg1?: string;
eventArg2?: string;
size?: number;
start?: number;
}): Promise<ResultSet<EventIdentifier> | null> {
const { context } = this;

const { moduleId, eventId, eventArg0, eventArg1, eventArg2, size, start } = opts;

const result = await context.queryMiddleware<Ensured<Query, 'eventsByIndexedArgs'>>(
eventsByIndexedArgs({
moduleId,
eventId,
eventArg0,
eventArg1,
eventArg2,
count: size,
skip: start,
})
);

//
}
}
3 changes: 3 additions & 0 deletions src/Polymesh.ts
Expand Up @@ -47,6 +47,7 @@ import { getDid, stringIsClean } from '~/utils/internal';

import { Claims } from './Claims';
// import { Governance } from './Governance';
import { Middleware } from './Middleware';
import { TREASURY_MODULE_ADDRESS } from './utils/constants';

interface ConnectParamsBase {
Expand Down Expand Up @@ -75,6 +76,7 @@ export class Polymesh {
// NOTE uncomment in Governance v2 upgrade
// public governance: Governance;
public claims: Claims;
public middleware: Middleware;

/**
* @hidden
Expand All @@ -85,6 +87,7 @@ export class Polymesh {
// NOTE uncomment in Governance v2 upgrade
// this.governance = new Governance(context);
this.claims = new Claims(context);
this.middleware = new Middleware(context);
}

/**
Expand Down
43 changes: 43 additions & 0 deletions src/middleware/queries.ts
Expand Up @@ -140,6 +140,49 @@ export function eventByIndexedArgs(
};
}

/**
* @hidden
*
* Get all events by any of its indexed arguments
*/
export function eventsByIndexedArgs(
variables: QueryEventsByIndexedArgsArgs
): GraphqlQuery<QueryEventsByIndexedArgsArgs> {
const query = gql`
query EventsByIndexedArgsQuery(
$moduleId: ModuleIdEnum!
$eventId: EventIdEnum!
$eventArg0: String
$eventArg1: String
$eventArg2: String
$count: Int
$skip: Int
) {
eventsByIndexedArgs(
moduleId: $moduleId
eventId: $eventId
eventArg0: $eventArg0
eventArg1: $eventArg1
eventArg2: $eventArg2
count: $count
skip: $skip
) {
block_id
event_idx
extrinsic_idx
block {
datetime
}
}
}
`;

return {
query,
variables,
};
}

/**
* @hidden
*
Expand Down

0 comments on commit 3bc59bd

Please sign in to comment.