@commitspark/graphql-api 0.9.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/container.js +21 -13
- package/dist/container.js.map +1 -1
- package/dist/graphql/field-resolver/entry-reference-resolver.d.ts +9 -0
- package/dist/graphql/field-resolver/entry-reference-resolver.js +15 -0
- package/dist/graphql/field-resolver/entry-reference-resolver.js.map +1 -0
- package/dist/graphql/field-resolver/field-default-value-resolver.d.ts +14 -0
- package/dist/graphql/field-resolver/field-default-value-resolver.js +73 -0
- package/dist/graphql/field-resolver/field-default-value-resolver.js.map +1 -0
- package/dist/graphql/field-resolver/fieldResolver.d.ts +11 -0
- package/dist/graphql/field-resolver/fieldResolver.js +3 -0
- package/dist/graphql/field-resolver/fieldResolver.js.map +1 -0
- package/dist/graphql/field-resolver/union-value-resolver.d.ts +10 -0
- package/dist/graphql/field-resolver/union-value-resolver.js +17 -0
- package/dist/graphql/field-resolver/union-value-resolver.js.map +1 -0
- package/dist/graphql/input-type-generator.service.d.ts +4 -5
- package/dist/graphql/input-type-generator.service.js +23 -13
- package/dist/graphql/input-type-generator.service.js.map +1 -1
- package/dist/graphql/queries-mutations-generator.service.d.ts +1 -1
- package/dist/graphql/resolver-generators/mutation-create-resolver-generator.d.ts +3 -1
- package/dist/graphql/resolver-generators/mutation-create-resolver-generator.js +46 -4
- package/dist/graphql/resolver-generators/mutation-create-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/mutation-delete-resolver-generator.d.ts +3 -1
- package/dist/graphql/resolver-generators/mutation-delete-resolver-generator.js +32 -9
- package/dist/graphql/resolver-generators/mutation-delete-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/{mutation-update.resolver-generator.d.ts → mutation-update-resolver-generator.d.ts} +4 -1
- package/dist/graphql/resolver-generators/mutation-update-resolver-generator.js +53 -0
- package/dist/graphql/resolver-generators/mutation-update-resolver-generator.js.map +1 -0
- package/dist/graphql/resolver-generators/object-type-field-default-value-resolver-generator.d.ts +13 -0
- package/dist/graphql/resolver-generators/object-type-field-default-value-resolver-generator.js +58 -0
- package/dist/graphql/resolver-generators/object-type-field-default-value-resolver-generator.js.map +1 -0
- package/dist/graphql/resolver-generators/query-all-resolver-generator.js +4 -1
- package/dist/graphql/resolver-generators/query-all-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/query-by-id-resolver-generator.js +2 -1
- package/dist/graphql/resolver-generators/query-by-id-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/union-type-resolver-generator.d.ts +4 -4
- package/dist/graphql/resolver-generators/union-type-resolver-generator.js +3 -3
- package/dist/graphql/resolver-generators/union-type-resolver-generator.js.map +1 -1
- package/dist/graphql/schema-analyzer.service.d.ts +1 -9
- package/dist/graphql/schema-analyzer.service.js +6 -17
- package/dist/graphql/schema-analyzer.service.js.map +1 -1
- package/dist/graphql/schema-generator.service.d.ts +3 -5
- package/dist/graphql/schema-generator.service.js +7 -12
- package/dist/graphql/schema-generator.service.js.map +1 -1
- package/dist/graphql/schema-utils/entry-reference-util.d.ts +12 -5
- package/dist/graphql/schema-utils/entry-reference-util.js +108 -25
- package/dist/graphql/schema-utils/entry-reference-util.js.map +1 -1
- package/dist/graphql/schema-utils/entry-type-util.d.ts +6 -0
- package/dist/graphql/schema-utils/entry-type-util.js +34 -0
- package/dist/graphql/schema-utils/entry-type-util.js.map +1 -0
- package/dist/graphql/schema-utils/union-type-util.d.ts +5 -0
- package/dist/graphql/schema-utils/union-type-util.js +21 -0
- package/dist/graphql/schema-utils/union-type-util.js.map +1 -0
- package/dist/persistence/persistence.service.d.ts +4 -7
- package/dist/persistence/persistence.service.js +18 -83
- package/dist/persistence/persistence.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/container.ts +29 -15
- package/src/graphql/field-resolver/entry-reference-resolver.ts +49 -0
- package/src/graphql/field-resolver/field-default-value-resolver.ts +154 -0
- package/src/graphql/field-resolver/fieldResolver.ts +19 -0
- package/src/graphql/field-resolver/union-value-resolver.ts +46 -0
- package/src/graphql/input-type-generator.service.ts +33 -18
- package/src/graphql/queries-mutations-generator.service.ts +1 -1
- package/src/graphql/resolver-generators/mutation-create-resolver-generator.ts +78 -13
- package/src/graphql/resolver-generators/mutation-delete-resolver-generator.ts +69 -21
- package/src/graphql/resolver-generators/mutation-update-resolver-generator.ts +131 -0
- package/src/graphql/resolver-generators/object-type-field-default-value-resolver-generator.ts +119 -0
- package/src/graphql/resolver-generators/query-all-resolver-generator.ts +5 -1
- package/src/graphql/resolver-generators/query-by-id-resolver-generator.ts +3 -1
- package/src/graphql/resolver-generators/union-type-resolver-generator.ts +5 -7
- package/src/graphql/schema-analyzer.service.ts +10 -24
- package/src/graphql/schema-generator.service.ts +11 -20
- package/src/graphql/schema-utils/entry-reference-util.ts +177 -35
- package/src/graphql/schema-utils/entry-type-util.ts +42 -0
- package/src/graphql/schema-utils/union-type-util.ts +23 -0
- package/src/persistence/persistence.service.ts +33 -132
- package/dist/graphql/resolver-generators/entry-reference-resolver.generator.d.ts +0 -12
- package/dist/graphql/resolver-generators/entry-reference-resolver.generator.js +0 -29
- package/dist/graphql/resolver-generators/entry-reference-resolver.generator.js.map +0 -1
- package/dist/graphql/resolver-generators/mutation-update.resolver-generator.js +0 -29
- package/dist/graphql/resolver-generators/mutation-update.resolver-generator.js.map +0 -1
- package/dist/graphql/resolver-generators/union-value-resolver-generator.d.ts +0 -13
- package/dist/graphql/resolver-generators/union-value-resolver-generator.js +0 -83
- package/dist/graphql/resolver-generators/union-value-resolver-generator.js.map +0 -1
- package/src/graphql/resolver-generators/entry-reference-resolver.generator.ts +0 -71
- package/src/graphql/resolver-generators/mutation-update.resolver-generator.ts +0 -59
- package/src/graphql/resolver-generators/union-value-resolver-generator.ts +0 -126
|
@@ -5,9 +5,15 @@ import {
|
|
|
5
5
|
import { GraphQLFieldResolver } from 'graphql/type/definition'
|
|
6
6
|
import { ApolloContext } from '../../app/api.service'
|
|
7
7
|
import { GraphQLError } from 'graphql/error/GraphQLError'
|
|
8
|
+
import { ContentEntry, ContentEntryDraft } from '@commitspark/git-adapter'
|
|
9
|
+
import { EntryReferenceUtil } from '../schema-utils/entry-reference-util'
|
|
10
|
+
import { isObjectType } from 'graphql'
|
|
8
11
|
|
|
9
12
|
export class MutationDeleteResolverGenerator {
|
|
10
|
-
constructor(
|
|
13
|
+
constructor(
|
|
14
|
+
private readonly persistence: PersistenceService,
|
|
15
|
+
private readonly entryReferenceUtil: EntryReferenceUtil,
|
|
16
|
+
) {}
|
|
11
17
|
|
|
12
18
|
public createResolver(
|
|
13
19
|
typeName: string,
|
|
@@ -18,35 +24,77 @@ export class MutationDeleteResolverGenerator {
|
|
|
18
24
|
context: ApolloContext,
|
|
19
25
|
info,
|
|
20
26
|
): Promise<Entry> => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const entry: ContentEntry = await this.persistence.findByTypeId(
|
|
28
|
+
context.gitAdapter,
|
|
29
|
+
context.getCurrentRef(),
|
|
30
|
+
typeName,
|
|
31
|
+
args.id,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
if (
|
|
35
|
+
entry.metadata.referencedBy &&
|
|
36
|
+
entry.metadata.referencedBy.length > 0
|
|
37
|
+
) {
|
|
38
|
+
const otherIds = entry.metadata.referencedBy
|
|
39
|
+
.map((referenceId) => `"${referenceId}"`)
|
|
40
|
+
.join(', ')
|
|
29
41
|
throw new GraphQLError(
|
|
30
|
-
`
|
|
42
|
+
`Entry with id "${args.id}" is referenced by other entries: [${otherIds}]`,
|
|
31
43
|
{
|
|
32
44
|
extensions: {
|
|
33
|
-
code: '
|
|
45
|
+
code: 'IN_USE',
|
|
34
46
|
argumentName: 'id',
|
|
35
47
|
},
|
|
36
48
|
},
|
|
37
49
|
)
|
|
38
50
|
}
|
|
39
51
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
const entryType = info.schema.getType(typeName)
|
|
53
|
+
if (!isObjectType(entryType)) {
|
|
54
|
+
throw new Error('Expected to delete an ObjectType')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const referencedEntryIds =
|
|
58
|
+
await this.entryReferenceUtil.getReferencedEntryIds(
|
|
59
|
+
entryType,
|
|
60
|
+
context,
|
|
61
|
+
null,
|
|
62
|
+
entryType,
|
|
63
|
+
entry.data,
|
|
64
|
+
)
|
|
65
|
+
const referencedEntryUpdates: ContentEntryDraft[] = []
|
|
66
|
+
for (const referencedEntryId of referencedEntryIds) {
|
|
67
|
+
const noLongerReferencedEntry = await this.persistence.findById(
|
|
68
|
+
context.gitAdapter,
|
|
69
|
+
context.getCurrentRef(),
|
|
70
|
+
referencedEntryId,
|
|
71
|
+
)
|
|
72
|
+
referencedEntryUpdates.push({
|
|
73
|
+
...noLongerReferencedEntry,
|
|
74
|
+
metadata: {
|
|
75
|
+
...noLongerReferencedEntry.metadata,
|
|
76
|
+
referencedBy: noLongerReferencedEntry.metadata.referencedBy?.filter(
|
|
77
|
+
(entryId) => entryId !== args.id,
|
|
78
|
+
),
|
|
79
|
+
},
|
|
80
|
+
deletion: false,
|
|
81
|
+
})
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const commit = await context.gitAdapter.createCommit({
|
|
85
|
+
ref: context.branch,
|
|
86
|
+
parentSha: context.getCurrentRef(),
|
|
87
|
+
contentEntries: [
|
|
88
|
+
{
|
|
89
|
+
...entry,
|
|
90
|
+
deletion: true,
|
|
91
|
+
},
|
|
92
|
+
...referencedEntryUpdates,
|
|
93
|
+
],
|
|
94
|
+
message: args.message,
|
|
95
|
+
})
|
|
96
|
+
context.setCurrentRef(commit.ref)
|
|
97
|
+
|
|
50
98
|
return {
|
|
51
99
|
id: args.id,
|
|
52
100
|
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Entry,
|
|
3
|
+
PersistenceService,
|
|
4
|
+
} from '../../persistence/persistence.service'
|
|
5
|
+
import { GraphQLFieldResolver } from 'graphql/type/definition'
|
|
6
|
+
import { ApolloContext } from '../../app/api.service'
|
|
7
|
+
import { EntryReferenceUtil } from '../schema-utils/entry-reference-util'
|
|
8
|
+
import { isObjectType } from 'graphql'
|
|
9
|
+
import { ContentEntryData, ContentEntryDraft } from '@commitspark/git-adapter'
|
|
10
|
+
|
|
11
|
+
export class MutationUpdateResolverGenerator {
|
|
12
|
+
constructor(
|
|
13
|
+
private readonly persistence: PersistenceService,
|
|
14
|
+
private readonly entryReferenceUtil: EntryReferenceUtil,
|
|
15
|
+
) {}
|
|
16
|
+
|
|
17
|
+
public createResolver(
|
|
18
|
+
typeName: string,
|
|
19
|
+
): GraphQLFieldResolver<any, ApolloContext, any, Promise<Entry>> {
|
|
20
|
+
return async (
|
|
21
|
+
source,
|
|
22
|
+
args,
|
|
23
|
+
context: ApolloContext,
|
|
24
|
+
info,
|
|
25
|
+
): Promise<Entry> => {
|
|
26
|
+
if (!isObjectType(info.returnType)) {
|
|
27
|
+
throw new Error('Expected to update an ObjectType')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const existingEntry = await this.persistence.findByTypeId(
|
|
31
|
+
context.gitAdapter,
|
|
32
|
+
context.getCurrentRef(),
|
|
33
|
+
typeName,
|
|
34
|
+
args.id,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
const existingReferencedEntryIds =
|
|
38
|
+
await this.entryReferenceUtil.getReferencedEntryIds(
|
|
39
|
+
info.returnType,
|
|
40
|
+
context,
|
|
41
|
+
null,
|
|
42
|
+
info.returnType,
|
|
43
|
+
existingEntry.data,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
const mergedData = this.mergeData(existingEntry.data ?? null, args.data)
|
|
47
|
+
const updatedReferencedEntryIds =
|
|
48
|
+
await this.entryReferenceUtil.getReferencedEntryIds(
|
|
49
|
+
info.returnType,
|
|
50
|
+
context,
|
|
51
|
+
null,
|
|
52
|
+
info.returnType,
|
|
53
|
+
mergedData,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
const noLongerReferencedIds = existingReferencedEntryIds.filter(
|
|
57
|
+
(entryId) => !updatedReferencedEntryIds.includes(entryId),
|
|
58
|
+
)
|
|
59
|
+
const newlyReferencedIds = updatedReferencedEntryIds.filter(
|
|
60
|
+
(entryId) => !existingReferencedEntryIds.includes(entryId),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
const referencedEntryUpdates: ContentEntryDraft[] = []
|
|
64
|
+
for (const noLongerReferencedEntryId of noLongerReferencedIds) {
|
|
65
|
+
const noLongerReferencedEntry = await this.persistence.findById(
|
|
66
|
+
context.gitAdapter,
|
|
67
|
+
context.getCurrentRef(),
|
|
68
|
+
noLongerReferencedEntryId,
|
|
69
|
+
)
|
|
70
|
+
referencedEntryUpdates.push({
|
|
71
|
+
...noLongerReferencedEntry,
|
|
72
|
+
metadata: {
|
|
73
|
+
...noLongerReferencedEntry.metadata,
|
|
74
|
+
referencedBy: noLongerReferencedEntry.metadata.referencedBy?.filter(
|
|
75
|
+
(entryId) => entryId !== args.id,
|
|
76
|
+
),
|
|
77
|
+
},
|
|
78
|
+
deletion: false,
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
for (const newlyReferencedEntryId of newlyReferencedIds) {
|
|
82
|
+
const newlyReferencedEntry = await this.persistence.findById(
|
|
83
|
+
context.gitAdapter,
|
|
84
|
+
context.getCurrentRef(),
|
|
85
|
+
newlyReferencedEntryId,
|
|
86
|
+
)
|
|
87
|
+
const updatedReferenceList: string[] =
|
|
88
|
+
newlyReferencedEntry.metadata.referencedBy ?? []
|
|
89
|
+
updatedReferenceList.push(args.id)
|
|
90
|
+
updatedReferenceList.sort()
|
|
91
|
+
referencedEntryUpdates.push({
|
|
92
|
+
...newlyReferencedEntry,
|
|
93
|
+
metadata: {
|
|
94
|
+
...newlyReferencedEntry.metadata,
|
|
95
|
+
referencedBy: updatedReferenceList,
|
|
96
|
+
},
|
|
97
|
+
deletion: false,
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const commit = await context.gitAdapter.createCommit({
|
|
102
|
+
ref: context.branch,
|
|
103
|
+
parentSha: context.getCurrentRef(),
|
|
104
|
+
contentEntries: [
|
|
105
|
+
{ ...existingEntry, data: mergedData, deletion: false },
|
|
106
|
+
...referencedEntryUpdates,
|
|
107
|
+
],
|
|
108
|
+
message: args.message,
|
|
109
|
+
})
|
|
110
|
+
context.setCurrentRef(commit.ref)
|
|
111
|
+
|
|
112
|
+
const updatedEntry = await this.persistence.findByTypeId(
|
|
113
|
+
context.gitAdapter,
|
|
114
|
+
context.getCurrentRef(),
|
|
115
|
+
typeName,
|
|
116
|
+
args.id,
|
|
117
|
+
)
|
|
118
|
+
return { ...updatedEntry.data, id: updatedEntry.id }
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private mergeData(
|
|
123
|
+
existingEntryData: ContentEntryData,
|
|
124
|
+
updateData: ContentEntryData,
|
|
125
|
+
): ContentEntryData {
|
|
126
|
+
return {
|
|
127
|
+
...existingEntryData,
|
|
128
|
+
...updateData,
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GraphQLFieldResolver,
|
|
3
|
+
GraphQLOutputType,
|
|
4
|
+
} from 'graphql/type/definition'
|
|
5
|
+
import { ApolloContext } from '../../app/api.service'
|
|
6
|
+
import { Entry } from '../../persistence/persistence.service'
|
|
7
|
+
import {
|
|
8
|
+
GraphQLField,
|
|
9
|
+
GraphQLObjectType,
|
|
10
|
+
GraphQLSchema,
|
|
11
|
+
isListType,
|
|
12
|
+
isNonNullType,
|
|
13
|
+
isObjectType,
|
|
14
|
+
isUnionType,
|
|
15
|
+
} from 'graphql'
|
|
16
|
+
import { ResolvedEntryData } from '../field-resolver/fieldResolver'
|
|
17
|
+
import { FieldDefaultValueResolver } from '../field-resolver/field-default-value-resolver'
|
|
18
|
+
|
|
19
|
+
export class ObjectTypeFieldDefaultValueResolverGenerator {
|
|
20
|
+
constructor(
|
|
21
|
+
private readonly fieldDefaultValueResolver: FieldDefaultValueResolver,
|
|
22
|
+
) {}
|
|
23
|
+
|
|
24
|
+
public createResolver(
|
|
25
|
+
schema: GraphQLSchema,
|
|
26
|
+
): Record<
|
|
27
|
+
string,
|
|
28
|
+
Record<
|
|
29
|
+
string,
|
|
30
|
+
GraphQLFieldResolver<
|
|
31
|
+
any,
|
|
32
|
+
ApolloContext,
|
|
33
|
+
any,
|
|
34
|
+
Promise<ResolvedEntryData<Entry | Entry[] | null>>
|
|
35
|
+
>
|
|
36
|
+
>
|
|
37
|
+
> {
|
|
38
|
+
const resolvers: Record<
|
|
39
|
+
string,
|
|
40
|
+
Record<
|
|
41
|
+
string,
|
|
42
|
+
GraphQLFieldResolver<
|
|
43
|
+
any,
|
|
44
|
+
ApolloContext,
|
|
45
|
+
any,
|
|
46
|
+
Promise<ResolvedEntryData<Entry | Entry[] | null>>
|
|
47
|
+
>
|
|
48
|
+
>
|
|
49
|
+
> = {}
|
|
50
|
+
for (const typeName of Object.keys(schema.getTypeMap())) {
|
|
51
|
+
const type = schema.getType(typeName)
|
|
52
|
+
if (!isObjectType(type) || type.name.startsWith('__')) {
|
|
53
|
+
continue
|
|
54
|
+
}
|
|
55
|
+
const objectType = type as GraphQLObjectType
|
|
56
|
+
const fieldsForCustomDefaultValueResolver =
|
|
57
|
+
this.getFieldsForCustomDefaultValueResolver(objectType)
|
|
58
|
+
|
|
59
|
+
const fieldResolvers: Record<
|
|
60
|
+
string,
|
|
61
|
+
GraphQLFieldResolver<
|
|
62
|
+
any,
|
|
63
|
+
ApolloContext,
|
|
64
|
+
any,
|
|
65
|
+
Promise<ResolvedEntryData<Entry | Entry[] | null>>
|
|
66
|
+
>
|
|
67
|
+
> = {}
|
|
68
|
+
for (const field of fieldsForCustomDefaultValueResolver) {
|
|
69
|
+
fieldResolvers[field.name] = (
|
|
70
|
+
obj,
|
|
71
|
+
args,
|
|
72
|
+
context,
|
|
73
|
+
info,
|
|
74
|
+
): Promise<ResolvedEntryData<Entry | Entry[] | null>> =>
|
|
75
|
+
this.fieldDefaultValueResolver.resolve(
|
|
76
|
+
field.name in obj ? obj[field.name] : undefined,
|
|
77
|
+
args,
|
|
78
|
+
{
|
|
79
|
+
gitAdapter: context.gitAdapter,
|
|
80
|
+
getCurrentRef: context.getCurrentRef,
|
|
81
|
+
},
|
|
82
|
+
info,
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (Object.keys(fieldResolvers).length > 0) {
|
|
87
|
+
resolvers[typeName] = fieldResolvers
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return resolvers
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private getFieldsForCustomDefaultValueResolver(
|
|
95
|
+
objectType: GraphQLObjectType,
|
|
96
|
+
): GraphQLField<any, any>[] {
|
|
97
|
+
const fields = []
|
|
98
|
+
for (const fieldsKey in objectType.getFields()) {
|
|
99
|
+
const field: GraphQLField<any, any> = objectType.getFields()[fieldsKey]
|
|
100
|
+
if (this.requiresCustomDefaultValueResolver(field.type)) {
|
|
101
|
+
fields.push(field)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return fields
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private requiresCustomDefaultValueResolver(type: GraphQLOutputType): boolean {
|
|
108
|
+
if (isNonNullType(type)) {
|
|
109
|
+
return this.requiresCustomDefaultValueResolver(type.ofType)
|
|
110
|
+
} else if (isListType(type)) {
|
|
111
|
+
return true
|
|
112
|
+
} else if (isUnionType(type)) {
|
|
113
|
+
return true
|
|
114
|
+
} else if (isObjectType(type)) {
|
|
115
|
+
return true
|
|
116
|
+
}
|
|
117
|
+
return false
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -17,11 +17,15 @@ export class QueryAllResolverGenerator {
|
|
|
17
17
|
context: ApolloContext,
|
|
18
18
|
info,
|
|
19
19
|
): Promise<Entry[]> => {
|
|
20
|
-
|
|
20
|
+
const entries = await this.persistence.findByType(
|
|
21
21
|
context.gitAdapter,
|
|
22
22
|
context.getCurrentRef(),
|
|
23
23
|
typeName,
|
|
24
24
|
)
|
|
25
|
+
|
|
26
|
+
return entries.map((entry) => {
|
|
27
|
+
return { ...entry.data, id: entry.id }
|
|
28
|
+
})
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
31
|
}
|
|
@@ -12,12 +12,14 @@ export class QueryByIdResolverGenerator {
|
|
|
12
12
|
typeName: string,
|
|
13
13
|
): GraphQLFieldResolver<any, ApolloContext, any, Promise<Entry>> {
|
|
14
14
|
return async (obj, args, context, info): Promise<Entry> => {
|
|
15
|
-
|
|
15
|
+
const entry = await this.persistence.findByTypeId(
|
|
16
16
|
context.gitAdapter,
|
|
17
17
|
context.getCurrentRef(),
|
|
18
18
|
typeName,
|
|
19
19
|
args.id,
|
|
20
20
|
)
|
|
21
|
+
|
|
22
|
+
return { ...entry.data, id: entry.id }
|
|
21
23
|
}
|
|
22
24
|
}
|
|
23
25
|
}
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
GraphQLAbstractType,
|
|
5
5
|
GraphQLResolveInfo,
|
|
6
6
|
GraphQLTypeResolver,
|
|
7
|
-
} from 'graphql
|
|
8
|
-
import {
|
|
7
|
+
} from 'graphql'
|
|
8
|
+
import { EntryTypeUtil } from '../schema-utils/entry-type-util'
|
|
9
9
|
|
|
10
10
|
export class UnionTypeResolverGenerator {
|
|
11
11
|
constructor(
|
|
12
12
|
private readonly persistence: PersistenceService,
|
|
13
|
-
private readonly
|
|
13
|
+
private readonly entryTypeUtil: EntryTypeUtil,
|
|
14
14
|
) {}
|
|
15
15
|
|
|
16
16
|
public createResolver(): GraphQLTypeResolver<any, ApolloContext> {
|
|
@@ -20,9 +20,7 @@ export class UnionTypeResolverGenerator {
|
|
|
20
20
|
info: GraphQLResolveInfo,
|
|
21
21
|
abstractType: GraphQLAbstractType,
|
|
22
22
|
): Promise<string> => {
|
|
23
|
-
if (
|
|
24
|
-
this.entryReferenceUtil.buildsOnTypeWithEntryDirective(abstractType)
|
|
25
|
-
) {
|
|
23
|
+
if (this.entryTypeUtil.buildsOnTypeWithEntryDirective(abstractType)) {
|
|
26
24
|
return this.persistence.getTypeById(
|
|
27
25
|
context.gitAdapter,
|
|
28
26
|
context.getCurrentRef(),
|
|
@@ -30,7 +28,7 @@ export class UnionTypeResolverGenerator {
|
|
|
30
28
|
)
|
|
31
29
|
} else {
|
|
32
30
|
// We have injected an internal `__typename` field into the data of fields pointing to a non-entry union
|
|
33
|
-
// in
|
|
31
|
+
// in UnionValueResolver. This artificial field holds the type information we need here.
|
|
34
32
|
return obj.__typename
|
|
35
33
|
}
|
|
36
34
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
GraphQLObjectType,
|
|
3
|
+
GraphQLSchema,
|
|
4
|
+
isInterfaceType,
|
|
5
|
+
isObjectType,
|
|
6
|
+
isUnionType,
|
|
7
|
+
} from 'graphql'
|
|
2
8
|
import { getDirective } from '@graphql-tools/utils'
|
|
3
9
|
import { GraphQLInterfaceType, GraphQLUnionType } from 'graphql/type/definition'
|
|
4
|
-
import { Kind } from 'graphql/language/kinds'
|
|
5
|
-
import { ApolloContext } from '../app/api.service'
|
|
6
|
-
import { EntryReferenceUtil } from './schema-utils/entry-reference-util'
|
|
7
10
|
|
|
8
11
|
export class SchemaAnalyzerService {
|
|
9
|
-
constructor(private readonly entryReferenceUtil: EntryReferenceUtil) {}
|
|
10
|
-
|
|
11
12
|
public analyzeSchema(schema: GraphQLSchema): ISchemaAnalyzerResult {
|
|
12
13
|
const result: ISchemaAnalyzerResult = {
|
|
13
14
|
entryDirectiveTypes: [],
|
|
14
15
|
objectTypes: [],
|
|
15
16
|
interfaceTypes: [],
|
|
16
17
|
unionTypes: [],
|
|
17
|
-
typesWithEntryReferences: [],
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
const typeMap = schema.getTypeMap()
|
|
@@ -24,31 +24,21 @@ export class SchemaAnalyzerService {
|
|
|
24
24
|
continue
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
if (type
|
|
27
|
+
if (isObjectType(type)) {
|
|
28
28
|
const objectType = type as GraphQLObjectType
|
|
29
29
|
result.objectTypes.push(objectType)
|
|
30
30
|
const entityDirective = getDirective(schema, objectType, 'Entry')?.[0]
|
|
31
31
|
if (entityDirective) {
|
|
32
32
|
result.entryDirectiveTypes.push(objectType)
|
|
33
33
|
}
|
|
34
|
-
const fieldsWithEntryReference =
|
|
35
|
-
this.entryReferenceUtil.getFieldsWithReferenceToTypeWithEntryDirective(
|
|
36
|
-
objectType,
|
|
37
|
-
)
|
|
38
|
-
if (fieldsWithEntryReference.length > 0) {
|
|
39
|
-
result.typesWithEntryReferences.push({
|
|
40
|
-
type: objectType,
|
|
41
|
-
fields: fieldsWithEntryReference,
|
|
42
|
-
})
|
|
43
|
-
}
|
|
44
34
|
}
|
|
45
35
|
|
|
46
|
-
if (type
|
|
36
|
+
if (isInterfaceType(type)) {
|
|
47
37
|
const interfaceType = type as GraphQLInterfaceType
|
|
48
38
|
result.interfaceTypes.push(interfaceType)
|
|
49
39
|
}
|
|
50
40
|
|
|
51
|
-
if (type
|
|
41
|
+
if (isUnionType(type)) {
|
|
52
42
|
const unionType = type as GraphQLUnionType
|
|
53
43
|
result.unionTypes.push(unionType)
|
|
54
44
|
}
|
|
@@ -63,8 +53,4 @@ export interface ISchemaAnalyzerResult {
|
|
|
63
53
|
objectTypes: GraphQLObjectType[]
|
|
64
54
|
interfaceTypes: GraphQLInterfaceType[]
|
|
65
55
|
unionTypes: GraphQLUnionType[]
|
|
66
|
-
typesWithEntryReferences: {
|
|
67
|
-
type: GraphQLObjectType<any, ApolloContext>
|
|
68
|
-
fields: GraphQLField<any, ApolloContext>[]
|
|
69
|
-
}[]
|
|
70
56
|
}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
IGeneratedSchema,
|
|
3
|
-
QueriesMutationsGeneratorService,
|
|
4
|
-
} from './queries-mutations-generator.service'
|
|
1
|
+
import { QueriesMutationsGeneratorService } from './queries-mutations-generator.service'
|
|
5
2
|
import {
|
|
6
3
|
IExecutableSchemaDefinition,
|
|
7
4
|
makeExecutableSchema,
|
|
@@ -10,7 +7,6 @@ import { SchemaAnalyzerService } from './schema-analyzer.service'
|
|
|
10
7
|
import { InputTypeGeneratorService } from './input-type-generator.service'
|
|
11
8
|
import { SchemaRootTypeGeneratorService } from './schema-root-type-generator.service'
|
|
12
9
|
import { printSchemaWithDirectives } from '@graphql-tools/utils'
|
|
13
|
-
import { EntryReferenceResolverGenerator } from './resolver-generators/entry-reference-resolver.generator'
|
|
14
10
|
import { UnionTypeResolverGenerator } from './resolver-generators/union-type-resolver-generator'
|
|
15
11
|
import { ApolloContext } from '../app/api.service'
|
|
16
12
|
import {
|
|
@@ -19,7 +15,7 @@ import {
|
|
|
19
15
|
} from 'graphql/type/definition'
|
|
20
16
|
import { SchemaValidator } from './schema-validator'
|
|
21
17
|
import { Entry } from '../persistence/persistence.service'
|
|
22
|
-
import {
|
|
18
|
+
import { ObjectTypeFieldDefaultValueResolverGenerator } from './resolver-generators/object-type-field-default-value-resolver-generator'
|
|
23
19
|
|
|
24
20
|
export class SchemaGeneratorService {
|
|
25
21
|
constructor(
|
|
@@ -27,9 +23,8 @@ export class SchemaGeneratorService {
|
|
|
27
23
|
private readonly schemaAnalyzer: SchemaAnalyzerService,
|
|
28
24
|
private readonly inputTypeGenerator: InputTypeGeneratorService,
|
|
29
25
|
private readonly schemaRootTypeGenerator: SchemaRootTypeGeneratorService,
|
|
30
|
-
private readonly entryReferenceResolverGenerator: EntryReferenceResolverGenerator,
|
|
31
26
|
private readonly unionTypeResolverGenerator: UnionTypeResolverGenerator,
|
|
32
|
-
private readonly
|
|
27
|
+
private readonly objectTypeFieldDefaultValueResolverGenerator: ObjectTypeFieldDefaultValueResolverGenerator,
|
|
33
28
|
private readonly schemaValidator: SchemaValidator,
|
|
34
29
|
) {}
|
|
35
30
|
|
|
@@ -74,10 +69,6 @@ export class SchemaGeneratorService {
|
|
|
74
69
|
>
|
|
75
70
|
>
|
|
76
71
|
> = {}
|
|
77
|
-
for (const type of schemaAnalyzerResult.typesWithEntryReferences) {
|
|
78
|
-
generatedEntryReferenceResolvers[type.type.name] =
|
|
79
|
-
this.entryReferenceResolverGenerator.createResolver(context, type)
|
|
80
|
-
}
|
|
81
72
|
|
|
82
73
|
const generatedObjectInputTypeStrings =
|
|
83
74
|
this.inputTypeGenerator.generateObjectInputTypeStrings(
|
|
@@ -112,8 +103,8 @@ export class SchemaGeneratorService {
|
|
|
112
103
|
__resolveType: this.unionTypeResolverGenerator.createResolver(),
|
|
113
104
|
}
|
|
114
105
|
}
|
|
115
|
-
const
|
|
116
|
-
this.
|
|
106
|
+
const generatedObjectTypeFieldDefaultValueResolvers =
|
|
107
|
+
this.objectTypeFieldDefaultValueResolverGenerator.createResolver(schema)
|
|
117
108
|
|
|
118
109
|
const generatedQueryResolvers: Record<
|
|
119
110
|
string,
|
|
@@ -124,9 +115,7 @@ export class SchemaGeneratorService {
|
|
|
124
115
|
GraphQLFieldResolver<any, ApolloContext>
|
|
125
116
|
> = {}
|
|
126
117
|
|
|
127
|
-
|
|
128
|
-
element: IGeneratedSchema,
|
|
129
|
-
): void {
|
|
118
|
+
for (const element of generatedQueriesMutations) {
|
|
130
119
|
generatedQueryResolvers[element.queryAll.name] = element.queryAll.resolver
|
|
131
120
|
generatedQueryResolvers[element.queryAllMeta.name] =
|
|
132
121
|
element.queryAllMeta.resolver
|
|
@@ -138,7 +127,7 @@ export class SchemaGeneratorService {
|
|
|
138
127
|
element.updateMutation.resolver
|
|
139
128
|
generatedMutationResolvers[element.deleteMutation.name] =
|
|
140
129
|
element.deleteMutation.resolver
|
|
141
|
-
}
|
|
130
|
+
}
|
|
142
131
|
generatedQueryResolvers[generatedTypeNameQuery.name] =
|
|
143
132
|
generatedTypeNameQuery.resolver
|
|
144
133
|
|
|
@@ -160,10 +149,12 @@ export class SchemaGeneratorService {
|
|
|
160
149
|
...generatedUnionTypeResolvers[typeName],
|
|
161
150
|
}
|
|
162
151
|
}
|
|
163
|
-
for (const typeName of Object.keys(
|
|
152
|
+
for (const typeName of Object.keys(
|
|
153
|
+
generatedObjectTypeFieldDefaultValueResolvers,
|
|
154
|
+
)) {
|
|
164
155
|
allGeneratedResolvers[typeName] = {
|
|
165
156
|
...(allGeneratedResolvers[typeName] ?? {}),
|
|
166
|
-
...
|
|
157
|
+
...generatedObjectTypeFieldDefaultValueResolvers[typeName],
|
|
167
158
|
}
|
|
168
159
|
}
|
|
169
160
|
for (const typeName of Object.keys(generatedEntryReferenceResolvers)) {
|