@unchainedshop/events 5.0.0-alpha.4 → 5.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/audit/audit-integration.d.ts +1 -1
- package/lib/audit/audit-integration.js +614 -98
- package/lib/audit/index.d.ts +18 -38
- package/lib/audit/index.js +74 -253
- package/lib/audit/ocsf-types.d.ts +9 -6
- package/lib/audit/ocsf-types.js +14 -1
- package/lib/audit/otlp-types.d.ts +62 -0
- package/lib/audit/otlp-types.js +9 -0
- package/lib/audit/otlp.d.ts +9 -0
- package/lib/audit/otlp.js +164 -0
- package/lib/audit/request-context.d.ts +8 -0
- package/lib/audit/request-context.js +8 -0
- package/lib/events-index.d.ts +2 -1
- package/lib/events-index.js +2 -1
- package/package.json +2 -2
|
@@ -1,13 +1,38 @@
|
|
|
1
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
2
2
|
import { EventDirector } from "../EventDirector.js";
|
|
3
3
|
import { OCSF_AUTH_ACTIVITY, OCSF_ACCOUNT_ACTIVITY, OCSF_API_ACTIVITY } from "./ocsf-types.js";
|
|
4
|
+
import { getAuditContext } from "./request-context.js";
|
|
4
5
|
const logger = createLogger('unchained:audit-integration');
|
|
6
|
+
function entityLabel(entity, fallbackId) {
|
|
7
|
+
if (!entity)
|
|
8
|
+
return fallbackId || 'unknown';
|
|
9
|
+
const name = entity.slugs?.[0] || entity.key || entity.isoCode || entity.title || entity.name || entity.type;
|
|
10
|
+
const id = entity._id || fallbackId;
|
|
11
|
+
if (name && id)
|
|
12
|
+
return `${name} (${id})`;
|
|
13
|
+
return name || id || 'unknown';
|
|
14
|
+
}
|
|
15
|
+
function changedFields(payload, excludeKeys) {
|
|
16
|
+
const keys = Object.keys(payload).filter((k) => !excludeKeys.includes(k) && !k.startsWith('_') && k !== 'updated');
|
|
17
|
+
if (!keys.length)
|
|
18
|
+
return { label: '', data: null };
|
|
19
|
+
const data = {};
|
|
20
|
+
for (const key of keys) {
|
|
21
|
+
data[key] = payload[key];
|
|
22
|
+
}
|
|
23
|
+
return { label: ` [${keys.join(', ')}]`, data };
|
|
24
|
+
}
|
|
5
25
|
function extractContext(payload) {
|
|
26
|
+
const reqCtx = getAuditContext();
|
|
6
27
|
return {
|
|
7
|
-
userId: payload.userId || payload.user?._id || payload.user?.id,
|
|
8
|
-
userName: payload.userName ||
|
|
9
|
-
|
|
10
|
-
|
|
28
|
+
userId: payload.userId || payload.user?._id || payload.user?.id || reqCtx?.userId,
|
|
29
|
+
userName: payload.userName ||
|
|
30
|
+
payload.username ||
|
|
31
|
+
payload.user?.username ||
|
|
32
|
+
payload.user?.emails?.[0]?.address ||
|
|
33
|
+
reqCtx?.userName,
|
|
34
|
+
remoteAddress: payload.remoteAddress || payload.ip || reqCtx?.remoteAddress,
|
|
35
|
+
sessionId: payload.sessionId || reqCtx?.sessionId,
|
|
11
36
|
};
|
|
12
37
|
}
|
|
13
38
|
const ACCOUNT_ACTION_MAP = {
|
|
@@ -18,7 +43,462 @@ const ACCOUNT_ACTION_MAP = {
|
|
|
18
43
|
'verify-email': { activity: OCSF_ACCOUNT_ACTIVITY.ENABLE, message: 'Email verified' },
|
|
19
44
|
'enroll-account': { activity: OCSF_ACCOUNT_ACTIVITY.ENABLE, message: 'Account enrolled' },
|
|
20
45
|
};
|
|
46
|
+
const PAYLOAD_META_KEYS = ['userId', 'userName', 'remoteAddress', 'sessionId'];
|
|
47
|
+
const API_EVENT_MAP = {
|
|
48
|
+
ORDER_CREATE: {
|
|
49
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
50
|
+
operation: 'createOrder',
|
|
51
|
+
message: (p) => `Order created: ${entityLabel(p.order)}`,
|
|
52
|
+
useOrderUserId: true,
|
|
53
|
+
},
|
|
54
|
+
ORDER_CHECKOUT: {
|
|
55
|
+
activity: OCSF_API_ACTIVITY.CHECKOUT,
|
|
56
|
+
operation: 'checkoutOrder',
|
|
57
|
+
message: (p) => `Order checkout: ${entityLabel(p.order)}`,
|
|
58
|
+
useOrderUserId: true,
|
|
59
|
+
},
|
|
60
|
+
ORDER_CONFIRMED: {
|
|
61
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
62
|
+
operation: 'confirmOrder',
|
|
63
|
+
message: (p) => `Order confirmed: ${entityLabel(p.order)}`,
|
|
64
|
+
useOrderUserId: true,
|
|
65
|
+
},
|
|
66
|
+
ORDER_FULFILLED: {
|
|
67
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
68
|
+
operation: 'fulfillOrder',
|
|
69
|
+
message: (p) => `Order fulfilled: ${entityLabel(p.order)}`,
|
|
70
|
+
useOrderUserId: true,
|
|
71
|
+
},
|
|
72
|
+
ORDER_REJECTED: {
|
|
73
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
74
|
+
operation: 'rejectOrder',
|
|
75
|
+
message: (p) => `Order rejected: ${entityLabel(p.order)}`,
|
|
76
|
+
success: false,
|
|
77
|
+
useOrderUserId: true,
|
|
78
|
+
},
|
|
79
|
+
ORDER_DELIVER: {
|
|
80
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
81
|
+
operation: 'deliverOrder',
|
|
82
|
+
message: (p) => `Order delivered: ${entityLabel(p.order)}`,
|
|
83
|
+
useOrderUserId: true,
|
|
84
|
+
},
|
|
85
|
+
ORDER_REMOVE: {
|
|
86
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
87
|
+
operation: 'removeOrder',
|
|
88
|
+
message: (p) => `Order removed: ${entityLabel(p.order)}`,
|
|
89
|
+
},
|
|
90
|
+
ORDER_EMPTY_CART: {
|
|
91
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
92
|
+
operation: 'emptyCart',
|
|
93
|
+
message: 'Cart emptied',
|
|
94
|
+
},
|
|
95
|
+
ORDER_ADD_PRODUCT: {
|
|
96
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
97
|
+
operation: 'addToCart',
|
|
98
|
+
message: (p) => `Product added to cart: ${p.orderPosition?.productId || 'unknown'}`,
|
|
99
|
+
},
|
|
100
|
+
ORDER_REMOVE_CART_ITEM: {
|
|
101
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
102
|
+
operation: 'removeFromCart',
|
|
103
|
+
message: 'Product removed from cart',
|
|
104
|
+
},
|
|
105
|
+
ORDER_SET_PAYMENT_PROVIDER: {
|
|
106
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
107
|
+
operation: 'setPaymentProvider',
|
|
108
|
+
message: (p) => `Payment provider set: ${p.paymentProviderId || 'unknown'}`,
|
|
109
|
+
},
|
|
110
|
+
ORDER_SET_DELIVERY_PROVIDER: {
|
|
111
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
112
|
+
operation: 'setDeliveryProvider',
|
|
113
|
+
message: (p) => `Delivery provider set: ${p.deliveryProviderId || 'unknown'}`,
|
|
114
|
+
},
|
|
115
|
+
ORDER_PAY: {
|
|
116
|
+
activity: OCSF_API_ACTIVITY.PAYMENT,
|
|
117
|
+
operation: 'processPayment',
|
|
118
|
+
message: 'Payment processed for order',
|
|
119
|
+
},
|
|
120
|
+
ORDER_UPDATE_PAYMENT: {
|
|
121
|
+
activity: OCSF_API_ACTIVITY.PAYMENT,
|
|
122
|
+
operation: 'updatePayment',
|
|
123
|
+
message: 'Payment updated',
|
|
124
|
+
},
|
|
125
|
+
ACL_DENIED: {
|
|
126
|
+
activity: OCSF_API_ACTIVITY.ACCESS_DENIED,
|
|
127
|
+
operation: '',
|
|
128
|
+
message: (p) => `Access denied: ${p.action || 'unknown'}`,
|
|
129
|
+
success: false,
|
|
130
|
+
},
|
|
131
|
+
ACL_GRANTED_SENSITIVE: {
|
|
132
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
133
|
+
operation: '',
|
|
134
|
+
message: (p) => `Sensitive access granted: ${p.action || 'unknown'}`,
|
|
135
|
+
},
|
|
136
|
+
PRODUCT_CREATE: {
|
|
137
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
138
|
+
operation: 'createProduct',
|
|
139
|
+
message: (p) => `Product created: ${entityLabel(p.product)}`,
|
|
140
|
+
},
|
|
141
|
+
PRODUCT_UPDATE: {
|
|
142
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
143
|
+
operation: 'updateProduct',
|
|
144
|
+
entityKey: 'product',
|
|
145
|
+
entityIdKey: 'productId',
|
|
146
|
+
trackChangedFields: true,
|
|
147
|
+
message: '',
|
|
148
|
+
},
|
|
149
|
+
PRODUCT_REMOVE: {
|
|
150
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
151
|
+
operation: 'removeProduct',
|
|
152
|
+
message: (p) => `Product removed: ${entityLabel(p.product, p.productId)}`,
|
|
153
|
+
},
|
|
154
|
+
PRODUCT_PUBLISH: {
|
|
155
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
156
|
+
operation: 'publishProduct',
|
|
157
|
+
message: (p) => `Product published: ${entityLabel(p.product, p.productId)}`,
|
|
158
|
+
},
|
|
159
|
+
PRODUCT_UNPUBLISH: {
|
|
160
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
161
|
+
operation: 'unpublishProduct',
|
|
162
|
+
message: (p) => `Product unpublished: ${entityLabel(p.product, p.productId)}`,
|
|
163
|
+
},
|
|
164
|
+
PRODUCT_UPDATE_TEXT: {
|
|
165
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
166
|
+
operation: 'updateProductText',
|
|
167
|
+
message: (p) => `Product text updated: ${p.productId || 'unknown'} [${p.text?.locale || ''}] ${p.text?.title || ''}`,
|
|
168
|
+
},
|
|
169
|
+
PRODUCT_UPDATE_MEDIA_TEXT: {
|
|
170
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
171
|
+
operation: 'updateProductMediaText',
|
|
172
|
+
message: (p) => `Product media text updated: ${p.productId || p.mediaId || 'unknown'}`,
|
|
173
|
+
},
|
|
174
|
+
PRODUCT_ADD_MEDIA: {
|
|
175
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
176
|
+
operation: 'addProductMedia',
|
|
177
|
+
message: (p) => `Product media added: ${p.productId || 'unknown'}`,
|
|
178
|
+
},
|
|
179
|
+
PRODUCT_REMOVE_MEDIA: {
|
|
180
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
181
|
+
operation: 'removeProductMedia',
|
|
182
|
+
message: (p) => `Product media removed: ${p.productId || p.mediaId || 'unknown'}`,
|
|
183
|
+
},
|
|
184
|
+
PRODUCT_REORDER_MEDIA: {
|
|
185
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
186
|
+
operation: 'reorderProductMedia',
|
|
187
|
+
message: (p) => `Product media reordered: ${p.productId || 'unknown'}`,
|
|
188
|
+
},
|
|
189
|
+
PRODUCT_ADD_ASSIGNMENT: {
|
|
190
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
191
|
+
operation: 'addProductAssignment',
|
|
192
|
+
message: (p) => `Product assignment added: ${p.productId || 'unknown'}`,
|
|
193
|
+
},
|
|
194
|
+
PRODUCT_REMOVE_ASSIGNMENT: {
|
|
195
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
196
|
+
operation: 'removeProductAssignment',
|
|
197
|
+
message: (p) => `Product assignment removed: ${p.productId || 'unknown'}`,
|
|
198
|
+
},
|
|
199
|
+
PRODUCT_CREATE_BUNDLE_ITEM: {
|
|
200
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
201
|
+
operation: 'createBundleItem',
|
|
202
|
+
message: (p) => `Bundle item created: ${p.productId || 'unknown'}`,
|
|
203
|
+
},
|
|
204
|
+
PRODUCT_REMOVE_BUNDLE_ITEM: {
|
|
205
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
206
|
+
operation: 'removeBundleItem',
|
|
207
|
+
message: (p) => `Bundle item removed: ${p.productId || 'unknown'}`,
|
|
208
|
+
},
|
|
209
|
+
PRODUCT_CREATE_VARIATION: {
|
|
210
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
211
|
+
operation: 'createProductVariation',
|
|
212
|
+
message: (p) => `Product variation created: ${p.productId || 'unknown'}`,
|
|
213
|
+
},
|
|
214
|
+
PRODUCT_REMOVE_VARIATION: {
|
|
215
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
216
|
+
operation: 'removeProductVariation',
|
|
217
|
+
message: (p) => `Product variation removed: ${p.productId || 'unknown'}`,
|
|
218
|
+
},
|
|
219
|
+
PRODUCT_VARIATION_OPTION_CREATE: {
|
|
220
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
221
|
+
operation: 'createVariationOption',
|
|
222
|
+
message: (p) => `Variation option created: ${p.productId || 'unknown'}`,
|
|
223
|
+
},
|
|
224
|
+
PRODUCT_REMOVE_VARIATION_OPTION: {
|
|
225
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
226
|
+
operation: 'removeVariationOption',
|
|
227
|
+
message: (p) => `Variation option removed: ${p.productId || 'unknown'}`,
|
|
228
|
+
},
|
|
229
|
+
PRODUCT_UPDATE_VARIATION_TEXT: {
|
|
230
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
231
|
+
operation: 'updateVariationText',
|
|
232
|
+
message: (p) => `Variation text updated: ${p.productId || 'unknown'}`,
|
|
233
|
+
},
|
|
234
|
+
PRODUCT_REVIEW_CREATE: {
|
|
235
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
236
|
+
operation: 'createProductReview',
|
|
237
|
+
message: (p) => `Product review created: ${p.productId || 'unknown'}`,
|
|
238
|
+
},
|
|
239
|
+
PRODUCT_UPDATE_REVIEW: {
|
|
240
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
241
|
+
operation: 'updateProductReview',
|
|
242
|
+
message: (p) => `Product review updated: ${p.productId || 'unknown'}`,
|
|
243
|
+
},
|
|
244
|
+
PRODUCT_REMOVE_REVIEW: {
|
|
245
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
246
|
+
operation: 'removeProductReview',
|
|
247
|
+
message: (p) => `Product review removed: ${p.productId || 'unknown'}`,
|
|
248
|
+
},
|
|
249
|
+
PRODUCT_REVIEW_ADD_VOTE: {
|
|
250
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
251
|
+
operation: 'addProductReviewVote',
|
|
252
|
+
message: (p) => `Review vote added: ${p.productId || 'unknown'}`,
|
|
253
|
+
},
|
|
254
|
+
PRODUCT_REMOVE_REVIEW_VOTE: {
|
|
255
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
256
|
+
operation: 'removeProductReviewVote',
|
|
257
|
+
message: (p) => `Review vote removed: ${p.productId || 'unknown'}`,
|
|
258
|
+
},
|
|
259
|
+
ASSORTMENT_UPDATE_TEXT: {
|
|
260
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
261
|
+
operation: 'updateAssortmentText',
|
|
262
|
+
message: (p) => `Assortment text updated: ${p.assortmentId || 'unknown'} [${p.text?.locale || ''}] ${p.text?.title || ''}`,
|
|
263
|
+
},
|
|
264
|
+
ASSORTMENT_UPDATE_MEDIA_TEXT: {
|
|
265
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
266
|
+
operation: 'updateAssortmentMediaText',
|
|
267
|
+
message: (p) => `Assortment media text updated: ${p.assortmentId || 'unknown'}`,
|
|
268
|
+
},
|
|
269
|
+
ASSORTMENT_ADD_PRODUCT: {
|
|
270
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
271
|
+
operation: 'addAssortmentProduct',
|
|
272
|
+
message: (p) => `Product added to assortment: ${p.productId || 'unknown'} → ${p.assortmentId || 'unknown'}`,
|
|
273
|
+
},
|
|
274
|
+
ASSORTMENT_REMOVE_PRODUCT: {
|
|
275
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
276
|
+
operation: 'removeAssortmentProduct',
|
|
277
|
+
message: (p) => `Product removed from assortment: ${p.assortmentId || 'unknown'}`,
|
|
278
|
+
},
|
|
279
|
+
ASSORTMENT_ADD_LINK: {
|
|
280
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
281
|
+
operation: 'addAssortmentLink',
|
|
282
|
+
message: (p) => `Assortment link added: ${p.assortmentId || 'unknown'}`,
|
|
283
|
+
},
|
|
284
|
+
ASSORTMENT_REMOVE_LINK: {
|
|
285
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
286
|
+
operation: 'removeAssortmentLink',
|
|
287
|
+
message: (p) => `Assortment link removed: ${p.assortmentId || 'unknown'}`,
|
|
288
|
+
},
|
|
289
|
+
ASSORTMENT_ADD_FILTER: {
|
|
290
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
291
|
+
operation: 'addAssortmentFilter',
|
|
292
|
+
message: (p) => `Filter added to assortment: ${p.assortmentId || 'unknown'}`,
|
|
293
|
+
},
|
|
294
|
+
ASSORTMENT_REMOVE_FILTER: {
|
|
295
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
296
|
+
operation: 'removeAssortmentFilter',
|
|
297
|
+
message: (p) => `Filter removed from assortment: ${p.assortmentId || 'unknown'}`,
|
|
298
|
+
},
|
|
299
|
+
ASSORTMENT_ADD_MEDIA: {
|
|
300
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
301
|
+
operation: 'addAssortmentMedia',
|
|
302
|
+
message: (p) => `Assortment media added: ${p.assortmentId || 'unknown'}`,
|
|
303
|
+
},
|
|
304
|
+
ASSORTMENT_REMOVE_MEDIA: {
|
|
305
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
306
|
+
operation: 'removeAssortmentMedia',
|
|
307
|
+
message: (p) => `Assortment media removed: ${p.assortmentId || 'unknown'}`,
|
|
308
|
+
},
|
|
309
|
+
ASSORTMENT_REORDER_PRODUCTS: {
|
|
310
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
311
|
+
operation: 'reorderAssortmentProducts',
|
|
312
|
+
message: (p) => `Assortment products reordered: ${p.assortmentId || 'unknown'}`,
|
|
313
|
+
},
|
|
314
|
+
ASSORTMENT_REORDER_LINKS: {
|
|
315
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
316
|
+
operation: 'reorderAssortmentLinks',
|
|
317
|
+
message: (p) => `Assortment links reordered: ${p.assortmentId || 'unknown'}`,
|
|
318
|
+
},
|
|
319
|
+
ASSORTMENT_REORDER_FILTERS: {
|
|
320
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
321
|
+
operation: 'reorderAssortmentFilters',
|
|
322
|
+
message: (p) => `Assortment filters reordered: ${p.assortmentId || 'unknown'}`,
|
|
323
|
+
},
|
|
324
|
+
ASSORTMENT_REORDER_MEDIA: {
|
|
325
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
326
|
+
operation: 'reorderAssortmentMedia',
|
|
327
|
+
message: (p) => `Assortment media reordered: ${p.assortmentId || 'unknown'}`,
|
|
328
|
+
},
|
|
329
|
+
FILTER_UPDATE_TEXT: {
|
|
330
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
331
|
+
operation: 'updateFilterText',
|
|
332
|
+
message: (p) => `Filter text updated: ${p.filterId || 'unknown'} [${p.text?.locale || ''}] ${p.text?.title || ''}`,
|
|
333
|
+
},
|
|
334
|
+
PAYMENT_PROVIDER_CREATE: {
|
|
335
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
336
|
+
operation: 'createPaymentProvider',
|
|
337
|
+
message: (p) => `Payment provider created: ${entityLabel(p.paymentProvider)}`,
|
|
338
|
+
},
|
|
339
|
+
PAYMENT_PROVIDER_UPDATE: {
|
|
340
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
341
|
+
operation: 'updatePaymentProvider',
|
|
342
|
+
message: (p) => `Payment provider updated: ${entityLabel(p.paymentProvider, p.paymentProviderId)}`,
|
|
343
|
+
},
|
|
344
|
+
PAYMENT_PROVIDER_REMOVE: {
|
|
345
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
346
|
+
operation: 'removePaymentProvider',
|
|
347
|
+
message: (p) => `Payment provider removed: ${entityLabel(p.paymentProvider, p.paymentProviderId)}`,
|
|
348
|
+
},
|
|
349
|
+
DELIVERY_PROVIDER_CREATE: {
|
|
350
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
351
|
+
operation: 'createDeliveryProvider',
|
|
352
|
+
message: (p) => `Delivery provider created: ${entityLabel(p.deliveryProvider)}`,
|
|
353
|
+
},
|
|
354
|
+
DELIVERY_PROVIDER_UPDATE: {
|
|
355
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
356
|
+
operation: 'updateDeliveryProvider',
|
|
357
|
+
message: (p) => `Delivery provider updated: ${entityLabel(p.deliveryProvider, p.deliveryProviderId)}`,
|
|
358
|
+
},
|
|
359
|
+
DELIVERY_PROVIDER_REMOVE: {
|
|
360
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
361
|
+
operation: 'removeDeliveryProvider',
|
|
362
|
+
message: (p) => `Delivery provider removed: ${entityLabel(p.deliveryProvider, p.deliveryProviderId)}`,
|
|
363
|
+
},
|
|
364
|
+
WAREHOUSING_PROVIDER_CREATE: {
|
|
365
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
366
|
+
operation: 'createWarehousingProvider',
|
|
367
|
+
message: (p) => `Warehousing provider created: ${entityLabel(p.warehousingProvider)}`,
|
|
368
|
+
},
|
|
369
|
+
WAREHOUSING_PROVIDER_UPDATE: {
|
|
370
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
371
|
+
operation: 'updateWarehousingProvider',
|
|
372
|
+
message: (p) => `Warehousing provider updated: ${entityLabel(p.warehousingProvider, p.warehousingProviderId)}`,
|
|
373
|
+
},
|
|
374
|
+
WAREHOUSING_PROVIDER_REMOVE: {
|
|
375
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
376
|
+
operation: 'removeWarehousingProvider',
|
|
377
|
+
message: (p) => `Warehousing provider removed: ${entityLabel(p.warehousingProvider, p.warehousingProviderId)}`,
|
|
378
|
+
},
|
|
379
|
+
TOKEN_OWNERSHIP_CHANGED: {
|
|
380
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
381
|
+
operation: 'transferToken',
|
|
382
|
+
message: (p) => `Token ownership changed: ${entityLabel(p.token, p.tokenId)}`,
|
|
383
|
+
},
|
|
384
|
+
TOKEN_INVALIDATED: {
|
|
385
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
386
|
+
operation: 'invalidateToken',
|
|
387
|
+
message: (p) => `Token invalidated: ${entityLabel(p.token, p.tokenId)}`,
|
|
388
|
+
},
|
|
389
|
+
ENROLLMENT_CREATE: {
|
|
390
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
391
|
+
operation: 'createEnrollment',
|
|
392
|
+
message: (p) => `Enrollment created: ${entityLabel(p.enrollment)}`,
|
|
393
|
+
},
|
|
394
|
+
ENROLLMENT_UPDATE: {
|
|
395
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
396
|
+
operation: 'updateEnrollment',
|
|
397
|
+
message: (p) => `Enrollment updated: ${entityLabel(p.enrollment, p.enrollmentId)}`,
|
|
398
|
+
},
|
|
399
|
+
ENROLLMENT_REMOVE: {
|
|
400
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
401
|
+
operation: 'removeEnrollment',
|
|
402
|
+
message: (p) => `Enrollment removed: ${entityLabel(p.enrollment, p.enrollmentId)}`,
|
|
403
|
+
},
|
|
404
|
+
QUOTATION_REQUEST_CREATE: {
|
|
405
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
406
|
+
operation: 'createQuotation',
|
|
407
|
+
message: (p) => `Quotation created: ${entityLabel(p.quotation)}`,
|
|
408
|
+
},
|
|
409
|
+
QUOTATION_UPDATE: {
|
|
410
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
411
|
+
operation: 'updateQuotation',
|
|
412
|
+
message: (p) => `Quotation updated: ${entityLabel(p.quotation, p.quotationId)}`,
|
|
413
|
+
},
|
|
414
|
+
ASSORTMENT_CREATE: {
|
|
415
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
416
|
+
operation: 'createAssortment',
|
|
417
|
+
message: (p) => `Assortment created: ${entityLabel(p.assortment)}`,
|
|
418
|
+
},
|
|
419
|
+
ASSORTMENT_UPDATE: {
|
|
420
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
421
|
+
operation: 'updateAssortment',
|
|
422
|
+
message: (p) => `Assortment updated: ${entityLabel(p.assortment, p.assortmentId)}`,
|
|
423
|
+
},
|
|
424
|
+
ASSORTMENT_REMOVE: {
|
|
425
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
426
|
+
operation: 'removeAssortment',
|
|
427
|
+
message: (p) => `Assortment removed: ${entityLabel(p.assortment, p.assortmentId)}`,
|
|
428
|
+
},
|
|
429
|
+
FILTER_CREATE: {
|
|
430
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
431
|
+
operation: 'createFilter',
|
|
432
|
+
message: (p) => `Filter created: ${entityLabel(p.filter)}`,
|
|
433
|
+
},
|
|
434
|
+
FILTER_UPDATE: {
|
|
435
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
436
|
+
operation: 'updateFilter',
|
|
437
|
+
message: (p) => `Filter updated: ${entityLabel(p.filter, p.filterId)}`,
|
|
438
|
+
},
|
|
439
|
+
FILTER_REMOVE: {
|
|
440
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
441
|
+
operation: 'removeFilter',
|
|
442
|
+
message: (p) => `Filter removed: ${entityLabel(p.filter, p.filterId)}`,
|
|
443
|
+
},
|
|
444
|
+
FILE_CREATE: {
|
|
445
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
446
|
+
operation: 'createFile',
|
|
447
|
+
message: (p) => `File created: ${entityLabel(p.file, p.fileId)}`,
|
|
448
|
+
},
|
|
449
|
+
FILE_REMOVE: {
|
|
450
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
451
|
+
operation: 'removeFile',
|
|
452
|
+
message: (p) => `File removed: ${entityLabel(p.file, p.fileId)}`,
|
|
453
|
+
},
|
|
454
|
+
COUNTRY_CREATE: {
|
|
455
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
456
|
+
operation: 'createCountry',
|
|
457
|
+
message: (p) => `Country created: ${entityLabel(p.country, p.countryId)}`,
|
|
458
|
+
},
|
|
459
|
+
COUNTRY_UPDATE: {
|
|
460
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
461
|
+
operation: 'updateCountry',
|
|
462
|
+
message: (p) => `Country updated: ${entityLabel(p.country, p.countryId)}`,
|
|
463
|
+
},
|
|
464
|
+
COUNTRY_REMOVE: {
|
|
465
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
466
|
+
operation: 'removeCountry',
|
|
467
|
+
message: (p) => `Country removed: ${entityLabel(p.country, p.countryId)}`,
|
|
468
|
+
},
|
|
469
|
+
CURRENCY_CREATE: {
|
|
470
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
471
|
+
operation: 'createCurrency',
|
|
472
|
+
message: (p) => `Currency created: ${entityLabel(p.currency, p.currencyId)}`,
|
|
473
|
+
},
|
|
474
|
+
CURRENCY_UPDATE: {
|
|
475
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
476
|
+
operation: 'updateCurrency',
|
|
477
|
+
message: (p) => `Currency updated: ${entityLabel(p.currency, p.currencyId)}`,
|
|
478
|
+
},
|
|
479
|
+
CURRENCY_REMOVE: {
|
|
480
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
481
|
+
operation: 'removeCurrency',
|
|
482
|
+
message: (p) => `Currency removed: ${entityLabel(p.currency, p.currencyId)}`,
|
|
483
|
+
},
|
|
484
|
+
LANGUAGE_CREATE: {
|
|
485
|
+
activity: OCSF_API_ACTIVITY.CREATE,
|
|
486
|
+
operation: 'createLanguage',
|
|
487
|
+
message: (p) => `Language created: ${entityLabel(p.language, p.languageId)}`,
|
|
488
|
+
},
|
|
489
|
+
LANGUAGE_UPDATE: {
|
|
490
|
+
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
491
|
+
operation: 'updateLanguage',
|
|
492
|
+
message: (p) => `Language updated: ${entityLabel(p.language, p.languageId)}`,
|
|
493
|
+
},
|
|
494
|
+
LANGUAGE_REMOVE: {
|
|
495
|
+
activity: OCSF_API_ACTIVITY.DELETE,
|
|
496
|
+
operation: 'removeLanguage',
|
|
497
|
+
message: (p) => `Language removed: ${entityLabel(p.language, p.languageId)}`,
|
|
498
|
+
},
|
|
499
|
+
};
|
|
21
500
|
export function configureAuditIntegration(auditLog) {
|
|
501
|
+
const subscribedEvents = new Set();
|
|
22
502
|
const sub = (event, handler) => {
|
|
23
503
|
try {
|
|
24
504
|
EventDirector.subscribe(event, async ({ payload }) => {
|
|
@@ -29,6 +509,7 @@ export function configureAuditIntegration(auditLog) {
|
|
|
29
509
|
logger.error(`Audit log error for ${event}: ${error}`);
|
|
30
510
|
}
|
|
31
511
|
});
|
|
512
|
+
subscribedEvents.add(event);
|
|
32
513
|
}
|
|
33
514
|
catch {
|
|
34
515
|
}
|
|
@@ -37,6 +518,15 @@ export function configureAuditIntegration(auditLog) {
|
|
|
37
518
|
const ctx = extractContext(p);
|
|
38
519
|
await auditLog.logAuthentication({ activity: OCSF_AUTH_ACTIVITY.LOGON, ...ctx, success: true });
|
|
39
520
|
});
|
|
521
|
+
sub('API_LOGIN_FAILED', async (p) => {
|
|
522
|
+
const ctx = extractContext(p);
|
|
523
|
+
await auditLog.logAuthentication({
|
|
524
|
+
activity: OCSF_AUTH_ACTIVITY.LOGON,
|
|
525
|
+
...ctx,
|
|
526
|
+
success: false,
|
|
527
|
+
message: 'Failed login attempt',
|
|
528
|
+
});
|
|
529
|
+
});
|
|
40
530
|
sub('API_LOGOUT', async (p) => {
|
|
41
531
|
const ctx = extractContext(p);
|
|
42
532
|
await auditLog.logAuthentication({ activity: OCSF_AUTH_ACTIVITY.LOGOFF, ...ctx, success: true });
|
|
@@ -83,104 +573,51 @@ export function configureAuditIntegration(auditLog) {
|
|
|
83
573
|
};
|
|
84
574
|
await auditLog.logAccountChange({ ...mapped, ...ctx, success: true });
|
|
85
575
|
});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const ctx = extractContext(p);
|
|
121
|
-
await auditLog.logApiActivity({
|
|
122
|
-
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
123
|
-
...ctx,
|
|
124
|
-
userId: p.order?.userId || ctx.userId,
|
|
125
|
-
success: true,
|
|
126
|
-
operation: 'fulfillOrder',
|
|
127
|
-
message: `Order fulfilled: ${p.order?._id || 'unknown'}`,
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
sub('ORDER_REJECTED', async (p) => {
|
|
131
|
-
const ctx = extractContext(p);
|
|
132
|
-
await auditLog.logApiActivity({
|
|
133
|
-
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
134
|
-
...ctx,
|
|
135
|
-
userId: p.order?.userId || ctx.userId,
|
|
136
|
-
success: false,
|
|
137
|
-
operation: 'rejectOrder',
|
|
138
|
-
message: `Order rejected: ${p.order?._id || 'unknown'}`,
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
sub('ORDER_ADD_PRODUCT', async (p) => {
|
|
142
|
-
const ctx = extractContext(p);
|
|
143
|
-
await auditLog.logApiActivity({
|
|
144
|
-
activity: OCSF_API_ACTIVITY.UPDATE,
|
|
145
|
-
...ctx,
|
|
146
|
-
success: true,
|
|
147
|
-
operation: 'addToCart',
|
|
148
|
-
message: `Product added to cart: ${p.orderPosition?.productId || 'unknown'}`,
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
sub('ORDER_REMOVE_CART_ITEM', async (p) => {
|
|
152
|
-
const ctx = extractContext(p);
|
|
153
|
-
await auditLog.logApiActivity({
|
|
154
|
-
activity: OCSF_API_ACTIVITY.DELETE,
|
|
155
|
-
...ctx,
|
|
156
|
-
success: true,
|
|
157
|
-
operation: 'removeFromCart',
|
|
158
|
-
message: 'Product removed from cart',
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
sub('ORDER_PAY', async (p) => {
|
|
162
|
-
const ctx = extractContext(p);
|
|
163
|
-
await auditLog.logApiActivity({
|
|
164
|
-
activity: OCSF_API_ACTIVITY.PAYMENT,
|
|
165
|
-
...ctx,
|
|
166
|
-
success: true,
|
|
167
|
-
operation: 'processPayment',
|
|
168
|
-
message: 'Payment processed for order',
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
sub('ORDER_UPDATE_PAYMENT', async (p) => {
|
|
172
|
-
const ctx = extractContext(p);
|
|
173
|
-
await auditLog.logApiActivity({
|
|
174
|
-
activity: OCSF_API_ACTIVITY.PAYMENT,
|
|
175
|
-
...ctx,
|
|
176
|
-
success: true,
|
|
177
|
-
operation: 'updatePayment',
|
|
178
|
-
message: 'Payment updated',
|
|
576
|
+
for (const [event, mapping] of Object.entries(API_EVENT_MAP)) {
|
|
577
|
+
sub(event, async (p) => {
|
|
578
|
+
const ctx = extractContext(p);
|
|
579
|
+
let message;
|
|
580
|
+
let data = null;
|
|
581
|
+
if (mapping.trackChangedFields) {
|
|
582
|
+
const entity = mapping.entityKey ? p[mapping.entityKey] : undefined;
|
|
583
|
+
const idKey = mapping.entityIdKey ? p[mapping.entityIdKey] : undefined;
|
|
584
|
+
const changed = changedFields(p, [
|
|
585
|
+
mapping.entityKey || '',
|
|
586
|
+
mapping.entityIdKey || '',
|
|
587
|
+
...PAYLOAD_META_KEYS,
|
|
588
|
+
]);
|
|
589
|
+
message = `${mapping.operation
|
|
590
|
+
.replace(/([A-Z])/g, ' $1')
|
|
591
|
+
.replace(/^./, (s) => s.toUpperCase())
|
|
592
|
+
.trim()}: ${entityLabel(entity, idKey)}${changed.label}`;
|
|
593
|
+
data = changed.data;
|
|
594
|
+
}
|
|
595
|
+
else if (typeof mapping.message === 'function') {
|
|
596
|
+
message = mapping.message(p);
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
message = mapping.message;
|
|
600
|
+
}
|
|
601
|
+
await auditLog.logApiActivity({
|
|
602
|
+
activity: mapping.activity,
|
|
603
|
+
...ctx,
|
|
604
|
+
userId: mapping.useOrderUserId ? p.order?.userId || ctx.userId : ctx.userId,
|
|
605
|
+
success: mapping.success ?? true,
|
|
606
|
+
operation: mapping.operation || p.action || 'unknown',
|
|
607
|
+
message,
|
|
608
|
+
...(data ? { data } : {}),
|
|
609
|
+
});
|
|
179
610
|
});
|
|
180
|
-
}
|
|
611
|
+
}
|
|
612
|
+
const missing = AUDITED_EVENTS.filter((e) => !subscribedEvents.has(e));
|
|
613
|
+
if (missing.length > 0) {
|
|
614
|
+
logger.warn(`Audit integration: ${missing.length} advertised events not registered: ${missing.join(', ')}`);
|
|
615
|
+
}
|
|
616
|
+
logger.info(`Audit integration configured: ${subscribedEvents.size}/${AUDITED_EVENTS.length} events subscribed`);
|
|
181
617
|
}
|
|
182
618
|
export const AUDITED_EVENTS = [
|
|
183
619
|
'API_LOGIN_TOKEN_CREATED',
|
|
620
|
+
'API_LOGIN_FAILED',
|
|
184
621
|
'API_LOGOUT',
|
|
185
622
|
'USER_CREATE',
|
|
186
623
|
'USER_REMOVE',
|
|
@@ -197,4 +634,83 @@ export const AUDITED_EVENTS = [
|
|
|
197
634
|
'ORDER_REMOVE_CART_ITEM',
|
|
198
635
|
'ORDER_PAY',
|
|
199
636
|
'ORDER_UPDATE_PAYMENT',
|
|
637
|
+
'ORDER_DELIVER',
|
|
638
|
+
'ORDER_REMOVE',
|
|
639
|
+
'ORDER_EMPTY_CART',
|
|
640
|
+
'ORDER_SET_PAYMENT_PROVIDER',
|
|
641
|
+
'ORDER_SET_DELIVERY_PROVIDER',
|
|
642
|
+
'ACL_DENIED',
|
|
643
|
+
'ACL_GRANTED_SENSITIVE',
|
|
644
|
+
'PRODUCT_CREATE',
|
|
645
|
+
'PRODUCT_UPDATE',
|
|
646
|
+
'PRODUCT_REMOVE',
|
|
647
|
+
'PRODUCT_PUBLISH',
|
|
648
|
+
'PRODUCT_UNPUBLISH',
|
|
649
|
+
'PRODUCT_UPDATE_TEXT',
|
|
650
|
+
'PRODUCT_UPDATE_MEDIA_TEXT',
|
|
651
|
+
'PRODUCT_ADD_MEDIA',
|
|
652
|
+
'PRODUCT_REMOVE_MEDIA',
|
|
653
|
+
'PRODUCT_REORDER_MEDIA',
|
|
654
|
+
'PRODUCT_ADD_ASSIGNMENT',
|
|
655
|
+
'PRODUCT_REMOVE_ASSIGNMENT',
|
|
656
|
+
'PRODUCT_CREATE_BUNDLE_ITEM',
|
|
657
|
+
'PRODUCT_REMOVE_BUNDLE_ITEM',
|
|
658
|
+
'PRODUCT_CREATE_VARIATION',
|
|
659
|
+
'PRODUCT_REMOVE_VARIATION',
|
|
660
|
+
'PRODUCT_VARIATION_OPTION_CREATE',
|
|
661
|
+
'PRODUCT_REMOVE_VARIATION_OPTION',
|
|
662
|
+
'PRODUCT_UPDATE_VARIATION_TEXT',
|
|
663
|
+
'PRODUCT_REVIEW_CREATE',
|
|
664
|
+
'PRODUCT_UPDATE_REVIEW',
|
|
665
|
+
'PRODUCT_REMOVE_REVIEW',
|
|
666
|
+
'PRODUCT_REVIEW_ADD_VOTE',
|
|
667
|
+
'PRODUCT_REMOVE_REVIEW_VOTE',
|
|
668
|
+
'ASSORTMENT_UPDATE_TEXT',
|
|
669
|
+
'ASSORTMENT_UPDATE_MEDIA_TEXT',
|
|
670
|
+
'ASSORTMENT_ADD_PRODUCT',
|
|
671
|
+
'ASSORTMENT_REMOVE_PRODUCT',
|
|
672
|
+
'ASSORTMENT_ADD_LINK',
|
|
673
|
+
'ASSORTMENT_REMOVE_LINK',
|
|
674
|
+
'ASSORTMENT_ADD_FILTER',
|
|
675
|
+
'ASSORTMENT_REMOVE_FILTER',
|
|
676
|
+
'ASSORTMENT_ADD_MEDIA',
|
|
677
|
+
'ASSORTMENT_REMOVE_MEDIA',
|
|
678
|
+
'ASSORTMENT_REORDER_PRODUCTS',
|
|
679
|
+
'ASSORTMENT_REORDER_LINKS',
|
|
680
|
+
'ASSORTMENT_REORDER_FILTERS',
|
|
681
|
+
'ASSORTMENT_REORDER_MEDIA',
|
|
682
|
+
'FILTER_UPDATE_TEXT',
|
|
683
|
+
'PAYMENT_PROVIDER_CREATE',
|
|
684
|
+
'PAYMENT_PROVIDER_UPDATE',
|
|
685
|
+
'PAYMENT_PROVIDER_REMOVE',
|
|
686
|
+
'DELIVERY_PROVIDER_CREATE',
|
|
687
|
+
'DELIVERY_PROVIDER_UPDATE',
|
|
688
|
+
'DELIVERY_PROVIDER_REMOVE',
|
|
689
|
+
'WAREHOUSING_PROVIDER_CREATE',
|
|
690
|
+
'WAREHOUSING_PROVIDER_UPDATE',
|
|
691
|
+
'WAREHOUSING_PROVIDER_REMOVE',
|
|
692
|
+
'TOKEN_OWNERSHIP_CHANGED',
|
|
693
|
+
'TOKEN_INVALIDATED',
|
|
694
|
+
'ENROLLMENT_CREATE',
|
|
695
|
+
'ENROLLMENT_UPDATE',
|
|
696
|
+
'ENROLLMENT_REMOVE',
|
|
697
|
+
'QUOTATION_REQUEST_CREATE',
|
|
698
|
+
'QUOTATION_UPDATE',
|
|
699
|
+
'ASSORTMENT_CREATE',
|
|
700
|
+
'ASSORTMENT_UPDATE',
|
|
701
|
+
'ASSORTMENT_REMOVE',
|
|
702
|
+
'FILTER_CREATE',
|
|
703
|
+
'FILTER_UPDATE',
|
|
704
|
+
'FILTER_REMOVE',
|
|
705
|
+
'FILE_CREATE',
|
|
706
|
+
'FILE_REMOVE',
|
|
707
|
+
'COUNTRY_CREATE',
|
|
708
|
+
'COUNTRY_UPDATE',
|
|
709
|
+
'COUNTRY_REMOVE',
|
|
710
|
+
'CURRENCY_CREATE',
|
|
711
|
+
'CURRENCY_UPDATE',
|
|
712
|
+
'CURRENCY_REMOVE',
|
|
713
|
+
'LANGUAGE_CREATE',
|
|
714
|
+
'LANGUAGE_UPDATE',
|
|
715
|
+
'LANGUAGE_REMOVE',
|
|
200
716
|
];
|