directus 9.23.1 → 9.23.3
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 +14 -10
- package/dist/auth/auth.d.ts +3 -3
- package/dist/auth/auth.js +2 -0
- package/dist/auth/drivers/ldap.d.ts +1 -1
- package/dist/auth/drivers/ldap.js +39 -28
- package/dist/auth/drivers/local.d.ts +1 -1
- package/dist/auth/drivers/local.js +13 -10
- package/dist/auth/drivers/oauth2.d.ts +1 -1
- package/dist/auth/drivers/oauth2.js +20 -13
- package/dist/auth/drivers/openid.d.ts +1 -1
- package/dist/auth/drivers/openid.js +21 -14
- package/dist/auth/drivers/saml.d.ts +1 -1
- package/dist/auth/drivers/saml.js +10 -7
- package/dist/auth.d.ts +1 -1
- package/dist/auth.js +4 -4
- package/dist/cache.d.ts +9 -1
- package/dist/cache.js +57 -14
- package/dist/cli/commands/bootstrap/index.js +2 -2
- package/dist/cli/commands/init/index.js +3 -3
- package/dist/cli/commands/schema/apply.js +14 -15
- package/dist/cli/commands/schema/snapshot.js +2 -2
- package/dist/cli/utils/create-db-connection.d.ts +1 -1
- package/dist/cli/utils/create-db-connection.js +2 -1
- package/dist/cli/utils/create-env/index.d.ts +2 -2
- package/dist/cli/utils/drivers.d.ts +1 -1
- package/dist/constants.d.ts +2 -2
- package/dist/constants.js +2 -3
- package/dist/controllers/activity.js +1 -2
- package/dist/controllers/assets.js +14 -9
- package/dist/controllers/auth.js +29 -15
- package/dist/controllers/dashboards.js +5 -2
- package/dist/controllers/fields.js +4 -4
- package/dist/controllers/files.js +10 -5
- package/dist/controllers/flows.js +5 -2
- package/dist/controllers/folders.js +5 -2
- package/dist/controllers/graphql.js +2 -4
- package/dist/controllers/items.js +5 -2
- package/dist/controllers/not-found.d.ts +1 -1
- package/dist/controllers/not-found.js +1 -2
- package/dist/controllers/notifications.js +5 -2
- package/dist/controllers/operations.js +5 -2
- package/dist/controllers/panels.js +5 -2
- package/dist/controllers/permissions.js +5 -2
- package/dist/controllers/presets.js +5 -2
- package/dist/controllers/roles.js +5 -2
- package/dist/controllers/shares.js +8 -5
- package/dist/controllers/users.js +16 -20
- package/dist/controllers/utils.js +6 -11
- package/dist/controllers/webhooks.js +5 -2
- package/dist/database/helpers/fn/dialects/mssql.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/mssql.js +10 -11
- package/dist/database/helpers/fn/dialects/mysql.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/mysql.js +2 -3
- package/dist/database/helpers/fn/dialects/oracle.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/oracle.js +10 -11
- package/dist/database/helpers/fn/dialects/postgres.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/postgres.js +10 -11
- package/dist/database/helpers/fn/dialects/sqlite.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/sqlite.js +10 -11
- package/dist/database/helpers/fn/types.d.ts +5 -5
- package/dist/database/helpers/fn/types.js +5 -4
- package/dist/database/helpers/geometry/dialects/mssql.d.ts +3 -3
- package/dist/database/helpers/geometry/dialects/mysql.d.ts +1 -1
- package/dist/database/helpers/geometry/dialects/oracle.d.ts +3 -3
- package/dist/database/helpers/geometry/dialects/postgres.d.ts +3 -3
- package/dist/database/helpers/geometry/dialects/postgres.js +1 -2
- package/dist/database/helpers/geometry/dialects/redshift.d.ts +2 -2
- package/dist/database/helpers/geometry/dialects/sqlite.d.ts +1 -1
- package/dist/database/helpers/geometry/types.d.ts +2 -2
- package/dist/database/helpers/geometry/types.js +1 -2
- package/dist/database/helpers/index.d.ts +5 -5
- package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -1
- package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
- package/dist/database/helpers/schema/dialects/mysql.d.ts +1 -1
- package/dist/database/helpers/schema/dialects/mysql.js +1 -2
- package/dist/database/helpers/schema/dialects/oracle.d.ts +2 -2
- package/dist/database/helpers/schema/dialects/oracle.js +4 -6
- package/dist/database/helpers/schema/types.d.ts +4 -4
- package/dist/database/helpers/types.d.ts +1 -1
- package/dist/database/helpers/types.js +1 -0
- package/dist/database/index.d.ts +1 -1
- package/dist/database/index.js +8 -8
- package/dist/database/migrations/20201028A-remove-collection-foreign-keys.d.ts +1 -1
- package/dist/database/migrations/20201029A-remove-system-relations.d.ts +1 -1
- package/dist/database/migrations/20201029B-remove-system-collections.d.ts +1 -1
- package/dist/database/migrations/20201029C-remove-system-fields.d.ts +1 -1
- package/dist/database/migrations/20201105A-add-cascade-system-relations.d.ts +1 -1
- package/dist/database/migrations/20201105B-change-webhook-url-type.d.ts +1 -1
- package/dist/database/migrations/20210225A-add-relations-sort-field.d.ts +1 -1
- package/dist/database/migrations/20210225A-add-relations-sort-field.js +1 -2
- package/dist/database/migrations/20210304A-remove-locked-fields.d.ts +1 -1
- package/dist/database/migrations/20210312A-webhooks-collections-text.d.ts +1 -1
- package/dist/database/migrations/20210331A-add-refresh-interval.d.ts +1 -1
- package/dist/database/migrations/20210415A-make-filesize-nullable.d.ts +1 -1
- package/dist/database/migrations/20210416A-add-collections-accountability.d.ts +1 -1
- package/dist/database/migrations/20210422A-remove-files-interface.d.ts +1 -1
- package/dist/database/migrations/20210506A-rename-interfaces.d.ts +1 -1
- package/dist/database/migrations/20210510A-restructure-relations.d.ts +1 -1
- package/dist/database/migrations/20210518A-add-foreign-key-constraints.d.ts +1 -1
- package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
- package/dist/database/migrations/20210519A-add-system-fk-triggers.d.ts +1 -1
- package/dist/database/migrations/20210519A-add-system-fk-triggers.js +2 -2
- package/dist/database/migrations/20210521A-add-collections-icon-color.d.ts +1 -1
- package/dist/database/migrations/20210525A-add-insights.d.ts +1 -1
- package/dist/database/migrations/20210608A-add-deep-clone-config.d.ts +1 -1
- package/dist/database/migrations/20210626A-change-filesize-bigint.d.ts +1 -1
- package/dist/database/migrations/20210716A-add-conditions-to-fields.d.ts +1 -1
- package/dist/database/migrations/20210721A-add-default-folder.d.ts +1 -1
- package/dist/database/migrations/20210802A-replace-groups.d.ts +1 -1
- package/dist/database/migrations/20210803A-add-required-to-fields.d.ts +1 -1
- package/dist/database/migrations/20210805A-update-groups.d.ts +1 -1
- package/dist/database/migrations/20210805B-change-image-metadata-structure.d.ts +1 -1
- package/dist/database/migrations/20210811A-add-geometry-config.d.ts +1 -1
- package/dist/database/migrations/20210831A-remove-limit-column.d.ts +1 -1
- package/dist/database/migrations/20210903A-add-auth-provider.d.ts +1 -1
- package/dist/database/migrations/20210907A-webhooks-collections-not-null.d.ts +1 -1
- package/dist/database/migrations/20210910A-move-module-setup.d.ts +1 -1
- package/dist/database/migrations/20210920A-webhooks-url-not-null.d.ts +1 -1
- package/dist/database/migrations/20210924A-add-collection-organization.d.ts +1 -1
- package/dist/database/migrations/20210927A-replace-fields-group.d.ts +1 -1
- package/dist/database/migrations/20210927B-replace-m2m-interface.d.ts +1 -1
- package/dist/database/migrations/20210929A-rename-login-action.d.ts +1 -1
- package/dist/database/migrations/20211007A-update-presets.d.ts +1 -1
- package/dist/database/migrations/20211007A-update-presets.js +7 -9
- package/dist/database/migrations/20211009A-add-auth-data.d.ts +1 -1
- package/dist/database/migrations/20211016A-add-webhook-headers.d.ts +1 -1
- package/dist/database/migrations/20211103A-set-unique-to-user-token.d.ts +1 -1
- package/dist/database/migrations/20211103B-update-special-geometry.d.ts +1 -1
- package/dist/database/migrations/20211104A-remove-collections-listing.d.ts +1 -1
- package/dist/database/migrations/20211118A-add-notifications.d.ts +1 -1
- package/dist/database/migrations/20211211A-add-shares.d.ts +1 -1
- package/dist/database/migrations/20211230A-add-project-descriptor.d.ts +1 -1
- package/dist/database/migrations/20220303A-remove-default-project-color.d.ts +1 -1
- package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +1 -1
- package/dist/database/migrations/20220314A-add-translation-strings.d.ts +1 -1
- package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +1 -1
- package/dist/database/migrations/20220323A-add-field-validation.d.ts +1 -1
- package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +1 -1
- package/dist/database/migrations/20220325B-add-default-language.d.ts +1 -1
- package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +1 -1
- package/dist/database/migrations/20220429A-add-flows.d.ts +1 -1
- package/dist/database/migrations/20220429B-add-color-to-insights-icon.d.ts +1 -1
- package/dist/database/migrations/20220429C-drop-non-null-from-ip-of-activity.d.ts +1 -1
- package/dist/database/migrations/20220429D-drop-non-null-from-sender-of-notifications.d.ts +1 -1
- package/dist/database/migrations/20220614A-rename-hook-trigger-to-event.d.ts +1 -1
- package/dist/database/migrations/20220801A-update-notifications-timestamp-column.d.ts +1 -1
- package/dist/database/migrations/20220802A-add-custom-aspect-ratios.d.ts +1 -1
- package/dist/database/migrations/20220826A-add-origin-to-accountability.d.ts +1 -1
- package/dist/database/migrations/run.d.ts +1 -1
- package/dist/database/run-ast.d.ts +3 -3
- package/dist/database/run-ast.js +17 -26
- package/dist/database/seeds/run.d.ts +1 -1
- package/dist/database/seeds/run.js +1 -2
- package/dist/database/system-data/app-access-permissions/index.d.ts +1 -1
- package/dist/database/system-data/collections/index.d.ts +1 -1
- package/dist/database/system-data/fields/collections.yaml +2 -0
- package/dist/database/system-data/fields/index.d.ts +1 -1
- package/dist/database/system-data/fields/index.js +1 -2
- package/dist/database/system-data/fields/settings.yaml +4 -0
- package/dist/database/system-data/relations/index.d.ts +1 -1
- package/dist/emitter.d.ts +1 -1
- package/dist/emitter.js +3 -0
- package/dist/env.js +10 -2
- package/dist/exceptions/database/dialects/mssql.d.ts +1 -1
- package/dist/exceptions/database/dialects/mssql.js +5 -6
- package/dist/exceptions/database/dialects/mysql.d.ts +1 -1
- package/dist/exceptions/database/dialects/mysql.js +19 -25
- package/dist/exceptions/database/dialects/oracle.d.ts +1 -1
- package/dist/exceptions/database/dialects/postgres.d.ts +1 -1
- package/dist/exceptions/database/dialects/sqlite.d.ts +1 -1
- package/dist/exceptions/database/translate.d.ts +1 -1
- package/dist/exceptions/database/value-out-of-range.js +1 -1
- package/dist/exceptions/range-not-satisfiable.js +2 -3
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +33 -23
- package/dist/flows.js +42 -25
- package/dist/logger.d.ts +1 -1
- package/dist/logger.js +19 -3
- package/dist/messenger.js +8 -6
- package/dist/middleware/authenticate.d.ts +1 -1
- package/dist/middleware/authenticate.js +12 -5
- package/dist/middleware/cache.d.ts +1 -1
- package/dist/middleware/cache.js +5 -5
- package/dist/middleware/check-ip.d.ts +1 -1
- package/dist/middleware/check-ip.js +1 -1
- package/dist/middleware/collection-exists.d.ts +1 -1
- package/dist/middleware/collection-exists.js +2 -2
- package/dist/middleware/cors.d.ts +1 -1
- package/dist/middleware/error-handler.d.ts +1 -1
- package/dist/middleware/error-handler.js +9 -10
- package/dist/middleware/extract-token.d.ts +1 -1
- package/dist/middleware/get-permissions.d.ts +1 -1
- package/dist/middleware/graphql.d.ts +1 -1
- package/dist/middleware/graphql.js +3 -3
- package/dist/middleware/rate-limiter-global.d.ts +5 -0
- package/dist/middleware/rate-limiter-global.js +48 -0
- package/dist/middleware/{rate-limiter.d.ts → rate-limiter-ip.d.ts} +2 -2
- package/dist/middleware/{rate-limiter.js → rate-limiter-ip.js} +3 -3
- package/dist/middleware/respond.d.ts +1 -1
- package/dist/middleware/respond.js +6 -7
- package/dist/middleware/sanitize-query.d.ts +1 -1
- package/dist/middleware/schema.d.ts +1 -1
- package/dist/middleware/use-collection.d.ts +1 -1
- package/dist/operations/condition/index.d.ts +1 -1
- package/dist/operations/exec/index.js +14 -3
- package/dist/operations/item-create/index.js +1 -2
- package/dist/operations/item-delete/index.d.ts +1 -1
- package/dist/operations/item-read/index.d.ts +1 -1
- package/dist/operations/item-update/index.d.ts +1 -1
- package/dist/operations/item-update/index.js +1 -2
- package/dist/operations/notification/index.js +1 -2
- package/dist/operations/request/index.js +19 -19
- package/dist/operations/trigger/index.js +2 -3
- package/dist/rate-limiter.d.ts +1 -1
- package/dist/rate-limiter.js +8 -8
- package/dist/server.js +8 -9
- package/dist/services/activity.d.ts +1 -1
- package/dist/services/activity.js +7 -6
- package/dist/services/assets.d.ts +3 -3
- package/dist/services/assets.js +33 -35
- package/dist/services/authentication.d.ts +2 -2
- package/dist/services/authentication.js +13 -10
- package/dist/services/authorization.d.ts +3 -3
- package/dist/services/authorization.js +27 -31
- package/dist/services/collections.d.ts +5 -5
- package/dist/services/collections.js +52 -48
- package/dist/services/dashboards.d.ts +1 -1
- package/dist/services/fields.d.ts +5 -5
- package/dist/services/fields.js +48 -48
- package/dist/services/files.d.ts +1 -2
- package/dist/services/files.js +27 -21
- package/dist/services/flows.d.ts +2 -2
- package/dist/services/folders.d.ts +1 -1
- package/dist/services/graphql/index.d.ts +4 -4
- package/dist/services/graphql/index.js +172 -167
- package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -2
- package/dist/services/graphql/utils/process-error.d.ts +2 -2
- package/dist/services/graphql/utils/process-error.js +11 -4
- package/dist/services/import-export.d.ts +3 -3
- package/dist/services/import-export.js +25 -22
- package/dist/services/items.d.ts +3 -3
- package/dist/services/items.js +42 -36
- package/dist/services/mail/index.d.ts +4 -4
- package/dist/services/mail/index.js +9 -5
- package/dist/services/meta.d.ts +3 -3
- package/dist/services/meta.js +10 -9
- package/dist/services/notifications.d.ts +3 -3
- package/dist/services/notifications.js +7 -6
- package/dist/services/operations.d.ts +2 -2
- package/dist/services/panels.d.ts +1 -1
- package/dist/services/payload.d.ts +3 -3
- package/dist/services/payload.js +124 -122
- package/dist/services/permissions.d.ts +3 -3
- package/dist/services/permissions.js +11 -11
- package/dist/services/presets.d.ts +1 -1
- package/dist/services/relations.d.ts +6 -6
- package/dist/services/relations.js +45 -43
- package/dist/services/revisions.d.ts +1 -1
- package/dist/services/roles.d.ts +2 -2
- package/dist/services/roles.js +2 -2
- package/dist/services/schema.d.ts +3 -3
- package/dist/services/schema.js +9 -11
- package/dist/services/server.d.ts +3 -3
- package/dist/services/server.js +69 -13
- package/dist/services/settings.d.ts +1 -1
- package/dist/services/shares.d.ts +1 -1
- package/dist/services/shares.js +5 -6
- package/dist/services/specifications.d.ts +4 -4
- package/dist/services/specifications.js +132 -116
- package/dist/services/tfa.d.ts +2 -2
- package/dist/services/tfa.js +7 -5
- package/dist/services/users.d.ts +3 -3
- package/dist/services/users.js +17 -17
- package/dist/services/utils.d.ts +3 -3
- package/dist/services/utils.js +10 -8
- package/dist/services/webhooks.d.ts +2 -2
- package/dist/services/webhooks.js +2 -1
- package/dist/types/assets.d.ts +1 -1
- package/dist/types/ast.d.ts +1 -1
- package/dist/types/auth.d.ts +2 -2
- package/dist/types/collection.d.ts +2 -2
- package/dist/types/events.d.ts +2 -2
- package/dist/types/graphql.d.ts +2 -2
- package/dist/types/items.d.ts +3 -3
- package/dist/types/services.d.ts +5 -5
- package/dist/types/snapshot.d.ts +4 -4
- package/dist/utils/apply-diff.d.ts +3 -3
- package/dist/utils/apply-diff.js +25 -28
- package/dist/utils/apply-query.d.ts +3 -3
- package/dist/utils/apply-query.js +8 -11
- package/dist/utils/apply-snapshot.d.ts +3 -3
- package/dist/utils/apply-snapshot.js +5 -6
- package/dist/utils/construct-flow-tree.d.ts +1 -1
- package/dist/utils/construct-flow-tree.js +2 -2
- package/dist/utils/filter-items.d.ts +1 -1
- package/dist/utils/get-accountability-for-role.d.ts +2 -2
- package/dist/utils/get-accountability-for-role.js +1 -1
- package/dist/utils/get-ast-from-query.d.ts +3 -3
- package/dist/utils/get-ast-from-query.js +22 -28
- package/dist/utils/get-cache-headers.d.ts +1 -1
- package/dist/utils/get-cache-headers.js +3 -4
- package/dist/utils/get-cache-key.d.ts +1 -1
- package/dist/utils/get-cache-key.js +2 -3
- package/dist/utils/get-collection-from-alias.d.ts +1 -1
- package/dist/utils/get-column-path.d.ts +2 -2
- package/dist/utils/get-column-path.js +3 -4
- package/dist/utils/get-column.d.ts +4 -4
- package/dist/utils/get-column.js +4 -5
- package/dist/utils/get-default-value.d.ts +2 -2
- package/dist/utils/get-default-value.js +1 -2
- package/dist/utils/get-graphql-query-and-variables.d.ts +1 -1
- package/dist/utils/get-graphql-query-and-variables.js +1 -2
- package/dist/utils/get-graphql-type.d.ts +2 -2
- package/dist/utils/get-graphql-type.js +1 -1
- package/dist/utils/get-ip-from-req.d.ts +1 -1
- package/dist/utils/get-local-type.d.ts +1 -1
- package/dist/utils/get-local-type.js +3 -3
- package/dist/utils/get-milliseconds.js +1 -2
- package/dist/utils/get-permissions.d.ts +1 -1
- package/dist/utils/get-permissions.js +1 -1
- package/dist/utils/get-relation-info.d.ts +1 -1
- package/dist/utils/get-relation-info.js +3 -5
- package/dist/utils/get-relation-type.d.ts +1 -1
- package/dist/utils/get-relation-type.js +3 -4
- package/dist/utils/get-schema.d.ts +2 -2
- package/dist/utils/get-schema.js +19 -21
- package/dist/utils/get-snapshot-diff.js +2 -3
- package/dist/utils/get-snapshot.d.ts +3 -3
- package/dist/utils/get-snapshot.js +6 -8
- package/dist/utils/is-directus-jwt.js +1 -1
- package/dist/utils/job-queue.js +2 -0
- package/dist/utils/jwt.d.ts +1 -1
- package/dist/utils/merge-permissions-for-share.d.ts +1 -1
- package/dist/utils/merge-permissions-for-share.js +3 -4
- package/dist/utils/merge-permissions.d.ts +3 -3
- package/dist/utils/redact-header-cookies.d.ts +1 -0
- package/dist/utils/redact-header-cookies.js +11 -0
- package/dist/utils/redact-header-cookies.test.d.ts +1 -0
- package/dist/utils/reduce-schema.d.ts +1 -1
- package/dist/utils/reduce-schema.js +12 -12
- package/dist/utils/sanitize-query.d.ts +1 -1
- package/dist/utils/sanitize-query.js +1 -1
- package/dist/utils/sanitize-schema.d.ts +2 -2
- package/dist/utils/should-skip-cache.d.ts +7 -0
- package/dist/utils/should-skip-cache.js +21 -0
- package/dist/utils/should-skip-cache.test.d.ts +1 -0
- package/dist/utils/transformations.d.ts +1 -1
- package/dist/utils/transformations.js +2 -4
- package/dist/utils/url.js +7 -2
- package/dist/utils/user-name.d.ts +1 -1
- package/dist/utils/validate-diff.js +7 -8
- package/dist/utils/validate-keys.d.ts +2 -2
- package/dist/utils/validate-keys.js +1 -1
- package/dist/utils/validate-query.d.ts +1 -1
- package/dist/utils/validate-query.js +2 -2
- package/dist/webhooks.js +1 -1
- package/package.json +36 -37
- package/dist/utils/with-timeout.d.ts +0 -1
- package/dist/utils/with-timeout.js +0 -16
package/dist/services/fields.js
CHANGED
|
@@ -44,10 +44,18 @@ const items_1 = require("../services/items");
|
|
|
44
44
|
const payload_1 = require("../services/payload");
|
|
45
45
|
const get_default_value_1 = __importDefault(require("../utils/get-default-value"));
|
|
46
46
|
const get_local_type_1 = __importDefault(require("../utils/get-local-type"));
|
|
47
|
-
const relations_1 = require("./relations");
|
|
48
|
-
const constants_3 = require("@directus/shared/constants");
|
|
49
47
|
const get_schema_1 = require("../utils/get-schema");
|
|
48
|
+
const relations_1 = require("./relations");
|
|
50
49
|
class FieldsService {
|
|
50
|
+
knex;
|
|
51
|
+
helpers;
|
|
52
|
+
accountability;
|
|
53
|
+
itemsService;
|
|
54
|
+
payloadService;
|
|
55
|
+
schemaInspector;
|
|
56
|
+
schema;
|
|
57
|
+
cache;
|
|
58
|
+
systemCache;
|
|
51
59
|
constructor(options) {
|
|
52
60
|
this.knex = options.knex || (0, database_1.default)();
|
|
53
61
|
this.helpers = (0, helpers_1.getHelpers)(this.knex);
|
|
@@ -61,13 +69,11 @@ class FieldsService {
|
|
|
61
69
|
this.systemCache = systemCache;
|
|
62
70
|
}
|
|
63
71
|
get hasReadAccess() {
|
|
64
|
-
|
|
65
|
-
return !!((_b = (_a = this.accountability) === null || _a === void 0 ? void 0 : _a.permissions) === null || _b === void 0 ? void 0 : _b.find((permission) => {
|
|
72
|
+
return !!this.accountability?.permissions?.find((permission) => {
|
|
66
73
|
return permission.collection === 'directus_fields' && permission.action === 'read';
|
|
67
|
-
})
|
|
74
|
+
});
|
|
68
75
|
}
|
|
69
76
|
async readAll(collection) {
|
|
70
|
-
var _a, _b, _c, _d;
|
|
71
77
|
let fields;
|
|
72
78
|
if (this.accountability && this.accountability.admin !== true && this.hasReadAccess === false) {
|
|
73
79
|
throw new exceptions_1.ForbiddenException();
|
|
@@ -144,8 +150,7 @@ class FieldsService {
|
|
|
144
150
|
});
|
|
145
151
|
const allowedFieldsInCollection = {};
|
|
146
152
|
permissions.forEach((permission) => {
|
|
147
|
-
|
|
148
|
-
allowedFieldsInCollection[permission.collection] = (_a = permission.fields) !== null && _a !== void 0 ? _a : [];
|
|
153
|
+
allowedFieldsInCollection[permission.collection] = permission.fields ?? [];
|
|
149
154
|
});
|
|
150
155
|
if (collection && collection in allowedFieldsInCollection === false) {
|
|
151
156
|
throw new exceptions_1.ForbiddenException();
|
|
@@ -161,10 +166,10 @@ class FieldsService {
|
|
|
161
166
|
}
|
|
162
167
|
// Update specific database type overrides
|
|
163
168
|
for (const field of result) {
|
|
164
|
-
if (
|
|
169
|
+
if (field.meta?.special?.includes('cast-timestamp')) {
|
|
165
170
|
field.type = 'timestamp';
|
|
166
171
|
}
|
|
167
|
-
else if (
|
|
172
|
+
else if (field.meta?.special?.includes('cast-datetime')) {
|
|
168
173
|
field.type = 'dateTime';
|
|
169
174
|
}
|
|
170
175
|
field.type = this.helpers.schema.processFieldType(field);
|
|
@@ -281,7 +286,7 @@ class FieldsService {
|
|
|
281
286
|
accountability: this.accountability,
|
|
282
287
|
},
|
|
283
288
|
};
|
|
284
|
-
if (opts
|
|
289
|
+
if (opts?.bypassEmitAction) {
|
|
285
290
|
opts.bypassEmitAction(actionEvent);
|
|
286
291
|
}
|
|
287
292
|
else {
|
|
@@ -293,13 +298,13 @@ class FieldsService {
|
|
|
293
298
|
if (runPostColumnChange) {
|
|
294
299
|
await this.helpers.schema.postColumnChange();
|
|
295
300
|
}
|
|
296
|
-
if (this.cache && env_1.default.CACHE_AUTO_PURGE &&
|
|
301
|
+
if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
|
|
297
302
|
await this.cache.clear();
|
|
298
303
|
}
|
|
299
|
-
if (
|
|
300
|
-
await (0, cache_1.clearSystemCache)();
|
|
304
|
+
if (opts?.autoPurgeSystemCache !== false) {
|
|
305
|
+
await (0, cache_1.clearSystemCache)({ autoPurgeCache: opts?.autoPurgeCache });
|
|
301
306
|
}
|
|
302
|
-
if (
|
|
307
|
+
if (opts?.emitEvents !== false && nestedActionEvents.length > 0) {
|
|
303
308
|
const updatedSchema = await (0, get_schema_1.getSchema)();
|
|
304
309
|
for (const nestedActionEvent of nestedActionEvents) {
|
|
305
310
|
nestedActionEvent.context.schema = updatedSchema;
|
|
@@ -309,7 +314,6 @@ class FieldsService {
|
|
|
309
314
|
}
|
|
310
315
|
}
|
|
311
316
|
async updateField(collection, field, opts) {
|
|
312
|
-
var _a, _b, _c;
|
|
313
317
|
if (this.accountability && this.accountability.admin !== true) {
|
|
314
318
|
throw new exceptions_1.ForbiddenException();
|
|
315
319
|
}
|
|
@@ -329,8 +333,8 @@ class FieldsService {
|
|
|
329
333
|
: null;
|
|
330
334
|
if (hookAdjustedField.type &&
|
|
331
335
|
(hookAdjustedField.type === 'alias' ||
|
|
332
|
-
|
|
333
|
-
hookAdjustedField.type !== (
|
|
336
|
+
this.schema.collections[collection].fields[field.field]?.type === 'alias') &&
|
|
337
|
+
hookAdjustedField.type !== (this.schema.collections[collection].fields[field.field]?.type ?? 'alias')) {
|
|
334
338
|
throw new exceptions_1.InvalidPayloadException('Alias type cannot be changed');
|
|
335
339
|
}
|
|
336
340
|
if (hookAdjustedField.schema) {
|
|
@@ -377,7 +381,7 @@ class FieldsService {
|
|
|
377
381
|
accountability: this.accountability,
|
|
378
382
|
},
|
|
379
383
|
};
|
|
380
|
-
if (opts
|
|
384
|
+
if (opts?.bypassEmitAction) {
|
|
381
385
|
opts.bypassEmitAction(actionEvent);
|
|
382
386
|
}
|
|
383
387
|
else {
|
|
@@ -389,13 +393,13 @@ class FieldsService {
|
|
|
389
393
|
if (runPostColumnChange) {
|
|
390
394
|
await this.helpers.schema.postColumnChange();
|
|
391
395
|
}
|
|
392
|
-
if (this.cache && env_1.default.CACHE_AUTO_PURGE &&
|
|
396
|
+
if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
|
|
393
397
|
await this.cache.clear();
|
|
394
398
|
}
|
|
395
|
-
if (
|
|
396
|
-
await (0, cache_1.clearSystemCache)();
|
|
399
|
+
if (opts?.autoPurgeSystemCache !== false) {
|
|
400
|
+
await (0, cache_1.clearSystemCache)({ autoPurgeCache: opts?.autoPurgeCache });
|
|
397
401
|
}
|
|
398
|
-
if (
|
|
402
|
+
if (opts?.emitEvents !== false && nestedActionEvents.length > 0) {
|
|
399
403
|
const updatedSchema = await (0, get_schema_1.getSchema)();
|
|
400
404
|
for (const nestedActionEvent of nestedActionEvents) {
|
|
401
405
|
nestedActionEvent.context.schema = updatedSchema;
|
|
@@ -419,11 +423,9 @@ class FieldsService {
|
|
|
419
423
|
accountability: this.accountability,
|
|
420
424
|
});
|
|
421
425
|
await this.knex.transaction(async (trx) => {
|
|
422
|
-
var _a, _b;
|
|
423
426
|
const relations = this.schema.relations.filter((relation) => {
|
|
424
|
-
var _a;
|
|
425
427
|
return ((relation.collection === collection && relation.field === field) ||
|
|
426
|
-
(relation.related_collection === collection &&
|
|
428
|
+
(relation.related_collection === collection && relation.meta?.one_field === field));
|
|
427
429
|
});
|
|
428
430
|
const relationsService = new relations_1.RelationsService({
|
|
429
431
|
knex: trx,
|
|
@@ -441,21 +443,21 @@ class FieldsService {
|
|
|
441
443
|
if (isM2O) {
|
|
442
444
|
await relationsService.deleteOne(collection, field, {
|
|
443
445
|
autoPurgeSystemCache: false,
|
|
444
|
-
bypassEmitAction: (params) =>
|
|
446
|
+
bypassEmitAction: (params) => opts?.bypassEmitAction ? opts.bypassEmitAction(params) : nestedActionEvents.push(params),
|
|
445
447
|
});
|
|
446
448
|
if (relation.related_collection &&
|
|
447
|
-
|
|
449
|
+
relation.meta?.one_field &&
|
|
448
450
|
relation.related_collection !== collection &&
|
|
449
451
|
relation.meta.one_field !== field) {
|
|
450
452
|
await fieldsService.deleteField(relation.related_collection, relation.meta.one_field, {
|
|
451
453
|
autoPurgeCache: false,
|
|
452
454
|
autoPurgeSystemCache: false,
|
|
453
|
-
bypassEmitAction: (params) =>
|
|
455
|
+
bypassEmitAction: (params) => opts?.bypassEmitAction ? opts.bypassEmitAction(params) : nestedActionEvents.push(params),
|
|
454
456
|
});
|
|
455
457
|
}
|
|
456
458
|
}
|
|
457
459
|
// If the current field is a o2m, just delete the one field config from the relation
|
|
458
|
-
if (!isM2O &&
|
|
460
|
+
if (!isM2O && relation.meta?.one_field) {
|
|
459
461
|
await trx('directus_relations')
|
|
460
462
|
.update({ one_field: null })
|
|
461
463
|
.where({ many_collection: relation.collection, many_field: relation.field });
|
|
@@ -475,10 +477,10 @@ class FieldsService {
|
|
|
475
477
|
.where({ collection })
|
|
476
478
|
.first();
|
|
477
479
|
const collectionMetaUpdates = {};
|
|
478
|
-
if (
|
|
480
|
+
if (collectionMeta?.archive_field === field) {
|
|
479
481
|
collectionMetaUpdates.archive_field = null;
|
|
480
482
|
}
|
|
481
|
-
if (
|
|
483
|
+
if (collectionMeta?.sort_field === field) {
|
|
482
484
|
collectionMetaUpdates.sort_field = null;
|
|
483
485
|
}
|
|
484
486
|
if (Object.keys(collectionMetaUpdates).length > 0) {
|
|
@@ -510,7 +512,7 @@ class FieldsService {
|
|
|
510
512
|
accountability: this.accountability,
|
|
511
513
|
},
|
|
512
514
|
};
|
|
513
|
-
if (opts
|
|
515
|
+
if (opts?.bypassEmitAction) {
|
|
514
516
|
opts.bypassEmitAction(actionEvent);
|
|
515
517
|
}
|
|
516
518
|
else {
|
|
@@ -521,13 +523,13 @@ class FieldsService {
|
|
|
521
523
|
if (runPostColumnChange) {
|
|
522
524
|
await this.helpers.schema.postColumnChange();
|
|
523
525
|
}
|
|
524
|
-
if (this.cache && env_1.default.CACHE_AUTO_PURGE &&
|
|
526
|
+
if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
|
|
525
527
|
await this.cache.clear();
|
|
526
528
|
}
|
|
527
|
-
if (
|
|
528
|
-
await (0, cache_1.clearSystemCache)();
|
|
529
|
+
if (opts?.autoPurgeSystemCache !== false) {
|
|
530
|
+
await (0, cache_1.clearSystemCache)({ autoPurgeCache: opts?.autoPurgeCache });
|
|
529
531
|
}
|
|
530
|
-
if (
|
|
532
|
+
if (opts?.emitEvents !== false && nestedActionEvents.length > 0) {
|
|
531
533
|
const updatedSchema = await (0, get_schema_1.getSchema)();
|
|
532
534
|
for (const nestedActionEvent of nestedActionEvents) {
|
|
533
535
|
nestedActionEvent.context.schema = updatedSchema;
|
|
@@ -537,14 +539,12 @@ class FieldsService {
|
|
|
537
539
|
}
|
|
538
540
|
}
|
|
539
541
|
addColumnToTable(table, field, alter = null) {
|
|
540
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
541
542
|
let column;
|
|
542
543
|
// Don't attempt to add a DB column for alias / corrupt fields
|
|
543
544
|
if (field.type === 'alias' || field.type === 'unknown')
|
|
544
545
|
return;
|
|
545
|
-
if (
|
|
546
|
+
if (field.schema?.has_auto_increment) {
|
|
546
547
|
if (field.type === 'bigInteger') {
|
|
547
|
-
// Create an auto-incremented big integer (MySQL, PostgreSQL) or an auto-incremented integer (other DBs)
|
|
548
548
|
column = table.bigIncrements(field.field);
|
|
549
549
|
}
|
|
550
550
|
else {
|
|
@@ -552,11 +552,11 @@ class FieldsService {
|
|
|
552
552
|
}
|
|
553
553
|
}
|
|
554
554
|
else if (field.type === 'string') {
|
|
555
|
-
column = table.string(field.field,
|
|
555
|
+
column = table.string(field.field, field.schema?.max_length ?? undefined);
|
|
556
556
|
}
|
|
557
557
|
else if (['float', 'decimal'].includes(field.type)) {
|
|
558
558
|
const type = field.type;
|
|
559
|
-
column = table[type](field.field,
|
|
559
|
+
column = table[type](field.field, field.schema?.numeric_precision ?? 10, field.schema?.numeric_scale ?? 5);
|
|
560
560
|
}
|
|
561
561
|
else if (field.type === 'csv') {
|
|
562
562
|
column = table.string(field.field);
|
|
@@ -573,13 +573,13 @@ class FieldsService {
|
|
|
573
573
|
else if (field.type.startsWith('geometry')) {
|
|
574
574
|
column = this.helpers.st.createColumn(table, field);
|
|
575
575
|
}
|
|
576
|
-
else if (
|
|
576
|
+
else if (constants_1.KNEX_TYPES.includes(field.type)) {
|
|
577
577
|
column = table[field.type](field.field);
|
|
578
578
|
}
|
|
579
579
|
else {
|
|
580
580
|
throw new exceptions_1.InvalidPayloadException(`Illegal type passed: "${field.type}"`);
|
|
581
581
|
}
|
|
582
|
-
if (
|
|
582
|
+
if (field.schema?.default_value !== undefined) {
|
|
583
583
|
if (typeof field.schema.default_value === 'string' &&
|
|
584
584
|
(field.schema.default_value.toLowerCase() === 'now()' || field.schema.default_value === 'CURRENT_TIMESTAMP')) {
|
|
585
585
|
column.defaultTo(this.knex.fn.now());
|
|
@@ -594,7 +594,7 @@ class FieldsService {
|
|
|
594
594
|
column.defaultTo(field.schema.default_value);
|
|
595
595
|
}
|
|
596
596
|
}
|
|
597
|
-
if (
|
|
597
|
+
if (field.schema?.is_nullable === false) {
|
|
598
598
|
if (!alter || alter.is_nullable === true) {
|
|
599
599
|
column.notNullable();
|
|
600
600
|
}
|
|
@@ -604,15 +604,15 @@ class FieldsService {
|
|
|
604
604
|
column.nullable();
|
|
605
605
|
}
|
|
606
606
|
}
|
|
607
|
-
if (
|
|
607
|
+
if (field.schema?.is_primary_key) {
|
|
608
608
|
column.primary().notNullable();
|
|
609
609
|
}
|
|
610
|
-
else if (
|
|
610
|
+
else if (field.schema?.is_unique === true) {
|
|
611
611
|
if (!alter || alter.is_unique === false) {
|
|
612
612
|
column.unique();
|
|
613
613
|
}
|
|
614
614
|
}
|
|
615
|
-
else if (
|
|
615
|
+
else if (field.schema?.is_unique === false) {
|
|
616
616
|
if (alter && alter.is_unique === true) {
|
|
617
617
|
table.dropUnique([field.field]);
|
|
618
618
|
}
|
package/dist/services/files.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import type { Readable } from 'node:stream';
|
|
3
|
-
import { AbstractServiceOptions, File, Metadata, MutationOptions, PrimaryKey } from '../types';
|
|
3
|
+
import type { AbstractServiceOptions, File, Metadata, MutationOptions, PrimaryKey } from '../types';
|
|
4
4
|
import { ItemsService } from './items';
|
|
5
5
|
export declare class FilesService extends ItemsService {
|
|
6
6
|
constructor(options: AbstractServiceOptions);
|
|
@@ -8,7 +8,6 @@ export declare class FilesService extends ItemsService {
|
|
|
8
8
|
* Upload a single new file to the configured storage adapter
|
|
9
9
|
*/
|
|
10
10
|
uploadOne(stream: Readable, data: Partial<File> & {
|
|
11
|
-
filename_download: string;
|
|
12
11
|
storage: string;
|
|
13
12
|
}, primaryKey?: PrimaryKey, opts?: MutationOptions): Promise<PrimaryKey>;
|
|
14
13
|
/**
|
package/dist/services/files.js
CHANGED
|
@@ -32,12 +32,20 @@ class FilesService extends items_1.ItemsService {
|
|
|
32
32
|
* Upload a single new file to the configured storage adapter
|
|
33
33
|
*/
|
|
34
34
|
async uploadOne(stream, data, primaryKey, opts) {
|
|
35
|
-
var _a, _b, _c, _d, _e, _f;
|
|
36
35
|
const storage = await (0, storage_1.getStorage)();
|
|
37
|
-
|
|
36
|
+
let existingFile = {};
|
|
37
|
+
if (primaryKey !== undefined) {
|
|
38
|
+
existingFile =
|
|
39
|
+
(await this.knex
|
|
40
|
+
.select('folder', 'filename_download')
|
|
41
|
+
.from('directus_files')
|
|
42
|
+
.where({ id: primaryKey })
|
|
43
|
+
.first()) ?? {};
|
|
44
|
+
}
|
|
45
|
+
const payload = { ...existingFile, ...(0, lodash_1.clone)(data) };
|
|
38
46
|
if ('folder' in payload === false) {
|
|
39
47
|
const settings = await this.knex.select('storage_default_folder').from('directus_settings').first();
|
|
40
|
-
if (settings
|
|
48
|
+
if (settings?.storage_default_folder) {
|
|
41
49
|
payload.folder = settings.storage_default_folder;
|
|
42
50
|
}
|
|
43
51
|
}
|
|
@@ -71,12 +79,12 @@ class FilesService extends items_1.ItemsService {
|
|
|
71
79
|
if (['image/jpeg', 'image/png', 'image/webp', 'image/gif', 'image/tiff'].includes(payload.type)) {
|
|
72
80
|
const stream = await storage.location(data.storage).read(payload.filename_disk);
|
|
73
81
|
const { height, width, description, title, tags, metadata } = await this.getMetadata(stream);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
payload.height = height ?? null;
|
|
83
|
+
payload.width = width ?? null;
|
|
84
|
+
payload.description = description ?? null;
|
|
85
|
+
payload.title = title ?? null;
|
|
86
|
+
payload.tags = tags ?? null;
|
|
87
|
+
payload.metadata = metadata ?? null;
|
|
80
88
|
}
|
|
81
89
|
// We do this in a service without accountability. Even if you don't have update permissions to the file,
|
|
82
90
|
// we still want to be able to set the extracted values from the file on create
|
|
@@ -85,10 +93,10 @@ class FilesService extends items_1.ItemsService {
|
|
|
85
93
|
schema: this.schema,
|
|
86
94
|
});
|
|
87
95
|
await sudoService.updateOne(primaryKey, payload, { emitEvents: false });
|
|
88
|
-
if (this.cache && env_1.default.CACHE_AUTO_PURGE &&
|
|
96
|
+
if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
|
|
89
97
|
await this.cache.clear();
|
|
90
98
|
}
|
|
91
|
-
if (
|
|
99
|
+
if (opts?.emitEvents !== false) {
|
|
92
100
|
emitter_1.default.emitAction('files.upload', {
|
|
93
101
|
payload,
|
|
94
102
|
key: primaryKey,
|
|
@@ -107,7 +115,6 @@ class FilesService extends items_1.ItemsService {
|
|
|
107
115
|
async getMetadata(stream, allowList = env_1.default.FILE_METADATA_ALLOW_LIST) {
|
|
108
116
|
return new Promise((resolve, reject) => {
|
|
109
117
|
(0, promises_1.pipeline)(stream, (0, sharp_1.default)().metadata(async (err, sharpMetadata) => {
|
|
110
|
-
var _a, _b, _c, _d;
|
|
111
118
|
if (err) {
|
|
112
119
|
reject(err);
|
|
113
120
|
return;
|
|
@@ -169,16 +176,16 @@ class FilesService extends items_1.ItemsService {
|
|
|
169
176
|
logger_1.default.warn(err);
|
|
170
177
|
}
|
|
171
178
|
}
|
|
172
|
-
if (
|
|
173
|
-
metadata.description =
|
|
179
|
+
if (fullMetadata?.iptc?.Caption && typeof fullMetadata.iptc.Caption === 'string') {
|
|
180
|
+
metadata.description = fullMetadata.iptc?.Caption;
|
|
174
181
|
}
|
|
175
|
-
if (
|
|
182
|
+
if (fullMetadata?.iptc?.Headline && typeof fullMetadata.iptc.Headline === 'string') {
|
|
176
183
|
metadata.title = fullMetadata.iptc.Headline;
|
|
177
184
|
}
|
|
178
|
-
if (
|
|
185
|
+
if (fullMetadata?.iptc?.Keywords) {
|
|
179
186
|
metadata.tags = fullMetadata.iptc.Keywords;
|
|
180
187
|
}
|
|
181
|
-
if (allowList === '*' ||
|
|
188
|
+
if (allowList === '*' || allowList?.[0] === '*') {
|
|
182
189
|
metadata.metadata = fullMetadata;
|
|
183
190
|
}
|
|
184
191
|
else {
|
|
@@ -201,9 +208,8 @@ class FilesService extends items_1.ItemsService {
|
|
|
201
208
|
* Import a single file from an external URL
|
|
202
209
|
*/
|
|
203
210
|
async importOne(importURL, body) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (this.accountability && ((_c = this.accountability) === null || _c === void 0 ? void 0 : _c.admin) !== true && !fileCreatePermissions) {
|
|
211
|
+
const fileCreatePermissions = this.accountability?.permissions?.find((permission) => permission.collection === 'directus_files' && permission.action === 'create');
|
|
212
|
+
if (this.accountability && this.accountability?.admin !== true && !fileCreatePermissions) {
|
|
207
213
|
throw new exceptions_1.ForbiddenException();
|
|
208
214
|
}
|
|
209
215
|
let fileResponse;
|
|
@@ -265,7 +271,7 @@ class FilesService extends items_1.ItemsService {
|
|
|
265
271
|
await disk.delete(filepath);
|
|
266
272
|
}
|
|
267
273
|
}
|
|
268
|
-
if (this.cache && env_1.default.CACHE_AUTO_PURGE &&
|
|
274
|
+
if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
|
|
269
275
|
await this.cache.clear();
|
|
270
276
|
}
|
|
271
277
|
return keys;
|
package/dist/services/flows.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FlowRaw } from '@directus/shared/types';
|
|
2
|
-
import { AbstractServiceOptions, Item, MutationOptions, PrimaryKey } from '../types';
|
|
1
|
+
import type { FlowRaw } from '@directus/shared/types';
|
|
2
|
+
import type { AbstractServiceOptions, Item, MutationOptions, PrimaryKey } from '../types';
|
|
3
3
|
import { ItemsService } from './items';
|
|
4
4
|
export declare class FlowsService extends ItemsService<FlowRaw> {
|
|
5
5
|
constructor(options: AbstractServiceOptions);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { BaseException } from '@directus/shared/exceptions';
|
|
1
|
+
import type { BaseException } from '@directus/shared/exceptions';
|
|
2
2
|
import { Accountability, Filter, Query, SchemaOverview } from '@directus/shared/types';
|
|
3
3
|
import { ArgumentNode, FormattedExecutionResult, FragmentDefinitionNode, GraphQLError, GraphQLResolveInfo, GraphQLSchema, SelectionNode } from 'graphql';
|
|
4
4
|
import { ObjectTypeComposer, SchemaComposer } from 'graphql-compose';
|
|
5
|
-
import { Knex } from 'knex';
|
|
6
|
-
import { AbstractServiceOptions, GraphQLParams, Item } from '../../types';
|
|
5
|
+
import type { Knex } from 'knex';
|
|
6
|
+
import type { AbstractServiceOptions, GraphQLParams, Item } from '../../types';
|
|
7
7
|
import { ItemsService } from '../items';
|
|
8
8
|
export declare class GraphQLService {
|
|
9
9
|
accountability: Accountability | null;
|
|
@@ -57,7 +57,7 @@ export declare class GraphQLService {
|
|
|
57
57
|
/**
|
|
58
58
|
* Replace functions from GraphQL format to Directus-Filter format
|
|
59
59
|
*/
|
|
60
|
-
replaceFuncs(filter
|
|
60
|
+
replaceFuncs(filter: Filter): Filter;
|
|
61
61
|
/**
|
|
62
62
|
* Convert Directus-Exception into a GraphQL format, so it can be returned by GraphQL properly.
|
|
63
63
|
*/
|