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.
Files changed (383) hide show
  1. package/dist/app.js +25 -21
  2. package/dist/auth/auth.d.ts +3 -3
  3. package/dist/auth/auth.js +2 -0
  4. package/dist/auth/drivers/ldap.d.ts +1 -1
  5. package/dist/auth/drivers/ldap.js +57 -46
  6. package/dist/auth/drivers/local.d.ts +1 -1
  7. package/dist/auth/drivers/local.js +20 -17
  8. package/dist/auth/drivers/oauth2.d.ts +1 -1
  9. package/dist/auth/drivers/oauth2.js +44 -35
  10. package/dist/auth/drivers/openid.d.ts +1 -1
  11. package/dist/auth/drivers/openid.js +50 -41
  12. package/dist/auth/drivers/saml.d.ts +1 -1
  13. package/dist/auth/drivers/saml.js +20 -17
  14. package/dist/auth.d.ts +1 -1
  15. package/dist/auth.js +8 -7
  16. package/dist/cache.d.ts +9 -1
  17. package/dist/cache.js +66 -18
  18. package/dist/cli/commands/bootstrap/index.js +7 -6
  19. package/dist/cli/commands/init/index.js +3 -3
  20. package/dist/cli/commands/schema/apply.js +14 -15
  21. package/dist/cli/commands/schema/snapshot.js +2 -2
  22. package/dist/cli/utils/create-db-connection.d.ts +1 -1
  23. package/dist/cli/utils/create-db-connection.js +3 -2
  24. package/dist/cli/utils/create-env/index.d.ts +2 -2
  25. package/dist/cli/utils/create-env/index.js +1 -1
  26. package/dist/cli/utils/drivers.d.ts +1 -1
  27. package/dist/constants.d.ts +3 -2
  28. package/dist/constants.js +7 -7
  29. package/dist/controllers/activity.js +10 -11
  30. package/dist/controllers/assets.js +31 -25
  31. package/dist/controllers/auth.js +40 -26
  32. package/dist/controllers/collections.js +10 -10
  33. package/dist/controllers/dashboards.js +14 -11
  34. package/dist/controllers/extensions.js +3 -3
  35. package/dist/controllers/fields.js +20 -20
  36. package/dist/controllers/files.js +26 -20
  37. package/dist/controllers/flows.js +16 -13
  38. package/dist/controllers/folders.js +14 -11
  39. package/dist/controllers/graphql.js +6 -8
  40. package/dist/controllers/items.js +22 -19
  41. package/dist/controllers/not-found.d.ts +1 -1
  42. package/dist/controllers/not-found.js +1 -2
  43. package/dist/controllers/notifications.js +14 -11
  44. package/dist/controllers/operations.js +14 -11
  45. package/dist/controllers/panels.js +14 -11
  46. package/dist/controllers/permissions.js +14 -11
  47. package/dist/controllers/presets.js +14 -11
  48. package/dist/controllers/relations.js +10 -10
  49. package/dist/controllers/revisions.js +3 -3
  50. package/dist/controllers/roles.js +14 -11
  51. package/dist/controllers/schema.js +5 -5
  52. package/dist/controllers/server.js +7 -7
  53. package/dist/controllers/settings.js +2 -2
  54. package/dist/controllers/shares.js +21 -18
  55. package/dist/controllers/users.js +32 -36
  56. package/dist/controllers/utils.js +10 -15
  57. package/dist/controllers/webhooks.js +14 -11
  58. package/dist/database/helpers/fn/dialects/mssql.d.ts +1 -1
  59. package/dist/database/helpers/fn/dialects/mssql.js +10 -11
  60. package/dist/database/helpers/fn/dialects/mysql.d.ts +1 -1
  61. package/dist/database/helpers/fn/dialects/mysql.js +2 -3
  62. package/dist/database/helpers/fn/dialects/oracle.d.ts +1 -1
  63. package/dist/database/helpers/fn/dialects/oracle.js +10 -11
  64. package/dist/database/helpers/fn/dialects/postgres.d.ts +1 -1
  65. package/dist/database/helpers/fn/dialects/postgres.js +10 -11
  66. package/dist/database/helpers/fn/dialects/sqlite.d.ts +1 -1
  67. package/dist/database/helpers/fn/dialects/sqlite.js +10 -11
  68. package/dist/database/helpers/fn/types.d.ts +5 -6
  69. package/dist/database/helpers/fn/types.js +4 -5
  70. package/dist/database/helpers/geometry/dialects/mssql.d.ts +3 -3
  71. package/dist/database/helpers/geometry/dialects/mysql.d.ts +1 -1
  72. package/dist/database/helpers/geometry/dialects/oracle.d.ts +3 -3
  73. package/dist/database/helpers/geometry/dialects/postgres.d.ts +3 -3
  74. package/dist/database/helpers/geometry/dialects/postgres.js +1 -2
  75. package/dist/database/helpers/geometry/dialects/redshift.d.ts +2 -2
  76. package/dist/database/helpers/geometry/dialects/sqlite.d.ts +1 -1
  77. package/dist/database/helpers/geometry/types.d.ts +2 -2
  78. package/dist/database/helpers/geometry/types.js +1 -2
  79. package/dist/database/helpers/index.d.ts +5 -5
  80. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -1
  81. package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
  82. package/dist/database/helpers/schema/dialects/mysql.d.ts +1 -1
  83. package/dist/database/helpers/schema/dialects/mysql.js +1 -2
  84. package/dist/database/helpers/schema/dialects/oracle.d.ts +2 -2
  85. package/dist/database/helpers/schema/dialects/oracle.js +4 -6
  86. package/dist/database/helpers/schema/types.d.ts +4 -4
  87. package/dist/database/helpers/types.d.ts +1 -1
  88. package/dist/database/helpers/types.js +1 -0
  89. package/dist/database/index.d.ts +1 -1
  90. package/dist/database/index.js +13 -13
  91. package/dist/database/migrations/20201028A-remove-collection-foreign-keys.d.ts +1 -1
  92. package/dist/database/migrations/20201029A-remove-system-relations.d.ts +1 -1
  93. package/dist/database/migrations/20201029B-remove-system-collections.d.ts +1 -1
  94. package/dist/database/migrations/20201029C-remove-system-fields.d.ts +1 -1
  95. package/dist/database/migrations/20201105A-add-cascade-system-relations.d.ts +1 -1
  96. package/dist/database/migrations/20201105B-change-webhook-url-type.d.ts +1 -1
  97. package/dist/database/migrations/20210225A-add-relations-sort-field.d.ts +1 -1
  98. package/dist/database/migrations/20210225A-add-relations-sort-field.js +1 -2
  99. package/dist/database/migrations/20210304A-remove-locked-fields.d.ts +1 -1
  100. package/dist/database/migrations/20210312A-webhooks-collections-text.d.ts +1 -1
  101. package/dist/database/migrations/20210331A-add-refresh-interval.d.ts +1 -1
  102. package/dist/database/migrations/20210415A-make-filesize-nullable.d.ts +1 -1
  103. package/dist/database/migrations/20210416A-add-collections-accountability.d.ts +1 -1
  104. package/dist/database/migrations/20210422A-remove-files-interface.d.ts +1 -1
  105. package/dist/database/migrations/20210506A-rename-interfaces.d.ts +1 -1
  106. package/dist/database/migrations/20210510A-restructure-relations.d.ts +1 -1
  107. package/dist/database/migrations/20210518A-add-foreign-key-constraints.d.ts +1 -1
  108. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
  109. package/dist/database/migrations/20210519A-add-system-fk-triggers.d.ts +1 -1
  110. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +2 -2
  111. package/dist/database/migrations/20210521A-add-collections-icon-color.d.ts +1 -1
  112. package/dist/database/migrations/20210525A-add-insights.d.ts +1 -1
  113. package/dist/database/migrations/20210608A-add-deep-clone-config.d.ts +1 -1
  114. package/dist/database/migrations/20210626A-change-filesize-bigint.d.ts +1 -1
  115. package/dist/database/migrations/20210716A-add-conditions-to-fields.d.ts +1 -1
  116. package/dist/database/migrations/20210721A-add-default-folder.d.ts +1 -1
  117. package/dist/database/migrations/20210802A-replace-groups.d.ts +1 -1
  118. package/dist/database/migrations/20210803A-add-required-to-fields.d.ts +1 -1
  119. package/dist/database/migrations/20210805A-update-groups.d.ts +1 -1
  120. package/dist/database/migrations/20210805B-change-image-metadata-structure.d.ts +1 -1
  121. package/dist/database/migrations/20210805B-change-image-metadata-structure.js +15 -15
  122. package/dist/database/migrations/20210811A-add-geometry-config.d.ts +1 -1
  123. package/dist/database/migrations/20210831A-remove-limit-column.d.ts +1 -1
  124. package/dist/database/migrations/20210903A-add-auth-provider.d.ts +1 -1
  125. package/dist/database/migrations/20210907A-webhooks-collections-not-null.d.ts +1 -1
  126. package/dist/database/migrations/20210910A-move-module-setup.d.ts +1 -1
  127. package/dist/database/migrations/20210920A-webhooks-url-not-null.d.ts +1 -1
  128. package/dist/database/migrations/20210924A-add-collection-organization.d.ts +1 -1
  129. package/dist/database/migrations/20210927A-replace-fields-group.d.ts +1 -1
  130. package/dist/database/migrations/20210927B-replace-m2m-interface.d.ts +1 -1
  131. package/dist/database/migrations/20210929A-rename-login-action.d.ts +1 -1
  132. package/dist/database/migrations/20211007A-update-presets.d.ts +1 -1
  133. package/dist/database/migrations/20211007A-update-presets.js +7 -9
  134. package/dist/database/migrations/20211009A-add-auth-data.d.ts +1 -1
  135. package/dist/database/migrations/20211016A-add-webhook-headers.d.ts +1 -1
  136. package/dist/database/migrations/20211103A-set-unique-to-user-token.d.ts +1 -1
  137. package/dist/database/migrations/20211103B-update-special-geometry.d.ts +1 -1
  138. package/dist/database/migrations/20211104A-remove-collections-listing.d.ts +1 -1
  139. package/dist/database/migrations/20211118A-add-notifications.d.ts +1 -1
  140. package/dist/database/migrations/20211211A-add-shares.d.ts +1 -1
  141. package/dist/database/migrations/20211230A-add-project-descriptor.d.ts +1 -1
  142. package/dist/database/migrations/20220303A-remove-default-project-color.d.ts +1 -1
  143. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +1 -1
  144. package/dist/database/migrations/20220314A-add-translation-strings.d.ts +1 -1
  145. package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +1 -1
  146. package/dist/database/migrations/20220323A-add-field-validation.d.ts +1 -1
  147. package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +1 -1
  148. package/dist/database/migrations/20220325B-add-default-language.d.ts +1 -1
  149. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +1 -1
  150. package/dist/database/migrations/20220429A-add-flows.d.ts +1 -1
  151. package/dist/database/migrations/20220429B-add-color-to-insights-icon.d.ts +1 -1
  152. package/dist/database/migrations/20220429C-drop-non-null-from-ip-of-activity.d.ts +1 -1
  153. package/dist/database/migrations/20220429D-drop-non-null-from-sender-of-notifications.d.ts +1 -1
  154. package/dist/database/migrations/20220614A-rename-hook-trigger-to-event.d.ts +1 -1
  155. package/dist/database/migrations/20220801A-update-notifications-timestamp-column.d.ts +1 -1
  156. package/dist/database/migrations/20220802A-add-custom-aspect-ratios.d.ts +1 -1
  157. package/dist/database/migrations/20220826A-add-origin-to-accountability.d.ts +1 -1
  158. package/dist/database/migrations/run.d.ts +1 -1
  159. package/dist/database/migrations/run.js +1 -1
  160. package/dist/database/run-ast.d.ts +3 -3
  161. package/dist/database/run-ast.js +21 -30
  162. package/dist/database/seeds/run.d.ts +1 -1
  163. package/dist/database/seeds/run.js +1 -2
  164. package/dist/database/system-data/app-access-permissions/index.d.ts +1 -1
  165. package/dist/database/system-data/collections/index.d.ts +1 -1
  166. package/dist/database/system-data/collections/index.js +2 -2
  167. package/dist/database/system-data/fields/collections.yaml +2 -0
  168. package/dist/database/system-data/fields/index.d.ts +1 -1
  169. package/dist/database/system-data/fields/index.js +3 -4
  170. package/dist/database/system-data/fields/settings.yaml +4 -0
  171. package/dist/database/system-data/relations/index.d.ts +1 -1
  172. package/dist/emitter.d.ts +1 -1
  173. package/dist/emitter.js +3 -0
  174. package/dist/env.js +11 -3
  175. package/dist/exceptions/database/dialects/mssql.d.ts +1 -1
  176. package/dist/exceptions/database/dialects/mssql.js +5 -6
  177. package/dist/exceptions/database/dialects/mysql.d.ts +1 -1
  178. package/dist/exceptions/database/dialects/mysql.js +19 -25
  179. package/dist/exceptions/database/dialects/oracle.d.ts +1 -1
  180. package/dist/exceptions/database/dialects/postgres.d.ts +1 -1
  181. package/dist/exceptions/database/dialects/sqlite.d.ts +1 -1
  182. package/dist/exceptions/database/translate.d.ts +1 -1
  183. package/dist/exceptions/database/value-out-of-range.js +1 -1
  184. package/dist/exceptions/range-not-satisfiable.js +2 -3
  185. package/dist/extensions.d.ts +1 -1
  186. package/dist/extensions.js +43 -33
  187. package/dist/flows.js +65 -46
  188. package/dist/logger.d.ts +2 -1
  189. package/dist/logger.js +35 -19
  190. package/dist/logger.test.d.ts +1 -0
  191. package/dist/mailer.js +16 -16
  192. package/dist/messenger.js +9 -7
  193. package/dist/middleware/authenticate.d.ts +1 -1
  194. package/dist/middleware/authenticate.js +13 -6
  195. package/dist/middleware/cache.d.ts +1 -1
  196. package/dist/middleware/cache.js +16 -16
  197. package/dist/middleware/check-ip.d.ts +1 -1
  198. package/dist/middleware/check-ip.js +1 -1
  199. package/dist/middleware/collection-exists.d.ts +1 -1
  200. package/dist/middleware/collection-exists.js +5 -5
  201. package/dist/middleware/cors.d.ts +1 -1
  202. package/dist/middleware/cors.js +7 -7
  203. package/dist/middleware/error-handler.d.ts +1 -1
  204. package/dist/middleware/error-handler.js +11 -12
  205. package/dist/middleware/extract-token.d.ts +1 -1
  206. package/dist/middleware/extract-token.js +2 -2
  207. package/dist/middleware/get-permissions.d.ts +1 -1
  208. package/dist/middleware/graphql.d.ts +1 -1
  209. package/dist/middleware/graphql.js +15 -9
  210. package/dist/middleware/rate-limiter-global.d.ts +5 -0
  211. package/dist/middleware/rate-limiter-global.js +48 -0
  212. package/dist/middleware/{rate-limiter.d.ts → rate-limiter-ip.d.ts} +2 -2
  213. package/dist/middleware/{rate-limiter.js → rate-limiter-ip.js} +5 -5
  214. package/dist/middleware/respond.d.ts +1 -1
  215. package/dist/middleware/respond.js +18 -19
  216. package/dist/middleware/sanitize-query.d.ts +1 -1
  217. package/dist/middleware/sanitize-query.js +1 -1
  218. package/dist/middleware/schema.d.ts +1 -1
  219. package/dist/middleware/use-collection.d.ts +1 -1
  220. package/dist/operations/condition/index.d.ts +1 -1
  221. package/dist/operations/exec/index.js +15 -4
  222. package/dist/operations/item-create/index.js +1 -2
  223. package/dist/operations/item-delete/index.d.ts +1 -1
  224. package/dist/operations/item-read/index.d.ts +1 -1
  225. package/dist/operations/item-update/index.d.ts +1 -1
  226. package/dist/operations/item-update/index.js +1 -2
  227. package/dist/operations/notification/index.js +1 -2
  228. package/dist/operations/request/index.js +19 -19
  229. package/dist/operations/trigger/index.js +2 -3
  230. package/dist/rate-limiter.d.ts +1 -1
  231. package/dist/rate-limiter.js +9 -9
  232. package/dist/request/validate-ip.js +2 -2
  233. package/dist/server.js +12 -13
  234. package/dist/services/activity.d.ts +1 -1
  235. package/dist/services/activity.js +17 -16
  236. package/dist/services/assets.d.ts +3 -3
  237. package/dist/services/assets.js +35 -37
  238. package/dist/services/authentication.d.ts +2 -2
  239. package/dist/services/authentication.js +22 -19
  240. package/dist/services/authorization.d.ts +3 -3
  241. package/dist/services/authorization.js +27 -31
  242. package/dist/services/collections.d.ts +5 -5
  243. package/dist/services/collections.js +54 -50
  244. package/dist/services/dashboards.d.ts +1 -1
  245. package/dist/services/fields.d.ts +5 -5
  246. package/dist/services/fields.js +50 -50
  247. package/dist/services/files.d.ts +1 -2
  248. package/dist/services/files.js +33 -27
  249. package/dist/services/flows.d.ts +2 -2
  250. package/dist/services/folders.d.ts +1 -1
  251. package/dist/services/graphql/index.d.ts +4 -4
  252. package/dist/services/graphql/index.js +259 -252
  253. package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -2
  254. package/dist/services/graphql/utils/process-error.d.ts +2 -2
  255. package/dist/services/graphql/utils/process-error.js +11 -4
  256. package/dist/services/import-export.d.ts +3 -3
  257. package/dist/services/import-export.js +30 -27
  258. package/dist/services/items.d.ts +3 -3
  259. package/dist/services/items.js +42 -36
  260. package/dist/services/mail/index.d.ts +4 -4
  261. package/dist/services/mail/index.js +14 -10
  262. package/dist/services/meta.d.ts +3 -3
  263. package/dist/services/meta.js +11 -9
  264. package/dist/services/notifications.d.ts +3 -3
  265. package/dist/services/notifications.js +10 -9
  266. package/dist/services/operations.d.ts +2 -2
  267. package/dist/services/panels.d.ts +1 -1
  268. package/dist/services/payload.d.ts +3 -3
  269. package/dist/services/payload.js +124 -122
  270. package/dist/services/permissions.d.ts +3 -3
  271. package/dist/services/permissions.js +11 -11
  272. package/dist/services/presets.d.ts +1 -1
  273. package/dist/services/relations.d.ts +6 -6
  274. package/dist/services/relations.js +45 -43
  275. package/dist/services/revisions.d.ts +1 -1
  276. package/dist/services/revisions.js +3 -3
  277. package/dist/services/roles.d.ts +2 -2
  278. package/dist/services/roles.js +7 -7
  279. package/dist/services/schema.d.ts +3 -3
  280. package/dist/services/schema.js +9 -11
  281. package/dist/services/server.d.ts +3 -3
  282. package/dist/services/server.js +88 -32
  283. package/dist/services/settings.d.ts +1 -1
  284. package/dist/services/shares.d.ts +1 -1
  285. package/dist/services/shares.js +14 -15
  286. package/dist/services/specifications.d.ts +4 -4
  287. package/dist/services/specifications.js +137 -119
  288. package/dist/services/tfa.d.ts +2 -2
  289. package/dist/services/tfa.js +7 -5
  290. package/dist/services/users.d.ts +2 -6
  291. package/dist/services/users.js +37 -40
  292. package/dist/services/utils.d.ts +3 -3
  293. package/dist/services/utils.js +10 -8
  294. package/dist/services/webhooks.d.ts +2 -2
  295. package/dist/services/webhooks.js +2 -1
  296. package/dist/storage/register-locations.js +1 -1
  297. package/dist/types/assets.d.ts +1 -1
  298. package/dist/types/ast.d.ts +1 -1
  299. package/dist/types/auth.d.ts +2 -2
  300. package/dist/types/collection.d.ts +2 -2
  301. package/dist/types/events.d.ts +2 -2
  302. package/dist/types/graphql.d.ts +2 -2
  303. package/dist/types/items.d.ts +3 -3
  304. package/dist/types/services.d.ts +5 -5
  305. package/dist/types/snapshot.d.ts +4 -4
  306. package/dist/utils/apply-diff.d.ts +3 -3
  307. package/dist/utils/apply-diff.js +25 -28
  308. package/dist/utils/apply-query.d.ts +3 -3
  309. package/dist/utils/apply-query.js +10 -12
  310. package/dist/utils/apply-snapshot.d.ts +3 -3
  311. package/dist/utils/apply-snapshot.js +5 -6
  312. package/dist/utils/construct-flow-tree.d.ts +1 -1
  313. package/dist/utils/construct-flow-tree.js +2 -2
  314. package/dist/utils/dynamic-import.js +1 -1
  315. package/dist/utils/filter-items.d.ts +1 -1
  316. package/dist/utils/generate-hash.js +1 -1
  317. package/dist/utils/get-accountability-for-role.d.ts +2 -2
  318. package/dist/utils/get-accountability-for-role.js +1 -1
  319. package/dist/utils/get-ast-from-query.d.ts +3 -3
  320. package/dist/utils/get-ast-from-query.js +22 -28
  321. package/dist/utils/get-auth-providers.js +1 -1
  322. package/dist/utils/get-cache-headers.d.ts +1 -1
  323. package/dist/utils/get-cache-headers.js +6 -7
  324. package/dist/utils/get-cache-key.d.ts +1 -1
  325. package/dist/utils/get-cache-key.js +2 -3
  326. package/dist/utils/get-collection-from-alias.d.ts +1 -1
  327. package/dist/utils/get-collection-from-alias.js +1 -0
  328. package/dist/utils/get-column-path.d.ts +2 -2
  329. package/dist/utils/get-column-path.js +3 -4
  330. package/dist/utils/get-column.d.ts +4 -4
  331. package/dist/utils/get-column.js +4 -5
  332. package/dist/utils/get-default-value.d.ts +2 -2
  333. package/dist/utils/get-default-value.js +2 -3
  334. package/dist/utils/get-graphql-query-and-variables.d.ts +1 -1
  335. package/dist/utils/get-graphql-query-and-variables.js +1 -2
  336. package/dist/utils/get-graphql-type.d.ts +2 -2
  337. package/dist/utils/get-graphql-type.js +1 -1
  338. package/dist/utils/get-ip-from-req.d.ts +1 -1
  339. package/dist/utils/get-ip-from-req.js +2 -2
  340. package/dist/utils/get-local-type.d.ts +1 -1
  341. package/dist/utils/get-local-type.js +3 -3
  342. package/dist/utils/get-milliseconds.js +1 -2
  343. package/dist/utils/get-permissions.d.ts +1 -1
  344. package/dist/utils/get-permissions.js +12 -12
  345. package/dist/utils/get-relation-info.d.ts +1 -1
  346. package/dist/utils/get-relation-info.js +3 -5
  347. package/dist/utils/get-relation-type.d.ts +1 -1
  348. package/dist/utils/get-relation-type.js +3 -4
  349. package/dist/utils/get-schema.d.ts +2 -2
  350. package/dist/utils/get-schema.js +20 -22
  351. package/dist/utils/get-snapshot-diff.js +2 -3
  352. package/dist/utils/get-snapshot.d.ts +3 -3
  353. package/dist/utils/get-snapshot.js +6 -8
  354. package/dist/utils/is-directus-jwt.js +1 -1
  355. package/dist/utils/is-url-allowed.js +5 -2
  356. package/dist/utils/job-queue.js +2 -0
  357. package/dist/utils/jwt.d.ts +1 -1
  358. package/dist/utils/merge-permissions-for-share.d.ts +1 -1
  359. package/dist/utils/merge-permissions-for-share.js +3 -4
  360. package/dist/utils/merge-permissions.d.ts +3 -3
  361. package/dist/utils/reduce-schema.d.ts +1 -1
  362. package/dist/utils/reduce-schema.js +12 -12
  363. package/dist/utils/sanitize-query.d.ts +1 -1
  364. package/dist/utils/sanitize-query.js +27 -27
  365. package/dist/utils/sanitize-schema.d.ts +2 -2
  366. package/dist/utils/should-skip-cache.d.ts +7 -0
  367. package/dist/utils/should-skip-cache.js +21 -0
  368. package/dist/utils/should-skip-cache.test.d.ts +1 -0
  369. package/dist/utils/track.js +16 -16
  370. package/dist/utils/transformations.d.ts +1 -1
  371. package/dist/utils/transformations.js +2 -4
  372. package/dist/utils/url.js +7 -2
  373. package/dist/utils/user-name.d.ts +1 -1
  374. package/dist/utils/validate-diff.js +7 -8
  375. package/dist/utils/validate-keys.d.ts +2 -2
  376. package/dist/utils/validate-keys.js +1 -1
  377. package/dist/utils/validate-query.d.ts +1 -1
  378. package/dist/utils/validate-query.js +3 -3
  379. package/dist/utils/validate-storage.js +8 -8
  380. package/dist/webhooks.js +3 -3
  381. package/package.json +36 -37
  382. package/dist/utils/with-timeout.d.ts +0 -1
  383. package/dist/utils/with-timeout.js +0 -16
@@ -4,17 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const express_1 = require("express");
7
+ const drivers_1 = require("../auth/drivers");
8
+ const constants_1 = require("../constants");
7
9
  const env_1 = __importDefault(require("../env"));
8
10
  const exceptions_1 = require("../exceptions");
11
+ const logger_1 = __importDefault(require("../logger"));
9
12
  const respond_1 = require("../middleware/respond");
10
13
  const services_1 = require("../services");
11
14
  const async_handler_1 = __importDefault(require("../utils/async-handler"));
12
15
  const get_auth_providers_1 = require("../utils/get-auth-providers");
13
- const logger_1 = __importDefault(require("../logger"));
14
- const drivers_1 = require("../auth/drivers");
15
- const constants_1 = require("../constants");
16
16
  const get_ip_from_req_1 = require("../utils/get-ip-from-req");
17
- const constants_2 = require("../constants");
18
17
  const router = (0, express_1.Router)();
19
18
  const authProviders = (0, get_auth_providers_1.getAuthProviders)();
20
19
  for (const authProvider of authProviders) {
@@ -42,21 +41,25 @@ for (const authProvider of authProviders) {
42
41
  }
43
42
  router.use(`/login/${authProvider.name}`, authRouter);
44
43
  }
45
- if (!env_1.default.AUTH_DISABLE_DEFAULT) {
44
+ if (!env_1.default['AUTH_DISABLE_DEFAULT']) {
46
45
  router.use('/login', (0, drivers_1.createLocalAuthRouter)(constants_1.DEFAULT_AUTH_PROVIDER));
47
46
  }
48
47
  router.post('/refresh', (0, async_handler_1.default)(async (req, res, next) => {
49
48
  const accountability = {
50
49
  ip: (0, get_ip_from_req_1.getIPFromReq)(req),
51
- userAgent: req.get('user-agent'),
52
- origin: req.get('origin'),
53
50
  role: null,
54
51
  };
52
+ const userAgent = req.get('user-agent');
53
+ if (userAgent)
54
+ accountability.userAgent = userAgent;
55
+ const origin = req.get('origin');
56
+ if (origin)
57
+ accountability.origin = origin;
55
58
  const authenticationService = new services_1.AuthenticationService({
56
59
  accountability: accountability,
57
60
  schema: req.schema,
58
61
  });
59
- const currentRefreshToken = req.body.refresh_token || req.cookies[env_1.default.REFRESH_TOKEN_COOKIE_NAME];
62
+ const currentRefreshToken = req.body.refresh_token || req.cookies[env_1.default['REFRESH_TOKEN_COOKIE_NAME']];
60
63
  if (!currentRefreshToken) {
61
64
  throw new exceptions_1.InvalidPayloadException(`"refresh_token" is required in either the JSON payload or Cookie`);
62
65
  }
@@ -66,37 +69,40 @@ router.post('/refresh', (0, async_handler_1.default)(async (req, res, next) => {
66
69
  data: { access_token: accessToken, expires },
67
70
  };
68
71
  if (mode === 'json') {
69
- payload.data.refresh_token = refreshToken;
72
+ payload['data']['refresh_token'] = refreshToken;
70
73
  }
71
74
  if (mode === 'cookie') {
72
- res.cookie(env_1.default.REFRESH_TOKEN_COOKIE_NAME, refreshToken, constants_2.COOKIE_OPTIONS);
75
+ res.cookie(env_1.default['REFRESH_TOKEN_COOKIE_NAME'], refreshToken, constants_1.COOKIE_OPTIONS);
73
76
  }
74
- res.locals.payload = payload;
77
+ res.locals['payload'] = payload;
75
78
  return next();
76
79
  }), respond_1.respond);
77
80
  router.post('/logout', (0, async_handler_1.default)(async (req, res, next) => {
78
- var _a;
79
81
  const accountability = {
80
82
  ip: (0, get_ip_from_req_1.getIPFromReq)(req),
81
- userAgent: req.get('user-agent'),
82
- origin: req.get('origin'),
83
83
  role: null,
84
84
  };
85
+ const userAgent = req.get('user-agent');
86
+ if (userAgent)
87
+ accountability.userAgent = userAgent;
88
+ const origin = req.get('origin');
89
+ if (origin)
90
+ accountability.origin = origin;
85
91
  const authenticationService = new services_1.AuthenticationService({
86
92
  accountability: accountability,
87
93
  schema: req.schema,
88
94
  });
89
- const currentRefreshToken = req.body.refresh_token || req.cookies[env_1.default.REFRESH_TOKEN_COOKIE_NAME];
95
+ const currentRefreshToken = req.body.refresh_token || req.cookies[env_1.default['REFRESH_TOKEN_COOKIE_NAME']];
90
96
  if (!currentRefreshToken) {
91
97
  throw new exceptions_1.InvalidPayloadException(`"refresh_token" is required in either the JSON payload or Cookie`);
92
98
  }
93
99
  await authenticationService.logout(currentRefreshToken);
94
- if (req.cookies[env_1.default.REFRESH_TOKEN_COOKIE_NAME]) {
95
- res.clearCookie(env_1.default.REFRESH_TOKEN_COOKIE_NAME, {
100
+ if (req.cookies[env_1.default['REFRESH_TOKEN_COOKIE_NAME']]) {
101
+ res.clearCookie(env_1.default['REFRESH_TOKEN_COOKIE_NAME'], {
96
102
  httpOnly: true,
97
- domain: env_1.default.REFRESH_TOKEN_COOKIE_DOMAIN,
98
- secure: (_a = env_1.default.REFRESH_TOKEN_COOKIE_SECURE) !== null && _a !== void 0 ? _a : false,
99
- sameSite: env_1.default.REFRESH_TOKEN_COOKIE_SAME_SITE || 'strict',
103
+ domain: env_1.default['REFRESH_TOKEN_COOKIE_DOMAIN'],
104
+ secure: env_1.default['REFRESH_TOKEN_COOKIE_SECURE'] ?? false,
105
+ sameSite: env_1.default['REFRESH_TOKEN_COOKIE_SAME_SITE'] || 'strict',
100
106
  });
101
107
  }
102
108
  return next();
@@ -107,10 +113,14 @@ router.post('/password/request', (0, async_handler_1.default)(async (req, res, n
107
113
  }
108
114
  const accountability = {
109
115
  ip: (0, get_ip_from_req_1.getIPFromReq)(req),
110
- userAgent: req.get('user-agent'),
111
- origin: req.get('origin'),
112
116
  role: null,
113
117
  };
118
+ const userAgent = req.get('user-agent');
119
+ if (userAgent)
120
+ accountability.userAgent = userAgent;
121
+ const origin = req.get('origin');
122
+ if (origin)
123
+ accountability.origin = origin;
114
124
  const service = new services_1.UsersService({ accountability, schema: req.schema });
115
125
  try {
116
126
  await service.requestPasswordReset(req.body.email, req.body.reset_url || null);
@@ -135,18 +145,22 @@ router.post('/password/reset', (0, async_handler_1.default)(async (req, res, nex
135
145
  }
136
146
  const accountability = {
137
147
  ip: (0, get_ip_from_req_1.getIPFromReq)(req),
138
- userAgent: req.get('user-agent'),
139
- origin: req.get('origin'),
140
148
  role: null,
141
149
  };
150
+ const userAgent = req.get('user-agent');
151
+ if (userAgent)
152
+ accountability.userAgent = userAgent;
153
+ const origin = req.get('origin');
154
+ if (origin)
155
+ accountability.origin = origin;
142
156
  const service = new services_1.UsersService({ accountability, schema: req.schema });
143
157
  await service.resetPassword(req.body.token, req.body.password);
144
158
  return next();
145
159
  }), respond_1.respond);
146
160
  router.get('/', (0, async_handler_1.default)(async (req, res, next) => {
147
- res.locals.payload = {
161
+ res.locals['payload'] = {
148
162
  data: (0, get_auth_providers_1.getAuthProviders)(),
149
- disableDefault: env_1.default.AUTH_DISABLE_DEFAULT,
163
+ disableDefault: env_1.default['AUTH_DISABLE_DEFAULT'],
150
164
  };
151
165
  return next();
152
166
  }), respond_1.respond);
@@ -18,12 +18,12 @@ router.post('/', (0, async_handler_1.default)(async (req, res, next) => {
18
18
  if (Array.isArray(req.body)) {
19
19
  const collectionKey = await collectionsService.createMany(req.body);
20
20
  const records = await collectionsService.readMany(collectionKey);
21
- res.locals.payload = { data: records || null };
21
+ res.locals['payload'] = { data: records || null };
22
22
  }
23
23
  else {
24
24
  const collectionKey = await collectionsService.createOne(req.body);
25
25
  const record = await collectionsService.readOne(collectionKey);
26
- res.locals.payload = { data: record || null };
26
+ res.locals['payload'] = { data: record || null };
27
27
  }
28
28
  return next();
29
29
  }), respond_1.respond);
@@ -44,7 +44,7 @@ const readHandler = (0, async_handler_1.default)(async (req, res, next) => {
44
44
  result = await collectionsService.readByQuery();
45
45
  }
46
46
  const meta = await metaService.getMetaForQuery('directus_collections', {});
47
- res.locals.payload = { data: result, meta };
47
+ res.locals['payload'] = { data: result, meta };
48
48
  return next();
49
49
  });
50
50
  router.get('/', (0, validate_batch_1.validateBatch)('read'), readHandler, respond_1.respond);
@@ -54,8 +54,8 @@ router.get('/:collection', (0, async_handler_1.default)(async (req, res, next) =
54
54
  accountability: req.accountability,
55
55
  schema: req.schema,
56
56
  });
57
- const collection = await collectionsService.readOne(req.params.collection);
58
- res.locals.payload = { data: collection || null };
57
+ const collection = await collectionsService.readOne(req.params['collection']);
58
+ res.locals['payload'] = { data: collection || null };
59
59
  return next();
60
60
  }), respond_1.respond);
61
61
  router.patch('/', (0, async_handler_1.default)(async (req, res, next) => {
@@ -66,7 +66,7 @@ router.patch('/', (0, async_handler_1.default)(async (req, res, next) => {
66
66
  const collectionKeys = await collectionsService.updateBatch(req.body);
67
67
  try {
68
68
  const collections = await collectionsService.readMany(collectionKeys);
69
- res.locals.payload = { data: collections || null };
69
+ res.locals['payload'] = { data: collections || null };
70
70
  }
71
71
  catch (error) {
72
72
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -81,10 +81,10 @@ router.patch('/:collection', (0, async_handler_1.default)(async (req, res, next)
81
81
  accountability: req.accountability,
82
82
  schema: req.schema,
83
83
  });
84
- await collectionsService.updateOne(req.params.collection, req.body);
84
+ await collectionsService.updateOne(req.params['collection'], req.body);
85
85
  try {
86
- const collection = await collectionsService.readOne(req.params.collection);
87
- res.locals.payload = { data: collection || null };
86
+ const collection = await collectionsService.readOne(req.params['collection']);
87
+ res.locals['payload'] = { data: collection || null };
88
88
  }
89
89
  catch (error) {
90
90
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -99,7 +99,7 @@ router.delete('/:collection', (0, async_handler_1.default)(async (req, res, next
99
99
  accountability: req.accountability,
100
100
  schema: req.schema,
101
101
  });
102
- await collectionsService.deleteOne(req.params.collection);
102
+ await collectionsService.deleteOne(req.params['collection']);
103
103
  return next();
104
104
  }), respond_1.respond);
105
105
  exports.default = router;
@@ -10,6 +10,7 @@ const use_collection_1 = __importDefault(require("../middleware/use-collection")
10
10
  const validate_batch_1 = require("../middleware/validate-batch");
11
11
  const services_1 = require("../services");
12
12
  const async_handler_1 = __importDefault(require("../utils/async-handler"));
13
+ const sanitize_query_1 = require("../utils/sanitize-query");
13
14
  const router = express_1.default.Router();
14
15
  router.use((0, use_collection_1.default)('directus_dashboards'));
15
16
  router.post('/', (0, async_handler_1.default)(async (req, res, next) => {
@@ -29,11 +30,11 @@ router.post('/', (0, async_handler_1.default)(async (req, res, next) => {
29
30
  try {
30
31
  if (Array.isArray(req.body)) {
31
32
  const items = await service.readMany(savedKeys, req.sanitizedQuery);
32
- res.locals.payload = { data: items };
33
+ res.locals['payload'] = { data: items };
33
34
  }
34
35
  else {
35
36
  const item = await service.readOne(savedKeys[0], req.sanitizedQuery);
36
- res.locals.payload = { data: item };
37
+ res.locals['payload'] = { data: item };
37
38
  }
38
39
  }
39
40
  catch (error) {
@@ -55,7 +56,7 @@ const readHandler = (0, async_handler_1.default)(async (req, res, next) => {
55
56
  });
56
57
  const records = await service.readByQuery(req.sanitizedQuery);
57
58
  const meta = await metaService.getMetaForQuery(req.collection, req.sanitizedQuery);
58
- res.locals.payload = { data: records || null, meta };
59
+ res.locals['payload'] = { data: records || null, meta };
59
60
  return next();
60
61
  });
61
62
  router.get('/', (0, validate_batch_1.validateBatch)('read'), readHandler, respond_1.respond);
@@ -65,8 +66,8 @@ router.get('/:pk', (0, async_handler_1.default)(async (req, res, next) => {
65
66
  accountability: req.accountability,
66
67
  schema: req.schema,
67
68
  });
68
- const record = await service.readOne(req.params.pk, req.sanitizedQuery);
69
- res.locals.payload = { data: record || null };
69
+ const record = await service.readOne(req.params['pk'], req.sanitizedQuery);
70
+ res.locals['payload'] = { data: record || null };
70
71
  return next();
71
72
  }), respond_1.respond);
72
73
  router.patch('/', (0, validate_batch_1.validateBatch)('update'), (0, async_handler_1.default)(async (req, res, next) => {
@@ -82,11 +83,12 @@ router.patch('/', (0, validate_batch_1.validateBatch)('update'), (0, async_handl
82
83
  keys = await service.updateMany(req.body.keys, req.body.data);
83
84
  }
84
85
  else {
85
- keys = await service.updateByQuery(req.body.query, req.body.data);
86
+ const sanitizedQuery = (0, sanitize_query_1.sanitizeQuery)(req.body.query, req.accountability);
87
+ keys = await service.updateByQuery(sanitizedQuery, req.body.data);
86
88
  }
87
89
  try {
88
90
  const result = await service.readMany(keys, req.sanitizedQuery);
89
- res.locals.payload = { data: result };
91
+ res.locals['payload'] = { data: result };
90
92
  }
91
93
  catch (error) {
92
94
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -101,10 +103,10 @@ router.patch('/:pk', (0, async_handler_1.default)(async (req, res, next) => {
101
103
  accountability: req.accountability,
102
104
  schema: req.schema,
103
105
  });
104
- const primaryKey = await service.updateOne(req.params.pk, req.body);
106
+ const primaryKey = await service.updateOne(req.params['pk'], req.body);
105
107
  try {
106
108
  const item = await service.readOne(primaryKey, req.sanitizedQuery);
107
- res.locals.payload = { data: item || null };
109
+ res.locals['payload'] = { data: item || null };
108
110
  }
109
111
  catch (error) {
110
112
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -126,7 +128,8 @@ router.delete('/', (0, async_handler_1.default)(async (req, res, next) => {
126
128
  await service.deleteMany(req.body.keys);
127
129
  }
128
130
  else {
129
- await service.deleteByQuery(req.body.query);
131
+ const sanitizedQuery = (0, sanitize_query_1.sanitizeQuery)(req.body.query, req.accountability);
132
+ await service.deleteByQuery(sanitizedQuery);
130
133
  }
131
134
  return next();
132
135
  }), respond_1.respond);
@@ -135,7 +138,7 @@ router.delete('/:pk', (0, async_handler_1.default)(async (req, res, next) => {
135
138
  accountability: req.accountability,
136
139
  schema: req.schema,
137
140
  });
138
- await service.deleteOne(req.params.pk);
141
+ await service.deleteOne(req.params['pk']);
139
142
  return next();
140
143
  }), respond_1.respond);
141
144
  exports.default = router;
@@ -15,13 +15,13 @@ const get_cache_headers_1 = require("../utils/get-cache-headers");
15
15
  const get_milliseconds_1 = require("../utils/get-milliseconds");
16
16
  const router = (0, express_1.Router)();
17
17
  router.get('/:type', (0, async_handler_1.default)(async (req, res, next) => {
18
- const type = (0, utils_1.depluralize)(req.params.type);
18
+ const type = (0, utils_1.depluralize)(req.params['type']);
19
19
  if (!(0, utils_1.isIn)(type, constants_1.EXTENSION_TYPES)) {
20
20
  throw new exceptions_1.RouteNotFoundException(req.path);
21
21
  }
22
22
  const extensionManager = (0, extensions_1.getExtensionManager)();
23
23
  const extensions = extensionManager.getExtensionsList(type);
24
- res.locals.payload = {
24
+ res.locals['payload'] = {
25
25
  data: extensions,
26
26
  };
27
27
  return next();
@@ -33,7 +33,7 @@ router.get('/sources/index.js', (0, async_handler_1.default)(async (req, res) =>
33
33
  throw new exceptions_1.RouteNotFoundException(req.path);
34
34
  }
35
35
  res.setHeader('Content-Type', 'application/javascript; charset=UTF-8');
36
- res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, (0, get_milliseconds_1.getMilliseconds)(env_1.default.EXTENSIONS_CACHE_TTL), false, false));
36
+ res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, (0, get_milliseconds_1.getMilliseconds)(env_1.default['EXTENSIONS_CACHE_TTL']), false, false));
37
37
  res.setHeader('Vary', 'Origin, Cache-Control');
38
38
  res.end(extensionSource);
39
39
  }));
@@ -3,15 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const constants_1 = require("@directus/shared/constants");
6
7
  const express_1 = require("express");
7
8
  const joi_1 = __importDefault(require("joi"));
8
- const constants_1 = require("../constants");
9
+ const constants_2 = require("../constants");
9
10
  const exceptions_1 = require("../exceptions");
10
11
  const collection_exists_1 = __importDefault(require("../middleware/collection-exists"));
11
12
  const respond_1 = require("../middleware/respond");
12
13
  const use_collection_1 = __importDefault(require("../middleware/use-collection"));
13
14
  const fields_1 = require("../services/fields");
14
- const constants_2 = require("@directus/shared/constants");
15
15
  const async_handler_1 = __importDefault(require("../utils/async-handler"));
16
16
  const router = (0, express_1.Router)();
17
17
  router.use((0, use_collection_1.default)('directus_fields'));
@@ -21,7 +21,7 @@ router.get('/', (0, async_handler_1.default)(async (req, res, next) => {
21
21
  schema: req.schema,
22
22
  });
23
23
  const fields = await service.readAll();
24
- res.locals.payload = { data: fields || null };
24
+ res.locals['payload'] = { data: fields || null };
25
25
  return next();
26
26
  }), respond_1.respond);
27
27
  router.get('/:collection', collection_exists_1.default, (0, async_handler_1.default)(async (req, res, next) => {
@@ -29,8 +29,8 @@ router.get('/:collection', collection_exists_1.default, (0, async_handler_1.defa
29
29
  accountability: req.accountability,
30
30
  schema: req.schema,
31
31
  });
32
- const fields = await service.readAll(req.params.collection);
33
- res.locals.payload = { data: fields || null };
32
+ const fields = await service.readAll(req.params['collection']);
33
+ res.locals['payload'] = { data: fields || null };
34
34
  return next();
35
35
  }), respond_1.respond);
36
36
  router.get('/:collection/:field', collection_exists_1.default, (0, async_handler_1.default)(async (req, res, next) => {
@@ -38,15 +38,15 @@ router.get('/:collection/:field', collection_exists_1.default, (0, async_handler
38
38
  accountability: req.accountability,
39
39
  schema: req.schema,
40
40
  });
41
- const field = await service.readOne(req.params.collection, req.params.field);
42
- res.locals.payload = { data: field || null };
41
+ const field = await service.readOne(req.params['collection'], req.params['field']);
42
+ res.locals['payload'] = { data: field || null };
43
43
  return next();
44
44
  }), respond_1.respond);
45
45
  const newFieldSchema = joi_1.default.object({
46
46
  collection: joi_1.default.string().optional(),
47
47
  field: joi_1.default.string().required(),
48
48
  type: joi_1.default.string()
49
- .valid(...constants_2.TYPES, ...constants_1.ALIAS_TYPES)
49
+ .valid(...constants_1.TYPES, ...constants_2.ALIAS_TYPES)
50
50
  .allow(null)
51
51
  .optional(),
52
52
  schema: joi_1.default.object({
@@ -68,10 +68,10 @@ router.post('/:collection', collection_exists_1.default, (0, async_handler_1.def
68
68
  throw new exceptions_1.InvalidPayloadException(error.message);
69
69
  }
70
70
  const field = req.body;
71
- await service.createField(req.params.collection, field);
71
+ await service.createField(req.params['collection'], field);
72
72
  try {
73
- const createdField = await service.readOne(req.params.collection, field.field);
74
- res.locals.payload = { data: createdField || null };
73
+ const createdField = await service.readOne(req.params['collection'], field.field);
74
+ res.locals['payload'] = { data: createdField || null };
75
75
  }
76
76
  catch (error) {
77
77
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -90,14 +90,14 @@ router.patch('/:collection', collection_exists_1.default, (0, async_handler_1.de
90
90
  throw new exceptions_1.InvalidPayloadException('Submitted body has to be an array.');
91
91
  }
92
92
  for (const field of req.body) {
93
- await service.updateField(req.params.collection, field);
93
+ await service.updateField(req.params['collection'], field);
94
94
  }
95
95
  try {
96
96
  const results = [];
97
97
  for (const field of req.body) {
98
- const updatedField = await service.readOne(req.params.collection, field.field);
98
+ const updatedField = await service.readOne(req.params['collection'], field.field);
99
99
  results.push(updatedField);
100
- res.locals.payload = { data: results || null };
100
+ res.locals['payload'] = { data: results || null };
101
101
  }
102
102
  }
103
103
  catch (error) {
@@ -110,7 +110,7 @@ router.patch('/:collection', collection_exists_1.default, (0, async_handler_1.de
110
110
  }), respond_1.respond);
111
111
  const updateSchema = joi_1.default.object({
112
112
  type: joi_1.default.string()
113
- .valid(...constants_2.TYPES, ...constants_1.ALIAS_TYPES)
113
+ .valid(...constants_1.TYPES, ...constants_2.ALIAS_TYPES)
114
114
  .allow(null),
115
115
  schema: joi_1.default.object({
116
116
  default_value: joi_1.default.any(),
@@ -135,11 +135,11 @@ router.patch('/:collection/:field', collection_exists_1.default, (0, async_handl
135
135
  }
136
136
  const fieldData = req.body;
137
137
  if (!fieldData.field)
138
- fieldData.field = req.params.field;
139
- await service.updateField(req.params.collection, fieldData);
138
+ fieldData.field = req.params['field'];
139
+ await service.updateField(req.params['collection'], fieldData);
140
140
  try {
141
- const updatedField = await service.readOne(req.params.collection, req.params.field);
142
- res.locals.payload = { data: updatedField || null };
141
+ const updatedField = await service.readOne(req.params['collection'], req.params['field']);
142
+ res.locals['payload'] = { data: updatedField || null };
143
143
  }
144
144
  catch (error) {
145
145
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -154,7 +154,7 @@ router.delete('/:collection/:field', collection_exists_1.default, (0, async_hand
154
154
  accountability: req.accountability,
155
155
  schema: req.schema,
156
156
  });
157
- await service.deleteField(req.params.collection, req.params.field);
157
+ await service.deleteField(req.params['collection'], req.params['field']);
158
158
  return next();
159
159
  }), respond_1.respond);
160
160
  exports.default = router;
@@ -18,6 +18,7 @@ const services_1 = require("../services");
18
18
  const async_handler_1 = __importDefault(require("../utils/async-handler"));
19
19
  // @ts-ignore
20
20
  const format_title_1 = __importDefault(require("@directus/format-title"));
21
+ const sanitize_query_1 = require("../utils/sanitize-query");
21
22
  const router = express_1.default.Router();
22
23
  router.use((0, use_collection_1.default)('directus_files'));
23
24
  const multipartHandler = (req, res, next) => {
@@ -36,13 +37,13 @@ const multipartHandler = (req, res, next) => {
36
37
  const busboy = (0, busboy_1.default)({ headers, defParamCharset: 'utf8' });
37
38
  const savedFiles = [];
38
39
  const service = new services_1.FilesService({ accountability: req.accountability, schema: req.schema });
39
- const existingPrimaryKey = req.params.pk || undefined;
40
+ const existingPrimaryKey = req.params['pk'] || undefined;
40
41
  /**
41
42
  * The order of the fields in multipart/form-data is important. We require that all fields
42
43
  * are provided _before_ the files. This allows us to set the storage location, and create
43
44
  * the row in directus_files async during the upload of the actual file.
44
45
  */
45
- let disk = (0, utils_1.toArray)(env_1.default.STORAGE_LOCATIONS)[0];
46
+ let disk = (0, utils_1.toArray)(env_1.default['STORAGE_LOCATIONS'])[0];
46
47
  let payload = {};
47
48
  let fileCount = 0;
48
49
  busboy.on('field', (fieldname, val) => {
@@ -63,12 +64,14 @@ const multipartHandler = (req, res, next) => {
63
64
  return busboy.emit('error', new exceptions_1.InvalidPayloadException(`File is missing filename`));
64
65
  }
65
66
  fileCount++;
66
- if (!payload.title) {
67
- payload.title = (0, format_title_1.default)(path_1.default.parse(filename).name);
67
+ if (!existingPrimaryKey) {
68
+ if (!payload.title) {
69
+ payload.title = (0, format_title_1.default)(path_1.default.parse(filename).name);
70
+ }
71
+ payload.filename_download = filename;
68
72
  }
69
73
  const payloadWithRequiredFields = {
70
74
  ...payload,
71
- filename_download: filename,
72
75
  type: mimeType,
73
76
  storage: payload.storage || disk,
74
77
  };
@@ -82,6 +85,7 @@ const multipartHandler = (req, res, next) => {
82
85
  catch (error) {
83
86
  busboy.emit('error', error);
84
87
  }
88
+ return undefined;
85
89
  });
86
90
  busboy.on('error', (error) => {
87
91
  next(error);
@@ -95,7 +99,7 @@ const multipartHandler = (req, res, next) => {
95
99
  if (fileCount === 0) {
96
100
  return next(new exceptions_1.InvalidPayloadException(`No files were included in the body`));
97
101
  }
98
- res.locals.savedFiles = savedFiles;
102
+ res.locals['savedFiles'] = savedFiles;
99
103
  return next();
100
104
  }
101
105
  }
@@ -108,7 +112,7 @@ router.post('/', (0, async_handler_1.default)(exports.multipartHandler), (0, asy
108
112
  });
109
113
  let keys = [];
110
114
  if (req.is('multipart/form-data')) {
111
- keys = res.locals.savedFiles;
115
+ keys = res.locals['savedFiles'];
112
116
  }
113
117
  else {
114
118
  keys = await service.createOne(req.body);
@@ -116,14 +120,14 @@ router.post('/', (0, async_handler_1.default)(exports.multipartHandler), (0, asy
116
120
  try {
117
121
  if (Array.isArray(keys) && keys.length > 1) {
118
122
  const records = await service.readMany(keys, req.sanitizedQuery);
119
- res.locals.payload = {
123
+ res.locals['payload'] = {
120
124
  data: records,
121
125
  };
122
126
  }
123
127
  else {
124
128
  const key = Array.isArray(keys) ? keys[0] : keys;
125
129
  const record = await service.readOne(key, req.sanitizedQuery);
126
- res.locals.payload = {
130
+ res.locals['payload'] = {
127
131
  data: record,
128
132
  };
129
133
  }
@@ -152,7 +156,7 @@ router.post('/import', (0, async_handler_1.default)(async (req, res, next) => {
152
156
  const primaryKey = await service.importOne(req.body.url, req.body.data);
153
157
  try {
154
158
  const record = await service.readOne(primaryKey, req.sanitizedQuery);
155
- res.locals.payload = { data: record || null };
159
+ res.locals['payload'] = { data: record || null };
156
160
  }
157
161
  catch (error) {
158
162
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -182,7 +186,7 @@ const readHandler = (0, async_handler_1.default)(async (req, res, next) => {
182
186
  result = await service.readByQuery(req.sanitizedQuery);
183
187
  }
184
188
  const meta = await metaService.getMetaForQuery('directus_files', req.sanitizedQuery);
185
- res.locals.payload = { data: result, meta };
189
+ res.locals['payload'] = { data: result, meta };
186
190
  return next();
187
191
  });
188
192
  router.get('/', (0, validate_batch_1.validateBatch)('read'), readHandler, respond_1.respond);
@@ -192,8 +196,8 @@ router.get('/:pk', (0, async_handler_1.default)(async (req, res, next) => {
192
196
  accountability: req.accountability,
193
197
  schema: req.schema,
194
198
  });
195
- const record = await service.readOne(req.params.pk, req.sanitizedQuery);
196
- res.locals.payload = { data: record || null };
199
+ const record = await service.readOne(req.params['pk'], req.sanitizedQuery);
200
+ res.locals['payload'] = { data: record || null };
197
201
  return next();
198
202
  }), respond_1.respond);
199
203
  router.patch('/', (0, validate_batch_1.validateBatch)('update'), (0, async_handler_1.default)(async (req, res, next) => {
@@ -209,11 +213,12 @@ router.patch('/', (0, validate_batch_1.validateBatch)('update'), (0, async_handl
209
213
  keys = await service.updateMany(req.body.keys, req.body.data);
210
214
  }
211
215
  else {
212
- keys = await service.updateByQuery(req.body.query, req.body.data);
216
+ const sanitizedQuery = (0, sanitize_query_1.sanitizeQuery)(req.body.query, req.accountability);
217
+ keys = await service.updateByQuery(sanitizedQuery, req.body.data);
213
218
  }
214
219
  try {
215
220
  const result = await service.readMany(keys, req.sanitizedQuery);
216
- res.locals.payload = { data: result || null };
221
+ res.locals['payload'] = { data: result || null };
217
222
  }
218
223
  catch (error) {
219
224
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -228,10 +233,10 @@ router.patch('/:pk', (0, async_handler_1.default)(exports.multipartHandler), (0,
228
233
  accountability: req.accountability,
229
234
  schema: req.schema,
230
235
  });
231
- await service.updateOne(req.params.pk, req.body);
236
+ await service.updateOne(req.params['pk'], req.body);
232
237
  try {
233
- const record = await service.readOne(req.params.pk, req.sanitizedQuery);
234
- res.locals.payload = { data: record || null };
238
+ const record = await service.readOne(req.params['pk'], req.sanitizedQuery);
239
+ res.locals['payload'] = { data: record || null };
235
240
  }
236
241
  catch (error) {
237
242
  if (error instanceof exceptions_1.ForbiddenException) {
@@ -253,7 +258,8 @@ router.delete('/', (0, validate_batch_1.validateBatch)('delete'), (0, async_hand
253
258
  await service.deleteMany(req.body.keys);
254
259
  }
255
260
  else {
256
- await service.deleteByQuery(req.body.query);
261
+ const sanitizedQuery = (0, sanitize_query_1.sanitizeQuery)(req.body.query, req.accountability);
262
+ await service.deleteByQuery(sanitizedQuery);
257
263
  }
258
264
  return next();
259
265
  }), respond_1.respond);
@@ -262,7 +268,7 @@ router.delete('/:pk', (0, async_handler_1.default)(async (req, res, next) => {
262
268
  accountability: req.accountability,
263
269
  schema: req.schema,
264
270
  });
265
- await service.deleteOne(req.params.pk);
271
+ await service.deleteOne(req.params['pk']);
266
272
  return next();
267
273
  }), respond_1.respond);
268
274
  exports.default = router;