directus 9.7.0 → 9.9.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 (112) hide show
  1. package/dist/__mocks__/cache.d.ts +5 -0
  2. package/dist/__mocks__/cache.js +7 -0
  3. package/dist/auth/drivers/ldap.js +10 -11
  4. package/dist/auth/drivers/oauth2.js +9 -4
  5. package/dist/auth/drivers/openid.js +7 -4
  6. package/dist/cache.js +2 -2
  7. package/dist/cli/commands/schema/apply.js +9 -3
  8. package/dist/controllers/assets.js +5 -0
  9. package/dist/controllers/files.d.ts +2 -0
  10. package/dist/controllers/files.js +10 -5
  11. package/dist/database/helpers/date/dialects/default.d.ts +3 -0
  12. package/dist/database/helpers/date/dialects/default.js +7 -0
  13. package/dist/database/helpers/date/dialects/mssql.d.ts +1 -9
  14. package/dist/database/helpers/date/dialects/mssql.js +4 -23
  15. package/dist/database/helpers/date/dialects/mysql.d.ts +2 -9
  16. package/dist/database/helpers/date/dialects/mysql.js +7 -22
  17. package/dist/database/helpers/date/dialects/oracle.d.ts +1 -9
  18. package/dist/database/helpers/date/dialects/oracle.js +7 -23
  19. package/dist/database/helpers/date/dialects/sqlite.d.ts +1 -9
  20. package/dist/database/helpers/date/dialects/sqlite.js +8 -24
  21. package/dist/database/helpers/date/index.d.ts +4 -4
  22. package/dist/database/helpers/date/index.js +9 -9
  23. package/dist/database/helpers/date/types.d.ts +3 -9
  24. package/dist/database/helpers/date/types.js +10 -0
  25. package/dist/database/helpers/fn/dialects/mssql.d.ts +13 -0
  26. package/dist/database/helpers/fn/dialects/mssql.js +42 -0
  27. package/dist/database/helpers/{date/dialects/postgres.d.ts → fn/dialects/mysql.d.ts} +3 -2
  28. package/dist/database/helpers/fn/dialects/mysql.js +42 -0
  29. package/dist/database/helpers/fn/dialects/oracle.d.ts +13 -0
  30. package/dist/database/helpers/fn/dialects/oracle.js +42 -0
  31. package/dist/database/helpers/fn/dialects/postgres.d.ts +13 -0
  32. package/dist/database/helpers/{date → fn}/dialects/postgres.js +14 -3
  33. package/dist/database/helpers/fn/dialects/sqlite.d.ts +13 -0
  34. package/dist/database/helpers/fn/dialects/sqlite.js +42 -0
  35. package/dist/database/helpers/fn/index.d.ts +7 -0
  36. package/dist/database/helpers/fn/index.js +17 -0
  37. package/dist/database/helpers/fn/types.d.ts +18 -0
  38. package/dist/database/helpers/fn/types.js +27 -0
  39. package/dist/database/helpers/index.d.ts +4 -1
  40. package/dist/database/helpers/index.js +7 -1
  41. package/dist/database/index.js +0 -3
  42. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +3 -0
  43. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.js +17 -0
  44. package/dist/database/migrations/20220314A-add-translation-strings.d.ts +3 -0
  45. package/dist/database/migrations/20220314A-add-translation-strings.js +15 -0
  46. package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +3 -0
  47. package/dist/database/migrations/20220322A-rename-field-typecast-flags.js +77 -0
  48. package/dist/database/migrations/20220323A-add-field-validation.d.ts +3 -0
  49. package/dist/database/migrations/20220323A-add-field-validation.js +17 -0
  50. package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +3 -0
  51. package/dist/database/migrations/20220325A-fix-typecast-flags.js +49 -0
  52. package/dist/database/migrations/20220325B-add-default-language.d.ts +3 -0
  53. package/dist/database/migrations/20220325B-add-default-language.js +28 -0
  54. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +3 -0
  55. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.js +22 -0
  56. package/dist/database/migrations/run.js +1 -1
  57. package/dist/database/run-ast.js +4 -2
  58. package/dist/database/system-data/fields/activity.yaml +4 -4
  59. package/dist/database/system-data/fields/collections.yaml +4 -4
  60. package/dist/database/system-data/fields/fields.yaml +17 -8
  61. package/dist/database/system-data/fields/files.yaml +2 -2
  62. package/dist/database/system-data/fields/panels.yaml +2 -2
  63. package/dist/database/system-data/fields/permissions.yaml +4 -4
  64. package/dist/database/system-data/fields/presets.yaml +17 -3
  65. package/dist/database/system-data/fields/relations.yaml +1 -1
  66. package/dist/database/system-data/fields/revisions.yaml +2 -2
  67. package/dist/database/system-data/fields/roles.yaml +4 -4
  68. package/dist/database/system-data/fields/settings.yaml +18 -4
  69. package/dist/database/system-data/fields/users.yaml +5 -2
  70. package/dist/database/system-data/fields/webhooks.yaml +4 -4
  71. package/dist/env.js +4 -1
  72. package/dist/exceptions/index.d.ts +1 -0
  73. package/dist/exceptions/index.js +1 -0
  74. package/dist/exceptions/token-expired.d.ts +4 -0
  75. package/dist/exceptions/token-expired.js +10 -0
  76. package/dist/logger.js +2 -1
  77. package/dist/middleware/cache.js +10 -0
  78. package/dist/services/activity.js +4 -1
  79. package/dist/services/authorization.d.ts +1 -1
  80. package/dist/services/authorization.js +198 -14
  81. package/dist/services/collections.d.ts +2 -0
  82. package/dist/services/collections.js +230 -198
  83. package/dist/services/fields.js +208 -174
  84. package/dist/services/files.d.ts +5 -1
  85. package/dist/services/files.js +59 -40
  86. package/dist/services/graphql.d.ts +2 -3
  87. package/dist/services/graphql.js +39 -9
  88. package/dist/services/items.js +1 -0
  89. package/dist/services/payload.d.ts +1 -0
  90. package/dist/services/payload.js +29 -24
  91. package/dist/services/relations.js +93 -81
  92. package/dist/services/server.js +1 -0
  93. package/dist/services/shares.js +2 -1
  94. package/dist/services/users.js +3 -1
  95. package/dist/types/files.d.ts +8 -0
  96. package/dist/utils/apply-query.js +38 -10
  97. package/dist/utils/apply-snapshot.d.ts +3 -1
  98. package/dist/utils/apply-snapshot.js +34 -5
  99. package/dist/utils/get-column.d.ts +6 -5
  100. package/dist/utils/get-column.js +16 -8
  101. package/dist/utils/get-graphql-type.js +1 -0
  102. package/dist/utils/get-local-type.js +7 -2
  103. package/dist/utils/get-schema.d.ts +1 -1
  104. package/dist/utils/get-schema.js +15 -10
  105. package/dist/utils/jwt.js +1 -1
  106. package/dist/utils/track.js +3 -2
  107. package/dist/utils/url.d.ts +1 -1
  108. package/dist/utils/url.js +1 -1
  109. package/dist/utils/validate-query.js +19 -15
  110. package/dist/utils/validate-storage.js +3 -1
  111. package/example.env +4 -0
  112. package/package.json +14 -13
@@ -46,19 +46,19 @@ fields:
46
46
  width: half
47
47
 
48
48
  - field: comment
49
- display: formatted-text
49
+ display: formatted-value
50
50
  display_options:
51
- subdued: true
51
+ color: 'var(--foreground-subdued)'
52
52
  width: half
53
53
 
54
54
  - field: user_agent
55
- display: formatted-text
55
+ display: formatted-value
56
56
  display_options:
57
57
  font: monospace
58
58
  width: half
59
59
 
60
60
  - field: ip
61
- display: formatted-text
61
+ display: formatted-value
62
62
  display_options:
63
63
  font: monospace
64
64
  width: half
@@ -42,21 +42,21 @@ fields:
42
42
  width: full
43
43
 
44
44
  - field: hidden
45
- special: boolean
45
+ special: cast-boolean
46
46
  interface: boolean
47
47
  options:
48
48
  label: $t:field_options.directus_collections.hidden_label
49
49
  width: half
50
50
 
51
51
  - field: singleton
52
- special: boolean
52
+ special: cast-boolean
53
53
  interface: boolean
54
54
  options:
55
55
  label: $t:singleton_label
56
56
  width: half
57
57
 
58
58
  - field: translations
59
- special: json
59
+ special: cast-json
60
60
  interface: list
61
61
  options:
62
62
  template: '{{ translation }} ({{ language }})'
@@ -115,7 +115,7 @@ fields:
115
115
 
116
116
  - field: archive_app_filter
117
117
  interface: boolean
118
- special: boolean
118
+ special: cast-boolean
119
119
  options:
120
120
  label: $t:field_options.directus_collections.archive_app_filter
121
121
  width: half
@@ -17,7 +17,7 @@ fields:
17
17
  - collection: directus_fields
18
18
  field: special
19
19
  hidden: true
20
- special: csv
20
+ special: cast-csv
21
21
  width: half
22
22
 
23
23
  - collection: directus_fields
@@ -27,7 +27,7 @@ fields:
27
27
  - collection: directus_fields
28
28
  field: options
29
29
  hidden: true
30
- special: json
30
+ special: cast-json
31
31
  width: half
32
32
 
33
33
  - collection: directus_fields
@@ -37,25 +37,25 @@ fields:
37
37
  - collection: directus_fields
38
38
  field: display_options
39
39
  hidden: true
40
- special: json
40
+ special: cast-json
41
41
  width: half
42
42
 
43
43
  - collection: directus_fields
44
44
  field: readonly
45
45
  hidden: true
46
- special: boolean
46
+ special: cast-boolean
47
47
  width: half
48
48
 
49
49
  - collection: directus_fields
50
50
  field: hidden
51
51
  hidden: true
52
- special: boolean
52
+ special: cast-boolean
53
53
  width: half
54
54
 
55
55
  - collection: directus_fields
56
56
  field: required
57
57
  hidden: true
58
- special: boolean
58
+ special: cast-boolean
59
59
  width: half
60
60
 
61
61
  - collection: directus_fields
@@ -73,7 +73,7 @@ fields:
73
73
  - collection: directus_fields
74
74
  field: translations
75
75
  hidden: true
76
- special: json
76
+ special: cast-json
77
77
  width: half
78
78
 
79
79
  - collection: directus_fields
@@ -83,4 +83,13 @@ fields:
83
83
  - collection: directus_fields
84
84
  field: conditions
85
85
  hidden: true
86
- special: json
86
+ special: cast-json
87
+
88
+ - collection: directus_fields
89
+ field: validation
90
+ hidden: true
91
+ special: cast-json
92
+
93
+ - collection: directus_fields
94
+ field: validation_message
95
+ hidden: true
@@ -23,7 +23,7 @@ fields:
23
23
  interface: tags
24
24
  options:
25
25
  iconRight: local_offer
26
- special: json
26
+ special: cast-json
27
27
  width: full
28
28
  display: labels
29
29
  display_options:
@@ -71,7 +71,7 @@ fields:
71
71
 
72
72
  - field: metadata
73
73
  hidden: true
74
- special: json
74
+ special: cast-json
75
75
 
76
76
  - field: type
77
77
  display: mime-type
@@ -9,13 +9,13 @@ fields:
9
9
  - field: note
10
10
  - field: type
11
11
  - field: show_header
12
- special: boolean
12
+ special: cast-boolean
13
13
  - field: position_x
14
14
  - field: position_y
15
15
  - field: width
16
16
  - field: height
17
17
  - field: options
18
- special: json
18
+ special: cast-json
19
19
  - field: date_created
20
20
  special: date-created
21
21
  - field: user_created
@@ -4,12 +4,12 @@ table: directus_permissions
4
4
  fields:
5
5
  - field: permissions
6
6
  hidden: true
7
- special: json
7
+ special: cast-json
8
8
  width: half
9
9
 
10
10
  - field: presets
11
11
  hidden: true
12
- special: json
12
+ special: cast-json
13
13
  width: half
14
14
 
15
15
  - field: role
@@ -23,11 +23,11 @@ fields:
23
23
 
24
24
  - field: fields
25
25
  width: half
26
- special: csv
26
+ special: cast-csv
27
27
 
28
28
  - field: action
29
29
  width: half
30
30
 
31
31
  - field: validation
32
32
  width: half
33
- special: json
33
+ special: cast-json
@@ -3,21 +3,29 @@ table: directus_presets
3
3
  fields:
4
4
  - field: filter
5
5
  hidden: true
6
- special: json
6
+ special: cast-json
7
7
 
8
8
  - field: layout_query
9
9
  hidden: true
10
- special: json
10
+ special: cast-json
11
11
 
12
12
  - field: layout_options
13
13
  hidden: true
14
- special: json
14
+ special: cast-json
15
15
 
16
16
  - field: role
17
17
  width: half
18
+ special: m2o
19
+ display: related-values
20
+ display_options:
21
+ template: '{{ name }}'
18
22
 
19
23
  - field: user
20
24
  width: half
25
+ special: m2o
26
+ display: related-values
27
+ display_options:
28
+ template: '{{ email }}'
21
29
 
22
30
  - field: id
23
31
  width: half
@@ -25,6 +33,12 @@ fields:
25
33
  - field: bookmark
26
34
  width: half
27
35
 
36
+ - field: icon
37
+ width: half
38
+
39
+ - field: color
40
+ width: half
41
+
28
42
  - field: search
29
43
  width: half
30
44
 
@@ -20,7 +20,7 @@ fields:
20
20
  width: half
21
21
 
22
22
  - field: one_allowed_collections
23
- special: csv
23
+ special: cast-csv
24
24
  width: half
25
25
 
26
26
  - field: junction_field
@@ -15,11 +15,11 @@ fields:
15
15
 
16
16
  - field: data
17
17
  hidden: true
18
- special: json
18
+ special: cast-json
19
19
 
20
20
  - field: delta
21
21
  hidden: true
22
- special: json
22
+ special: cast-json
23
23
 
24
24
  - field: parent
25
25
  width: half
@@ -25,24 +25,24 @@ fields:
25
25
 
26
26
  - field: app_access
27
27
  interface: boolean
28
- special: boolean
28
+ special: cast-boolean
29
29
  width: half
30
30
 
31
31
  - field: admin_access
32
32
  interface: boolean
33
- special: boolean
33
+ special: cast-boolean
34
34
  width: half
35
35
 
36
36
  - field: ip_access
37
37
  interface: tags
38
38
  options:
39
39
  placeholder: $t:field_options.directus_roles.ip_access
40
- special: csv
40
+ special: cast-csv
41
41
  width: full
42
42
 
43
43
  - field: enforce_tfa
44
44
  interface: boolean
45
- special: boolean
45
+ special: cast-boolean
46
46
  width: half
47
47
 
48
48
  - field: users
@@ -32,7 +32,17 @@ fields:
32
32
  translations:
33
33
  language: en-US
34
34
  translations: Website
35
- width: full
35
+ width: half
36
+
37
+ - field: default_language
38
+ interface: system-language
39
+ options:
40
+ iconRight: language
41
+ placeholder: en-US
42
+ translations:
43
+ language: en-US
44
+ translations: Default Language
45
+ width: half
36
46
 
37
47
  - field: branding_divider
38
48
  interface: presentation-divider
@@ -121,7 +131,7 @@ fields:
121
131
 
122
132
  - field: module_bar
123
133
  interface: system-modules
124
- special: json
134
+ special: cast-json
125
135
 
126
136
  - field: security_divider
127
137
  interface: presentation-divider
@@ -297,7 +307,7 @@ fields:
297
307
  ]
298
308
  width: full
299
309
  template: '{{key}}'
300
- special: json
310
+ special: cast-json
301
311
  width: full
302
312
 
303
313
  - field: map_divider
@@ -322,7 +332,7 @@ fields:
322
332
 
323
333
  - field: basemaps
324
334
  interface: list
325
- special: json
335
+ special: cast-json
326
336
  options:
327
337
  template: '{{name}}'
328
338
  fields:
@@ -378,3 +388,7 @@ fields:
378
388
  interface: input
379
389
  options:
380
390
  placeholder: $t:fields.directus_settings.attribution_placeholder
391
+
392
+ - field: translation_strings
393
+ special: cast-json
394
+ hidden: true
@@ -50,7 +50,7 @@ fields:
50
50
 
51
51
  - field: tags
52
52
  interface: tags
53
- special: json
53
+ special: cast-json
54
54
  width: full
55
55
  options:
56
56
  iconRight: local_offer
@@ -72,6 +72,8 @@ fields:
72
72
  - field: language
73
73
  interface: system-language
74
74
  width: half
75
+ options:
76
+ includeProjectDefault: true
75
77
 
76
78
  - field: theme
77
79
  interface: select-dropdown
@@ -93,7 +95,7 @@ fields:
93
95
  - field: email_notifications
94
96
  interface: boolean
95
97
  width: half
96
- special: boolean
98
+ special: cast-boolean
97
99
 
98
100
  - field: admin_divider
99
101
  interface: presentation-divider
@@ -152,6 +154,7 @@ fields:
152
154
  - field: last_access
153
155
  width: half
154
156
  display: datetime
157
+ readonly: true
155
158
  display_options:
156
159
  relative: true
157
160
 
@@ -60,12 +60,12 @@ fields:
60
60
  interface: boolean
61
61
  options:
62
62
  label: $t:fields.directus_webhooks.data_label
63
- special: boolean
63
+ special: cast-boolean
64
64
  width: half
65
65
  display: boolean
66
66
 
67
67
  - field: headers
68
- special: json
68
+ special: cast-json
69
69
  interface: list
70
70
  options:
71
71
  template: '{{ header }}: {{ value }}'
@@ -105,7 +105,7 @@ fields:
105
105
  value: update
106
106
  - text: $t:delete_label
107
107
  value: delete
108
- special: csv
108
+ special: cast-csv
109
109
  width: full
110
110
  display: labels
111
111
  display_options:
@@ -129,7 +129,7 @@ fields:
129
129
 
130
130
  - field: collections
131
131
  interface: system-collections
132
- special: csv
132
+ special: cast-csv
133
133
  width: full
134
134
  display: labels
135
135
  display_options:
package/dist/env.js CHANGED
@@ -14,7 +14,7 @@ const lodash_1 = require("lodash");
14
14
  const path_1 = __importDefault(require("path"));
15
15
  const require_yaml_1 = require("./utils/require-yaml");
16
16
  const utils_1 = require("@directus/shared/utils");
17
- const acceptedEnvTypes = ['string', 'number', 'regex', 'array'];
17
+ const acceptedEnvTypes = ['string', 'number', 'regex', 'array', 'json'];
18
18
  const defaults = {
19
19
  CONFIG_PATH: path_1.default.resolve(process.cwd(), '.env'),
20
20
  HOST: '0.0.0.0',
@@ -69,6 +69,7 @@ const defaults = {
69
69
  SERVE_APP: true,
70
70
  RELATIONAL_BATCH_SIZE: 25000,
71
71
  EXPORT_BATCH_SIZE: 5000,
72
+ FILE_METADATA_ALLOW_LIST: 'ifd0.Make,ifd0.Model,exif.FNumber,exif.ExposureTime,exif.FocalLength,exif.ISO',
72
73
  };
73
74
  // Allows us to force certain environment variable into a type, instead of relying
74
75
  // on the auto-parsed type in processValues. ref #3705
@@ -82,6 +83,7 @@ const typeMap = {
82
83
  DB_PORT: 'number',
83
84
  DB_EXCLUDE_TABLES: 'array',
84
85
  IMPORT_IP_DENY_LIST: 'array',
86
+ FILE_METADATA_ALLOW_LIST: 'array',
85
87
  };
86
88
  let env = {
87
89
  ...defaults,
@@ -235,6 +237,7 @@ function processValues(env) {
235
237
  }
236
238
  if (String(value).includes(',')) {
237
239
  env[key] = (0, utils_1.toArray)(value);
240
+ continue;
238
241
  }
239
242
  // Try converting the value to a JS object. This allows JSON objects to be passed for nested
240
243
  // config flags, or custom param names (that aren't camelCased)
@@ -13,6 +13,7 @@ export * from './method-not-allowed';
13
13
  export * from './range-not-satisfiable';
14
14
  export * from './route-not-found';
15
15
  export * from './service-unavailable';
16
+ export * from './token-expired';
16
17
  export * from './unprocessable-entity';
17
18
  export * from './unsupported-media-type';
18
19
  export * from './user-suspended';
@@ -25,6 +25,7 @@ __exportStar(require("./method-not-allowed"), exports);
25
25
  __exportStar(require("./range-not-satisfiable"), exports);
26
26
  __exportStar(require("./route-not-found"), exports);
27
27
  __exportStar(require("./service-unavailable"), exports);
28
+ __exportStar(require("./token-expired"), exports);
28
29
  __exportStar(require("./unprocessable-entity"), exports);
29
30
  __exportStar(require("./unsupported-media-type"), exports);
30
31
  __exportStar(require("./user-suspended"), exports);
@@ -0,0 +1,4 @@
1
+ import { BaseException } from '@directus/shared/exceptions';
2
+ export declare class TokenExpiredException extends BaseException {
3
+ constructor(message?: string);
4
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenExpiredException = void 0;
4
+ const exceptions_1 = require("@directus/shared/exceptions");
5
+ class TokenExpiredException extends exceptions_1.BaseException {
6
+ constructor(message = 'Token expired.') {
7
+ super(message, 401, 'TOKEN_EXPIRED');
8
+ }
9
+ }
10
+ exports.TokenExpiredException = TokenExpiredException;
package/dist/logger.js CHANGED
@@ -28,6 +28,7 @@ const pino_http_1 = __importStar(require("pino-http"));
28
28
  const get_config_from_env_1 = require("./utils/get-config-from-env");
29
29
  const url_1 = require("url");
30
30
  const env_1 = __importDefault(require("./env"));
31
+ const utils_1 = require("@directus/shared/utils");
31
32
  const pinoOptions = {
32
33
  level: env_1.default.LOG_LEVEL || 'info',
33
34
  redact: {
@@ -43,7 +44,7 @@ const loggerEnvConfig = (0, get_config_from_env_1.getConfigFromEnv)('LOGGER_', '
43
44
  // Expose custom log levels into formatter function
44
45
  if (loggerEnvConfig.levels) {
45
46
  const customLogLevels = {};
46
- for (const el of loggerEnvConfig.levels.split(',')) {
47
+ for (const el of (0, utils_1.toArray)(loggerEnvConfig.levels)) {
47
48
  const key_val = el.split(':');
48
49
  customLogLevels[key_val[0].trim()] = key_val[1].trim();
49
50
  }
@@ -19,6 +19,8 @@ const checkCacheMiddleware = (0, async_handler_1.default)(async (req, res, next)
19
19
  if (!cache)
20
20
  return next();
21
21
  if (((_a = req.headers['cache-control']) === null || _a === void 0 ? void 0 : _a.includes('no-store')) || ((_b = req.headers['Cache-Control']) === null || _b === void 0 ? void 0 : _b.includes('no-store'))) {
22
+ if (env_1.default.CACHE_STATUS_HEADER)
23
+ res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
22
24
  return next();
23
25
  }
24
26
  const key = (0, get_cache_key_1.getCacheKey)(req);
@@ -28,6 +30,8 @@ const checkCacheMiddleware = (0, async_handler_1.default)(async (req, res, next)
28
30
  }
29
31
  catch (err) {
30
32
  logger_1.default.warn(err, `[cache] Couldn't read key ${key}. ${err.message}`);
33
+ if (env_1.default.CACHE_STATUS_HEADER)
34
+ res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
31
35
  return next();
32
36
  }
33
37
  if (cachedData) {
@@ -37,14 +41,20 @@ const checkCacheMiddleware = (0, async_handler_1.default)(async (req, res, next)
37
41
  }
38
42
  catch (err) {
39
43
  logger_1.default.warn(err, `[cache] Couldn't read key ${`${key}__expires_at`}. ${err.message}`);
44
+ if (env_1.default.CACHE_STATUS_HEADER)
45
+ res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
40
46
  return next();
41
47
  }
42
48
  const cacheTTL = cacheExpiryDate ? cacheExpiryDate - Date.now() : null;
43
49
  res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, cacheTTL));
44
50
  res.setHeader('Vary', 'Origin, Cache-Control');
51
+ if (env_1.default.CACHE_STATUS_HEADER)
52
+ res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'HIT');
45
53
  return res.json(cachedData);
46
54
  }
47
55
  else {
56
+ if (env_1.default.CACHE_STATUS_HEADER)
57
+ res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
48
58
  return next();
49
59
  }
50
60
  });
@@ -16,6 +16,7 @@ const user_name_1 = require("../utils/user-name");
16
16
  const lodash_1 = require("lodash");
17
17
  const env_1 = __importDefault(require("../env"));
18
18
  const uuid_validate_1 = __importDefault(require("uuid-validate"));
19
+ const url_1 = require("../utils/url");
19
20
  class ActivityService extends items_1.ItemsService {
20
21
  constructor(options) {
21
22
  super('directus_activity', options);
@@ -70,7 +71,9 @@ ${(0, user_name_1.userName)(sender)} has mentioned you in a comment:
70
71
 
71
72
  ${comment}
72
73
 
73
- <a href="${env_1.default.PUBLIC_URL}/admin/content/${data.collection}/${data.item}">Click here to view.</a>
74
+ <a href="${new url_1.Url(env_1.default.PUBLIC_URL)
75
+ .addPath('admin', 'content', data.collection, data.item)
76
+ .toString()}">Click here to view.</a>
74
77
  `;
75
78
  await this.notificationsService.createOne({
76
79
  recipient: userID,
@@ -1,6 +1,6 @@
1
+ import { Accountability, PermissionsAction, SchemaOverview } from '@directus/shared/types';
1
2
  import { Knex } from 'knex';
2
3
  import { AbstractServiceOptions, AST, Item, PrimaryKey } from '../types';
3
- import { PermissionsAction, Accountability, SchemaOverview } from '@directus/shared/types';
4
4
  import { PayloadService } from './payload';
5
5
  export declare class AuthorizationService {
6
6
  knex: Knex;