Skip to content

Commit b39afda

Browse files
committed
Wip: add types to revisionData in node builder
1 parent 975d72d commit b39afda

File tree

8 files changed

+159
-89
lines changed

8 files changed

+159
-89
lines changed

dev/resolvers/query.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,23 @@ const query: {
5858
.where({id: args.id})
5959
.first()) as {id: string; name: string};
6060

61-
return await versionConnection<QueryTeamResolver>(currentNode, [parent, args, ctx, info], {
62-
knex: ctx.sqlClient,
63-
// nodeBuilder,
64-
nodeBuilder: (previousNode, versionInfo: IAllNodeBuilderVersionInfo<number>) => {
65-
if (typeGuards.isNodeBuilderNodeChangeVersionInfo(versionInfo)) {
66-
const a = versionInfo.revisionData;
67-
return {...previousNode, ...a};
68-
}
69-
return previousNode;
70-
},
71-
nodeId: args.id,
72-
nodeName: 'team'
73-
});
61+
return await versionConnection<QueryTeamResolver, {id: 'hi'}>(
62+
currentNode,
63+
[parent, args, ctx, info],
64+
{
65+
knex: ctx.sqlClient,
66+
// nodeBuilder,
67+
nodeBuilder: (previousNode, versionInfo) => {
68+
if (typeGuards.isNodeBuilderNodeChangeVersionInfo(versionInfo)) {
69+
const a = versionInfo.revisionData;
70+
return {...previousNode, ...a};
71+
}
72+
return previousNode;
73+
},
74+
nodeId: args.id,
75+
nodeName: 'team'
76+
}
77+
);
7478
},
7579
async todoList(parent, args, ctx, info) {
7680
const currentNode = await ctx.sqlClient

src/data_accessors/sql/query_time_range_of_version_connection.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@ import {
66
ITableAndColumnNames,
77
IVersionConnectionInfo,
88
NodeInConnection,
9-
ILoggerConfig
9+
ILoggerConfig,
10+
IVersionConnection,
11+
ExtractNodeFromVersionConnection,
12+
UnPromisify
1013
} from '../../types';
1114
import {castDateToUTCSeconds, unixSecondsToSqlTimestamp} from '../../lib/time';
1215
import {getLoggerFromConfig} from '../../logger';
1316
/**
1417
* Fetch the number of full node snapshots for the node id and node schema version
1518
* If a snapshot exists within the expected snapshot frequency, then we don't need to take another snapshot
1619
*/
17-
export default async <ResolverT extends (...args: [any, any, any, any]) => any>(
20+
export default async <
21+
ResolverT extends (...args: [any, any, any, any]) => Promise<IVersionConnection<any>>,
22+
Snapshot = ExtractNodeFromVersionConnection<UnPromisify<ReturnType<ResolverT>>>
23+
>(
1824
knex: Knex,
1925
tableAndColumnNames: ITableAndColumnNames,
2026
resolverArgs: Parameters<ResolverT>,
21-
nodesInVersionConnection: NodeInConnection[],
27+
nodesInVersionConnection: Array<NodeInConnection<Snapshot>>,
2228
allNodeInstancesInConnection: Array<
2329
Pick<IVersionConnectionInfo<ResolverT>, 'nodeId' | 'nodeName'>
2430
>,
@@ -66,7 +72,7 @@ export default async <ResolverT extends (...args: [any, any, any, any]) => any>(
6672
// Filter out any nodes that have snapshots
6773
const oldestNodes = (oldestNodesWithPossibilityOfSnapshots
6874
? oldestNodesWithPossibilityOfSnapshots.filter(node => node && node.snapshot == null) // tslint:disable-line
69-
: []) as NodeInConnection[] | undefined;
75+
: []) as Array<NodeInConnection<Snapshot>> | undefined;
7076

7177
logger.debug(
7278
'Number of node types that dont have snapshots in initial connection',
@@ -85,7 +91,7 @@ export default async <ResolverT extends (...args: [any, any, any, any]) => any>(
8591
};
8692
}
8793
// Determine the oldest version with a full node snapshot
88-
const oldestCreatedAt = await getMinCreatedAtOfVersionWithSnapshot(
94+
const oldestCreatedAt = await getMinCreatedAtOfVersionWithSnapshot<Snapshot>(
8995
knex,
9096
tableAndColumnNames,
9197
oldestNodes,
@@ -115,10 +121,10 @@ export default async <ResolverT extends (...args: [any, any, any, any]) => any>(
115121
* Gets the closest revision with a snapshot to the oldest revision of interest
116122
* This will be the initial snapshot that full nodes are calculated off of
117123
*/
118-
const getMinCreatedAtOfVersionWithSnapshot = async (
124+
const getMinCreatedAtOfVersionWithSnapshot = async <Snapshot>(
119125
knex: Knex,
120126
{table_names, event, node_snapshot}: ITableAndColumnNames,
121-
oldestNodes: NodeInConnection[],
127+
oldestNodes: Array<NodeInConnection<Snapshot>>,
122128
logger?: ILoggerConfig['logger']
123129
): Promise<number | undefined> => {
124130
logger && logger.debug('Querying oldest snapshots for nodes:', oldestNodes); // tslint:disable-line

src/data_accessors/sql/query_version_connection.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import {
1212
IGqlVersionNode,
1313
IVersionConnectionInfo,
1414
NodeInConnection,
15-
ILoggerConfig
15+
ILoggerConfig,
16+
ExtractNodeFromVersionConnection,
17+
UnPromisify,
18+
IVersionConnection
1619
} from '../../types';
1720
import {unixSecondsToSqlTimestamp, castDateToUTCSeconds} from '../../lib/time';
1821
import {getLoggerFromConfig} from '../../logger';
@@ -47,7 +50,9 @@ const castNodeWithRevisionTimeInDateTimeToUnixSecs = (logger?: ILoggerConfig['lo
4750
};
4851
};
4952

50-
type NodesInConnectionUnprocessed = Array<NodeInConnection & {roleName: string}>;
53+
type NodesInConnectionUnprocessed<Snapshot> = Array<
54+
NodeInConnection<Snapshot> & {roleName: string}
55+
>;
5156

5257
const nodeTransformer = (logger?: ILoggerConfig['logger']) => {
5358
const firstTransformer = castNodeWithRevisionTimeInDateTimeToUnixSecs(logger);
@@ -65,7 +70,10 @@ const nodeTransformer = (logger?: ILoggerConfig['logger']) => {
6570
};
6671
};
6772

68-
export default async <ResolverT extends (...args: any[]) => any>(
73+
export default async <
74+
ResolverT extends (...args: any[]) => Promise<IVersionConnection<any>>,
75+
Snapshot = ExtractNodeFromVersionConnection<UnPromisify<ReturnType<ResolverT>>>
76+
>(
6977
connectionInputs: IInputArgs,
7078
knex: Knex,
7179
{
@@ -83,7 +91,13 @@ export default async <ResolverT extends (...args: any[]) => any>(
8391
loggerConfig?: ILoggerConfig
8492
): // INamesForTablesAndColumns,
8593
// extractors: IVersionConnectionExtractors<ResolverT>
86-
Promise<IQueryResult<NodeInConnection & {snapshot?: string}>> => {
94+
Promise<
95+
IQueryResult<
96+
NodeInConnection<Snapshot> & {
97+
snapshot?: Snapshot;
98+
}
99+
>
100+
> => {
87101
const parentLogger = getLoggerFromConfig(loggerConfig);
88102
const logger = parentLogger.child({query: 'Version connection'});
89103

@@ -210,8 +224,8 @@ Promise<IQueryResult<NodeInConnection & {snapshot?: string}>> => {
210224
.orderBy(`main.id`, 'desc');
211225

212226
logger.debug('Raw SQL:', logger.level === 'debug' && query.toQuery());
213-
const nodeResult = (await query) as NodesInConnectionUnprocessed;
214-
const uniqueVersions = aggregateVersionsById(nodeResult);
227+
const nodeResult = (await query) as NodesInConnectionUnprocessed<Snapshot>;
228+
const uniqueVersions = aggregateVersionsById<Snapshot>(nodeResult);
215229
nodeConnection.addResult(uniqueVersions);
216230
const {pageInfo, edges} = nodeConnection;
217231
return {pageInfo, edges};
@@ -222,8 +236,8 @@ Promise<IQueryResult<NodeInConnection & {snapshot?: string}>> => {
222236
* for each user role. Thus, we need to combine user roles together into an array for
223237
* each duplicate of a revision.
224238
*/
225-
const aggregateVersionsById = (
226-
nodeVersions: NodesInConnectionUnprocessed,
239+
const aggregateVersionsById = <Snapshot>(
240+
nodeVersions: NodesInConnectionUnprocessed<Snapshot>,
227241
_logger?: ILoggerConfig['logger']
228242
) => {
229243
// extract all the user roles for the version
@@ -259,7 +273,7 @@ const aggregateVersionsById = (
259273
return uniqueVersions;
260274
},
261275
{} as {
262-
[id: string]: NodeInConnection;
276+
[id: string]: NodeInConnection<Snapshot>;
263277
}
264278
);
265279

src/type_guards.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,34 +38,36 @@ export const isGqlNodeChangeNode = (
3838
return (n as IGqlVersionNodeChangeNode).revisionData !== undefined;
3939
};
4040

41-
export const isNodeBuilderNodeVersionInfoWithSnapshot = (
41+
export const isNodeBuilderNodeVersionInfoWithSnapshot = <A, B, C>(
4242
n:
43-
| IAllNodeBuilderVersionInfo
44-
| Required<INodeBuilderNodeChangeVersionInfo>
45-
| Required<INodeBuilderNodeFragmentChangeVersionInfo>
43+
| IAllNodeBuilderVersionInfo<A, B, C>
44+
| Required<INodeBuilderNodeChangeVersionInfo<A, B, C>>
45+
| Required<INodeBuilderNodeFragmentChangeVersionInfo<A, B, C>>
4646
): n is
47-
| Required<INodeBuilderNodeChangeVersionInfo>
48-
| Required<INodeBuilderNodeFragmentChangeVersionInfo> => {
47+
| Required<INodeBuilderNodeChangeVersionInfo<A, B, C>>
48+
| Required<INodeBuilderNodeFragmentChangeVersionInfo<A, B, C>> => {
4949
return (
5050
(n as
51-
| Required<INodeBuilderNodeChangeVersionInfo>
52-
| Required<INodeBuilderNodeFragmentChangeVersionInfo>).snapshot != null // tslint:disable-line
51+
| Required<INodeBuilderNodeChangeVersionInfo<A, B, C>>
52+
| Required<INodeBuilderNodeFragmentChangeVersionInfo<A, B, C>>).snapshot != null // tslint:disable-line
5353
);
5454
};
5555

56-
export const isNodeBuilderNodeChangeVersionInfo = (
57-
n: IAllNodeBuilderVersionInfo | INodeBuilderNodeChangeVersionInfo
58-
): n is INodeBuilderNodeChangeVersionInfo => {
56+
export const isNodeBuilderNodeChangeVersionInfo = <A, B, C>(
57+
n: IAllNodeBuilderVersionInfo<A, B, C> | INodeBuilderNodeChangeVersionInfo<A, B, C>
58+
): n is INodeBuilderNodeChangeVersionInfo<A, B, C> => {
5959
return (
60-
(n as INodeBuilderNodeChangeVersionInfo).revisionData !== undefined &&
61-
(n as INodeBuilderNodeFragmentChangeVersionInfo).childRevisionData === undefined
60+
(n as INodeBuilderNodeChangeVersionInfo<A, B, C>).revisionData !== undefined &&
61+
(n as INodeBuilderNodeFragmentChangeVersionInfo<A, B, C>).childRevisionData === undefined
6262
);
6363
};
6464

65-
export const isNodeBuilderNodeFragmentChangeVersionInfo = (
66-
n: IAllNodeBuilderVersionInfo | INodeBuilderNodeFragmentChangeVersionInfo
67-
): n is INodeBuilderNodeFragmentChangeVersionInfo => {
68-
return (n as INodeBuilderNodeFragmentChangeVersionInfo).childRevisionData !== undefined;
65+
export const isNodeBuilderNodeFragmentChangeVersionInfo = <A, B, C>(
66+
n: IAllNodeBuilderVersionInfo<A, B, C> | INodeBuilderNodeFragmentChangeVersionInfo<A, B, C>
67+
): n is INodeBuilderNodeFragmentChangeVersionInfo<A, B, C> => {
68+
return (
69+
(n as INodeBuilderNodeFragmentChangeVersionInfo<A, B, C>).childRevisionData !== undefined
70+
);
6971
};
7072

7173
export const shouldSkipNodeBuilderBecauseHasLinkChangeVersionInfo = (

src/types.ts

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export type IGqlVersionNode =
147147
| IGqlVersionNodeFragmentChangeNode
148148
| IGqlVersionLinkChangeNode;
149149

150-
export type NodeInConnection = IGqlVersionNode & {snapshot?: string};
150+
export type NodeInConnection<Snapshot> = IGqlVersionNode & {snapshot?: Snapshot};
151151

152152
export interface IVersionConnection<Node> {
153153
edges: Array<{
@@ -169,17 +169,19 @@ export interface IVersionConnection<Node> {
169169
*
170170
*/
171171

172-
type ExtractNodeFromVersionConnection<P> = P extends IVersionConnection<infer T> ? T : never;
172+
export type ExtractNodeFromVersionConnection<P> = P extends IVersionConnection<infer T> ? T : never;
173173

174174
export interface IVersionConnectionInfo<
175-
Resolver extends (...args: any[]) => Promise<IVersionConnection<any>>
175+
Resolver extends (...args: any[]) => Promise<IVersionConnection<any>>,
176+
RevisionData = any,
177+
FragmentNode = any
176178
> {
177179
nodeId: string | number;
178180
nodeName: string;
179181
nodeBuilder: <
180-
GqlNode = ExtractNodeFromVersionConnection<UnPromisify<ReturnType<Resolver>>>,
181-
RevisionData = any,
182-
FragmentNode extends object = object
182+
GqlNode = ExtractNodeFromVersionConnection<UnPromisify<ReturnType<Resolver>>>
183+
// RevisionData = any,
184+
// FragmentNode = any
183185
>(
184186
previousNode: GqlNode,
185187
versionInfo: IAllNodeBuilderVersionInfo<number, RevisionData>,
@@ -188,12 +190,14 @@ export interface IVersionConnectionInfo<
188190
) => GqlNode;
189191
}
190192
export interface IVersionConnectionExtractors<
191-
Resolver extends (...args: any[]) => Promise<IVersionConnection<any>>
193+
Resolver extends (...args: any[]) => Promise<IVersionConnection<any>>,
194+
RevisionData = any,
195+
FragmentNode = any
192196
> extends IVersionConnectionInfo<Resolver> {
193197
knex: Knex;
194198
nodeId: IVersionConnectionInfo<Resolver>['nodeId'];
195199
nodeName: IVersionConnectionInfo<Resolver>['nodeName'];
196-
nodeBuilder: IVersionConnectionInfo<Resolver>['nodeBuilder'];
200+
nodeBuilder: IVersionConnectionInfo<Resolver, RevisionData, FragmentNode>['nodeBuilder'];
197201
}
198202

199203
export interface IVersionRecorderExtractors<
@@ -335,9 +339,9 @@ export interface IPersistVersionInfo {
335339

336340
export type PersistVersion = (versionInfo: IPersistVersionInfo) => Promise<void>;
337341

338-
export type IAllNodeBuilderVersionInfo<CreatedAt = number, RevisionData = any> =
339-
| INodeBuilderNodeChangeVersionInfo<CreatedAt, RevisionData>
340-
| INodeBuilderNodeFragmentChangeVersionInfo<CreatedAt, RevisionData>;
342+
export type IAllNodeBuilderVersionInfo<CreatedAt = number, Snapshot = any, RevisionData = any> =
343+
| INodeBuilderNodeChangeVersionInfo<CreatedAt, Snapshot, RevisionData>
344+
| INodeBuilderNodeFragmentChangeVersionInfo<CreatedAt, Snapshot, RevisionData>;
341345

342346
export interface INodeBuilderVersionInfo<CreatedAt = number> {
343347
type: string;
@@ -350,8 +354,11 @@ export interface INodeBuilderVersionInfo<CreatedAt = number> {
350354
resolverOperation: string;
351355
}
352356

353-
export interface INodeBuilderNodeChangeVersionInfo<CreatedAt = number, RevisionData = any>
354-
extends INodeBuilderVersionInfo<CreatedAt> {
357+
export interface INodeBuilderNodeChangeVersionInfo<
358+
CreatedAt = number,
359+
Snapshot = any,
360+
RevisionData = any
361+
> extends INodeBuilderVersionInfo<CreatedAt> {
355362
type: string;
356363

357364
id: number;
@@ -364,11 +371,14 @@ export interface INodeBuilderNodeChangeVersionInfo<CreatedAt = number, RevisionD
364371
revisionData: RevisionData;
365372
nodeSchemaVersion: string;
366373

367-
snapshot?: string;
374+
snapshot?: Snapshot;
368375
}
369376

370-
export interface INodeBuilderNodeFragmentChangeVersionInfo<CreatedAt = number, RevisionData = any>
371-
extends INodeBuilderVersionInfo<CreatedAt> {
377+
export interface INodeBuilderNodeFragmentChangeVersionInfo<
378+
CreatedAt = number,
379+
Snapshot = any,
380+
RevisionData = any
381+
> extends INodeBuilderVersionInfo<CreatedAt> {
372382
type: string;
373383

374384
id: number;
@@ -384,7 +394,7 @@ export interface INodeBuilderNodeFragmentChangeVersionInfo<CreatedAt = number, R
384394
childRevisionData: RevisionData;
385395
childNodeSchemaVersion: string;
386396

387-
snapshot?: string;
397+
snapshot?: Snapshot;
388398
}
389399

390400
export type QueryShouldTakeNodeSnapshot = (eventInfo: IEventNodeChangeInfo) => Promise<boolean>;

src/version_connection/build_connection.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,27 @@
11
import {isGqlNodeChangeNode} from 'type_guards';
22
import {EVENT_IMPLEMENTOR_TYPE_NAMES} from 'enums';
33
import {getLoggerFromConfig} from 'logger';
4-
import {ILoggerConfig, UnPromisify, NodeInConnection, IVersionConnection} from 'types';
4+
import {
5+
ILoggerConfig,
6+
UnPromisify,
7+
NodeInConnection,
8+
IVersionConnection,
9+
ExtractNodeFromVersionConnection
10+
} from 'types';
511
import {IQueryResult} from '@social-native/snpkg-snapi-connections';
612

7-
export default <ResolverT extends (...args: [any, any, any, any]) => IVersionConnection<any>>(
8-
versionNodeConnection: IQueryResult<NodeInConnection & {snapshot?: string}>,
9-
nodesOfConnectionByEventId: {[eventId: string]: UnPromisify<ReturnType<ResolverT>>},
13+
export default <
14+
ResolverT extends (...args: [any, any, any, any]) => Promise<IVersionConnection<any>>,
15+
Snapshot = ExtractNodeFromVersionConnection<UnPromisify<ReturnType<ResolverT>>>
16+
>(
17+
versionNodeConnection: IQueryResult<
18+
NodeInConnection<Snapshot> & {
19+
snapshot?: Snapshot;
20+
}
21+
>,
22+
nodesOfConnectionByEventId: {
23+
[eventId: string]: Snapshot;
24+
},
1025
originNodeInstance: {nodeName: string; nodeId: string | number},
1126
loggerConfig?: ILoggerConfig
1227
) => {

0 commit comments

Comments
 (0)