-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathsubscriptions.ts
93 lines (79 loc) · 2.67 KB
/
subscriptions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { GraphQLInt, GraphQLObjectType } from 'graphql'
import { PubSub, withFilter } from 'graphql-subscriptions'
import {
CreateFieldDeclarationType,
DeleteFieldDeclarationType,
EventList,
GraphqlSchemaDeclarationType,
UpdateFieldDeclarationType,
} from '../../types'
import { isGraphqlFieldDeclaration } from '../isGraphqlFieldDeclaration'
const availableActions: EventList = ['create', 'update', 'delete']
function capitalizeFirstLetter(string: any) {
return string.charAt(0).toUpperCase() + string.slice(1)
}
export default function generateSubscriptions(
graphqlSchemaDeclaration: GraphqlSchemaDeclarationType,
types: any,
pubSubInstance: PubSub
): GraphQLObjectType | undefined {
const fields = Object.keys(types.inputTypes).reduce(
(subscriptions: any, modelName: string) => {
if (!graphqlSchemaDeclaration[modelName]) {
return subscriptions
}
const outputType = types.outputTypes[modelName]
const declaration = graphqlSchemaDeclaration[modelName]
if (isGraphqlFieldDeclaration(declaration)) {
return subscriptions
}
const subscriptionsEnabled: EventList = declaration.subscriptions || []
availableActions.forEach((action) => {
if (subscriptionsEnabled.includes(action)) {
// ex: name = "userUpdated"
const name = `${modelName}${capitalizeFirstLetter(action)}d`
const configuration = declaration[action]
let subscriptionFunction: any = () => true
if (
typeof configuration !== 'undefined' &&
Object.prototype.hasOwnProperty.call(
configuration,
'subscriptionFilter'
)
) {
subscriptionFunction = (
configuration as
| CreateFieldDeclarationType
| DeleteFieldDeclarationType
| UpdateFieldDeclarationType
).subscriptionFilter
}
subscriptions[name] = {
type: outputType,
args: {
id: { type: GraphQLInt },
},
subscribe: withFilter(
() => pubSubInstance.asyncIterator(name),
subscriptionFunction
),
}
}
})
/** Subscription an be manually added, following declaration is requiered because typescript sucks. */
const s = declaration.additionalSubscriptions
if (typeof s !== 'undefined') {
Object.keys(s).map((key) => (subscriptions[key] = s[key]))
}
return subscriptions
},
{}
)
if (Object.values(fields).length === 0) {
return undefined
}
return new GraphQLObjectType({
name: 'Subscription',
fields,
})
}