@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.
Files changed (115) 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 +19 -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} +13 -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 +8 -2
  65. package/dist/services/graphql/resolvers/get-collection-type.d.ts +3 -0
  66. package/dist/services/graphql/resolvers/get-collection-type.js +34 -0
  67. package/dist/services/graphql/resolvers/get-field-type.d.ts +3 -0
  68. package/dist/services/graphql/resolvers/get-field-type.js +51 -0
  69. package/dist/services/graphql/resolvers/get-relation-type.d.ts +3 -0
  70. package/dist/services/graphql/resolvers/get-relation-type.js +39 -0
  71. package/dist/services/graphql/resolvers/mutation.js +1 -1
  72. package/dist/services/graphql/resolvers/query.js +4 -4
  73. package/dist/services/graphql/resolvers/system-admin.d.ts +2 -2
  74. package/dist/services/graphql/resolvers/system-admin.js +207 -199
  75. package/dist/services/graphql/resolvers/system.d.ts +1 -7
  76. package/dist/services/graphql/resolvers/system.js +12 -113
  77. package/dist/services/graphql/schema/index.js +1 -1
  78. package/dist/services/graphql/schema/parse-query.d.ts +2 -2
  79. package/dist/services/graphql/schema/parse-query.js +6 -6
  80. package/dist/services/graphql/schema/read.d.ts +2 -2
  81. package/dist/services/graphql/schema/read.js +86 -2
  82. package/dist/services/graphql/schema-cache.d.ts +2 -2
  83. package/dist/services/graphql/schema-cache.js +1 -3
  84. package/dist/services/graphql/subscription.d.ts +3 -3
  85. package/dist/services/graphql/subscription.js +3 -3
  86. package/dist/services/graphql/utils/{aggrgate-query.d.ts → aggregate-query.d.ts} +2 -2
  87. package/dist/services/graphql/utils/{aggrgate-query.js → aggregate-query.js} +3 -3
  88. package/dist/services/items.d.ts +1 -0
  89. package/dist/services/items.js +30 -16
  90. package/dist/services/payload.d.ts +1 -0
  91. package/dist/services/payload.js +32 -17
  92. package/dist/services/shares.js +1 -1
  93. package/dist/services/specifications.js +10 -5
  94. package/dist/services/tus/lockers.d.ts +1 -1
  95. package/dist/services/tus/lockers.js +6 -5
  96. package/dist/services/tus/server.js +24 -0
  97. package/dist/services/users.js +1 -0
  98. package/dist/types/services.d.ts +2 -0
  99. package/dist/utils/apply-query.d.ts +1 -0
  100. package/dist/utils/apply-query.js +21 -12
  101. package/dist/utils/generate-hash.js +1 -1
  102. package/dist/utils/get-config-from-env.d.ts +6 -1
  103. package/dist/utils/get-config-from-env.js +16 -11
  104. package/dist/utils/get-graphql-type.js +3 -1
  105. package/dist/utils/is-login-redirect-allowed.js +2 -0
  106. package/dist/utils/redact-object.js +5 -1
  107. package/dist/utils/sanitize-query.d.ts +5 -2
  108. package/dist/utils/sanitize-query.js +34 -9
  109. package/dist/websocket/controllers/base.d.ts +2 -2
  110. package/dist/websocket/handlers/items.js +4 -4
  111. package/dist/websocket/handlers/subscribe.js +2 -2
  112. package/dist/websocket/messages.d.ts +7 -7
  113. package/dist/websocket/messages.js +1 -1
  114. package/package.json +59 -59
  115. 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 { BaseTypeComposers } from './system.js';
5
- export declare function resolveSystemAdmin(gql: GraphQLService, schemaComposer: SchemaComposer<GraphQLParams['contextValue']>, { Collection, Field, Relation, Extension }: BaseTypeComposers): void;
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
- 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>;