@directus/api 20.0.0 → 21.0.0-rc.0

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 (330) hide show
  1. package/dist/app.js +5 -5
  2. package/dist/auth/drivers/ldap.js +5 -5
  3. package/dist/auth/drivers/local.js +4 -4
  4. package/dist/auth/drivers/oauth2.js +5 -5
  5. package/dist/auth/drivers/openid.js +3 -5
  6. package/dist/auth/drivers/saml.js +1 -1
  7. package/dist/auth.js +1 -1
  8. package/dist/cache.js +4 -1
  9. package/dist/cli/commands/bootstrap/index.js +10 -3
  10. package/dist/cli/commands/count/index.js +1 -1
  11. package/dist/cli/commands/database/install.js +1 -1
  12. package/dist/cli/commands/database/migrate.js +1 -1
  13. package/dist/cli/commands/init/index.js +9 -10
  14. package/dist/cli/commands/roles/create.js +1 -1
  15. package/dist/cli/commands/schema/apply.js +1 -1
  16. package/dist/cli/commands/schema/snapshot.js +1 -1
  17. package/dist/cli/commands/users/create.js +1 -1
  18. package/dist/cli/commands/users/passwd.js +1 -1
  19. package/dist/cli/load-extensions.js +1 -1
  20. package/dist/cli/utils/defaults.d.ts +4 -11
  21. package/dist/cli/utils/defaults.js +7 -1
  22. package/dist/constants.d.ts +1 -1
  23. package/dist/constants.js +2 -2
  24. package/dist/controllers/access.d.ts +2 -0
  25. package/dist/controllers/access.js +148 -0
  26. package/dist/controllers/assets.js +1 -1
  27. package/dist/controllers/auth.js +6 -17
  28. package/dist/controllers/files.js +1 -1
  29. package/dist/controllers/permissions.js +14 -2
  30. package/dist/controllers/policies.d.ts +2 -0
  31. package/dist/controllers/policies.js +169 -0
  32. package/dist/controllers/roles.js +22 -1
  33. package/dist/controllers/schema.js +1 -1
  34. package/dist/controllers/tus.js +11 -23
  35. package/dist/controllers/users.js +0 -55
  36. package/dist/database/get-ast-from-query/get-ast-from-query.d.ts +16 -0
  37. package/dist/database/get-ast-from-query/get-ast-from-query.js +82 -0
  38. package/dist/database/get-ast-from-query/lib/convert-wildcards.d.ts +13 -0
  39. package/dist/database/get-ast-from-query/lib/convert-wildcards.js +69 -0
  40. package/dist/database/get-ast-from-query/lib/parse-fields.d.ts +15 -0
  41. package/dist/database/get-ast-from-query/lib/parse-fields.js +190 -0
  42. package/dist/database/get-ast-from-query/utils/get-deep-query.d.ts +14 -0
  43. package/dist/database/get-ast-from-query/utils/get-deep-query.js +17 -0
  44. package/dist/database/get-ast-from-query/utils/get-related-collection.d.ts +2 -0
  45. package/dist/database/get-ast-from-query/utils/get-related-collection.js +13 -0
  46. package/dist/database/get-ast-from-query/utils/get-relation.d.ts +2 -0
  47. package/dist/database/get-ast-from-query/utils/get-relation.js +7 -0
  48. package/dist/database/helpers/fn/types.d.ts +2 -1
  49. package/dist/database/helpers/fn/types.js +1 -1
  50. package/dist/database/helpers/geometry/dialects/mssql.d.ts +1 -1
  51. package/dist/database/helpers/geometry/dialects/mssql.js +4 -2
  52. package/dist/database/helpers/geometry/dialects/mysql.js +1 -1
  53. package/dist/database/helpers/geometry/dialects/oracle.d.ts +1 -1
  54. package/dist/database/helpers/geometry/dialects/oracle.js +5 -3
  55. package/dist/database/helpers/geometry/types.d.ts +1 -1
  56. package/dist/database/helpers/geometry/types.js +4 -2
  57. package/dist/database/index.js +3 -2
  58. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
  59. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +1 -1
  60. package/dist/database/migrations/20210802A-replace-groups.js +1 -1
  61. package/dist/database/migrations/20230721A-require-shares-fields.js +1 -1
  62. package/dist/database/migrations/20240710A-permissions-policies.d.ts +3 -0
  63. package/dist/database/migrations/20240710A-permissions-policies.js +169 -0
  64. package/dist/database/migrations/run.js +1 -1
  65. package/dist/database/run-ast/lib/get-db-query.d.ts +4 -0
  66. package/dist/database/run-ast/lib/get-db-query.js +208 -0
  67. package/dist/database/run-ast/lib/parse-current-level.d.ts +7 -0
  68. package/dist/database/run-ast/lib/parse-current-level.js +41 -0
  69. package/dist/database/run-ast/run-ast.d.ts +7 -0
  70. package/dist/database/run-ast/run-ast.js +107 -0
  71. package/dist/database/{run-ast.d.ts → run-ast/types.d.ts} +3 -9
  72. package/dist/database/run-ast/types.js +1 -0
  73. package/dist/database/run-ast/utils/apply-case-when.d.ts +16 -0
  74. package/dist/database/run-ast/utils/apply-case-when.js +26 -0
  75. package/dist/database/run-ast/utils/apply-parent-filters.d.ts +3 -0
  76. package/dist/database/run-ast/utils/apply-parent-filters.js +55 -0
  77. package/dist/database/run-ast/utils/get-column-pre-processor.d.ts +10 -0
  78. package/dist/database/run-ast/utils/get-column-pre-processor.js +57 -0
  79. package/dist/database/run-ast/utils/get-field-alias.d.ts +2 -0
  80. package/dist/database/run-ast/utils/get-field-alias.js +4 -0
  81. package/dist/database/run-ast/utils/get-inner-query-column-pre-processor.d.ts +5 -0
  82. package/dist/database/run-ast/utils/get-inner-query-column-pre-processor.js +23 -0
  83. package/dist/database/run-ast/utils/merge-with-parent-items.d.ts +3 -0
  84. package/dist/database/run-ast/utils/merge-with-parent-items.js +87 -0
  85. package/dist/database/run-ast/utils/remove-temporary-fields.d.ts +3 -0
  86. package/dist/database/run-ast/utils/remove-temporary-fields.js +73 -0
  87. package/dist/emitter.js +1 -1
  88. package/dist/extensions/lib/get-shared-deps-mapping.js +1 -1
  89. package/dist/extensions/lib/installation/manager.js +1 -1
  90. package/dist/extensions/lib/sandbox/register/call-reference.js +1 -1
  91. package/dist/extensions/lib/sandbox/sdk/generators/log.js +1 -1
  92. package/dist/extensions/lib/sync-extensions.js +1 -1
  93. package/dist/extensions/manager.js +1 -1
  94. package/dist/flows.js +4 -5
  95. package/dist/{logger.js → logger/index.js} +2 -8
  96. package/dist/logger/redact-query.d.ts +1 -0
  97. package/dist/logger/redact-query.js +13 -0
  98. package/dist/mailer.js +1 -1
  99. package/dist/middleware/authenticate.js +2 -7
  100. package/dist/middleware/cache.js +2 -2
  101. package/dist/middleware/error-handler.js +1 -1
  102. package/dist/middleware/rate-limiter-global.js +1 -1
  103. package/dist/middleware/respond.js +2 -2
  104. package/dist/operations/log/index.js +1 -1
  105. package/dist/operations/mail/index.js +1 -1
  106. package/dist/permissions/cache.d.ts +2 -0
  107. package/dist/permissions/cache.js +23 -0
  108. package/dist/permissions/lib/fetch-permissions.d.ts +10 -0
  109. package/dist/permissions/lib/fetch-permissions.js +55 -0
  110. package/dist/permissions/lib/fetch-policies.d.ts +7 -0
  111. package/dist/permissions/lib/fetch-policies.js +28 -0
  112. package/dist/permissions/lib/fetch-roles-tree.d.ts +3 -0
  113. package/dist/permissions/lib/fetch-roles-tree.js +28 -0
  114. package/dist/{services/permissions → permissions}/lib/with-app-minimal-permissions.d.ts +1 -1
  115. package/dist/permissions/lib/with-app-minimal-permissions.js +10 -0
  116. package/dist/permissions/modules/fetch-accountability-collection-access/fetch-accountability-collection-access.d.ts +7 -0
  117. package/dist/permissions/modules/fetch-accountability-collection-access/fetch-accountability-collection-access.js +56 -0
  118. package/dist/permissions/modules/fetch-accountability-policy-globals/fetch-accountability-policy-globals.d.ts +3 -0
  119. package/dist/permissions/modules/fetch-accountability-policy-globals/fetch-accountability-policy-globals.js +16 -0
  120. package/dist/permissions/modules/fetch-allowed-collections/fetch-allowed-collections.d.ts +8 -0
  121. package/dist/permissions/modules/fetch-allowed-collections/fetch-allowed-collections.js +24 -0
  122. package/dist/permissions/modules/fetch-allowed-field-map/fetch-allowed-field-map.d.ts +9 -0
  123. package/dist/permissions/modules/fetch-allowed-field-map/fetch-allowed-field-map.js +31 -0
  124. package/dist/permissions/modules/fetch-allowed-fields/fetch-allowed-fields.d.ts +16 -0
  125. package/dist/permissions/modules/fetch-allowed-fields/fetch-allowed-fields.js +27 -0
  126. package/dist/permissions/modules/fetch-global-access/fetch-global-access.d.ts +10 -0
  127. package/dist/permissions/modules/fetch-global-access/fetch-global-access.js +23 -0
  128. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-roles.d.ts +5 -0
  129. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-roles.js +7 -0
  130. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-user.d.ts +5 -0
  131. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-user.js +10 -0
  132. package/dist/permissions/modules/fetch-global-access/types.d.ts +4 -0
  133. package/dist/permissions/modules/fetch-global-access/types.js +1 -0
  134. package/dist/permissions/modules/fetch-global-access/utils/fetch-global-access-for-query.d.ts +4 -0
  135. package/dist/permissions/modules/fetch-global-access/utils/fetch-global-access-for-query.js +27 -0
  136. package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.d.ts +12 -0
  137. package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.js +32 -0
  138. package/dist/permissions/modules/fetch-policies-ip-access/fetch-policies-ip-access.d.ts +4 -0
  139. package/dist/permissions/modules/fetch-policies-ip-access/fetch-policies-ip-access.js +29 -0
  140. package/dist/permissions/modules/process-ast/lib/extract-fields-from-children.d.ts +4 -0
  141. package/dist/permissions/modules/process-ast/lib/extract-fields-from-children.js +49 -0
  142. package/dist/permissions/modules/process-ast/lib/extract-fields-from-query.d.ts +3 -0
  143. package/dist/permissions/modules/process-ast/lib/extract-fields-from-query.js +56 -0
  144. package/dist/permissions/modules/process-ast/lib/field-map-from-ast.d.ts +4 -0
  145. package/dist/permissions/modules/process-ast/lib/field-map-from-ast.js +8 -0
  146. package/dist/permissions/modules/process-ast/lib/inject-cases.d.ts +9 -0
  147. package/dist/permissions/modules/process-ast/lib/inject-cases.js +93 -0
  148. package/dist/permissions/modules/process-ast/process-ast.d.ts +9 -0
  149. package/dist/permissions/modules/process-ast/process-ast.js +39 -0
  150. package/dist/permissions/modules/process-ast/types.d.ts +24 -0
  151. package/dist/permissions/modules/process-ast/types.js +1 -0
  152. package/dist/permissions/modules/process-ast/utils/collections-in-field-map.d.ts +2 -0
  153. package/dist/permissions/modules/process-ast/utils/collections-in-field-map.js +7 -0
  154. package/dist/permissions/modules/process-ast/utils/dedupe-access.d.ts +12 -0
  155. package/dist/permissions/modules/process-ast/utils/dedupe-access.js +30 -0
  156. package/dist/permissions/modules/process-ast/utils/extract-paths-from-query.d.ts +15 -0
  157. package/dist/permissions/modules/process-ast/utils/extract-paths-from-query.js +50 -0
  158. package/dist/permissions/modules/process-ast/utils/find-related-collection.d.ts +3 -0
  159. package/dist/permissions/modules/process-ast/utils/find-related-collection.js +9 -0
  160. package/dist/permissions/modules/process-ast/utils/flatten-filter.d.ts +3 -0
  161. package/dist/permissions/modules/process-ast/utils/flatten-filter.js +34 -0
  162. package/dist/permissions/modules/process-ast/utils/format-a2o-key.d.ts +1 -0
  163. package/dist/permissions/modules/process-ast/utils/format-a2o-key.js +3 -0
  164. package/dist/permissions/modules/process-ast/utils/get-info-for-path.d.ts +5 -0
  165. package/dist/permissions/modules/process-ast/utils/get-info-for-path.js +7 -0
  166. package/dist/permissions/modules/process-ast/utils/has-item-permissions.d.ts +2 -0
  167. package/dist/permissions/modules/process-ast/utils/has-item-permissions.js +3 -0
  168. package/dist/permissions/modules/process-ast/utils/stringify-query-path.d.ts +2 -0
  169. package/dist/permissions/modules/process-ast/utils/stringify-query-path.js +3 -0
  170. package/dist/permissions/modules/process-ast/utils/validate-path/create-error.d.ts +3 -0
  171. package/dist/permissions/modules/process-ast/utils/validate-path/create-error.js +16 -0
  172. package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-existence.d.ts +2 -0
  173. package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-existence.js +12 -0
  174. package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-permissions.d.ts +2 -0
  175. package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-permissions.js +28 -0
  176. package/dist/permissions/modules/process-payload/lib/is-field-nullable.d.ts +5 -0
  177. package/dist/permissions/modules/process-payload/lib/is-field-nullable.js +12 -0
  178. package/dist/permissions/modules/process-payload/process-payload.d.ts +13 -0
  179. package/dist/permissions/modules/process-payload/process-payload.js +77 -0
  180. package/dist/permissions/modules/validate-access/lib/validate-collection-access.d.ts +12 -0
  181. package/dist/permissions/modules/validate-access/lib/validate-collection-access.js +11 -0
  182. package/dist/permissions/modules/validate-access/lib/validate-item-access.d.ts +9 -0
  183. package/dist/permissions/modules/validate-access/lib/validate-item-access.js +33 -0
  184. package/dist/permissions/modules/validate-access/validate-access.d.ts +14 -0
  185. package/dist/permissions/modules/validate-access/validate-access.js +28 -0
  186. package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-count.d.ts +1 -0
  187. package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-count.js +8 -0
  188. package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-users.d.ts +5 -0
  189. package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-users.js +10 -0
  190. package/dist/permissions/types.d.ts +6 -0
  191. package/dist/permissions/types.js +1 -0
  192. package/dist/permissions/utils/create-default-accountability.d.ts +2 -0
  193. package/dist/permissions/utils/create-default-accountability.js +11 -0
  194. package/dist/permissions/utils/extract-required-dynamic-variable-context.d.ts +8 -0
  195. package/dist/permissions/utils/extract-required-dynamic-variable-context.js +27 -0
  196. package/dist/permissions/utils/fetch-dynamic-variable-context.d.ts +9 -0
  197. package/dist/permissions/utils/fetch-dynamic-variable-context.js +43 -0
  198. package/dist/permissions/utils/filter-policies-by-ip.d.ts +2 -0
  199. package/dist/permissions/utils/filter-policies-by-ip.js +15 -0
  200. package/dist/permissions/utils/get-unaliased-field-key.d.ts +5 -0
  201. package/dist/permissions/utils/get-unaliased-field-key.js +17 -0
  202. package/dist/permissions/utils/process-permissions.d.ts +7 -0
  203. package/dist/permissions/utils/process-permissions.js +9 -0
  204. package/dist/permissions/utils/with-cache.d.ts +10 -0
  205. package/dist/permissions/utils/with-cache.js +25 -0
  206. package/dist/request/is-denied-ip.js +1 -1
  207. package/dist/server.js +1 -1
  208. package/dist/services/access.d.ts +10 -0
  209. package/dist/services/access.js +43 -0
  210. package/dist/services/activity.js +23 -11
  211. package/dist/services/assets.d.ts +2 -3
  212. package/dist/services/assets.js +11 -6
  213. package/dist/services/authentication.js +18 -18
  214. package/dist/services/collections.js +18 -17
  215. package/dist/services/fields.d.ts +0 -1
  216. package/dist/services/fields.js +53 -24
  217. package/dist/services/files/utils/get-metadata.js +1 -1
  218. package/dist/services/files.js +25 -15
  219. package/dist/services/graphql/index.d.ts +3 -3
  220. package/dist/services/graphql/index.js +126 -22
  221. package/dist/services/graphql/subscription.js +2 -4
  222. package/dist/services/graphql/utils/process-error.js +1 -1
  223. package/dist/services/graphql/utils/sanitize-gql-schema.js +1 -1
  224. package/dist/services/import-export.js +19 -5
  225. package/dist/services/index.d.ts +3 -2
  226. package/dist/services/index.js +3 -2
  227. package/dist/services/items.d.ts +3 -3
  228. package/dist/services/items.js +115 -44
  229. package/dist/services/mail/index.js +1 -1
  230. package/dist/services/meta.js +60 -23
  231. package/dist/services/notifications.js +15 -7
  232. package/dist/services/payload.d.ts +9 -10
  233. package/dist/services/payload.js +18 -3
  234. package/dist/services/{permissions/index.d.ts → permissions.d.ts} +5 -7
  235. package/dist/services/{permissions/index.js → permissions.js} +30 -54
  236. package/dist/services/policies.d.ts +12 -0
  237. package/dist/services/policies.js +87 -0
  238. package/dist/services/relations.d.ts +0 -6
  239. package/dist/services/relations.js +26 -29
  240. package/dist/services/roles.d.ts +4 -12
  241. package/dist/services/roles.js +57 -424
  242. package/dist/services/server.js +1 -1
  243. package/dist/services/shares.d.ts +0 -2
  244. package/dist/services/shares.js +13 -9
  245. package/dist/services/specifications.d.ts +2 -2
  246. package/dist/services/specifications.js +39 -27
  247. package/dist/services/tus/data-store.js +3 -1
  248. package/dist/services/users.d.ts +1 -5
  249. package/dist/services/users.js +79 -162
  250. package/dist/services/utils.js +11 -7
  251. package/dist/services/versions.d.ts +0 -2
  252. package/dist/services/versions.js +34 -10
  253. package/dist/services/webhooks.js +1 -1
  254. package/dist/telemetry/lib/get-report.js +2 -2
  255. package/dist/telemetry/lib/track.js +1 -1
  256. package/dist/telemetry/utils/check-user-limits.d.ts +5 -0
  257. package/dist/telemetry/utils/check-user-limits.js +19 -0
  258. package/dist/types/ast.d.ts +43 -1
  259. package/dist/types/items.d.ts +11 -0
  260. package/dist/utils/apply-diff.js +1 -1
  261. package/dist/utils/apply-query.d.ts +4 -3
  262. package/dist/utils/apply-query.js +37 -8
  263. package/dist/utils/delete-from-require-cache.js +1 -1
  264. package/dist/utils/fetch-user-count/fetch-access-lookup.d.ts +17 -0
  265. package/dist/utils/fetch-user-count/fetch-access-lookup.js +22 -0
  266. package/dist/utils/fetch-user-count/fetch-access-roles.d.ts +16 -0
  267. package/dist/utils/fetch-user-count/fetch-access-roles.js +37 -0
  268. package/dist/utils/fetch-user-count/fetch-active-users.d.ts +6 -0
  269. package/dist/utils/fetch-user-count/fetch-active-users.js +3 -0
  270. package/dist/utils/fetch-user-count/fetch-user-count.d.ts +12 -0
  271. package/dist/utils/fetch-user-count/fetch-user-count.js +57 -0
  272. package/dist/utils/fetch-user-count/get-user-count-query.d.ts +20 -0
  273. package/dist/utils/fetch-user-count/get-user-count-query.js +17 -0
  274. package/dist/utils/get-accountability-for-role.js +16 -25
  275. package/dist/utils/get-accountability-for-token.js +17 -16
  276. package/dist/utils/get-cache-key.d.ts +1 -1
  277. package/dist/utils/get-cache-key.js +12 -1
  278. package/dist/utils/get-column.d.ts +2 -1
  279. package/dist/utils/get-column.js +1 -0
  280. package/dist/utils/get-default-value.js +1 -1
  281. package/dist/utils/get-ip-from-req.js +1 -1
  282. package/dist/utils/get-schema.js +1 -1
  283. package/dist/utils/get-service.js +5 -1
  284. package/dist/utils/is-url-allowed.js +1 -1
  285. package/dist/utils/reduce-schema.d.ts +4 -6
  286. package/dist/utils/reduce-schema.js +16 -32
  287. package/dist/utils/sanitize-query.js +1 -1
  288. package/dist/utils/transaction.js +1 -1
  289. package/dist/utils/validate-env.js +1 -1
  290. package/dist/utils/validate-storage.js +1 -1
  291. package/dist/utils/validate-user-count-integrity.d.ts +13 -0
  292. package/dist/utils/validate-user-count-integrity.js +29 -0
  293. package/dist/websocket/authenticate.d.ts +0 -2
  294. package/dist/websocket/authenticate.js +0 -12
  295. package/dist/websocket/controllers/base.d.ts +1 -1
  296. package/dist/websocket/controllers/base.js +21 -17
  297. package/dist/websocket/controllers/graphql.js +2 -5
  298. package/dist/websocket/controllers/hooks.js +4 -0
  299. package/dist/websocket/controllers/rest.js +1 -3
  300. package/dist/websocket/errors.js +1 -1
  301. package/dist/websocket/handlers/subscribe.js +0 -2
  302. package/dist/websocket/utils/items.d.ts +1 -1
  303. package/package.json +28 -27
  304. package/dist/database/run-ast.js +0 -450
  305. package/dist/middleware/check-ip.d.ts +0 -2
  306. package/dist/middleware/check-ip.js +0 -37
  307. package/dist/middleware/get-permissions.d.ts +0 -3
  308. package/dist/middleware/get-permissions.js +0 -10
  309. package/dist/services/authorization.d.ts +0 -17
  310. package/dist/services/authorization.js +0 -456
  311. package/dist/services/permissions/lib/with-app-minimal-permissions.js +0 -13
  312. package/dist/telemetry/utils/check-increased-user-limits.d.ts +0 -7
  313. package/dist/telemetry/utils/check-increased-user-limits.js +0 -25
  314. package/dist/telemetry/utils/get-role-counts-by-roles.d.ts +0 -6
  315. package/dist/telemetry/utils/get-role-counts-by-roles.js +0 -27
  316. package/dist/telemetry/utils/get-role-counts-by-users.d.ts +0 -11
  317. package/dist/telemetry/utils/get-role-counts-by-users.js +0 -34
  318. package/dist/telemetry/utils/get-user-count.d.ts +0 -8
  319. package/dist/telemetry/utils/get-user-count.js +0 -33
  320. package/dist/telemetry/utils/get-user-counts-by-roles.d.ts +0 -7
  321. package/dist/telemetry/utils/get-user-counts-by-roles.js +0 -35
  322. package/dist/utils/get-ast-from-query.d.ts +0 -13
  323. package/dist/utils/get-ast-from-query.js +0 -297
  324. package/dist/utils/get-permissions.d.ts +0 -2
  325. package/dist/utils/get-permissions.js +0 -150
  326. package/dist/utils/merge-permissions-for-share.d.ts +0 -4
  327. package/dist/utils/merge-permissions-for-share.js +0 -109
  328. package/dist/utils/merge-permissions.d.ts +0 -3
  329. package/dist/utils/merge-permissions.js +0 -95
  330. /package/dist/{logger.d.ts → logger/index.d.ts} +0 -0
package/dist/app.js CHANGED
@@ -10,6 +10,7 @@ import path from 'path';
10
10
  import qs from 'qs';
11
11
  import { registerAuthProviders } from './auth.js';
12
12
  import activityRouter from './controllers/activity.js';
13
+ import accessRouter from './controllers/access.js';
13
14
  import assetsRouter from './controllers/assets.js';
14
15
  import authRouter from './controllers/auth.js';
15
16
  import collectionsRouter from './controllers/collections.js';
@@ -26,6 +27,7 @@ import notificationsRouter from './controllers/notifications.js';
26
27
  import operationsRouter from './controllers/operations.js';
27
28
  import panelsRouter from './controllers/panels.js';
28
29
  import permissionsRouter from './controllers/permissions.js';
30
+ import policiesRouter from './controllers/policies.js';
29
31
  import presetsRouter from './controllers/presets.js';
30
32
  import relationsRouter from './controllers/relations.js';
31
33
  import revisionsRouter from './controllers/revisions.js';
@@ -44,14 +46,12 @@ import { isInstalled, validateDatabaseConnection, validateDatabaseExtensions, va
44
46
  import emitter from './emitter.js';
45
47
  import { getExtensionManager } from './extensions/index.js';
46
48
  import { getFlowManager } from './flows.js';
47
- import { createExpressLogger, useLogger } from './logger.js';
49
+ import { createExpressLogger, useLogger } from './logger/index.js';
48
50
  import authenticate from './middleware/authenticate.js';
49
51
  import cache from './middleware/cache.js';
50
- import { checkIP } from './middleware/check-ip.js';
51
52
  import cors from './middleware/cors.js';
52
53
  import errorHandler from './middleware/error-handler.js';
53
54
  import extractToken from './middleware/extract-token.js';
54
- import getPermissions from './middleware/get-permissions.js';
55
55
  import rateLimiterGlobal from './middleware/rate-limiter-global.js';
56
56
  import rateLimiter from './middleware/rate-limiter-ip.js';
57
57
  import sanitizeQuery from './middleware/sanitize-query.js';
@@ -198,16 +198,15 @@ export default async function createApp() {
198
198
  }
199
199
  app.get('/server/ping', (_req, res) => res.send('pong'));
200
200
  app.use(authenticate);
201
- app.use(checkIP);
202
201
  app.use(sanitizeQuery);
203
202
  app.use(cache);
204
203
  app.use(schema);
205
- app.use(getPermissions);
206
204
  await emitter.emitInit('middlewares.after', { app });
207
205
  await emitter.emitInit('routes.before', { app });
208
206
  app.use('/auth', authRouter);
209
207
  app.use('/graphql', graphqlRouter);
210
208
  app.use('/activity', activityRouter);
209
+ app.use('/access', accessRouter);
211
210
  app.use('/assets', assetsRouter);
212
211
  app.use('/collections', collectionsRouter);
213
212
  app.use('/dashboards', dashboardsRouter);
@@ -224,6 +223,7 @@ export default async function createApp() {
224
223
  app.use('/operations', operationsRouter);
225
224
  app.use('/panels', panelsRouter);
226
225
  app.use('/permissions', permissionsRouter);
226
+ app.use('/policies', policiesRouter);
227
227
  app.use('/presets', presetsRouter);
228
228
  app.use('/translations', translationsRouter);
229
229
  app.use('/relations', relationsRouter);
@@ -3,16 +3,17 @@ import { ErrorCode, InvalidCredentialsError, InvalidPayloadError, InvalidProvide
3
3
  import { Router } from 'express';
4
4
  import Joi from 'joi';
5
5
  import ldap from 'ldapjs';
6
+ import { REFRESH_COOKIE_OPTIONS, SESSION_COOKIE_OPTIONS } from '../../constants.js';
6
7
  import getDatabase from '../../database/index.js';
7
8
  import emitter from '../../emitter.js';
8
- import { useLogger } from '../../logger.js';
9
+ import { useLogger } from '../../logger/index.js';
9
10
  import { respond } from '../../middleware/respond.js';
11
+ import { createDefaultAccountability } from '../../permissions/utils/create-default-accountability.js';
10
12
  import { AuthenticationService } from '../../services/authentication.js';
11
13
  import { UsersService } from '../../services/users.js';
12
14
  import asyncHandler from '../../utils/async-handler.js';
13
15
  import { getIPFromReq } from '../../utils/get-ip-from-req.js';
14
16
  import { AuthDriver } from '../auth.js';
15
- import { REFRESH_COOKIE_OPTIONS, SESSION_COOKIE_OPTIONS } from '../../constants.js';
16
17
  // 0x2: ACCOUNTDISABLE
17
18
  // 0x10: LOCKOUT
18
19
  // 0x800000: PASSWORD_EXPIRED
@@ -295,10 +296,9 @@ export function createLDAPAuthRouter(provider) {
295
296
  }).unknown();
296
297
  router.post('/', asyncHandler(async (req, res, next) => {
297
298
  const env = useEnv();
298
- const accountability = {
299
+ const accountability = createDefaultAccountability({
299
300
  ip: getIPFromReq(req),
300
- role: null,
301
- };
301
+ });
302
302
  const userAgent = req.get('user-agent')?.substring(0, 1024);
303
303
  if (userAgent)
304
304
  accountability.userAgent = userAgent;
@@ -1,11 +1,12 @@
1
+ import { useEnv } from '@directus/env';
1
2
  import { InvalidCredentialsError, InvalidPayloadError } from '@directus/errors';
2
3
  import argon2 from 'argon2';
3
4
  import { Router } from 'express';
4
5
  import Joi from 'joi';
5
6
  import { performance } from 'perf_hooks';
6
7
  import { REFRESH_COOKIE_OPTIONS, SESSION_COOKIE_OPTIONS } from '../../constants.js';
7
- import { useEnv } from '@directus/env';
8
8
  import { respond } from '../../middleware/respond.js';
9
+ import { createDefaultAccountability } from '../../permissions/utils/create-default-accountability.js';
9
10
  import { AuthenticationService } from '../../services/authentication.js';
10
11
  import asyncHandler from '../../utils/async-handler.js';
11
12
  import { getIPFromReq } from '../../utils/get-ip-from-req.js';
@@ -47,10 +48,9 @@ export function createLocalAuthRouter(provider) {
47
48
  router.post('/', asyncHandler(async (req, res, next) => {
48
49
  const STALL_TIME = env['LOGIN_STALL_TIME'];
49
50
  const timeStart = performance.now();
50
- const accountability = {
51
+ const accountability = createDefaultAccountability({
51
52
  ip: getIPFromReq(req),
52
- role: null,
53
- };
53
+ });
54
54
  const userAgent = req.get('user-agent')?.substring(0, 1024);
55
55
  if (userAgent)
56
56
  accountability.userAgent = userAgent;
@@ -9,17 +9,18 @@ import { getAuthProvider } from '../../auth.js';
9
9
  import { REFRESH_COOKIE_OPTIONS, SESSION_COOKIE_OPTIONS } from '../../constants.js';
10
10
  import getDatabase from '../../database/index.js';
11
11
  import emitter from '../../emitter.js';
12
- import { useLogger } from '../../logger.js';
12
+ import { useLogger } from '../../logger/index.js';
13
13
  import { respond } from '../../middleware/respond.js';
14
+ import { createDefaultAccountability } from '../../permissions/utils/create-default-accountability.js';
14
15
  import { AuthenticationService } from '../../services/authentication.js';
15
16
  import { UsersService } from '../../services/users.js';
16
17
  import asyncHandler from '../../utils/async-handler.js';
17
18
  import { getConfigFromEnv } from '../../utils/get-config-from-env.js';
18
19
  import { getIPFromReq } from '../../utils/get-ip-from-req.js';
20
+ import { getSecret } from '../../utils/get-secret.js';
19
21
  import { isLoginRedirectAllowed } from '../../utils/is-login-redirect-allowed.js';
20
22
  import { Url } from '../../utils/url.js';
21
23
  import { LocalAuthDriver } from './local.js';
22
- import { getSecret } from '../../utils/get-secret.js';
23
24
  export class OAuth2AuthDriver extends LocalAuthDriver {
24
25
  client;
25
26
  redirectUrl;
@@ -251,10 +252,9 @@ export function createOAuth2AuthRouter(providerName) {
251
252
  throw new InvalidCredentialsError();
252
253
  }
253
254
  const { verifier, redirect, prompt } = tokenData;
254
- const accountability = {
255
+ const accountability = createDefaultAccountability({
255
256
  ip: getIPFromReq(req),
256
- role: null,
257
- };
257
+ });
258
258
  const userAgent = req.get('user-agent')?.substring(0, 1024);
259
259
  if (userAgent)
260
260
  accountability.userAgent = userAgent;
@@ -9,8 +9,9 @@ import { getAuthProvider } from '../../auth.js';
9
9
  import { REFRESH_COOKIE_OPTIONS, SESSION_COOKIE_OPTIONS } from '../../constants.js';
10
10
  import getDatabase from '../../database/index.js';
11
11
  import emitter from '../../emitter.js';
12
- import { useLogger } from '../../logger.js';
12
+ import { useLogger } from '../../logger/index.js';
13
13
  import { respond } from '../../middleware/respond.js';
14
+ import { createDefaultAccountability } from '../../permissions/utils/create-default-accountability.js';
14
15
  import { AuthenticationService } from '../../services/authentication.js';
15
16
  import { UsersService } from '../../services/users.js';
16
17
  import asyncHandler from '../../utils/async-handler.js';
@@ -272,10 +273,7 @@ export function createOpenIDAuthRouter(providerName) {
272
273
  throw new InvalidCredentialsError();
273
274
  }
274
275
  const { verifier, redirect, prompt } = tokenData;
275
- const accountability = {
276
- ip: getIPFromReq(req),
277
- role: null,
278
- };
276
+ const accountability = createDefaultAccountability({ ip: getIPFromReq(req) });
279
277
  const userAgent = req.get('user-agent')?.substring(0, 1024);
280
278
  if (userAgent)
281
279
  accountability.userAgent = userAgent;
@@ -7,7 +7,7 @@ import { getAuthProvider } from '../../auth.js';
7
7
  import { REFRESH_COOKIE_OPTIONS, SESSION_COOKIE_OPTIONS } from '../../constants.js';
8
8
  import getDatabase from '../../database/index.js';
9
9
  import emitter from '../../emitter.js';
10
- import { useLogger } from '../../logger.js';
10
+ import { useLogger } from '../../logger/index.js';
11
11
  import { respond } from '../../middleware/respond.js';
12
12
  import { AuthenticationService } from '../../services/authentication.js';
13
13
  import { UsersService } from '../../services/users.js';
package/dist/auth.js CHANGED
@@ -4,7 +4,7 @@ import { toArray } from '@directus/utils';
4
4
  import { LDAPAuthDriver, LocalAuthDriver, OAuth2AuthDriver, OpenIDAuthDriver, SAMLAuthDriver, } from './auth/drivers/index.js';
5
5
  import { DEFAULT_AUTH_PROVIDER } from './constants.js';
6
6
  import getDatabase from './database/index.js';
7
- import { useLogger } from './logger.js';
7
+ import { useLogger } from './logger/index.js';
8
8
  import { getConfigFromEnv } from './utils/get-config-from-env.js';
9
9
  import { getSchema } from './utils/get-schema.js';
10
10
  const providers = new Map();
package/dist/cache.js CHANGED
@@ -2,12 +2,13 @@ import { useEnv } from '@directus/env';
2
2
  import { getSimpleHash } from '@directus/utils';
3
3
  import Keyv from 'keyv';
4
4
  import { useBus } from './bus/index.js';
5
- import { useLogger } from './logger.js';
5
+ import { useLogger } from './logger/index.js';
6
6
  import { redisConfigAvailable } from './redis/index.js';
7
7
  import { compress, decompress } from './utils/compress.js';
8
8
  import { getConfigFromEnv } from './utils/get-config-from-env.js';
9
9
  import { getMilliseconds } from './utils/get-milliseconds.js';
10
10
  import { validateEnv } from './utils/validate-env.js';
11
+ import { clearCache as clearPermissionCache } from './permissions/cache.js';
11
12
  import { createRequire } from 'node:module';
12
13
  const logger = useLogger();
13
14
  const env = useEnv();
@@ -66,6 +67,8 @@ export async function clearSystemCache(opts) {
66
67
  }
67
68
  await sharedSchemaCache.clear();
68
69
  await localSchemaCache.clear();
70
+ // Since a lot of cached permission function rely on the schema it needs to be cleared as well
71
+ await clearPermissionCache();
69
72
  messenger.publish('schemaChanged', { autoPurgeCache: opts?.autoPurgeCache });
70
73
  }
71
74
  export async function setSystemCache(key, value, ttl) {
@@ -2,12 +2,14 @@ import { useEnv } from '@directus/env';
2
2
  import getDatabase, { hasDatabaseConnection, isInstalled, validateDatabaseConnection, } from '../../../database/index.js';
3
3
  import runMigrations from '../../../database/migrations/run.js';
4
4
  import installDatabase from '../../../database/seeds/run.js';
5
- import { useLogger } from '../../../logger.js';
5
+ import { useLogger } from '../../../logger/index.js';
6
+ import { AccessService } from '../../../services/access.js';
7
+ import { PoliciesService } from '../../../services/policies.js';
6
8
  import { RolesService } from '../../../services/roles.js';
7
9
  import { SettingsService } from '../../../services/settings.js';
8
10
  import { UsersService } from '../../../services/users.js';
9
11
  import { getSchema } from '../../../utils/get-schema.js';
10
- import { defaultAdminRole, defaultAdminUser } from '../../utils/defaults.js';
12
+ import { defaultAdminPolicy, defaultAdminRole, defaultAdminUser } from '../../utils/defaults.js';
11
13
  export default async function bootstrap({ skipAdminInit }) {
12
14
  const logger = useLogger();
13
15
  logger.info('Initializing bootstrap...');
@@ -58,8 +60,12 @@ async function createDefaultAdmin(schema) {
58
60
  const env = useEnv();
59
61
  const { nanoid } = await import('nanoid');
60
62
  logger.info('Setting up first admin role...');
63
+ const accessService = new AccessService({ schema });
64
+ const policiesService = new PoliciesService({ schema });
61
65
  const rolesService = new RolesService({ schema });
62
66
  const role = await rolesService.createOne(defaultAdminRole);
67
+ const policy = await policiesService.createOne(defaultAdminPolicy);
68
+ await accessService.createOne({ policy, role });
63
69
  logger.info('Adding first admin user...');
64
70
  const usersService = new UsersService({ schema });
65
71
  let adminEmail = env['ADMIN_EMAIL'];
@@ -72,5 +78,6 @@ async function createDefaultAdmin(schema) {
72
78
  adminPassword = nanoid(12);
73
79
  logger.info(`No admin password provided. Defaulting to "${adminPassword}"`);
74
80
  }
75
- await usersService.createOne({ email: adminEmail, password: adminPassword, role, ...defaultAdminUser });
81
+ const token = env['ADMIN_TOKEN'] ?? null;
82
+ await usersService.createOne({ ...defaultAdminUser, email: adminEmail, password: adminPassword, token, role });
76
83
  }
@@ -1,5 +1,5 @@
1
1
  import getDatabase from '../../../database/index.js';
2
- import { useLogger } from '../../../logger.js';
2
+ import { useLogger } from '../../../logger/index.js';
3
3
  export default async function count(collection) {
4
4
  const database = getDatabase();
5
5
  const logger = useLogger();
@@ -1,6 +1,6 @@
1
1
  import installSeeds from '../../../database/seeds/run.js';
2
2
  import getDatabase from '../../../database/index.js';
3
- import { useLogger } from '../../../logger.js';
3
+ import { useLogger } from '../../../logger/index.js';
4
4
  export default async function start() {
5
5
  const database = getDatabase();
6
6
  const logger = useLogger();
@@ -1,6 +1,6 @@
1
1
  import run from '../../../database/migrations/run.js';
2
2
  import getDatabase from '../../../database/index.js';
3
- import { useLogger } from '../../../logger.js';
3
+ import { useLogger } from '../../../logger/index.js';
4
4
  export default async function migrate(direction) {
5
5
  const database = getDatabase();
6
6
  const logger = useLogger();
@@ -9,7 +9,7 @@ import runSeed from '../../../database/seeds/run.js';
9
9
  import { generateHash } from '../../../utils/generate-hash.js';
10
10
  import createDBConnection from '../../utils/create-db-connection.js';
11
11
  import createEnv from '../../utils/create-env/index.js';
12
- import { defaultAdminRole, defaultAdminUser } from '../../utils/defaults.js';
12
+ import { defaultAdminPolicy, defaultAdminRole, defaultAdminUser } from '../../utils/defaults.js';
13
13
  import { drivers, getDriverForClient } from '../../utils/drivers.js';
14
14
  import { databaseQuestions } from './questions.js';
15
15
  export default async function init() {
@@ -79,18 +79,17 @@ export default async function init() {
79
79
  },
80
80
  ]);
81
81
  firstUser.password = await generateHash(firstUser.password);
82
- const userID = randomUUID();
83
- const roleID = randomUUID();
84
- await db('directus_roles').insert({
85
- id: roleID,
86
- ...defaultAdminRole,
87
- });
82
+ const role = randomUUID();
83
+ const policy = randomUUID();
84
+ await db('directus_roles').insert({ ...defaultAdminRole, id: role });
85
+ await db('directus_policies').insert({ ...defaultAdminPolicy, id: policy });
86
+ await db('directus_access').insert({ id: randomUUID(), role, policy });
88
87
  await db('directus_users').insert({
89
- id: userID,
88
+ ...defaultAdminUser,
89
+ id: randomUUID(),
90
90
  email: firstUser.email,
91
91
  password: firstUser.password,
92
- role: roleID,
93
- ...defaultAdminUser,
92
+ role,
94
93
  });
95
94
  await db.destroy();
96
95
  process.stdout.write(`\nYour project has been created at ${chalk.green(rootPath)}.\n`);
@@ -1,7 +1,7 @@
1
1
  import { getSchema } from '../../../utils/get-schema.js';
2
2
  import { RolesService } from '../../../services/roles.js';
3
3
  import getDatabase from '../../../database/index.js';
4
- import { useLogger } from '../../../logger.js';
4
+ import { useLogger } from '../../../logger/index.js';
5
5
  export default async function rolesCreate({ role: name, admin }) {
6
6
  const database = getDatabase();
7
7
  const logger = useLogger();
@@ -5,7 +5,7 @@ import inquirer from 'inquirer';
5
5
  import { load as loadYaml } from 'js-yaml';
6
6
  import path from 'path';
7
7
  import getDatabase, { isInstalled, validateDatabaseConnection } from '../../../database/index.js';
8
- import { useLogger } from '../../../logger.js';
8
+ import { useLogger } from '../../../logger/index.js';
9
9
  import { DiffKind } from '../../../types/index.js';
10
10
  import { isNestedMetaUpdate } from '../../../utils/apply-diff.js';
11
11
  import { applySnapshot } from '../../../utils/apply-snapshot.js';
@@ -3,7 +3,7 @@ import inquirer from 'inquirer';
3
3
  import { dump as toYaml } from 'js-yaml';
4
4
  import path from 'path';
5
5
  import getDatabase from '../../../database/index.js';
6
- import { useLogger } from '../../../logger.js';
6
+ import { useLogger } from '../../../logger/index.js';
7
7
  import { getSnapshot } from '../../../utils/get-snapshot.js';
8
8
  export async function snapshot(snapshotPath, options) {
9
9
  const database = getDatabase();
@@ -1,5 +1,5 @@
1
1
  import getDatabase from '../../../database/index.js';
2
- import { useLogger } from '../../../logger.js';
2
+ import { useLogger } from '../../../logger/index.js';
3
3
  import { UsersService } from '../../../services/users.js';
4
4
  import { getSchema } from '../../../utils/get-schema.js';
5
5
  export default async function usersCreate({ email, password, role, }) {
@@ -1,5 +1,5 @@
1
1
  import getDatabase from '../../../database/index.js';
2
- import { useLogger } from '../../../logger.js';
2
+ import { useLogger } from '../../../logger/index.js';
3
3
  import { UsersService } from '../../../services/users.js';
4
4
  import { generateHash } from '../../../utils/generate-hash.js';
5
5
  import { getSchema } from '../../../utils/get-schema.js';
@@ -1,7 +1,7 @@
1
1
  import { useEnv } from '@directus/env';
2
2
  import { isInstalled, validateMigrations } from '../database/index.js';
3
3
  import { getExtensionManager } from '../extensions/index.js';
4
- import { useLogger } from '../logger.js';
4
+ import { useLogger } from '../logger/index.js';
5
5
  export const loadExtensions = async () => {
6
6
  const env = useEnv();
7
7
  const logger = useLogger();
@@ -1,11 +1,4 @@
1
- export declare const defaultAdminRole: {
2
- name: string;
3
- icon: string;
4
- admin_access: boolean;
5
- description: string;
6
- };
7
- export declare const defaultAdminUser: {
8
- status: string;
9
- first_name: string;
10
- last_name: string;
11
- };
1
+ import type { Policy, Role, User } from '@directus/types';
2
+ export declare const defaultAdminRole: Partial<Role>;
3
+ export declare const defaultAdminUser: Partial<User>;
4
+ export declare const defaultAdminPolicy: Partial<Policy>;
@@ -1,7 +1,6 @@
1
1
  export const defaultAdminRole = {
2
2
  name: 'Administrator',
3
3
  icon: 'verified',
4
- admin_access: true,
5
4
  description: '$t:admin_description',
6
5
  };
7
6
  export const defaultAdminUser = {
@@ -9,3 +8,10 @@ export const defaultAdminUser = {
9
8
  first_name: 'Admin',
10
9
  last_name: 'User',
11
10
  };
11
+ export const defaultAdminPolicy = {
12
+ name: 'Administrator',
13
+ icon: 'verified',
14
+ admin_access: true,
15
+ app_access: true,
16
+ description: '$t:admin_description',
17
+ };
@@ -6,7 +6,7 @@ export declare const FILTER_VARIABLES: string[];
6
6
  export declare const ALIAS_TYPES: string[];
7
7
  export declare const DEFAULT_AUTH_PROVIDER = "default";
8
8
  export declare const COLUMN_TRANSFORMS: string[];
9
- export declare const GENERATE_SPECIAL: string[];
9
+ export declare const GENERATE_SPECIAL: readonly ["uuid", "date-created", "role-created", "user-created"];
10
10
  export declare const UUID_REGEX = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
11
11
  export declare const REFRESH_COOKIE_OPTIONS: CookieOptions;
12
12
  export declare const SESSION_COOKIE_OPTIONS: CookieOptions;
package/dist/constants.js CHANGED
@@ -82,8 +82,8 @@ export const SUPPORTED_IMAGE_METADATA_FORMATS = [
82
82
  /** Resumable uploads */
83
83
  export const RESUMABLE_UPLOADS = {
84
84
  ENABLED: toBoolean(env['TUS_ENABLED']),
85
- CHUNK_SIZE: bytes(env['TUS_CHUNK_SIZE']),
86
- MAX_SIZE: bytes(env['FILES_MAX_UPLOAD_SIZE']),
85
+ CHUNK_SIZE: bytes.parse(env['TUS_CHUNK_SIZE']),
86
+ MAX_SIZE: bytes.parse(env['FILES_MAX_UPLOAD_SIZE']),
87
87
  EXPIRATION_TIME: getMilliseconds(env['TUS_UPLOAD_EXPIRATION'], 600_000 /* 10min */),
88
88
  SCHEDULE: String(env['TUS_CLEANUP_SCHEDULE']),
89
89
  };
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,148 @@
1
+ import { ErrorCode, isDirectusError } from '@directus/errors';
2
+ import express from 'express';
3
+ import { respond } from '../middleware/respond.js';
4
+ import useCollection from '../middleware/use-collection.js';
5
+ import { validateBatch } from '../middleware/validate-batch.js';
6
+ import { MetaService } from '../services/meta.js';
7
+ import { AccessService } from '../services/access.js';
8
+ import asyncHandler from '../utils/async-handler.js';
9
+ import { sanitizeQuery } from '../utils/sanitize-query.js';
10
+ const router = express.Router();
11
+ router.use(useCollection('directus_access'));
12
+ router.post('/', asyncHandler(async (req, res, next) => {
13
+ const service = new AccessService({
14
+ accountability: req.accountability,
15
+ schema: req.schema,
16
+ });
17
+ const savedKeys = [];
18
+ if (Array.isArray(req.body)) {
19
+ const keys = await service.createMany(req.body);
20
+ savedKeys.push(...keys);
21
+ }
22
+ else {
23
+ const key = await service.createOne(req.body);
24
+ savedKeys.push(key);
25
+ }
26
+ try {
27
+ if (Array.isArray(req.body)) {
28
+ const items = await service.readMany(savedKeys, req.sanitizedQuery);
29
+ res.locals['payload'] = { data: items };
30
+ }
31
+ else {
32
+ const item = await service.readOne(savedKeys[0], req.sanitizedQuery);
33
+ res.locals['payload'] = { data: item };
34
+ }
35
+ }
36
+ catch (error) {
37
+ if (isDirectusError(error, ErrorCode.Forbidden)) {
38
+ return next();
39
+ }
40
+ throw error;
41
+ }
42
+ return next();
43
+ }), respond);
44
+ const readHandler = asyncHandler(async (req, res, next) => {
45
+ const service = new AccessService({
46
+ accountability: req.accountability,
47
+ schema: req.schema,
48
+ });
49
+ const metaService = new MetaService({
50
+ accountability: req.accountability,
51
+ schema: req.schema,
52
+ });
53
+ let result;
54
+ if (req.body.keys) {
55
+ result = await service.readMany(req.body.keys, req.sanitizedQuery);
56
+ }
57
+ else {
58
+ result = await service.readByQuery(req.sanitizedQuery);
59
+ }
60
+ const meta = await metaService.getMetaForQuery('directus_access', req.sanitizedQuery);
61
+ res.locals['payload'] = { data: result, meta };
62
+ return next();
63
+ });
64
+ router.get('/', validateBatch('read'), readHandler, respond);
65
+ router.search('/', validateBatch('read'), readHandler, respond);
66
+ router.get('/:pk', asyncHandler(async (req, res, next) => {
67
+ if (req.path.endsWith('me'))
68
+ return next();
69
+ const service = new AccessService({
70
+ accountability: req.accountability,
71
+ schema: req.schema,
72
+ });
73
+ const record = await service.readOne(req.params['pk'], req.sanitizedQuery);
74
+ res.locals['payload'] = { data: record };
75
+ return next();
76
+ }), respond);
77
+ router.patch('/', validateBatch('update'), asyncHandler(async (req, res, next) => {
78
+ const service = new AccessService({
79
+ accountability: req.accountability,
80
+ schema: req.schema,
81
+ });
82
+ let keys = [];
83
+ if (Array.isArray(req.body)) {
84
+ keys = await service.updateBatch(req.body);
85
+ }
86
+ else if (req.body.keys) {
87
+ keys = await service.updateMany(req.body.keys, req.body.data);
88
+ }
89
+ else {
90
+ const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
91
+ keys = await service.updateByQuery(sanitizedQuery, req.body.data);
92
+ }
93
+ try {
94
+ const result = await service.readMany(keys, req.sanitizedQuery);
95
+ res.locals['payload'] = { data: result };
96
+ }
97
+ catch (error) {
98
+ if (isDirectusError(error, ErrorCode.Forbidden)) {
99
+ return next();
100
+ }
101
+ throw error;
102
+ }
103
+ return next();
104
+ }), respond);
105
+ router.patch('/:pk', asyncHandler(async (req, res, next) => {
106
+ const service = new AccessService({
107
+ accountability: req.accountability,
108
+ schema: req.schema,
109
+ });
110
+ const primaryKey = await service.updateOne(req.params['pk'], req.body);
111
+ try {
112
+ const item = await service.readOne(primaryKey, req.sanitizedQuery);
113
+ res.locals['payload'] = { data: item || null };
114
+ }
115
+ catch (error) {
116
+ if (isDirectusError(error, ErrorCode.Forbidden)) {
117
+ return next();
118
+ }
119
+ throw error;
120
+ }
121
+ return next();
122
+ }), respond);
123
+ router.delete('/', validateBatch('delete'), asyncHandler(async (req, _res, next) => {
124
+ const service = new AccessService({
125
+ accountability: req.accountability,
126
+ schema: req.schema,
127
+ });
128
+ if (Array.isArray(req.body)) {
129
+ await service.deleteMany(req.body);
130
+ }
131
+ else if (req.body.keys) {
132
+ await service.deleteMany(req.body.keys);
133
+ }
134
+ else {
135
+ const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
136
+ await service.deleteByQuery(sanitizedQuery);
137
+ }
138
+ return next();
139
+ }), respond);
140
+ router.delete('/:pk', asyncHandler(async (req, _res, next) => {
141
+ const service = new AccessService({
142
+ accountability: req.accountability,
143
+ schema: req.schema,
144
+ });
145
+ await service.deleteOne(req.params['pk']);
146
+ return next();
147
+ }), respond);
148
+ export default router;
@@ -6,7 +6,7 @@ import { Router } from 'express';
6
6
  import { merge, pick } from 'lodash-es';
7
7
  import { ASSET_TRANSFORM_QUERY_KEYS, SYSTEM_ASSET_ALLOW_LIST } from '../constants.js';
8
8
  import getDatabase from '../database/index.js';
9
- import { useLogger } from '../logger.js';
9
+ import { useLogger } from '../logger/index.js';
10
10
  import useCollection from '../middleware/use-collection.js';
11
11
  import { AssetsService } from '../services/assets.js';
12
12
  import { PayloadService } from '../services/payload.js';