@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.
- package/dist/app.js +3 -3
- package/dist/auth/drivers/oauth2.d.ts +2 -0
- package/dist/auth/drivers/oauth2.js +40 -2
- package/dist/auth/drivers/openid.js +8 -1
- package/dist/controllers/access.js +2 -2
- package/dist/controllers/comments.js +2 -2
- package/dist/controllers/dashboards.js +2 -2
- package/dist/controllers/files.js +2 -2
- package/dist/controllers/flows.js +2 -2
- package/dist/controllers/folders.js +2 -2
- package/dist/controllers/items.js +2 -2
- package/dist/controllers/notifications.js +2 -2
- package/dist/controllers/operations.js +2 -2
- package/dist/controllers/panels.js +2 -2
- package/dist/controllers/permissions.js +2 -2
- package/dist/controllers/policies.js +2 -2
- package/dist/controllers/presets.js +2 -2
- package/dist/controllers/roles.js +2 -2
- package/dist/controllers/shares.js +2 -2
- package/dist/controllers/translations.js +2 -2
- package/dist/controllers/users.js +2 -2
- package/dist/controllers/utils.js +8 -3
- package/dist/controllers/versions.js +2 -2
- package/dist/controllers/webhooks.js +1 -1
- package/dist/database/helpers/capabilities/dialects/default.d.ts +3 -0
- package/dist/database/helpers/capabilities/dialects/default.js +3 -0
- package/dist/database/helpers/capabilities/dialects/mysql.d.ts +4 -0
- package/dist/database/helpers/capabilities/dialects/mysql.js +9 -0
- package/dist/database/helpers/capabilities/dialects/postgres.d.ts +5 -0
- package/dist/database/helpers/capabilities/dialects/postgres.js +14 -0
- package/dist/database/helpers/capabilities/index.d.ts +7 -0
- package/dist/database/helpers/capabilities/index.js +7 -0
- package/dist/database/helpers/capabilities/types.d.ts +11 -0
- package/dist/database/helpers/capabilities/types.js +15 -0
- package/dist/database/helpers/index.d.ts +2 -0
- package/dist/database/helpers/index.js +2 -0
- package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -2
- package/dist/database/helpers/schema/dialects/cockroachdb.js +0 -4
- package/dist/database/helpers/schema/dialects/postgres.d.ts +1 -2
- package/dist/database/helpers/schema/dialects/postgres.js +0 -4
- package/dist/database/index.js +1 -1
- package/dist/database/migrations/20250224A-visual-editor.d.ts +3 -0
- package/dist/database/migrations/20250224A-visual-editor.js +35 -0
- package/dist/database/run-ast/lib/get-db-query.js +16 -4
- package/dist/logger/index.js +3 -3
- package/dist/middleware/sanitize-query.js +17 -7
- package/dist/middleware/validate-batch.js +1 -1
- package/dist/operations/item-delete/index.js +1 -1
- package/dist/operations/item-read/index.js +1 -1
- package/dist/operations/item-update/index.js +1 -1
- package/dist/permissions/lib/fetch-permissions.js +6 -4
- package/dist/permissions/modules/process-ast/utils/context-has-dynamic-variables.d.ts +2 -0
- package/dist/permissions/modules/process-ast/utils/context-has-dynamic-variables.js +3 -0
- package/dist/permissions/modules/process-payload/process-payload.d.ts +1 -0
- package/dist/permissions/modules/process-payload/process-payload.js +13 -4
- package/dist/permissions/types.d.ts +2 -1
- package/dist/permissions/utils/extract-required-dynamic-variable-context.d.ts +3 -2
- package/dist/permissions/utils/extract-required-dynamic-variable-context.js +24 -5
- package/dist/permissions/utils/fetch-dynamic-variable-data.d.ts +9 -0
- package/dist/permissions/utils/{fetch-dynamic-variable-context.js → fetch-dynamic-variable-data.js} +11 -12
- package/dist/rate-limiter.js +1 -1
- package/dist/services/assets.js +12 -2
- package/dist/services/authentication.js +2 -2
- package/dist/services/collections.js +39 -3
- package/dist/services/fields/build-collection-and-field-relations.d.ts +21 -0
- package/dist/services/fields/build-collection-and-field-relations.js +55 -0
- package/dist/services/fields/get-collection-meta-updates.d.ts +11 -0
- package/dist/services/fields/get-collection-meta-updates.js +72 -0
- package/dist/services/fields/get-collection-relation-list.d.ts +5 -0
- package/dist/services/fields/get-collection-relation-list.js +28 -0
- package/dist/services/fields.js +17 -12
- package/dist/services/graphql/resolvers/get-collection-type.d.ts +3 -0
- package/dist/services/graphql/resolvers/get-collection-type.js +34 -0
- package/dist/services/graphql/resolvers/get-field-type.d.ts +3 -0
- package/dist/services/graphql/resolvers/get-field-type.js +51 -0
- package/dist/services/graphql/resolvers/get-relation-type.d.ts +3 -0
- package/dist/services/graphql/resolvers/get-relation-type.js +39 -0
- package/dist/services/graphql/resolvers/mutation.js +1 -1
- package/dist/services/graphql/resolvers/query.js +4 -4
- package/dist/services/graphql/resolvers/system-admin.d.ts +2 -2
- package/dist/services/graphql/resolvers/system-admin.js +207 -199
- package/dist/services/graphql/resolvers/system.d.ts +1 -7
- package/dist/services/graphql/resolvers/system.js +12 -113
- package/dist/services/graphql/schema/index.js +1 -1
- package/dist/services/graphql/schema/parse-query.d.ts +2 -2
- package/dist/services/graphql/schema/parse-query.js +6 -6
- package/dist/services/graphql/schema/read.d.ts +2 -2
- package/dist/services/graphql/schema/read.js +86 -2
- package/dist/services/graphql/schema-cache.d.ts +2 -2
- package/dist/services/graphql/schema-cache.js +1 -3
- package/dist/services/graphql/subscription.d.ts +3 -3
- package/dist/services/graphql/subscription.js +3 -3
- package/dist/services/graphql/utils/{aggrgate-query.d.ts → aggregate-query.d.ts} +2 -2
- package/dist/services/graphql/utils/{aggrgate-query.js → aggregate-query.js} +3 -3
- package/dist/services/items.d.ts +1 -0
- package/dist/services/items.js +30 -16
- package/dist/services/meta.js +4 -2
- package/dist/services/payload.d.ts +1 -0
- package/dist/services/payload.js +32 -17
- package/dist/services/shares.js +1 -1
- package/dist/services/specifications.js +10 -5
- package/dist/services/tus/lockers.d.ts +1 -1
- package/dist/services/tus/lockers.js +6 -5
- package/dist/services/tus/server.js +24 -0
- package/dist/services/users.js +1 -0
- package/dist/types/services.d.ts +2 -0
- package/dist/utils/apply-query.d.ts +1 -0
- package/dist/utils/apply-query.js +42 -31
- package/dist/utils/generate-hash.js +1 -1
- package/dist/utils/get-config-from-env.d.ts +6 -1
- package/dist/utils/get-config-from-env.js +16 -11
- package/dist/utils/get-graphql-type.js +3 -1
- package/dist/utils/is-login-redirect-allowed.js +2 -0
- package/dist/utils/redact-object.js +5 -1
- package/dist/utils/sanitize-query.d.ts +5 -2
- package/dist/utils/sanitize-query.js +34 -9
- package/dist/websocket/controllers/base.d.ts +2 -2
- package/dist/websocket/handlers/items.js +4 -4
- package/dist/websocket/handlers/subscribe.js +2 -2
- package/dist/websocket/messages.d.ts +7 -7
- package/dist/websocket/messages.js +1 -1
- package/package.json +58 -58
- 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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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 {
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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,
|