@directus/api 25.0.0 → 26.0.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.
Files changed (123) hide show
  1. package/dist/app.js +3 -3
  2. package/dist/auth/drivers/oauth2.d.ts +2 -0
  3. package/dist/auth/drivers/oauth2.js +40 -2
  4. package/dist/auth/drivers/openid.js +8 -1
  5. package/dist/controllers/access.js +2 -2
  6. package/dist/controllers/comments.js +2 -2
  7. package/dist/controllers/dashboards.js +2 -2
  8. package/dist/controllers/files.js +2 -2
  9. package/dist/controllers/flows.js +2 -2
  10. package/dist/controllers/folders.js +2 -2
  11. package/dist/controllers/items.js +2 -2
  12. package/dist/controllers/notifications.js +2 -2
  13. package/dist/controllers/operations.js +2 -2
  14. package/dist/controllers/panels.js +2 -2
  15. package/dist/controllers/permissions.js +2 -2
  16. package/dist/controllers/policies.js +2 -2
  17. package/dist/controllers/presets.js +2 -2
  18. package/dist/controllers/roles.js +2 -2
  19. package/dist/controllers/shares.js +2 -2
  20. package/dist/controllers/translations.js +2 -2
  21. package/dist/controllers/users.js +2 -2
  22. package/dist/controllers/utils.js +8 -3
  23. package/dist/controllers/versions.js +2 -2
  24. package/dist/controllers/webhooks.js +1 -1
  25. package/dist/database/helpers/capabilities/dialects/default.d.ts +3 -0
  26. package/dist/database/helpers/capabilities/dialects/default.js +3 -0
  27. package/dist/database/helpers/capabilities/dialects/mysql.d.ts +4 -0
  28. package/dist/database/helpers/capabilities/dialects/mysql.js +9 -0
  29. package/dist/database/helpers/capabilities/dialects/postgres.d.ts +5 -0
  30. package/dist/database/helpers/capabilities/dialects/postgres.js +14 -0
  31. package/dist/database/helpers/capabilities/index.d.ts +7 -0
  32. package/dist/database/helpers/capabilities/index.js +7 -0
  33. package/dist/database/helpers/capabilities/types.d.ts +11 -0
  34. package/dist/database/helpers/capabilities/types.js +15 -0
  35. package/dist/database/helpers/index.d.ts +2 -0
  36. package/dist/database/helpers/index.js +2 -0
  37. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -2
  38. package/dist/database/helpers/schema/dialects/cockroachdb.js +0 -4
  39. package/dist/database/helpers/schema/dialects/postgres.d.ts +1 -2
  40. package/dist/database/helpers/schema/dialects/postgres.js +0 -4
  41. package/dist/database/index.js +1 -1
  42. package/dist/database/migrations/20250224A-visual-editor.d.ts +3 -0
  43. package/dist/database/migrations/20250224A-visual-editor.js +35 -0
  44. package/dist/database/run-ast/lib/get-db-query.js +16 -4
  45. package/dist/logger/index.js +3 -3
  46. package/dist/middleware/sanitize-query.js +17 -7
  47. package/dist/middleware/validate-batch.js +1 -1
  48. package/dist/operations/item-delete/index.js +1 -1
  49. package/dist/operations/item-read/index.js +1 -1
  50. package/dist/operations/item-update/index.js +1 -1
  51. package/dist/permissions/lib/fetch-permissions.js +6 -4
  52. package/dist/permissions/modules/process-ast/utils/context-has-dynamic-variables.d.ts +2 -0
  53. package/dist/permissions/modules/process-ast/utils/context-has-dynamic-variables.js +3 -0
  54. package/dist/permissions/modules/process-payload/process-payload.d.ts +1 -0
  55. package/dist/permissions/modules/process-payload/process-payload.js +13 -4
  56. package/dist/permissions/types.d.ts +2 -1
  57. package/dist/permissions/utils/extract-required-dynamic-variable-context.d.ts +3 -2
  58. package/dist/permissions/utils/extract-required-dynamic-variable-context.js +24 -5
  59. package/dist/permissions/utils/fetch-dynamic-variable-data.d.ts +9 -0
  60. package/dist/permissions/utils/{fetch-dynamic-variable-context.js → fetch-dynamic-variable-data.js} +11 -12
  61. package/dist/rate-limiter.js +1 -1
  62. package/dist/services/assets.js +12 -2
  63. package/dist/services/authentication.js +2 -2
  64. package/dist/services/collections.js +39 -3
  65. package/dist/services/fields/build-collection-and-field-relations.d.ts +21 -0
  66. package/dist/services/fields/build-collection-and-field-relations.js +55 -0
  67. package/dist/services/fields/get-collection-meta-updates.d.ts +11 -0
  68. package/dist/services/fields/get-collection-meta-updates.js +72 -0
  69. package/dist/services/fields/get-collection-relation-list.d.ts +5 -0
  70. package/dist/services/fields/get-collection-relation-list.js +28 -0
  71. package/dist/services/fields.js +17 -12
  72. package/dist/services/graphql/resolvers/get-collection-type.d.ts +3 -0
  73. package/dist/services/graphql/resolvers/get-collection-type.js +34 -0
  74. package/dist/services/graphql/resolvers/get-field-type.d.ts +3 -0
  75. package/dist/services/graphql/resolvers/get-field-type.js +51 -0
  76. package/dist/services/graphql/resolvers/get-relation-type.d.ts +3 -0
  77. package/dist/services/graphql/resolvers/get-relation-type.js +39 -0
  78. package/dist/services/graphql/resolvers/mutation.js +1 -1
  79. package/dist/services/graphql/resolvers/query.js +4 -4
  80. package/dist/services/graphql/resolvers/system-admin.d.ts +2 -2
  81. package/dist/services/graphql/resolvers/system-admin.js +207 -199
  82. package/dist/services/graphql/resolvers/system.d.ts +1 -7
  83. package/dist/services/graphql/resolvers/system.js +12 -113
  84. package/dist/services/graphql/schema/index.js +1 -1
  85. package/dist/services/graphql/schema/parse-query.d.ts +2 -2
  86. package/dist/services/graphql/schema/parse-query.js +6 -6
  87. package/dist/services/graphql/schema/read.d.ts +2 -2
  88. package/dist/services/graphql/schema/read.js +86 -2
  89. package/dist/services/graphql/schema-cache.d.ts +2 -2
  90. package/dist/services/graphql/schema-cache.js +1 -3
  91. package/dist/services/graphql/subscription.d.ts +3 -3
  92. package/dist/services/graphql/subscription.js +3 -3
  93. package/dist/services/graphql/utils/{aggrgate-query.d.ts → aggregate-query.d.ts} +2 -2
  94. package/dist/services/graphql/utils/{aggrgate-query.js → aggregate-query.js} +3 -3
  95. package/dist/services/items.d.ts +1 -0
  96. package/dist/services/items.js +30 -16
  97. package/dist/services/meta.js +4 -2
  98. package/dist/services/payload.d.ts +1 -0
  99. package/dist/services/payload.js +32 -17
  100. package/dist/services/shares.js +1 -1
  101. package/dist/services/specifications.js +10 -5
  102. package/dist/services/tus/lockers.d.ts +1 -1
  103. package/dist/services/tus/lockers.js +6 -5
  104. package/dist/services/tus/server.js +24 -0
  105. package/dist/services/users.js +1 -0
  106. package/dist/types/services.d.ts +2 -0
  107. package/dist/utils/apply-query.d.ts +1 -0
  108. package/dist/utils/apply-query.js +42 -31
  109. package/dist/utils/generate-hash.js +1 -1
  110. package/dist/utils/get-config-from-env.d.ts +6 -1
  111. package/dist/utils/get-config-from-env.js +16 -11
  112. package/dist/utils/get-graphql-type.js +3 -1
  113. package/dist/utils/is-login-redirect-allowed.js +2 -0
  114. package/dist/utils/redact-object.js +5 -1
  115. package/dist/utils/sanitize-query.d.ts +5 -2
  116. package/dist/utils/sanitize-query.js +34 -9
  117. package/dist/websocket/controllers/base.d.ts +2 -2
  118. package/dist/websocket/handlers/items.js +4 -4
  119. package/dist/websocket/handlers/subscribe.js +2 -2
  120. package/dist/websocket/messages.d.ts +7 -7
  121. package/dist/websocket/messages.js +1 -1
  122. package/package.json +58 -58
  123. package/dist/permissions/utils/fetch-dynamic-variable-context.d.ts +0 -8
@@ -5,178 +5,186 @@ import { ExtensionsService } from '../../extensions.js';
5
5
  import { FieldsService } from '../../fields.js';
6
6
  import { RelationsService } from '../../relations.js';
7
7
  import { GraphQLService } from '../index.js';
8
- export function resolveSystemAdmin(gql, schemaComposer, { Collection, Field, Relation, Extension }) {
9
- if (gql.accountability?.admin === true) {
10
- schemaComposer.Mutation.addFields({
11
- create_collections_item: {
12
- type: Collection,
13
- args: {
14
- data: toInputObjectType(Collection.clone('create_directus_collections'), {
15
- postfix: '_input',
16
- }).addFields({
17
- fields: [
18
- toInputObjectType(Field.clone('create_directus_collections_fields'), { postfix: '_input' }).NonNull,
19
- ],
20
- }).NonNull,
21
- },
22
- resolve: async (_, args) => {
23
- const collectionsService = new CollectionsService({
24
- accountability: gql.accountability,
25
- schema: gql.schema,
26
- });
27
- const collectionKey = await collectionsService.createOne(args['data']);
28
- return await collectionsService.readOne(collectionKey);
29
- },
8
+ import { getFieldType } from './get-field-type.js';
9
+ import { getRelationType } from './get-relation-type.js';
10
+ import { getCollectionType } from './get-collection-type.js';
11
+ export function resolveSystemAdmin(gql, schema, schemaComposer) {
12
+ if (!gql.accountability?.admin) {
13
+ return;
14
+ }
15
+ const Collection = getCollectionType(schemaComposer, schema, 'write');
16
+ const Field = getFieldType(schemaComposer, schema, 'write');
17
+ const Relation = getRelationType(schemaComposer, schema, 'write');
18
+ schemaComposer.Mutation.addFields({
19
+ create_collections_item: {
20
+ type: Collection,
21
+ args: {
22
+ data: toInputObjectType(Collection, {
23
+ postfix: '_input',
24
+ }).addFields({
25
+ fields: [toInputObjectType(Field, { postfix: '_input' }).NonNull],
26
+ }).NonNull,
30
27
  },
31
- update_collections_item: {
32
- type: Collection,
33
- args: {
34
- collection: new GraphQLNonNull(GraphQLString),
35
- data: toInputObjectType(Collection.clone('update_directus_collections'), {
36
- postfix: '_input',
37
- }).removeField(['collection', 'schema']).NonNull,
38
- },
39
- resolve: async (_, args) => {
40
- const collectionsService = new CollectionsService({
41
- accountability: gql.accountability,
42
- schema: gql.schema,
43
- });
44
- const collectionKey = await collectionsService.updateOne(args['collection'], args['data']);
45
- return await collectionsService.readOne(collectionKey);
46
- },
28
+ resolve: async (_, args) => {
29
+ const collectionsService = new CollectionsService({
30
+ accountability: gql.accountability,
31
+ schema: gql.schema,
32
+ });
33
+ const collectionKey = await collectionsService.createOne(args['data']);
34
+ return await collectionsService.readOne(collectionKey);
47
35
  },
48
- delete_collections_item: {
49
- type: schemaComposer.createObjectTC({
50
- name: 'delete_collection',
51
- fields: {
52
- collection: GraphQLString,
53
- },
54
- }),
55
- args: {
56
- collection: new GraphQLNonNull(GraphQLString),
57
- },
58
- resolve: async (_, args) => {
59
- const collectionsService = new CollectionsService({
60
- accountability: gql.accountability,
61
- schema: gql.schema,
62
- });
63
- await collectionsService.deleteOne(args['collection']);
64
- return { collection: args['collection'] };
65
- },
36
+ },
37
+ update_collections_item: {
38
+ type: Collection,
39
+ args: {
40
+ collection: new GraphQLNonNull(GraphQLString),
41
+ data: toInputObjectType(Collection, {
42
+ postfix: '_input',
43
+ }).removeField(['collection', 'schema']).NonNull,
66
44
  },
67
- });
68
- schemaComposer.Mutation.addFields({
69
- create_fields_item: {
70
- type: Field,
71
- args: {
72
- collection: new GraphQLNonNull(GraphQLString),
73
- data: toInputObjectType(Field.clone('create_directus_fields'), { postfix: '_input' }).NonNull,
74
- },
75
- resolve: async (_, args) => {
76
- const service = new FieldsService({
77
- accountability: gql.accountability,
78
- schema: gql.schema,
79
- });
80
- await service.createField(args['collection'], args['data']);
81
- return await service.readOne(args['collection'], args['data'].field);
82
- },
45
+ resolve: async (_, args) => {
46
+ const collectionsService = new CollectionsService({
47
+ accountability: gql.accountability,
48
+ schema: gql.schema,
49
+ });
50
+ const collectionKey = await collectionsService.updateOne(args['collection'], args['data']);
51
+ return await collectionsService.readOne(collectionKey);
83
52
  },
84
- update_fields_item: {
85
- type: Field,
86
- args: {
87
- collection: new GraphQLNonNull(GraphQLString),
88
- field: new GraphQLNonNull(GraphQLString),
89
- data: toInputObjectType(Field.clone('update_directus_fields'), { postfix: '_input' }).NonNull,
90
- },
91
- resolve: async (_, args) => {
92
- const service = new FieldsService({
93
- accountability: gql.accountability,
94
- schema: gql.schema,
95
- });
96
- await service.updateField(args['collection'], {
97
- ...args['data'],
98
- field: args['field'],
99
- });
100
- return await service.readOne(args['collection'], args['data'].field);
53
+ },
54
+ delete_collections_item: {
55
+ type: schemaComposer.createObjectTC({
56
+ name: 'delete_collection',
57
+ fields: {
58
+ collection: GraphQLString,
101
59
  },
60
+ }),
61
+ args: {
62
+ collection: new GraphQLNonNull(GraphQLString),
102
63
  },
103
- delete_fields_item: {
104
- type: schemaComposer.createObjectTC({
105
- name: 'delete_field',
106
- fields: {
107
- collection: GraphQLString,
108
- field: GraphQLString,
109
- },
110
- }),
111
- args: {
112
- collection: new GraphQLNonNull(GraphQLString),
113
- field: new GraphQLNonNull(GraphQLString),
114
- },
115
- resolve: async (_, args) => {
116
- const service = new FieldsService({
117
- accountability: gql.accountability,
118
- schema: gql.schema,
119
- });
120
- await service.deleteField(args['collection'], args['field']);
121
- const { collection, field } = args;
122
- return { collection, field };
123
- },
64
+ resolve: async (_, args) => {
65
+ const collectionsService = new CollectionsService({
66
+ accountability: gql.accountability,
67
+ schema: gql.schema,
68
+ });
69
+ await collectionsService.deleteOne(args['collection']);
70
+ return { collection: args['collection'] };
124
71
  },
125
- });
126
- schemaComposer.Mutation.addFields({
127
- create_relations_item: {
128
- type: Relation,
129
- args: {
130
- data: toInputObjectType(Relation.clone('create_directus_relations'), { postfix: '_input' }).NonNull,
131
- },
132
- resolve: async (_, args) => {
133
- const relationsService = new RelationsService({
134
- accountability: gql.accountability,
135
- schema: gql.schema,
136
- });
137
- await relationsService.createOne(args['data']);
138
- return await relationsService.readOne(args['data'].collection, args['data'].field);
139
- },
72
+ },
73
+ });
74
+ schemaComposer.Mutation.addFields({
75
+ create_fields_item: {
76
+ type: Field,
77
+ args: {
78
+ collection: new GraphQLNonNull(GraphQLString),
79
+ data: toInputObjectType(Field, { postfix: '_input' }).NonNull,
140
80
  },
141
- update_relations_item: {
142
- type: Relation,
143
- args: {
144
- collection: new GraphQLNonNull(GraphQLString),
145
- field: new GraphQLNonNull(GraphQLString),
146
- data: toInputObjectType(Relation.clone('update_directus_relations'), { postfix: '_input' }).NonNull,
147
- },
148
- resolve: async (_, args) => {
149
- const relationsService = new RelationsService({
150
- accountability: gql.accountability,
151
- schema: gql.schema,
152
- });
153
- await relationsService.updateOne(args['collection'], args['field'], args['data']);
154
- return await relationsService.readOne(args['data'].collection, args['data'].field);
155
- },
81
+ resolve: async (_, args) => {
82
+ const service = new FieldsService({
83
+ accountability: gql.accountability,
84
+ schema: gql.schema,
85
+ });
86
+ await service.createField(args['collection'], args['data']);
87
+ return await service.readOne(args['collection'], args['data'].field);
156
88
  },
157
- delete_relations_item: {
158
- type: schemaComposer.createObjectTC({
159
- name: 'delete_relation',
160
- fields: {
161
- collection: GraphQLString,
162
- field: GraphQLString,
163
- },
164
- }),
165
- args: {
166
- collection: new GraphQLNonNull(GraphQLString),
167
- field: new GraphQLNonNull(GraphQLString),
89
+ },
90
+ update_fields_item: {
91
+ type: Field,
92
+ args: {
93
+ collection: new GraphQLNonNull(GraphQLString),
94
+ field: new GraphQLNonNull(GraphQLString),
95
+ data: toInputObjectType(Field, { postfix: '_input' }).NonNull,
96
+ },
97
+ resolve: async (_, args) => {
98
+ const service = new FieldsService({
99
+ accountability: gql.accountability,
100
+ schema: gql.schema,
101
+ });
102
+ await service.updateField(args['collection'], {
103
+ ...args['data'],
104
+ field: args['field'],
105
+ });
106
+ return await service.readOne(args['collection'], args['data'].field);
107
+ },
108
+ },
109
+ delete_fields_item: {
110
+ type: schemaComposer.createObjectTC({
111
+ name: 'delete_field',
112
+ fields: {
113
+ collection: GraphQLString,
114
+ field: GraphQLString,
168
115
  },
169
- resolve: async (_, args) => {
170
- const relationsService = new RelationsService({
171
- accountability: gql.accountability,
172
- schema: gql.schema,
173
- });
174
- await relationsService.deleteOne(args['collection'], args['field']);
175
- return { collection: args['collection'], field: args['field'] };
116
+ }),
117
+ args: {
118
+ collection: new GraphQLNonNull(GraphQLString),
119
+ field: new GraphQLNonNull(GraphQLString),
120
+ },
121
+ resolve: async (_, args) => {
122
+ const service = new FieldsService({
123
+ accountability: gql.accountability,
124
+ schema: gql.schema,
125
+ });
126
+ await service.deleteField(args['collection'], args['field']);
127
+ const { collection, field } = args;
128
+ return { collection, field };
129
+ },
130
+ },
131
+ });
132
+ schemaComposer.Mutation.addFields({
133
+ create_relations_item: {
134
+ type: Relation,
135
+ args: {
136
+ data: toInputObjectType(Relation, { postfix: '_input' }).NonNull,
137
+ },
138
+ resolve: async (_, args) => {
139
+ const relationsService = new RelationsService({
140
+ accountability: gql.accountability,
141
+ schema: gql.schema,
142
+ });
143
+ await relationsService.createOne(args['data']);
144
+ return await relationsService.readOne(args['data'].collection, args['data'].field);
145
+ },
146
+ },
147
+ update_relations_item: {
148
+ type: Relation,
149
+ args: {
150
+ collection: new GraphQLNonNull(GraphQLString),
151
+ field: new GraphQLNonNull(GraphQLString),
152
+ data: toInputObjectType(Relation, { postfix: '_input' }).NonNull,
153
+ },
154
+ resolve: async (_, args) => {
155
+ const relationsService = new RelationsService({
156
+ accountability: gql.accountability,
157
+ schema: gql.schema,
158
+ });
159
+ await relationsService.updateOne(args['collection'], args['field'], args['data']);
160
+ return await relationsService.readOne(args['data'].collection, args['data'].field);
161
+ },
162
+ },
163
+ delete_relations_item: {
164
+ type: schemaComposer.createObjectTC({
165
+ name: 'delete_relation',
166
+ fields: {
167
+ collection: GraphQLString,
168
+ field: GraphQLString,
176
169
  },
170
+ }),
171
+ args: {
172
+ collection: new GraphQLNonNull(GraphQLString),
173
+ field: new GraphQLNonNull(GraphQLString),
177
174
  },
178
- });
179
- Extension.addFields({
175
+ resolve: async (_, args) => {
176
+ const relationsService = new RelationsService({
177
+ accountability: gql.accountability,
178
+ schema: gql.schema,
179
+ });
180
+ await relationsService.deleteOne(args['collection'], args['field']);
181
+ return { collection: args['collection'], field: args['field'] };
182
+ },
183
+ },
184
+ });
185
+ const Extension = schemaComposer.createObjectTC({
186
+ name: 'directus_extensions',
187
+ fields: {
180
188
  bundle: GraphQLString,
181
189
  name: new GraphQLNonNull(GraphQLString),
182
190
  schema: schemaComposer.createObjectTC({
@@ -192,45 +200,45 @@ export function resolveSystemAdmin(gql, schemaComposer, { Collection, Field, Rel
192
200
  enabled: GraphQLBoolean,
193
201
  },
194
202
  }),
195
- });
196
- schemaComposer.Query.addFields({
197
- extensions: {
198
- type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(Extension.getType()))),
199
- resolve: async () => {
200
- const service = new ExtensionsService({
201
- accountability: gql.accountability,
202
- schema: gql.schema,
203
- });
204
- return await service.readAll();
205
- },
203
+ },
204
+ });
205
+ schemaComposer.Query.addFields({
206
+ extensions: {
207
+ type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(Extension.getType()))),
208
+ resolve: async () => {
209
+ const service = new ExtensionsService({
210
+ accountability: gql.accountability,
211
+ schema: gql.schema,
212
+ });
213
+ return await service.readAll();
206
214
  },
207
- });
208
- schemaComposer.Mutation.addFields({
209
- update_extensions_item: {
210
- type: Extension,
211
- args: {
212
- id: GraphQLID,
213
- data: toInputObjectType(schemaComposer.createObjectTC({
214
- name: 'update_directus_extensions_input',
215
- fields: {
216
- meta: schemaComposer.createObjectTC({
217
- name: 'update_directus_extensions_input_meta',
218
- fields: {
219
- enabled: GraphQLBoolean,
220
- },
221
- }),
222
- },
223
- })),
224
- },
225
- resolve: async (_, args) => {
226
- const extensionsService = new ExtensionsService({
227
- accountability: gql.accountability,
228
- schema: gql.schema,
229
- });
230
- await extensionsService.updateOne(args['id'], args['data']);
231
- return await extensionsService.readOne(args['id']);
232
- },
215
+ },
216
+ });
217
+ schemaComposer.Mutation.addFields({
218
+ update_extensions_item: {
219
+ type: Extension,
220
+ args: {
221
+ id: GraphQLID,
222
+ data: toInputObjectType(schemaComposer.createObjectTC({
223
+ name: 'update_directus_extensions_input',
224
+ fields: {
225
+ meta: schemaComposer.createObjectTC({
226
+ name: 'update_directus_extensions_input_meta',
227
+ fields: {
228
+ enabled: GraphQLBoolean,
229
+ },
230
+ }),
231
+ },
232
+ })),
233
233
  },
234
- });
235
- }
234
+ resolve: async (_, args) => {
235
+ const extensionsService = new ExtensionsService({
236
+ accountability: gql.accountability,
237
+ schema: gql.schema,
238
+ });
239
+ await extensionsService.updateOne(args['id'], args['data']);
240
+ return await extensionsService.readOne(args['id']);
241
+ },
242
+ },
243
+ });
236
244
  }
@@ -1,11 +1,5 @@
1
- import { ObjectTypeComposer, SchemaComposer } from 'graphql-compose';
1
+ import { SchemaComposer } from 'graphql-compose';
2
2
  import type { GraphQLParams } from '../../../types/index.js';
3
3
  import { GraphQLService } from '../index.js';
4
4
  import { type CollectionTypes, type Schema } from '../schema/index.js';
5
- export type BaseTypeComposers = {
6
- Collection: ObjectTypeComposer<any, any>;
7
- Field: ObjectTypeComposer<any, any>;
8
- Relation: ObjectTypeComposer<any, any>;
9
- Extension: ObjectTypeComposer<any, any>;
10
- };
11
5
  export declare function injectSystemResolvers(gql: GraphQLService, schemaComposer: SchemaComposer<GraphQLParams['contextValue']>, { CreateCollectionTypes, ReadCollectionTypes, UpdateCollectionTypes }: CollectionTypes, schema: Schema): SchemaComposer<any>;
@@ -1,11 +1,10 @@
1
1
  import { useEnv } from '@directus/env';
2
2
  import { toBoolean } from '@directus/utils';
3
3
  import { GraphQLBoolean, GraphQLEnumType, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, } from 'graphql';
4
- import { GraphQLJSON, ObjectTypeComposer, SchemaComposer, toInputObjectType } from 'graphql-compose';
4
+ import { GraphQLJSON, SchemaComposer, toInputObjectType } from 'graphql-compose';
5
5
  import getDatabase from '../../../database/index.js';
6
6
  import { fetchAccountabilityCollectionAccess } from '../../../permissions/modules/fetch-accountability-collection-access/fetch-accountability-collection-access.js';
7
7
  import { fetchAccountabilityPolicyGlobals } from '../../../permissions/modules/fetch-accountability-policy-globals/fetch-accountability-policy-globals.js';
8
- import { getGraphQLType } from '../../../utils/get-graphql-type.js';
9
8
  import { CollectionsService } from '../../collections.js';
10
9
  import { FieldsService } from '../../fields.js';
11
10
  import { FilesService } from '../../files.js';
@@ -18,6 +17,9 @@ import { GraphQLService } from '../index.js';
18
17
  import { generateSchema } from '../schema/index.js';
19
18
  import { getQuery } from '../schema/parse-query.js';
20
19
  import { replaceFragmentsInSelections } from '../utils/replace-fragments.js';
20
+ import { getCollectionType } from './get-collection-type.js';
21
+ import { getFieldType } from './get-field-type.js';
22
+ import { getRelationType } from './get-relation-type.js';
21
23
  import { resolveSystemAdmin } from './system-admin.js';
22
24
  import { globalResolvers } from './system-global.js';
23
25
  const env = useEnv();
@@ -187,47 +189,8 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
187
189
  },
188
190
  },
189
191
  });
190
- const Collection = schemaComposer.createObjectTC({
191
- name: 'directus_collections',
192
- });
193
- const Field = schemaComposer.createObjectTC({
194
- name: 'directus_fields',
195
- });
196
- const Relation = schemaComposer.createObjectTC({
197
- name: 'directus_relations',
198
- });
199
- const Extension = schemaComposer.createObjectTC({
200
- name: 'directus_extensions',
201
- });
202
- const composers = {
203
- Collection,
204
- Field,
205
- Relation,
206
- Extension,
207
- };
208
192
  if ('directus_collections' in schema.read.collections) {
209
- Collection.addFields({
210
- collection: GraphQLString,
211
- meta: schemaComposer.createObjectTC({
212
- name: 'directus_collections_meta',
213
- fields: Object.values(schema.read.collections['directus_collections'].fields).reduce((acc, field) => {
214
- acc[field.field] = {
215
- type: field.nullable
216
- ? getGraphQLType(field.type, field.special)
217
- : new GraphQLNonNull(getGraphQLType(field.type, field.special)),
218
- description: field.note,
219
- };
220
- return acc;
221
- }, {}),
222
- }),
223
- schema: schemaComposer.createObjectTC({
224
- name: 'directus_collections_schema',
225
- fields: {
226
- name: GraphQLString,
227
- comment: GraphQLString,
228
- },
229
- }),
230
- });
193
+ const Collection = getCollectionType(schemaComposer, schema, 'read');
231
194
  schemaComposer.Query.addFields({
232
195
  collections: {
233
196
  type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(Collection.getType()))),
@@ -255,45 +218,7 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
255
218
  });
256
219
  }
257
220
  if ('directus_fields' in schema.read.collections) {
258
- Field.addFields({
259
- collection: GraphQLString,
260
- field: GraphQLString,
261
- type: GraphQLString,
262
- meta: schemaComposer.createObjectTC({
263
- name: 'directus_fields_meta',
264
- fields: Object.values(schema.read.collections['directus_fields'].fields).reduce((acc, field) => {
265
- acc[field.field] = {
266
- type: field.nullable
267
- ? getGraphQLType(field.type, field.special)
268
- : new GraphQLNonNull(getGraphQLType(field.type, field.special)),
269
- description: field.note,
270
- };
271
- return acc;
272
- }, {}),
273
- }),
274
- schema: schemaComposer.createObjectTC({
275
- name: 'directus_fields_schema',
276
- fields: {
277
- name: GraphQLString,
278
- table: GraphQLString,
279
- data_type: GraphQLString,
280
- default_value: GraphQLString,
281
- max_length: GraphQLInt,
282
- numeric_precision: GraphQLInt,
283
- numeric_scale: GraphQLInt,
284
- is_generated: GraphQLBoolean,
285
- generation_expression: GraphQLString,
286
- is_indexed: GraphQLBoolean,
287
- is_nullable: GraphQLBoolean,
288
- is_unique: GraphQLBoolean,
289
- is_primary_key: GraphQLBoolean,
290
- has_auto_increment: GraphQLBoolean,
291
- foreign_key_column: GraphQLString,
292
- foreign_key_table: GraphQLString,
293
- comment: GraphQLString,
294
- },
295
- }),
296
- });
221
+ const Field = getFieldType(schemaComposer, schema, 'read');
297
222
  schemaComposer.Query.addFields({
298
223
  fields: {
299
224
  type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(Field.getType()))),
@@ -335,33 +260,7 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
335
260
  });
336
261
  }
337
262
  if ('directus_relations' in schema.read.collections) {
338
- Relation.addFields({
339
- collection: GraphQLString,
340
- field: GraphQLString,
341
- related_collection: GraphQLString,
342
- schema: schemaComposer.createObjectTC({
343
- name: 'directus_relations_schema',
344
- fields: {
345
- table: new GraphQLNonNull(GraphQLString),
346
- column: new GraphQLNonNull(GraphQLString),
347
- foreign_key_table: new GraphQLNonNull(GraphQLString),
348
- foreign_key_column: new GraphQLNonNull(GraphQLString),
349
- constraint_name: GraphQLString,
350
- on_update: new GraphQLNonNull(GraphQLString),
351
- on_delete: new GraphQLNonNull(GraphQLString),
352
- },
353
- }),
354
- meta: schemaComposer.createObjectTC({
355
- name: 'directus_relations_meta',
356
- fields: Object.values(schema.read.collections['directus_relations'].fields).reduce((acc, field) => {
357
- acc[field.field] = {
358
- type: getGraphQLType(field.type, field.special),
359
- description: field.note,
360
- };
361
- return acc;
362
- }, {}),
363
- }),
364
- });
263
+ const Relation = getRelationType(schemaComposer, schema, 'read');
365
264
  schemaComposer.Query.addFields({
366
265
  relations: {
367
266
  type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(Relation.getType()))),
@@ -402,7 +301,7 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
402
301
  },
403
302
  });
404
303
  }
405
- resolveSystemAdmin(gql, schemaComposer, composers);
304
+ resolveSystemAdmin(gql, schema, schemaComposer);
406
305
  if ('directus_users' in schema.read.collections) {
407
306
  schemaComposer.Query.addFields({
408
307
  users_me: {
@@ -412,7 +311,7 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
412
311
  return null;
413
312
  const service = new UsersService({ schema: gql.schema, accountability: gql.accountability });
414
313
  const selections = replaceFragmentsInSelections(info.fieldNodes[0]?.selectionSet?.selections, info.fragments);
415
- const query = getQuery(args, selections || [], info.variableValues, gql.accountability);
314
+ const query = await getQuery(args, selections || [], info.variableValues, gql.schema, gql.accountability);
416
315
  return await service.readOne(gql.accountability.user, query);
417
316
  },
418
317
  },
@@ -450,7 +349,7 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
450
349
  schema: gql.schema,
451
350
  });
452
351
  const selections = replaceFragmentsInSelections(info.fieldNodes[0]?.selectionSet?.selections, info.fragments);
453
- const query = getQuery(args, selections || [], info.variableValues, gql.accountability);
352
+ const query = await getQuery(args, selections || [], info.variableValues, gql.schema, gql.accountability);
454
353
  query.limit = -1;
455
354
  const roles = await service.readMany(gql.accountability.roles, query);
456
355
  return roles;
@@ -498,7 +397,7 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
498
397
  await service.updateOne(gql.accountability.user, args['data']);
499
398
  if ('directus_users' in ReadCollectionTypes) {
500
399
  const selections = replaceFragmentsInSelections(info.fieldNodes[0]?.selectionSet?.selections, info.fragments);
501
- const query = getQuery(args, selections || [], info.variableValues, gql.accountability);
400
+ const query = await getQuery(args, selections || [], info.variableValues, gql.schema, gql.accountability);
502
401
  return await service.readOne(gql.accountability.user, query);
503
402
  }
504
403
  return true;
@@ -522,7 +421,7 @@ export function injectSystemResolvers(gql, schemaComposer, { CreateCollectionTyp
522
421
  const primaryKey = await service.importOne(args['url'], args['data']);
523
422
  if ('directus_files' in ReadCollectionTypes) {
524
423
  const selections = replaceFragmentsInSelections(info.fieldNodes[0]?.selectionSet?.selections, info.fragments);
525
- const query = getQuery(args, selections || [], info.variableValues, gql.accountability);
424
+ const query = await getQuery(args, selections || [], info.variableValues, gql.schema, gql.accountability);
526
425
  return await service.readOne(primaryKey, query);
527
426
  }
528
427
  return true;
@@ -89,7 +89,7 @@ export async function generateSchema(gql, type = 'schema') {
89
89
  action: 'delete',
90
90
  }, { schema: gql.schema, knex: gql.knex }),
91
91
  };
92
- const { ReadCollectionTypes, VersionCollectionTypes } = getReadableTypes(gql, schemaComposer, schema, inconsistentFields);
92
+ const { ReadCollectionTypes, VersionCollectionTypes } = await getReadableTypes(gql, schemaComposer, schema, inconsistentFields);
93
93
  const { CreateCollectionTypes, UpdateCollectionTypes, DeleteCollectionTypes } = getWritableTypes(gql, schemaComposer, schema, inconsistentFields, ReadCollectionTypes);
94
94
  const CollectionTypes = {
95
95
  CreateCollectionTypes,