directus 9.23.1 → 9.23.4
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 +25 -21
- 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 +57 -46
- package/dist/auth/drivers/local.d.ts +1 -1
- package/dist/auth/drivers/local.js +20 -17
- package/dist/auth/drivers/oauth2.d.ts +1 -1
- package/dist/auth/drivers/oauth2.js +44 -35
- package/dist/auth/drivers/openid.d.ts +1 -1
- package/dist/auth/drivers/openid.js +50 -41
- package/dist/auth/drivers/saml.d.ts +1 -1
- package/dist/auth/drivers/saml.js +20 -17
- package/dist/auth.d.ts +1 -1
- package/dist/auth.js +8 -7
- package/dist/cache.d.ts +9 -1
- package/dist/cache.js +66 -18
- package/dist/cli/commands/bootstrap/index.js +7 -6
- 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 +3 -2
- package/dist/cli/utils/create-env/index.d.ts +2 -2
- package/dist/cli/utils/create-env/index.js +1 -1
- package/dist/cli/utils/drivers.d.ts +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.js +7 -7
- package/dist/controllers/activity.js +10 -11
- package/dist/controllers/assets.js +31 -25
- package/dist/controllers/auth.js +40 -26
- package/dist/controllers/collections.js +10 -10
- package/dist/controllers/dashboards.js +14 -11
- package/dist/controllers/extensions.js +3 -3
- package/dist/controllers/fields.js +20 -20
- package/dist/controllers/files.js +26 -20
- package/dist/controllers/flows.js +16 -13
- package/dist/controllers/folders.js +14 -11
- package/dist/controllers/graphql.js +6 -8
- package/dist/controllers/items.js +22 -19
- package/dist/controllers/not-found.d.ts +1 -1
- package/dist/controllers/not-found.js +1 -2
- package/dist/controllers/notifications.js +14 -11
- package/dist/controllers/operations.js +14 -11
- package/dist/controllers/panels.js +14 -11
- package/dist/controllers/permissions.js +14 -11
- package/dist/controllers/presets.js +14 -11
- package/dist/controllers/relations.js +10 -10
- package/dist/controllers/revisions.js +3 -3
- package/dist/controllers/roles.js +14 -11
- package/dist/controllers/schema.js +5 -5
- package/dist/controllers/server.js +7 -7
- package/dist/controllers/settings.js +2 -2
- package/dist/controllers/shares.js +21 -18
- package/dist/controllers/users.js +32 -36
- package/dist/controllers/utils.js +10 -15
- package/dist/controllers/webhooks.js +14 -11
- 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 -6
- package/dist/database/helpers/fn/types.js +4 -5
- 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 +13 -13
- 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/20210805B-change-image-metadata-structure.js +15 -15
- 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/migrations/run.js +1 -1
- package/dist/database/run-ast.d.ts +3 -3
- package/dist/database/run-ast.js +21 -30
- 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/collections/index.js +2 -2
- 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 +3 -4
- 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 +11 -3
- 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 +43 -33
- package/dist/flows.js +65 -46
- package/dist/logger.d.ts +2 -1
- package/dist/logger.js +35 -19
- package/dist/logger.test.d.ts +1 -0
- package/dist/mailer.js +16 -16
- package/dist/messenger.js +9 -7
- package/dist/middleware/authenticate.d.ts +1 -1
- package/dist/middleware/authenticate.js +13 -6
- package/dist/middleware/cache.d.ts +1 -1
- package/dist/middleware/cache.js +16 -16
- 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 +5 -5
- package/dist/middleware/cors.d.ts +1 -1
- package/dist/middleware/cors.js +7 -7
- package/dist/middleware/error-handler.d.ts +1 -1
- package/dist/middleware/error-handler.js +11 -12
- package/dist/middleware/extract-token.d.ts +1 -1
- package/dist/middleware/extract-token.js +2 -2
- package/dist/middleware/get-permissions.d.ts +1 -1
- package/dist/middleware/graphql.d.ts +1 -1
- package/dist/middleware/graphql.js +15 -9
- 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} +5 -5
- package/dist/middleware/respond.d.ts +1 -1
- package/dist/middleware/respond.js +18 -19
- package/dist/middleware/sanitize-query.d.ts +1 -1
- package/dist/middleware/sanitize-query.js +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 +15 -4
- 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 +9 -9
- package/dist/request/validate-ip.js +2 -2
- package/dist/server.js +12 -13
- package/dist/services/activity.d.ts +1 -1
- package/dist/services/activity.js +17 -16
- package/dist/services/assets.d.ts +3 -3
- package/dist/services/assets.js +35 -37
- package/dist/services/authentication.d.ts +2 -2
- package/dist/services/authentication.js +22 -19
- 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 +54 -50
- package/dist/services/dashboards.d.ts +1 -1
- package/dist/services/fields.d.ts +5 -5
- package/dist/services/fields.js +50 -50
- package/dist/services/files.d.ts +1 -2
- package/dist/services/files.js +33 -27
- 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 +259 -252
- 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 +30 -27
- 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 +14 -10
- package/dist/services/meta.d.ts +3 -3
- package/dist/services/meta.js +11 -9
- package/dist/services/notifications.d.ts +3 -3
- package/dist/services/notifications.js +10 -9
- 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/revisions.js +3 -3
- package/dist/services/roles.d.ts +2 -2
- package/dist/services/roles.js +7 -7
- 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 +88 -32
- package/dist/services/settings.d.ts +1 -1
- package/dist/services/shares.d.ts +1 -1
- package/dist/services/shares.js +14 -15
- package/dist/services/specifications.d.ts +4 -4
- package/dist/services/specifications.js +137 -119
- package/dist/services/tfa.d.ts +2 -2
- package/dist/services/tfa.js +7 -5
- package/dist/services/users.d.ts +2 -6
- package/dist/services/users.js +37 -40
- 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/storage/register-locations.js +1 -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 +10 -12
- 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/dynamic-import.js +1 -1
- package/dist/utils/filter-items.d.ts +1 -1
- package/dist/utils/generate-hash.js +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-auth-providers.js +1 -1
- package/dist/utils/get-cache-headers.d.ts +1 -1
- package/dist/utils/get-cache-headers.js +6 -7
- 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-collection-from-alias.js +1 -0
- 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 +2 -3
- 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-ip-from-req.js +2 -2
- 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 +12 -12
- 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 +20 -22
- 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/is-url-allowed.js +5 -2
- 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/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 +27 -27
- 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/track.js +16 -16
- 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 +3 -3
- package/dist/utils/validate-storage.js +8 -8
- package/dist/webhooks.js +3 -3
- package/package.json +36 -37
- package/dist/utils/with-timeout.d.ts +0 -1
- package/dist/utils/with-timeout.js +0 -16
package/dist/flows.js
CHANGED
|
@@ -67,16 +67,17 @@ const ACCOUNTABILITY_KEY = '$accountability';
|
|
|
67
67
|
const LAST_KEY = '$last';
|
|
68
68
|
const ENV_KEY = '$env';
|
|
69
69
|
class FlowManager {
|
|
70
|
+
isLoaded = false;
|
|
71
|
+
operations = {};
|
|
72
|
+
triggerHandlers = [];
|
|
73
|
+
operationFlowHandlers = {};
|
|
74
|
+
webhookFlowHandlers = {};
|
|
75
|
+
reloadQueue;
|
|
70
76
|
constructor() {
|
|
71
|
-
this.isLoaded = false;
|
|
72
|
-
this.operations = {};
|
|
73
|
-
this.triggerHandlers = [];
|
|
74
|
-
this.operationFlowHandlers = {};
|
|
75
|
-
this.webhookFlowHandlers = {};
|
|
76
77
|
this.reloadQueue = new job_queue_1.JobQueue();
|
|
77
78
|
const messenger = (0, messenger_1.getMessenger)();
|
|
78
79
|
messenger.subscribe('flows', (event) => {
|
|
79
|
-
if (event
|
|
80
|
+
if (event['type'] === 'reload') {
|
|
80
81
|
this.reloadQueue.enqueue(async () => {
|
|
81
82
|
if (this.isLoaded) {
|
|
82
83
|
await this.unload();
|
|
@@ -121,7 +122,6 @@ class FlowManager {
|
|
|
121
122
|
return handler(data, context);
|
|
122
123
|
}
|
|
123
124
|
async load() {
|
|
124
|
-
var _a, _b, _c, _d;
|
|
125
125
|
const flowsService = new services_1.FlowsService({ knex: (0, database_1.default)(), schema: await (0, get_schema_1.getSchema)() });
|
|
126
126
|
const flows = await flowsService.readByQuery({
|
|
127
127
|
filter: { status: { _eq: 'active' } },
|
|
@@ -132,14 +132,13 @@ class FlowManager {
|
|
|
132
132
|
for (const flow of flowTrees) {
|
|
133
133
|
if (flow.trigger === 'event') {
|
|
134
134
|
let events = [];
|
|
135
|
-
if (
|
|
136
|
-
events = (0, utils_1.toArray)(flow.options
|
|
135
|
+
if (flow.options?.['scope']) {
|
|
136
|
+
events = (0, utils_1.toArray)(flow.options['scope'])
|
|
137
137
|
.map((scope) => {
|
|
138
|
-
var _a;
|
|
139
138
|
if (['items.create', 'items.update', 'items.delete'].includes(scope)) {
|
|
140
|
-
if (!
|
|
139
|
+
if (!flow.options?.['collections'])
|
|
141
140
|
return [];
|
|
142
|
-
return (0, utils_1.toArray)(flow.options
|
|
141
|
+
return (0, utils_1.toArray)(flow.options['collections']).map((collection) => {
|
|
143
142
|
if (collection.startsWith('directus_')) {
|
|
144
143
|
const action = scope.split('.')[1];
|
|
145
144
|
return collection.substring(9) + '.' + action;
|
|
@@ -151,11 +150,11 @@ class FlowManager {
|
|
|
151
150
|
})
|
|
152
151
|
.flat();
|
|
153
152
|
}
|
|
154
|
-
if (flow.options
|
|
153
|
+
if (flow.options['type'] === 'filter') {
|
|
155
154
|
const handler = (payload, meta, context) => this.executeFlow(flow, { payload, ...meta }, {
|
|
156
|
-
accountability: context
|
|
157
|
-
database: context
|
|
158
|
-
getSchema: context
|
|
155
|
+
accountability: context['accountability'],
|
|
156
|
+
database: context['database'],
|
|
157
|
+
getSchema: context['schema'] ? () => context['schema'] : get_schema_1.getSchema,
|
|
159
158
|
});
|
|
160
159
|
events.forEach((event) => emitter_1.default.onFilter(event, handler));
|
|
161
160
|
this.triggerHandlers.push({
|
|
@@ -163,11 +162,11 @@ class FlowManager {
|
|
|
163
162
|
events: events.map((event) => ({ type: 'filter', name: event, handler })),
|
|
164
163
|
});
|
|
165
164
|
}
|
|
166
|
-
else if (flow.options
|
|
165
|
+
else if (flow.options['type'] === 'action') {
|
|
167
166
|
const handler = (meta, context) => this.executeFlow(flow, meta, {
|
|
168
|
-
accountability: context
|
|
167
|
+
accountability: context['accountability'],
|
|
169
168
|
database: (0, database_1.default)(),
|
|
170
|
-
getSchema: context
|
|
169
|
+
getSchema: context['schema'] ? () => context['schema'] : get_schema_1.getSchema,
|
|
171
170
|
});
|
|
172
171
|
events.forEach((event) => emitter_1.default.onAction(event, handler));
|
|
173
172
|
this.triggerHandlers.push({
|
|
@@ -177,8 +176,8 @@ class FlowManager {
|
|
|
177
176
|
}
|
|
178
177
|
}
|
|
179
178
|
else if (flow.trigger === 'schedule') {
|
|
180
|
-
if ((0, node_cron_1.validate)(flow.options
|
|
181
|
-
const task = (0, node_cron_1.schedule)(flow.options
|
|
179
|
+
if ((0, node_cron_1.validate)(flow.options['cron'])) {
|
|
180
|
+
const task = (0, node_cron_1.schedule)(flow.options['cron'], async () => {
|
|
182
181
|
try {
|
|
183
182
|
await this.executeFlow(flow);
|
|
184
183
|
}
|
|
@@ -189,7 +188,7 @@ class FlowManager {
|
|
|
189
188
|
this.triggerHandlers.push({ id: flow.id, events: [{ type: flow.trigger, task }] });
|
|
190
189
|
}
|
|
191
190
|
else {
|
|
192
|
-
logger_1.default.warn(`Couldn't register cron trigger. Provided cron is invalid: ${flow.options
|
|
191
|
+
logger_1.default.warn(`Couldn't register cron trigger. Provided cron is invalid: ${flow.options['cron']}`);
|
|
193
192
|
}
|
|
194
193
|
}
|
|
195
194
|
else if (flow.trigger === 'operation') {
|
|
@@ -198,23 +197,23 @@ class FlowManager {
|
|
|
198
197
|
}
|
|
199
198
|
else if (flow.trigger === 'webhook') {
|
|
200
199
|
const handler = (data, context) => {
|
|
201
|
-
if (flow.options
|
|
200
|
+
if (flow.options['async']) {
|
|
202
201
|
this.executeFlow(flow, data, context);
|
|
202
|
+
return undefined;
|
|
203
203
|
}
|
|
204
204
|
else {
|
|
205
205
|
return this.executeFlow(flow, data, context);
|
|
206
206
|
}
|
|
207
207
|
};
|
|
208
|
-
const method =
|
|
208
|
+
const method = flow.options?.['method'] ?? 'GET';
|
|
209
209
|
// Default return to $last for webhooks
|
|
210
|
-
flow.options
|
|
210
|
+
flow.options['return'] = flow.options['return'] ?? '$last';
|
|
211
211
|
this.webhookFlowHandlers[`${method}-${flow.id}`] = handler;
|
|
212
212
|
}
|
|
213
213
|
else if (flow.trigger === 'manual') {
|
|
214
214
|
const handler = (data, context) => {
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
const targetCollection = data === null || data === void 0 ? void 0 : data.body.collection;
|
|
215
|
+
const enabledCollections = flow.options?.['collections'] ?? [];
|
|
216
|
+
const targetCollection = data?.['body'].collection;
|
|
218
217
|
if (!targetCollection) {
|
|
219
218
|
logger_1.default.warn(`Manual trigger requires "collection" to be specified in the payload`);
|
|
220
219
|
throw new exceptions.ForbiddenException();
|
|
@@ -227,15 +226,16 @@ class FlowManager {
|
|
|
227
226
|
logger_1.default.warn(`Specified collection must be one of: ${enabledCollections.join(', ')}.`);
|
|
228
227
|
throw new exceptions.ForbiddenException();
|
|
229
228
|
}
|
|
230
|
-
if (flow.options
|
|
229
|
+
if (flow.options['async']) {
|
|
231
230
|
this.executeFlow(flow, data, context);
|
|
231
|
+
return undefined;
|
|
232
232
|
}
|
|
233
233
|
else {
|
|
234
234
|
return this.executeFlow(flow, data, context);
|
|
235
235
|
}
|
|
236
236
|
};
|
|
237
237
|
// Default return to $last for manual
|
|
238
|
-
flow.options
|
|
238
|
+
flow.options['return'] = '$last';
|
|
239
239
|
this.webhookFlowHandlers[`POST-${flow.id}`] = handler;
|
|
240
240
|
}
|
|
241
241
|
}
|
|
@@ -263,14 +263,13 @@ class FlowManager {
|
|
|
263
263
|
this.isLoaded = false;
|
|
264
264
|
}
|
|
265
265
|
async executeFlow(flow, data = null, context = {}) {
|
|
266
|
-
|
|
267
|
-
const
|
|
268
|
-
const schema = (_b = context.schema) !== null && _b !== void 0 ? _b : (await (0, get_schema_1.getSchema)({ database }));
|
|
266
|
+
const database = context['database'] ?? (0, database_1.default)();
|
|
267
|
+
const schema = context['schema'] ?? (await (0, get_schema_1.getSchema)({ database }));
|
|
269
268
|
const keyedData = {
|
|
270
269
|
[TRIGGER_KEY]: data,
|
|
271
270
|
[LAST_KEY]: data,
|
|
272
|
-
[ACCOUNTABILITY_KEY]:
|
|
273
|
-
[ENV_KEY]: (0, lodash_1.pick)(env_1.default, env_1.default
|
|
271
|
+
[ACCOUNTABILITY_KEY]: context?.['accountability'] ?? null,
|
|
272
|
+
[ENV_KEY]: (0, lodash_1.pick)(env_1.default, env_1.default['FLOWS_ENV_ALLOW_LIST'] ? (0, utils_1.toArray)(env_1.default['FLOWS_ENV_ALLOW_LIST']) : []),
|
|
274
273
|
};
|
|
275
274
|
let nextOperation = flow.operation;
|
|
276
275
|
let lastOperationStatus = 'unknown';
|
|
@@ -288,14 +287,14 @@ class FlowManager {
|
|
|
288
287
|
knex: database,
|
|
289
288
|
schema: schema,
|
|
290
289
|
});
|
|
291
|
-
const accountability = context
|
|
290
|
+
const accountability = context?.['accountability'];
|
|
292
291
|
const activity = await activityService.createOne({
|
|
293
292
|
action: types_1.Action.RUN,
|
|
294
|
-
user:
|
|
293
|
+
user: accountability?.user ?? null,
|
|
295
294
|
collection: 'directus_flows',
|
|
296
|
-
ip:
|
|
297
|
-
user_agent:
|
|
298
|
-
origin:
|
|
295
|
+
ip: accountability?.ip ?? null,
|
|
296
|
+
user_agent: accountability?.userAgent ?? null,
|
|
297
|
+
origin: accountability?.origin ?? null,
|
|
299
298
|
item: flow.id,
|
|
300
299
|
});
|
|
301
300
|
if (flow.accountability === 'all') {
|
|
@@ -314,14 +313,14 @@ class FlowManager {
|
|
|
314
313
|
});
|
|
315
314
|
}
|
|
316
315
|
}
|
|
317
|
-
if (flow.trigger === 'event' && flow.options
|
|
316
|
+
if (flow.trigger === 'event' && flow.options['type'] === 'filter' && lastOperationStatus === 'reject') {
|
|
318
317
|
throw keyedData[LAST_KEY];
|
|
319
318
|
}
|
|
320
|
-
if (flow.options
|
|
319
|
+
if (flow.options['return'] === '$all') {
|
|
321
320
|
return keyedData;
|
|
322
321
|
}
|
|
323
|
-
else if (flow.options
|
|
324
|
-
return (0, micromustache_1.get)(keyedData, flow.options
|
|
322
|
+
else if (flow.options['return']) {
|
|
323
|
+
return (0, micromustache_1.get)(keyedData, flow.options['return']);
|
|
325
324
|
}
|
|
326
325
|
return undefined;
|
|
327
326
|
}
|
|
@@ -344,15 +343,35 @@ class FlowManager {
|
|
|
344
343
|
accountability: null,
|
|
345
344
|
...context,
|
|
346
345
|
});
|
|
346
|
+
// Validate that the operations result is serializable and thus catching the error inside the flow execution
|
|
347
|
+
JSON.stringify(result ?? null);
|
|
347
348
|
// JSON structures don't allow for undefined values, so we need to replace them with null
|
|
348
349
|
// Otherwise the applyOptionsData function will not work correctly on the next operation
|
|
349
350
|
if (typeof result === 'object' && result !== null) {
|
|
350
351
|
result = (0, map_values_deep_1.mapValuesDeep)(result, (_, value) => (value === undefined ? null : value));
|
|
351
352
|
}
|
|
352
|
-
return { successor: operation.resolve, status: 'resolve', data: result
|
|
353
|
+
return { successor: operation.resolve, status: 'resolve', data: result ?? null, options };
|
|
353
354
|
}
|
|
354
355
|
catch (error) {
|
|
355
|
-
|
|
356
|
+
let data;
|
|
357
|
+
if (error instanceof Error) {
|
|
358
|
+
// If the error is instance of Error, use the message of it as the error data
|
|
359
|
+
data = { message: error.message };
|
|
360
|
+
}
|
|
361
|
+
else if (typeof error === 'string') {
|
|
362
|
+
// If the error is a JSON string, parse it and use that as the error data
|
|
363
|
+
data = (0, utils_1.isValidJSON)(error) ? (0, utils_1.parseJSON)(error) : error;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
// If error is plain object, use this as the error data and otherwise fallback to null
|
|
367
|
+
data = error ?? null;
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
successor: operation.reject,
|
|
371
|
+
status: 'reject',
|
|
372
|
+
data,
|
|
373
|
+
options,
|
|
374
|
+
};
|
|
356
375
|
}
|
|
357
376
|
}
|
|
358
377
|
}
|
package/dist/logger.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="qs" />
|
|
2
|
-
import { RequestHandler } from 'express';
|
|
3
2
|
import { LoggerOptions } from 'pino';
|
|
3
|
+
import type { RequestHandler } from 'express';
|
|
4
|
+
export declare const httpLoggerOptions: LoggerOptions;
|
|
4
5
|
declare const logger: import("pino").Logger<LoggerOptions & Record<string, any>>;
|
|
5
6
|
export declare const expressLogger: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
6
7
|
export default logger;
|
package/dist/logger.js
CHANGED
|
@@ -26,29 +26,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.expressLogger = void 0;
|
|
29
|
+
exports.expressLogger = exports.httpLoggerOptions = void 0;
|
|
30
|
+
const utils_1 = require("@directus/shared/utils");
|
|
31
|
+
const lodash_1 = require("lodash");
|
|
30
32
|
const pino_1 = __importDefault(require("pino"));
|
|
31
33
|
const pino_http_1 = __importStar(require("pino-http"));
|
|
32
|
-
const get_config_from_env_1 = require("./utils/get-config-from-env");
|
|
33
34
|
const url_1 = require("url");
|
|
34
35
|
const env_1 = __importDefault(require("./env"));
|
|
35
|
-
const
|
|
36
|
-
const
|
|
36
|
+
const constants_1 = require("./constants");
|
|
37
|
+
const get_config_from_env_1 = require("./utils/get-config-from-env");
|
|
37
38
|
const pinoOptions = {
|
|
38
|
-
level: env_1.default
|
|
39
|
+
level: env_1.default['LOG_LEVEL'] || 'info',
|
|
39
40
|
redact: {
|
|
40
|
-
paths: ['req.headers.authorization',
|
|
41
|
-
censor:
|
|
41
|
+
paths: ['req.headers.authorization', 'req.headers.cookie'],
|
|
42
|
+
censor: constants_1.REDACT_TEXT,
|
|
42
43
|
},
|
|
43
44
|
};
|
|
44
|
-
|
|
45
|
-
level: env_1.default
|
|
45
|
+
exports.httpLoggerOptions = {
|
|
46
|
+
level: env_1.default['LOG_LEVEL'] || 'info',
|
|
46
47
|
redact: {
|
|
47
|
-
paths: ['req.headers.authorization',
|
|
48
|
-
censor:
|
|
48
|
+
paths: ['req.headers.authorization', 'req.headers.cookie'],
|
|
49
|
+
censor: constants_1.REDACT_TEXT,
|
|
49
50
|
},
|
|
50
51
|
};
|
|
51
|
-
if (env_1.default
|
|
52
|
+
if (env_1.default['LOG_STYLE'] !== 'raw') {
|
|
52
53
|
pinoOptions.transport = {
|
|
53
54
|
target: 'pino-pretty',
|
|
54
55
|
options: {
|
|
@@ -56,7 +57,7 @@ if (env_1.default.LOG_STYLE !== 'raw') {
|
|
|
56
57
|
sync: true,
|
|
57
58
|
},
|
|
58
59
|
};
|
|
59
|
-
httpLoggerOptions.transport = {
|
|
60
|
+
exports.httpLoggerOptions.transport = {
|
|
60
61
|
target: 'pino-http-print',
|
|
61
62
|
options: {
|
|
62
63
|
all: true,
|
|
@@ -69,11 +70,26 @@ if (env_1.default.LOG_STYLE !== 'raw') {
|
|
|
69
70
|
},
|
|
70
71
|
};
|
|
71
72
|
}
|
|
73
|
+
if (env_1.default['LOG_STYLE'] === 'raw') {
|
|
74
|
+
exports.httpLoggerOptions.redact = {
|
|
75
|
+
paths: ['req.headers.authorization', 'req.headers.cookie', 'res.headers'],
|
|
76
|
+
censor: (value, pathParts) => {
|
|
77
|
+
const path = pathParts.join('.');
|
|
78
|
+
if (path === 'res.headers') {
|
|
79
|
+
if ('set-cookie' in value) {
|
|
80
|
+
value['set-cookie'] = constants_1.REDACT_TEXT;
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
return constants_1.REDACT_TEXT;
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
72
88
|
const loggerEnvConfig = (0, get_config_from_env_1.getConfigFromEnv)('LOGGER_', 'LOGGER_HTTP');
|
|
73
89
|
// Expose custom log levels into formatter function
|
|
74
|
-
if (loggerEnvConfig
|
|
90
|
+
if (loggerEnvConfig['levels']) {
|
|
75
91
|
const customLogLevels = {};
|
|
76
|
-
for (const el of (0, utils_1.toArray)(loggerEnvConfig
|
|
92
|
+
for (const el of (0, utils_1.toArray)(loggerEnvConfig['levels'])) {
|
|
77
93
|
const key_val = el.split(':');
|
|
78
94
|
customLogLevels[key_val[0].trim()] = key_val[1].trim();
|
|
79
95
|
}
|
|
@@ -85,7 +101,7 @@ if (loggerEnvConfig.levels) {
|
|
|
85
101
|
};
|
|
86
102
|
},
|
|
87
103
|
};
|
|
88
|
-
httpLoggerOptions.formatters = {
|
|
104
|
+
exports.httpLoggerOptions.formatters = {
|
|
89
105
|
level(label, number) {
|
|
90
106
|
return {
|
|
91
107
|
severity: customLogLevels[label] || 'info',
|
|
@@ -93,12 +109,12 @@ if (loggerEnvConfig.levels) {
|
|
|
93
109
|
};
|
|
94
110
|
},
|
|
95
111
|
};
|
|
96
|
-
delete loggerEnvConfig
|
|
112
|
+
delete loggerEnvConfig['levels'];
|
|
97
113
|
}
|
|
98
114
|
const logger = (0, pino_1.default)((0, lodash_1.merge)(pinoOptions, loggerEnvConfig));
|
|
99
115
|
const httpLoggerEnvConfig = (0, get_config_from_env_1.getConfigFromEnv)('LOGGER_HTTP', ['LOGGER_HTTP_LOGGER']);
|
|
100
116
|
exports.expressLogger = (0, pino_http_1.default)({
|
|
101
|
-
logger: (0, pino_1.default)((0, lodash_1.merge)(httpLoggerOptions, loggerEnvConfig)),
|
|
117
|
+
logger: (0, pino_1.default)((0, lodash_1.merge)(exports.httpLoggerOptions, loggerEnvConfig)),
|
|
102
118
|
...httpLoggerEnvConfig,
|
|
103
119
|
serializers: {
|
|
104
120
|
req(request) {
|
|
@@ -112,7 +128,7 @@ exports.default = logger;
|
|
|
112
128
|
function redactQuery(originalPath) {
|
|
113
129
|
const url = new url_1.URL(originalPath, 'http://example.com/');
|
|
114
130
|
if (url.searchParams.has('access_token')) {
|
|
115
|
-
url.searchParams.set('access_token',
|
|
131
|
+
url.searchParams.set('access_token', constants_1.REDACT_TEXT);
|
|
116
132
|
}
|
|
117
133
|
return url.pathname + url.search;
|
|
118
134
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/mailer.js
CHANGED
|
@@ -11,12 +11,12 @@ let transporter;
|
|
|
11
11
|
function getMailer() {
|
|
12
12
|
if (transporter)
|
|
13
13
|
return transporter;
|
|
14
|
-
const transportName = env_1.default
|
|
14
|
+
const transportName = env_1.default['EMAIL_TRANSPORT'].toLowerCase();
|
|
15
15
|
if (transportName === 'sendmail') {
|
|
16
16
|
transporter = nodemailer_1.default.createTransport({
|
|
17
17
|
sendmail: true,
|
|
18
|
-
newline: env_1.default
|
|
19
|
-
path: env_1.default
|
|
18
|
+
newline: env_1.default['EMAIL_SENDMAIL_NEW_LINE'] || 'unix',
|
|
19
|
+
path: env_1.default['EMAIL_SENDMAIL_PATH'] || '/usr/sbin/sendmail',
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
else if (transportName === 'ses') {
|
|
@@ -29,20 +29,20 @@ function getMailer() {
|
|
|
29
29
|
}
|
|
30
30
|
else if (transportName === 'smtp') {
|
|
31
31
|
let auth = false;
|
|
32
|
-
if (env_1.default
|
|
32
|
+
if (env_1.default['EMAIL_SMTP_USER'] || env_1.default['EMAIL_SMTP_PASSWORD']) {
|
|
33
33
|
auth = {
|
|
34
|
-
user: env_1.default
|
|
35
|
-
pass: env_1.default
|
|
34
|
+
user: env_1.default['EMAIL_SMTP_USER'],
|
|
35
|
+
pass: env_1.default['EMAIL_SMTP_PASSWORD'],
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
const tls = (0, get_config_from_env_1.getConfigFromEnv)('EMAIL_SMTP_TLS_');
|
|
39
39
|
transporter = nodemailer_1.default.createTransport({
|
|
40
|
-
name: env_1.default
|
|
41
|
-
pool: env_1.default
|
|
42
|
-
host: env_1.default
|
|
43
|
-
port: env_1.default
|
|
44
|
-
secure: env_1.default
|
|
45
|
-
ignoreTLS: env_1.default
|
|
40
|
+
name: env_1.default['EMAIL_SMTP_NAME'],
|
|
41
|
+
pool: env_1.default['EMAIL_SMTP_POOL'],
|
|
42
|
+
host: env_1.default['EMAIL_SMTP_HOST'],
|
|
43
|
+
port: env_1.default['EMAIL_SMTP_PORT'],
|
|
44
|
+
secure: env_1.default['EMAIL_SMTP_SECURE'],
|
|
45
|
+
ignoreTLS: env_1.default['EMAIL_SMTP_IGNORE_TLS'],
|
|
46
46
|
auth,
|
|
47
47
|
tls,
|
|
48
48
|
});
|
|
@@ -51,16 +51,16 @@ function getMailer() {
|
|
|
51
51
|
const mg = require('nodemailer-mailgun-transport');
|
|
52
52
|
transporter = nodemailer_1.default.createTransport(mg({
|
|
53
53
|
auth: {
|
|
54
|
-
api_key: env_1.default
|
|
55
|
-
domain: env_1.default
|
|
54
|
+
api_key: env_1.default['EMAIL_MAILGUN_API_KEY'],
|
|
55
|
+
domain: env_1.default['EMAIL_MAILGUN_DOMAIN'],
|
|
56
56
|
},
|
|
57
|
-
host: env_1.default
|
|
57
|
+
host: env_1.default['EMAIL_MAILGUN_HOST'] || 'api.mailgun.net',
|
|
58
58
|
}));
|
|
59
59
|
}
|
|
60
60
|
else if (transportName === 'sendgrid') {
|
|
61
61
|
const sg = require('nodemailer-sendgrid');
|
|
62
62
|
transporter = nodemailer_1.default.createTransport(sg({
|
|
63
|
-
apiKey: env_1.default
|
|
63
|
+
apiKey: env_1.default['EMAIL_SENDGRID_API_KEY'],
|
|
64
64
|
}));
|
|
65
65
|
}
|
|
66
66
|
else {
|
package/dist/messenger.js
CHANGED
|
@@ -9,12 +9,12 @@ const ioredis_1 = __importDefault(require("ioredis"));
|
|
|
9
9
|
const env_1 = __importDefault(require("./env"));
|
|
10
10
|
const get_config_from_env_1 = require("./utils/get-config-from-env");
|
|
11
11
|
class MessengerMemory {
|
|
12
|
+
handlers;
|
|
12
13
|
constructor() {
|
|
13
14
|
this.handlers = {};
|
|
14
15
|
}
|
|
15
16
|
publish(channel, payload) {
|
|
16
|
-
|
|
17
|
-
(_b = (_a = this.handlers)[channel]) === null || _b === void 0 ? void 0 : _b.call(_a, payload);
|
|
17
|
+
this.handlers[channel]?.(payload);
|
|
18
18
|
}
|
|
19
19
|
subscribe(channel, callback) {
|
|
20
20
|
this.handlers[channel] = callback;
|
|
@@ -25,12 +25,14 @@ class MessengerMemory {
|
|
|
25
25
|
}
|
|
26
26
|
exports.MessengerMemory = MessengerMemory;
|
|
27
27
|
class MessengerRedis {
|
|
28
|
+
namespace;
|
|
29
|
+
pub;
|
|
30
|
+
sub;
|
|
28
31
|
constructor() {
|
|
29
|
-
var _a, _b, _c;
|
|
30
32
|
const config = (0, get_config_from_env_1.getConfigFromEnv)('MESSENGER_REDIS');
|
|
31
|
-
this.pub = new ioredis_1.default(
|
|
32
|
-
this.sub = new ioredis_1.default(
|
|
33
|
-
this.namespace =
|
|
33
|
+
this.pub = new ioredis_1.default(env_1.default['MESSENGER_REDIS'] ?? config);
|
|
34
|
+
this.sub = new ioredis_1.default(env_1.default['MESSENGER_REDIS'] ?? config);
|
|
35
|
+
this.namespace = env_1.default['MESSENGER_NAMESPACE'] ?? 'directus';
|
|
34
36
|
}
|
|
35
37
|
publish(channel, payload) {
|
|
36
38
|
this.pub.publish(`${this.namespace}:${channel}`, JSON.stringify(payload));
|
|
@@ -53,7 +55,7 @@ let messenger;
|
|
|
53
55
|
function getMessenger() {
|
|
54
56
|
if (messenger)
|
|
55
57
|
return messenger;
|
|
56
|
-
if (env_1.default
|
|
58
|
+
if (env_1.default['MESSENGER_STORE'] === 'redis') {
|
|
57
59
|
messenger = new MessengerRedis();
|
|
58
60
|
}
|
|
59
61
|
else {
|
|
@@ -23,9 +23,13 @@ const handler = async (req, res, next) => {
|
|
|
23
23
|
admin: false,
|
|
24
24
|
app: false,
|
|
25
25
|
ip: (0, get_ip_from_req_1.getIPFromReq)(req),
|
|
26
|
-
userAgent: req.get('user-agent'),
|
|
27
|
-
origin: req.get('origin'),
|
|
28
26
|
};
|
|
27
|
+
const userAgent = req.get('user-agent');
|
|
28
|
+
if (userAgent)
|
|
29
|
+
defaultAccountability.userAgent = userAgent;
|
|
30
|
+
const origin = req.get('origin');
|
|
31
|
+
if (origin)
|
|
32
|
+
defaultAccountability.origin = origin;
|
|
29
33
|
const database = (0, database_1.default)();
|
|
30
34
|
const customAccountability = await emitter_1.default.emitFilter('authenticate', defaultAccountability, {
|
|
31
35
|
req,
|
|
@@ -41,13 +45,16 @@ const handler = async (req, res, next) => {
|
|
|
41
45
|
req.accountability = defaultAccountability;
|
|
42
46
|
if (req.token) {
|
|
43
47
|
if ((0, is_directus_jwt_1.default)(req.token)) {
|
|
44
|
-
const payload = (0, jwt_1.verifyAccessJWT)(req.token, env_1.default
|
|
45
|
-
req.accountability.share = payload.share;
|
|
46
|
-
req.accountability.share_scope = payload.share_scope;
|
|
47
|
-
req.accountability.user = payload.id;
|
|
48
|
+
const payload = (0, jwt_1.verifyAccessJWT)(req.token, env_1.default['SECRET']);
|
|
48
49
|
req.accountability.role = payload.role;
|
|
49
50
|
req.accountability.admin = payload.admin_access === true || payload.admin_access == 1;
|
|
50
51
|
req.accountability.app = payload.app_access === true || payload.app_access == 1;
|
|
52
|
+
if (payload.share)
|
|
53
|
+
req.accountability.share = payload.share;
|
|
54
|
+
if (payload.share_scope)
|
|
55
|
+
req.accountability.share_scope = payload.share_scope;
|
|
56
|
+
if (payload.id)
|
|
57
|
+
req.accountability.user = payload.id;
|
|
51
58
|
}
|
|
52
59
|
else {
|
|
53
60
|
// Try finding the user with the provided token
|
package/dist/middleware/cache.js
CHANGED
|
@@ -5,22 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const cache_1 = require("../cache");
|
|
7
7
|
const env_1 = __importDefault(require("../env"));
|
|
8
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
8
9
|
const async_handler_1 = __importDefault(require("../utils/async-handler"));
|
|
9
10
|
const get_cache_headers_1 = require("../utils/get-cache-headers");
|
|
10
11
|
const get_cache_key_1 = require("../utils/get-cache-key");
|
|
11
|
-
const
|
|
12
|
+
const should_skip_cache_1 = require("../utils/should-skip-cache");
|
|
12
13
|
const checkCacheMiddleware = (0, async_handler_1.default)(async (req, res, next) => {
|
|
13
|
-
var _a, _b, _c, _d;
|
|
14
14
|
const { cache } = (0, cache_1.getCache)();
|
|
15
|
-
if (req.method.toLowerCase() !== 'get' &&
|
|
15
|
+
if (req.method.toLowerCase() !== 'get' && req.originalUrl?.startsWith('/graphql') === false)
|
|
16
16
|
return next();
|
|
17
|
-
if (env_1.default
|
|
17
|
+
if (env_1.default['CACHE_ENABLED'] !== true)
|
|
18
18
|
return next();
|
|
19
19
|
if (!cache)
|
|
20
20
|
return next();
|
|
21
|
-
if ((
|
|
22
|
-
if (env_1.default
|
|
23
|
-
res.setHeader(`${env_1.default
|
|
21
|
+
if ((0, should_skip_cache_1.shouldSkipCache)(req)) {
|
|
22
|
+
if (env_1.default['CACHE_STATUS_HEADER'])
|
|
23
|
+
res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
|
|
24
24
|
return next();
|
|
25
25
|
}
|
|
26
26
|
const key = (0, get_cache_key_1.getCacheKey)(req);
|
|
@@ -30,31 +30,31 @@ const checkCacheMiddleware = (0, async_handler_1.default)(async (req, res, next)
|
|
|
30
30
|
}
|
|
31
31
|
catch (err) {
|
|
32
32
|
logger_1.default.warn(err, `[cache] Couldn't read key ${key}. ${err.message}`);
|
|
33
|
-
if (env_1.default
|
|
34
|
-
res.setHeader(`${env_1.default
|
|
33
|
+
if (env_1.default['CACHE_STATUS_HEADER'])
|
|
34
|
+
res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
|
|
35
35
|
return next();
|
|
36
36
|
}
|
|
37
37
|
if (cachedData) {
|
|
38
38
|
let cacheExpiryDate;
|
|
39
39
|
try {
|
|
40
|
-
cacheExpiryDate = (
|
|
40
|
+
cacheExpiryDate = (await (0, cache_1.getCacheValue)(cache, `${key}__expires_at`))?.exp;
|
|
41
41
|
}
|
|
42
42
|
catch (err) {
|
|
43
43
|
logger_1.default.warn(err, `[cache] Couldn't read key ${`${key}__expires_at`}. ${err.message}`);
|
|
44
|
-
if (env_1.default
|
|
45
|
-
res.setHeader(`${env_1.default
|
|
44
|
+
if (env_1.default['CACHE_STATUS_HEADER'])
|
|
45
|
+
res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
|
|
46
46
|
return next();
|
|
47
47
|
}
|
|
48
48
|
const cacheTTL = cacheExpiryDate ? cacheExpiryDate - Date.now() : undefined;
|
|
49
49
|
res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, cacheTTL, true, true));
|
|
50
50
|
res.setHeader('Vary', 'Origin, Cache-Control');
|
|
51
|
-
if (env_1.default
|
|
52
|
-
res.setHeader(`${env_1.default
|
|
51
|
+
if (env_1.default['CACHE_STATUS_HEADER'])
|
|
52
|
+
res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'HIT');
|
|
53
53
|
return res.json(cachedData);
|
|
54
54
|
}
|
|
55
55
|
else {
|
|
56
|
-
if (env_1.default
|
|
57
|
-
res.setHeader(`${env_1.default
|
|
56
|
+
if (env_1.default['CACHE_STATUS_HEADER'])
|
|
57
|
+
res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
|
|
58
58
|
return next();
|
|
59
59
|
}
|
|
60
60
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { RequestHandler } from 'express';
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
2
|
export declare const checkIP: RequestHandler;
|
|
@@ -17,7 +17,7 @@ exports.checkIP = (0, async_handler_1.default)(async (req, _res, next) => {
|
|
|
17
17
|
query.whereNull('id');
|
|
18
18
|
}
|
|
19
19
|
const role = await query.first();
|
|
20
|
-
const ipAllowlist = (
|
|
20
|
+
const ipAllowlist = (role?.ip_access || '').split(',').filter((ip) => ip);
|
|
21
21
|
if (ipAllowlist.length > 0 && ipAllowlist.includes(req.accountability.ip) === false)
|
|
22
22
|
throw new exceptions_1.InvalidIPException();
|
|
23
23
|
return next();
|