@directus/api 25.0.1 → 26.0.1
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 +19 -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} +13 -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 +8 -2
- 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/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 +21 -12
- 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 +59 -59
- package/dist/permissions/utils/fetch-dynamic-variable-context.d.ts +0 -8
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { GraphQLBoolean, GraphQLInt, GraphQLNonNull, GraphQLString } from 'graphql';
|
|
2
|
+
import { getGraphQLType } from '../../../utils/get-graphql-type.js';
|
|
3
|
+
export function getFieldType(schemaComposer, schema, action) {
|
|
4
|
+
const prefix = action === 'read' ? '' : 'write_';
|
|
5
|
+
const Field = schemaComposer.createObjectTC({
|
|
6
|
+
name: `${prefix}directus_fields`,
|
|
7
|
+
});
|
|
8
|
+
if ('directus_fields' in schema.read.collections === false) {
|
|
9
|
+
return Field;
|
|
10
|
+
}
|
|
11
|
+
Field.addFields({
|
|
12
|
+
collection: GraphQLString,
|
|
13
|
+
field: GraphQLString,
|
|
14
|
+
type: GraphQLString,
|
|
15
|
+
meta: schemaComposer.createObjectTC({
|
|
16
|
+
name: `${prefix}directus_fields_meta`,
|
|
17
|
+
fields: Object.values(schema.read.collections['directus_fields'].fields).reduce((acc, field) => {
|
|
18
|
+
acc[field.field] = {
|
|
19
|
+
type: field.nullable || action === 'write'
|
|
20
|
+
? getGraphQLType(field.type, field.special)
|
|
21
|
+
: new GraphQLNonNull(getGraphQLType(field.type, field.special)),
|
|
22
|
+
description: field.note,
|
|
23
|
+
};
|
|
24
|
+
return acc;
|
|
25
|
+
}, {}),
|
|
26
|
+
}),
|
|
27
|
+
schema: schemaComposer.createObjectTC({
|
|
28
|
+
name: `${prefix}directus_fields_schema`,
|
|
29
|
+
fields: {
|
|
30
|
+
name: GraphQLString,
|
|
31
|
+
table: GraphQLString,
|
|
32
|
+
data_type: GraphQLString,
|
|
33
|
+
default_value: GraphQLString,
|
|
34
|
+
max_length: GraphQLInt,
|
|
35
|
+
numeric_precision: GraphQLInt,
|
|
36
|
+
numeric_scale: GraphQLInt,
|
|
37
|
+
is_generated: GraphQLBoolean,
|
|
38
|
+
generation_expression: GraphQLString,
|
|
39
|
+
is_indexed: GraphQLBoolean,
|
|
40
|
+
is_nullable: GraphQLBoolean,
|
|
41
|
+
is_unique: GraphQLBoolean,
|
|
42
|
+
is_primary_key: GraphQLBoolean,
|
|
43
|
+
has_auto_increment: GraphQLBoolean,
|
|
44
|
+
foreign_key_column: GraphQLString,
|
|
45
|
+
foreign_key_table: GraphQLString,
|
|
46
|
+
comment: GraphQLString,
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
return Field;
|
|
51
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { SchemaComposer } from 'graphql-compose';
|
|
2
|
+
import type { Schema } from '../schema/index.js';
|
|
3
|
+
export declare function getRelationType(schemaComposer: SchemaComposer, schema: Schema, action: 'read' | 'write'): import("graphql-compose").ObjectTypeComposer<any, any>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { GraphQLNonNull, GraphQLString } from 'graphql';
|
|
2
|
+
import { getGraphQLType } from '../../../utils/get-graphql-type.js';
|
|
3
|
+
export function getRelationType(schemaComposer, schema, action) {
|
|
4
|
+
const prefix = action === 'read' ? '' : 'write_';
|
|
5
|
+
const Relation = schemaComposer.createObjectTC({
|
|
6
|
+
name: `${prefix}directus_relations`,
|
|
7
|
+
});
|
|
8
|
+
if ('directus_relations' in schema.read.collections === false) {
|
|
9
|
+
return Relation;
|
|
10
|
+
}
|
|
11
|
+
Relation.addFields({
|
|
12
|
+
collection: GraphQLString,
|
|
13
|
+
field: GraphQLString,
|
|
14
|
+
related_collection: GraphQLString,
|
|
15
|
+
schema: schemaComposer.createObjectTC({
|
|
16
|
+
name: `${prefix}directus_relations_schema`,
|
|
17
|
+
fields: {
|
|
18
|
+
table: new GraphQLNonNull(GraphQLString),
|
|
19
|
+
column: new GraphQLNonNull(GraphQLString),
|
|
20
|
+
foreign_key_table: new GraphQLNonNull(GraphQLString),
|
|
21
|
+
foreign_key_column: new GraphQLNonNull(GraphQLString),
|
|
22
|
+
constraint_name: GraphQLString,
|
|
23
|
+
on_update: new GraphQLNonNull(GraphQLString),
|
|
24
|
+
on_delete: new GraphQLNonNull(GraphQLString),
|
|
25
|
+
},
|
|
26
|
+
}),
|
|
27
|
+
meta: schemaComposer.createObjectTC({
|
|
28
|
+
name: `${prefix}directus_relations_meta`,
|
|
29
|
+
fields: Object.values(schema.read.collections['directus_relations'].fields).reduce((acc, field) => {
|
|
30
|
+
acc[field.field] = {
|
|
31
|
+
type: getGraphQLType(field.type, field.special),
|
|
32
|
+
description: field.note,
|
|
33
|
+
};
|
|
34
|
+
return acc;
|
|
35
|
+
}, {}),
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
return Relation;
|
|
39
|
+
}
|
|
@@ -8,7 +8,7 @@ export async function resolveMutation(gql, args, info) {
|
|
|
8
8
|
if (gql.scope === 'system')
|
|
9
9
|
collection = `directus_${collection}`;
|
|
10
10
|
const selections = replaceFragmentsInSelections(info.fieldNodes[0]?.selectionSet?.selections, info.fragments);
|
|
11
|
-
const query = getQuery(args, selections || [], info.variableValues, gql.accountability);
|
|
11
|
+
const query = await getQuery(args, selections || [], info.variableValues, gql.schema, gql.accountability);
|
|
12
12
|
const singleton = collection.endsWith('_batch') === false &&
|
|
13
13
|
collection.endsWith('_items') === false &&
|
|
14
14
|
collection.endsWith('_item') === false &&
|
|
@@ -2,10 +2,10 @@ import { parseFilterFunctionPath } from '@directus/utils';
|
|
|
2
2
|
import { omit } from 'lodash-es';
|
|
3
3
|
import { mergeVersionsRaw, mergeVersionsRecursive } from '../../../utils/merge-version-data.js';
|
|
4
4
|
import { VersionsService } from '../../versions.js';
|
|
5
|
-
import { getAggregateQuery } from '../utils/aggrgate-query.js';
|
|
6
|
-
import { replaceFragmentsInSelections } from '../utils/replace-fragments.js';
|
|
7
5
|
import { parseArgs } from '../schema/parse-args.js';
|
|
8
6
|
import { getQuery } from '../schema/parse-query.js';
|
|
7
|
+
import { getAggregateQuery } from '../utils/aggregate-query.js';
|
|
8
|
+
import { replaceFragmentsInSelections } from '../utils/replace-fragments.js';
|
|
9
9
|
/**
|
|
10
10
|
* Generic resolver that's used for every "regular" items/system query. Converts the incoming GraphQL AST / fragments into
|
|
11
11
|
* Directus' query structure which is then executed by the services.
|
|
@@ -22,11 +22,11 @@ export async function resolveQuery(gql, info) {
|
|
|
22
22
|
let versionRaw = false;
|
|
23
23
|
const isAggregate = collection.endsWith('_aggregated') && collection in gql.schema.collections === false;
|
|
24
24
|
if (isAggregate) {
|
|
25
|
-
query = getAggregateQuery(args, selections, gql.accountability);
|
|
25
|
+
query = await getAggregateQuery(args, selections, gql.schema, gql.accountability);
|
|
26
26
|
collection = collection.slice(0, -11);
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
29
|
-
query = getQuery(args, selections, info.variableValues, gql.accountability);
|
|
29
|
+
query = await getQuery(args, selections, info.variableValues, gql.schema, gql.accountability);
|
|
30
30
|
if (collection.endsWith('_by_id') && collection in gql.schema.collections === false) {
|
|
31
31
|
collection = collection.slice(0, -6);
|
|
32
32
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SchemaComposer } from 'graphql-compose';
|
|
2
2
|
import type { GraphQLParams } from '../../../types/index.js';
|
|
3
3
|
import { GraphQLService } from '../index.js';
|
|
4
|
-
import type {
|
|
5
|
-
export declare function resolveSystemAdmin(gql: GraphQLService, schemaComposer: SchemaComposer<GraphQLParams['contextValue']
|
|
4
|
+
import type { Schema } from '../schema/index.js';
|
|
5
|
+
export declare function resolveSystemAdmin(gql: GraphQLService, schema: Schema, schemaComposer: SchemaComposer<GraphQLParams['contextValue']>): void;
|
|
@@ -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>;
|