Skip to content

Commit 25b3235

Browse files
committed
Adding functional tests and some fixes
1 parent 3f012fb commit 25b3235

File tree

10 files changed

+263
-44
lines changed

10 files changed

+263
-44
lines changed

examples/hello-world/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
},
1010
"dependencies": {
1111
"graphql": "0.11.7",
12-
"graphql-schema-decorator": "file:../../",
13-
"typescript": "2.3.4"
12+
"graphql-schema-decorator": "file:../../"
1413
},
1514
"keywords": [],
1615
"author": "Quramy",
@@ -20,6 +19,7 @@
2019
},
2120
"license": "ISC",
2221
"devDependencies": {
22+
"typescript": "2.3.4",
2323
"@types/node": "7.0.5"
2424
}
2525
}

src/decorator/field.decorator.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { SchemaFactoryError, SchemaFactoryErrorType } from '../type-factory';
22

33
import { FieldOption } from '../metadata';
4+
import { PaginationMiddleware } from '../pagination.middleware';
45
import { getMetadataArgsStorage } from '../metadata-builder';
56

67
/**
@@ -20,10 +21,14 @@ export function Field(option?: FieldOption) {
2021
target: target,
2122
name: propertyKey,
2223
description: option ? option.description : null,
24+
property: propertyKey,
2325
type: option ? option.type : null,
2426
nonNull: option ? option.nonNull : null,
2527
isList: option ? option.isList : null,
2628
pagination: option ? option.pagination : null,
2729
});
30+
if (option && option.pagination) {
31+
return PaginationMiddleware(target, propertyKey, methodDescriptor);
32+
}
2833
} as Function;
2934
}

src/metadata-builder/metadata-args.storage.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,24 @@ export class MetadataArgsStorage {
6868
return this.fields.filter(item => item.target === target);
6969
}
7070

71-
filterArgumentByClass(target: any): ArgumentArg[] {
72-
return this.arguments.filter(item => item.target === target);
71+
filterArgumentByClassAndProperty(target: any, property: string): ArgumentArg[] {
72+
return this.arguments.filter(item => item.target === target && item.property === property);
7373
}
7474

75-
filterContextByClass(target: any): ContextArg[] {
76-
return this.contexts.filter(item => item.target === target);
75+
filterContextByClassAndProperty(target: any, property: string): ContextArg[] {
76+
return this.contexts.filter(item => item.target === target && item.property === property);
7777
}
7878

79-
filterRootByClass(target: any): RootArg[] {
80-
return this.roots.filter(item => item.target === target);
79+
filterRootByClassAndProperty(target: any, property: string): RootArg[] {
80+
return this.roots.filter(item => item.target === target && item.property === property);
8181
}
8282

83-
filterOrderByByClass(target: any): OrderByArg[] {
84-
return this.orderBys.filter(item => item.target === target);
83+
filterOrderByByClassAndProperty(target: any, property: string): OrderByArg[] {
84+
return this.orderBys.filter(item => item.target === target && item.property === property);
8585
}
8686

87-
filterBeforeByByClass(target: any): BeforeArg[] {
88-
return this.befores.filter(item => item.target === target);
87+
filterBeforeByByClassAndProperty(target: any, property: string): BeforeArg[] {
88+
return this.befores.filter(item => item.target === target && item.property === property);
8989
}
9090
}
9191

src/metadata-builder/metadata.builder.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,18 @@ export class MetadataBuilder {
9797
isNonNull: !!arg.nonNull,
9898
isList: !!arg.isList,
9999
isPagination: !!arg.pagination,
100-
arguments: this.buildArgumentMetadata(target),
101-
context: this.buildContextMetadata(target),
102-
root: this.buildRootMetadata(target),
103-
orderBy: this.buildOrderByMetadata(target),
104-
before: this.buildBeforeMetadata(target),
100+
property: arg.property,
101+
arguments: this.buildArgumentMetadata(target, arg.property),
102+
context: this.buildContextMetadata(target, arg.property),
103+
root: this.buildRootMetadata(target, arg.property),
104+
orderBy: this.buildOrderByMetadata(target, arg.property),
105+
before: this.buildBeforeMetadata(target, arg.property),
105106
}));
106107
}
107108

108-
protected buildArgumentMetadata(target: any): ArgumentMetadata[] | undefined {
109+
protected buildArgumentMetadata(target: any, property: string): ArgumentMetadata[] | undefined {
109110
return getMetadataArgsStorage()
110-
.filterArgumentByClass(target)
111+
.filterArgumentByClassAndProperty(target, property)
111112
.map(arg => ({
112113
type: arg.type,
113114
target: arg.target,
@@ -120,9 +121,9 @@ export class MetadataBuilder {
120121
}));
121122
}
122123

123-
protected buildContextMetadata(target: any): ContextMetadata | undefined {
124+
protected buildContextMetadata(target: any, property: string): ContextMetadata | undefined {
124125
return getMetadataArgsStorage()
125-
.filterContextByClass(target)
126+
.filterContextByClassAndProperty(target, property)
126127
.map(arg => ({
127128
target: arg.target,
128129
name: arg.name,
@@ -133,9 +134,9 @@ export class MetadataBuilder {
133134
.find((_, index) => index === 0);
134135
}
135136

136-
protected buildRootMetadata(target: any): RootMetadata | undefined {
137+
protected buildRootMetadata(target: any, property: string): RootMetadata | undefined {
137138
return getMetadataArgsStorage()
138-
.filterRootByClass(target)
139+
.filterRootByClassAndProperty(target, property)
139140
.map(arg => ({
140141
target: arg.target,
141142
name: arg.name,
@@ -146,9 +147,9 @@ export class MetadataBuilder {
146147
.find((_, index) => index === 0);
147148
}
148149

149-
protected buildOrderByMetadata(target: any): OrderByMetadata | undefined {
150+
protected buildOrderByMetadata(target: any, property: string): OrderByMetadata | undefined {
150151
return getMetadataArgsStorage()
151-
.filterOrderByByClass(target)
152+
.filterOrderByByClassAndProperty(target, property)
152153
.map(arg => ({
153154
target: arg.target,
154155
name: arg.name,
@@ -163,9 +164,9 @@ export class MetadataBuilder {
163164
.find((_, index) => index === 0);
164165
}
165166

166-
protected buildBeforeMetadata(target: any): BeforeMetadata | undefined {
167+
protected buildBeforeMetadata(target: any, property: string): BeforeMetadata | undefined {
167168
return getMetadataArgsStorage()
168-
.filterBeforeByByClass(target)
169+
.filterBeforeByByClassAndProperty(target, property)
169170
.map(arg => ({
170171
target: arg.target,
171172
name: arg.name,

src/metadata/args/field.arg.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export interface FieldArg extends Argument {
55
nonNull?: boolean;
66
isList?: boolean;
77
pagination?: boolean;
8+
property: string;
89
}

src/metadata/types/field.metadata.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export interface FieldMetadata extends Metadata {
1010
isNonNull: boolean;
1111
isList: boolean;
1212
isPagination: boolean;
13+
property: string;
1314
arguments: ArgumentMetadata[];
1415
context?: ContextMetadata;
1516
root?: RootMetadata;

src/pagination.middleware.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'reflect-metadata';
2+
3+
import { FieldMetadata } from './metadata';
4+
import { PageInfo } from './page-info.type';
5+
import { PaginationResponse } from './pagination.type';
6+
import { getMetadataBuilder } from './metadata-builder';
7+
8+
export function PaginationMiddleware(target: any, propertyKey: string, methodDescriptor: TypedPropertyDescriptor<any>): any {
9+
return {
10+
value: async function (...args: any[]) {
11+
let [data, count] = await methodDescriptor.value.apply(this, args);
12+
13+
return getMetadataBuilder().buildFieldMetadata(target)
14+
.filter(metadata => metadata.property === propertyKey)
15+
.map(metadata => metadata.arguments)
16+
.map(fieldArguments => {
17+
const paginationValues = fieldArguments
18+
.reduce((indexMap, metadata) => {
19+
indexMap[metadata.name] = metadata.index;
20+
return indexMap;
21+
}, {} as { [name: string]: number; });
22+
return new PaginationResponse(count, data, new PageInfo(count, paginationValues['offset'], paginationValues['limit']));
23+
})
24+
.find((_, index) => index === 0);
25+
},
26+
};
27+
}

src/pagination.type.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import * as graphql from 'graphql';
2+
3+
import { PageInfo, PageInfoType } from './page-info.type';
4+
25
import { OrderByItem } from './order-by-item';
3-
import { PageInfoType, PageInfo } from './page-info.type';
46

57
export class PaginationResponse<T> {
68

@@ -25,8 +27,8 @@ export class PaginationType {
2527
public static build(name: string, type: any): any {
2628

2729
return new graphql.GraphQLObjectType({
28-
name: name + 'Connection',
29-
description: 'Connecton object that connects ' + name + ' to the server',
30+
name: `${name}Connection`,
31+
description: `Connecton object that connects '${name}' to the server`,
3032
fields: function () {
3133
return {
3234
count: {
@@ -39,7 +41,7 @@ export class PaginationType {
3941
},
4042
pageInfo: {
4143
type: PageInfoType,
42-
description: 'Page information',
44+
description: 'Pagination information',
4345
},
4446
};
4547
},

0 commit comments

Comments
 (0)