order-management 0.0.95 → 0.0.97
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/.medusa/server/src/admin/index.js +2446 -397
- package/.medusa/server/src/admin/index.mjs +2450 -401
- package/.medusa/server/src/api/admin/deleted-records-audit/[id]/route.js +30 -0
- package/.medusa/server/src/api/admin/deleted-records-audit/route.js +48 -0
- package/.medusa/server/src/api/admin/deleted-records-audit/stats/route.js +27 -0
- package/.medusa/server/src/api/admin/deleted-records-audit/validators.js +57 -0
- package/.medusa/server/src/api/middlewares/block-refund-until-return-received.js +141 -42
- package/.medusa/server/src/api/middlewares.js +11 -5
- package/.medusa/server/src/helpers/refund-receive-guard.js +102 -1
- package/.medusa/server/src/modules/deleted-records-audit/audited-tables.js +257 -0
- package/.medusa/server/src/modules/deleted-records-audit/index.js +14 -0
- package/.medusa/server/src/modules/deleted-records-audit/migrations/Migration20261008120000.js +81 -0
- package/.medusa/server/src/modules/deleted-records-audit/models/deleted-records-audit.js +15 -0
- package/.medusa/server/src/modules/deleted-records-audit/service.js +164 -0
- package/.medusa/server/src/modules/deleted-records-audit/types.js +3 -0
- package/README.md +79 -2
- package/package.json +1 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AUDIT_TRIGGER_FUNCTION = exports.AUDIT_TABLE_NAME = exports.AUDITED_TABLE_NAMES = void 0;
|
|
4
|
+
exports.auditTriggerName = auditTriggerName;
|
|
5
|
+
exports.buildCreateAuditTriggerSql = buildCreateAuditTriggerSql;
|
|
6
|
+
exports.buildDropAuditTriggerSql = buildDropAuditTriggerSql;
|
|
7
|
+
/**
|
|
8
|
+
* Tables that receive a BEFORE DELETE audit trigger.
|
|
9
|
+
* Tables missing from the database are skipped at migration time.
|
|
10
|
+
* Never add `deleted_records_audit` here (the trigger would recurse).
|
|
11
|
+
*/
|
|
12
|
+
exports.AUDITED_TABLE_NAMES = [
|
|
13
|
+
"account_deletion_request",
|
|
14
|
+
"account_holder",
|
|
15
|
+
"api_key",
|
|
16
|
+
"application_method_buy_rules",
|
|
17
|
+
"application_method_target_rules",
|
|
18
|
+
"auth_identity",
|
|
19
|
+
"auth_mfa_factor",
|
|
20
|
+
"auth_mfa_recovery_code",
|
|
21
|
+
"auth_password_reset_token",
|
|
22
|
+
"auth_verification",
|
|
23
|
+
"cancel_order_reason_mapping",
|
|
24
|
+
"capture",
|
|
25
|
+
"cart",
|
|
26
|
+
"cart_address",
|
|
27
|
+
"cart_line_item",
|
|
28
|
+
"cart_line_item_adjustment",
|
|
29
|
+
"cart_line_item_tax_line",
|
|
30
|
+
"cart_payment_collection",
|
|
31
|
+
"cart_promotion",
|
|
32
|
+
"cart_shipping_method",
|
|
33
|
+
"cart_shipping_method_adjustment",
|
|
34
|
+
"cart_shipping_method_tax_line",
|
|
35
|
+
"contact_email_subscription",
|
|
36
|
+
"contact_request",
|
|
37
|
+
"contact_request_comment",
|
|
38
|
+
"credit_line",
|
|
39
|
+
"currency",
|
|
40
|
+
"customer",
|
|
41
|
+
"customer_account_holder",
|
|
42
|
+
"customer_address",
|
|
43
|
+
"customer_group",
|
|
44
|
+
"customer_group_customer",
|
|
45
|
+
"dynamic_config_value",
|
|
46
|
+
"fulfillment",
|
|
47
|
+
"fulfillment_address",
|
|
48
|
+
"fulfillment_item",
|
|
49
|
+
"fulfillment_label",
|
|
50
|
+
"fulfillment_provider",
|
|
51
|
+
"fulfillment_set",
|
|
52
|
+
"geo_zone",
|
|
53
|
+
"image",
|
|
54
|
+
"inventory_count_item",
|
|
55
|
+
"inventory_count_session",
|
|
56
|
+
"inventory_item",
|
|
57
|
+
"inventory_level",
|
|
58
|
+
"inventory_movement",
|
|
59
|
+
"inventory_purchase",
|
|
60
|
+
"inventory_purchase_attachment",
|
|
61
|
+
"inventory_purchase_audit_event",
|
|
62
|
+
"inventory_purchase_batch",
|
|
63
|
+
"inventory_purchase_line_item",
|
|
64
|
+
"invite",
|
|
65
|
+
"invite_rbac_role",
|
|
66
|
+
"invoice",
|
|
67
|
+
"invoice_sequence",
|
|
68
|
+
"layout_configuration",
|
|
69
|
+
"link_module_migrations",
|
|
70
|
+
"location_fulfillment_provider",
|
|
71
|
+
"location_fulfillment_set",
|
|
72
|
+
"loyalty_gift_card",
|
|
73
|
+
"mikro_orm_migrations",
|
|
74
|
+
"notification",
|
|
75
|
+
"notification_provider",
|
|
76
|
+
"notification_tokens",
|
|
77
|
+
"order",
|
|
78
|
+
"order_address",
|
|
79
|
+
"order_cart",
|
|
80
|
+
"order_change",
|
|
81
|
+
"order_change_action",
|
|
82
|
+
"order_claim",
|
|
83
|
+
"order_claim_item",
|
|
84
|
+
"order_claim_item_image",
|
|
85
|
+
"order_credit_line",
|
|
86
|
+
"order_exchange",
|
|
87
|
+
"order_exchange_item",
|
|
88
|
+
"order_fulfillment",
|
|
89
|
+
"order_item",
|
|
90
|
+
"order_line_item",
|
|
91
|
+
"order_line_item_adjustment",
|
|
92
|
+
"order_line_item_tax_line",
|
|
93
|
+
"order_payment_collection",
|
|
94
|
+
"order_promotion",
|
|
95
|
+
"order_shipping",
|
|
96
|
+
"order_shipping_method",
|
|
97
|
+
"order_shipping_method_adjustment",
|
|
98
|
+
"order_shipping_method_tax_line",
|
|
99
|
+
"order_summary",
|
|
100
|
+
"order_transaction",
|
|
101
|
+
"otp_verification",
|
|
102
|
+
"payment",
|
|
103
|
+
"payment_collection",
|
|
104
|
+
"payment_collection_payment_providers",
|
|
105
|
+
"payment_detail",
|
|
106
|
+
"payment_provider",
|
|
107
|
+
"payment_session",
|
|
108
|
+
"payout_request",
|
|
109
|
+
"price",
|
|
110
|
+
"price_list",
|
|
111
|
+
"price_list_rule",
|
|
112
|
+
"price_preference",
|
|
113
|
+
"price_rule",
|
|
114
|
+
"price_set",
|
|
115
|
+
"product",
|
|
116
|
+
"product_category",
|
|
117
|
+
"product_category_product",
|
|
118
|
+
"product_collection",
|
|
119
|
+
"product_display_priority",
|
|
120
|
+
"product_option",
|
|
121
|
+
"product_option_value",
|
|
122
|
+
"product_product_option",
|
|
123
|
+
"product_product_option_value",
|
|
124
|
+
"product_sales_channel",
|
|
125
|
+
"product_shipping_profile",
|
|
126
|
+
"product_tag",
|
|
127
|
+
"product_tags",
|
|
128
|
+
"product_type",
|
|
129
|
+
"product_variant",
|
|
130
|
+
"product_variant_inventory_item",
|
|
131
|
+
"product_variant_option",
|
|
132
|
+
"product_variant_price_set",
|
|
133
|
+
"product_variant_product_image",
|
|
134
|
+
"product_view",
|
|
135
|
+
"promotion",
|
|
136
|
+
"promotion_application_method",
|
|
137
|
+
"promotion_campaign",
|
|
138
|
+
"promotion_campaign_budget",
|
|
139
|
+
"promotion_campaign_budget_usage",
|
|
140
|
+
"promotion_promotion_rule",
|
|
141
|
+
"promotion_rule",
|
|
142
|
+
"promotion_rule_value",
|
|
143
|
+
"property_label",
|
|
144
|
+
"provider_identity",
|
|
145
|
+
"publishable_api_key_sales_channel",
|
|
146
|
+
"purchase_supplier",
|
|
147
|
+
"referral_link",
|
|
148
|
+
"referral_reward",
|
|
149
|
+
"refund",
|
|
150
|
+
"refund_payment_mapping",
|
|
151
|
+
"refund_reason",
|
|
152
|
+
"region",
|
|
153
|
+
"region_country",
|
|
154
|
+
"region_payment_provider",
|
|
155
|
+
"reservation_item",
|
|
156
|
+
"return",
|
|
157
|
+
"return_fulfillment",
|
|
158
|
+
"return_item",
|
|
159
|
+
"return_reason",
|
|
160
|
+
"review",
|
|
161
|
+
"sales_channel",
|
|
162
|
+
"sales_channel_stock_location",
|
|
163
|
+
"script_migrations",
|
|
164
|
+
"search_index",
|
|
165
|
+
"search_index_sync",
|
|
166
|
+
"search_index_version",
|
|
167
|
+
"search_postgres_index",
|
|
168
|
+
"service_zone",
|
|
169
|
+
"shipment_tracking_event",
|
|
170
|
+
"shipping_option",
|
|
171
|
+
"shipping_option_price_set",
|
|
172
|
+
"shipping_option_rule",
|
|
173
|
+
"shipping_option_type",
|
|
174
|
+
"shipping_profile",
|
|
175
|
+
"skip_merge_cart",
|
|
176
|
+
"stock_location",
|
|
177
|
+
"stock_location_address",
|
|
178
|
+
"store",
|
|
179
|
+
"store_credit_account",
|
|
180
|
+
"store_credit_account_transaction",
|
|
181
|
+
"store_currency",
|
|
182
|
+
"store_locale",
|
|
183
|
+
"tax_provider",
|
|
184
|
+
"tax_rate",
|
|
185
|
+
"tax_rate_rule",
|
|
186
|
+
"tax_region",
|
|
187
|
+
"telegram_config",
|
|
188
|
+
"telegram_notification_log",
|
|
189
|
+
"user",
|
|
190
|
+
"user_preference",
|
|
191
|
+
"user_rbac_role",
|
|
192
|
+
"view_configuration",
|
|
193
|
+
"wallet_account",
|
|
194
|
+
"wallet_credit_lot",
|
|
195
|
+
"wallet_gift_card",
|
|
196
|
+
"wallet_hold",
|
|
197
|
+
"wallet_ledger_entry",
|
|
198
|
+
"wallet_rate_limit",
|
|
199
|
+
"wallet_refund_intent",
|
|
200
|
+
"wallet_top_up_request",
|
|
201
|
+
"wishlist",
|
|
202
|
+
"workflow_execution",
|
|
203
|
+
];
|
|
204
|
+
exports.AUDIT_TABLE_NAME = "deleted_records_audit";
|
|
205
|
+
exports.AUDIT_TRIGGER_FUNCTION = "om_audit_row_delete";
|
|
206
|
+
const TRIGGER_PREFIX = "om_ad_";
|
|
207
|
+
const PG_IDENTIFIER_MAX = 63;
|
|
208
|
+
/** Deterministic trigger name that stays within Postgres' 63-byte identifier limit. */
|
|
209
|
+
function auditTriggerName(tableName) {
|
|
210
|
+
const safe = tableName.replace(/[^a-z0-9_]/gi, "_").toLowerCase();
|
|
211
|
+
const full = `${TRIGGER_PREFIX}${safe}`;
|
|
212
|
+
if (full.length <= PG_IDENTIFIER_MAX)
|
|
213
|
+
return full;
|
|
214
|
+
let hash = 0;
|
|
215
|
+
for (const ch of safe)
|
|
216
|
+
hash = (hash * 31 + ch.charCodeAt(0)) >>> 0;
|
|
217
|
+
const suffix = `_${hash.toString(36)}`;
|
|
218
|
+
return `${full.slice(0, PG_IDENTIFIER_MAX - suffix.length)}${suffix}`;
|
|
219
|
+
}
|
|
220
|
+
function quoteLiteral(value) {
|
|
221
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
222
|
+
}
|
|
223
|
+
function quoteIdent(value) {
|
|
224
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
225
|
+
}
|
|
226
|
+
function buildCreateAuditTriggerSql(tableName) {
|
|
227
|
+
const trigger = quoteIdent(auditTriggerName(tableName));
|
|
228
|
+
const table = quoteIdent(tableName);
|
|
229
|
+
return `
|
|
230
|
+
DO $$
|
|
231
|
+
BEGIN
|
|
232
|
+
IF EXISTS (
|
|
233
|
+
SELECT 1 FROM information_schema.tables
|
|
234
|
+
WHERE table_schema = 'public' AND table_name = ${quoteLiteral(tableName)}
|
|
235
|
+
) THEN
|
|
236
|
+
EXECUTE 'DROP TRIGGER IF EXISTS ' || ${quoteLiteral(trigger)} || ' ON public.' || ${quoteLiteral(table)};
|
|
237
|
+
EXECUTE 'CREATE TRIGGER ' || ${quoteLiteral(trigger)} || ' BEFORE DELETE ON public.' || ${quoteLiteral(table)} || ' FOR EACH ROW EXECUTE FUNCTION ${exports.AUDIT_TRIGGER_FUNCTION}()';
|
|
238
|
+
END IF;
|
|
239
|
+
END
|
|
240
|
+
$$;`;
|
|
241
|
+
}
|
|
242
|
+
function buildDropAuditTriggerSql(tableName) {
|
|
243
|
+
const trigger = quoteIdent(auditTriggerName(tableName));
|
|
244
|
+
const table = quoteIdent(tableName);
|
|
245
|
+
return `
|
|
246
|
+
DO $$
|
|
247
|
+
BEGIN
|
|
248
|
+
IF EXISTS (
|
|
249
|
+
SELECT 1 FROM information_schema.tables
|
|
250
|
+
WHERE table_schema = 'public' AND table_name = ${quoteLiteral(tableName)}
|
|
251
|
+
) THEN
|
|
252
|
+
EXECUTE 'DROP TRIGGER IF EXISTS ' || ${quoteLiteral(trigger)} || ' ON public.' || ${quoteLiteral(table)};
|
|
253
|
+
END IF;
|
|
254
|
+
END
|
|
255
|
+
$$;`;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXRlZC10YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kZWxldGVkLXJlY29yZHMtYXVkaXQvYXVkaXRlZC10YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK01BLDRDQVFDO0FBVUQsZ0VBZUM7QUFFRCw0REFjQztBQWhRRDs7OztHQUlHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRztJQUNqQywwQkFBMEI7SUFDMUIsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCw4QkFBOEI7SUFDOUIsaUNBQWlDO0lBQ2pDLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsd0JBQXdCO0lBQ3hCLDJCQUEyQjtJQUMzQixtQkFBbUI7SUFDbkIsNkJBQTZCO0lBQzdCLFNBQVM7SUFDVCxNQUFNO0lBQ04sY0FBYztJQUNkLGdCQUFnQjtJQUNoQiwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLGlDQUFpQztJQUNqQywrQkFBK0I7SUFDL0IsNEJBQTRCO0lBQzVCLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIsYUFBYTtJQUNiLFVBQVU7SUFDVixVQUFVO0lBQ1YseUJBQXlCO0lBQ3pCLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIseUJBQXlCO0lBQ3pCLHNCQUFzQjtJQUN0QixhQUFhO0lBQ2IscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsc0JBQXNCO0lBQ3RCLGlCQUFpQjtJQUNqQixVQUFVO0lBQ1YsT0FBTztJQUNQLHNCQUFzQjtJQUN0Qix5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLCtCQUErQjtJQUMvQixnQ0FBZ0M7SUFDaEMsMEJBQTBCO0lBQzFCLDhCQUE4QjtJQUM5QixRQUFRO0lBQ1Isa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLHdCQUF3QjtJQUN4QiwrQkFBK0I7SUFDL0IsMEJBQTBCO0lBQzFCLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsY0FBYztJQUNkLHVCQUF1QjtJQUN2QixxQkFBcUI7SUFDckIsT0FBTztJQUNQLGVBQWU7SUFDZixZQUFZO0lBQ1osY0FBYztJQUNkLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLHdCQUF3QjtJQUN4QixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQiw0QkFBNEI7SUFDNUIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLHVCQUF1QjtJQUN2QixrQ0FBa0M7SUFDbEMsZ0NBQWdDO0lBQ2hDLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxvQkFBb0I7SUFDcEIsc0NBQXNDO0lBQ3RDLGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFdBQVc7SUFDWCxTQUFTO0lBQ1Qsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixvQkFBb0I7SUFDcEIsMEJBQTBCO0lBQzFCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsd0JBQXdCO0lBQ3hCLDhCQUE4QjtJQUM5Qix1QkFBdUI7SUFDdkIsMEJBQTBCO0lBQzFCLGFBQWE7SUFDYixjQUFjO0lBQ2QsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixnQ0FBZ0M7SUFDaEMsd0JBQXdCO0lBQ3hCLDJCQUEyQjtJQUMzQiwrQkFBK0I7SUFDL0IsY0FBYztJQUNkLFdBQVc7SUFDWCw4QkFBOEI7SUFDOUIsb0JBQW9CO0lBQ3BCLDJCQUEyQjtJQUMzQixpQ0FBaUM7SUFDakMsMEJBQTBCO0lBQzFCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixtQ0FBbUM7SUFDbkMsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsUUFBUTtJQUNSLHdCQUF3QjtJQUN4QixlQUFlO0lBQ2YsUUFBUTtJQUNSLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixvQkFBb0I7SUFDcEIsYUFBYTtJQUNiLGVBQWU7SUFDZixRQUFRO0lBQ1IsZUFBZTtJQUNmLDhCQUE4QjtJQUM5QixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsaUJBQWlCO0lBQ2pCLDJCQUEyQjtJQUMzQixzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtJQUN4QixPQUFPO0lBQ1Asc0JBQXNCO0lBQ3RCLGtDQUFrQztJQUNsQyxnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGNBQWM7SUFDZCxVQUFVO0lBQ1YsZUFBZTtJQUNmLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsMkJBQTJCO0lBQzNCLE1BQU07SUFDTixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtJQUNwQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLFVBQVU7SUFDVixvQkFBb0I7Q0FDWixDQUFBO0FBSUcsUUFBQSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQTtBQUMxQyxRQUFBLHNCQUFzQixHQUFHLHFCQUFxQixDQUFBO0FBRTNELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQTtBQUMvQixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQTtBQUU1Qix1RkFBdUY7QUFDdkYsU0FBZ0IsZ0JBQWdCLENBQUMsU0FBaUI7SUFDaEQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDakUsTUFBTSxJQUFJLEdBQUcsR0FBRyxjQUFjLEdBQUcsSUFBSSxFQUFFLENBQUE7SUFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLGlCQUFpQjtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2pELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQTtJQUNaLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSTtRQUFFLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQTtJQUN0QyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFBO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFhO0lBQ2pDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFBO0FBQ3pDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFhO0lBQy9CLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFBO0FBQ3pDLENBQUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FBQyxTQUFpQjtJQUMxRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUN2RCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDbkMsT0FBTzs7Ozs7cURBSzRDLFlBQVksQ0FBQyxTQUFTLENBQUM7OzJDQUVqQyxZQUFZLENBQUMsT0FBTyxDQUFDLHdCQUF3QixZQUFZLENBQUMsS0FBSyxDQUFDO21DQUN4RSxZQUFZLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxZQUFZLENBQUMsS0FBSyxDQUFDLHVDQUF1Qyw4QkFBc0I7OztJQUcxSyxDQUFBO0FBQ0osQ0FBQztBQUVELFNBQWdCLHdCQUF3QixDQUFDLFNBQWlCO0lBQ3hELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNuQyxPQUFPOzs7OztxREFLNEMsWUFBWSxDQUFDLFNBQVMsQ0FBQzs7MkNBRWpDLFlBQVksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLFlBQVksQ0FBQyxLQUFLLENBQUM7OztJQUd2RyxDQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DeletedRecordsAuditModuleService = exports.DELETED_RECORDS_AUDIT_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const service_1 = __importDefault(require("./service"));
|
|
9
|
+
exports.DeletedRecordsAuditModuleService = service_1.default;
|
|
10
|
+
exports.DELETED_RECORDS_AUDIT_MODULE = "deleted_records_audit";
|
|
11
|
+
exports.default = (0, utils_1.Module)(exports.DELETED_RECORDS_AUDIT_MODULE, {
|
|
12
|
+
service: service_1.default,
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kZWxldGVkLXJlY29yZHMtYXVkaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUF3RDtBQVEvQywyQ0FSRixpQkFBZ0MsQ0FRRTtBQU41QixRQUFBLDRCQUE0QixHQUFHLHVCQUF1QixDQUFBO0FBRW5FLGtCQUFlLElBQUEsY0FBTSxFQUFDLG9DQUE0QixFQUFFO0lBQ2xELE9BQU8sRUFBRSxpQkFBZ0M7Q0FDMUMsQ0FBQyxDQUFBIn0=
|
package/.medusa/server/src/modules/deleted-records-audit/migrations/Migration20261008120000.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20261008120000 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
const audited_tables_1 = require("../audited-tables");
|
|
6
|
+
class Migration20261008120000 extends migrations_1.Migration {
|
|
7
|
+
async up() {
|
|
8
|
+
this.addSql(`
|
|
9
|
+
CREATE TABLE IF NOT EXISTS "deleted_records_audit" (
|
|
10
|
+
"id" text NOT NULL PRIMARY KEY,
|
|
11
|
+
"table_name" text NOT NULL,
|
|
12
|
+
"record_id" text NULL,
|
|
13
|
+
"operation" text NOT NULL DEFAULT 'DELETE',
|
|
14
|
+
"old_data" jsonb NULL,
|
|
15
|
+
"occurred_at" timestamptz NOT NULL DEFAULT now(),
|
|
16
|
+
"deleted_by" text NULL,
|
|
17
|
+
"source" text NULL,
|
|
18
|
+
"created_at" timestamptz NOT NULL DEFAULT now(),
|
|
19
|
+
"updated_at" timestamptz NOT NULL DEFAULT now(),
|
|
20
|
+
"deleted_at" timestamptz NULL
|
|
21
|
+
);
|
|
22
|
+
`);
|
|
23
|
+
this.addSql(`
|
|
24
|
+
CREATE INDEX IF NOT EXISTS "IDX_deleted_records_audit_occurred_at"
|
|
25
|
+
ON "deleted_records_audit" ("occurred_at" DESC);
|
|
26
|
+
`);
|
|
27
|
+
this.addSql(`
|
|
28
|
+
CREATE INDEX IF NOT EXISTS "IDX_deleted_records_audit_table_occurred"
|
|
29
|
+
ON "deleted_records_audit" ("table_name", "occurred_at" DESC);
|
|
30
|
+
`);
|
|
31
|
+
this.addSql(`
|
|
32
|
+
CREATE INDEX IF NOT EXISTS "IDX_deleted_records_audit_record_id"
|
|
33
|
+
ON "deleted_records_audit" ("record_id");
|
|
34
|
+
`);
|
|
35
|
+
this.addSql(`
|
|
36
|
+
CREATE INDEX IF NOT EXISTS "IDX_deleted_records_audit_source"
|
|
37
|
+
ON "deleted_records_audit" ("source") WHERE "source" IS NOT NULL;
|
|
38
|
+
`);
|
|
39
|
+
this.addSql(`
|
|
40
|
+
CREATE OR REPLACE FUNCTION ${audited_tables_1.AUDIT_TRIGGER_FUNCTION}()
|
|
41
|
+
RETURNS trigger
|
|
42
|
+
LANGUAGE plpgsql
|
|
43
|
+
AS $fn$
|
|
44
|
+
DECLARE
|
|
45
|
+
row_json jsonb := to_jsonb(OLD);
|
|
46
|
+
BEGIN
|
|
47
|
+
INSERT INTO "deleted_records_audit" (
|
|
48
|
+
"id", "table_name", "record_id", "operation", "old_data",
|
|
49
|
+
"occurred_at", "deleted_by", "source"
|
|
50
|
+
) VALUES (
|
|
51
|
+
'dra_' || replace(gen_random_uuid()::text, '-', ''),
|
|
52
|
+
TG_TABLE_NAME,
|
|
53
|
+
row_json ->> 'id',
|
|
54
|
+
'DELETE',
|
|
55
|
+
row_json,
|
|
56
|
+
now(),
|
|
57
|
+
NULLIF(current_setting('app.audit_actor_id', true), ''),
|
|
58
|
+
NULLIF(current_setting('app.audit_source', true), '')
|
|
59
|
+
);
|
|
60
|
+
RETURN OLD;
|
|
61
|
+
END;
|
|
62
|
+
$fn$;
|
|
63
|
+
`);
|
|
64
|
+
for (const table of audited_tables_1.AUDITED_TABLE_NAMES) {
|
|
65
|
+
this.addSql((0, audited_tables_1.buildCreateAuditTriggerSql)(table));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async down() {
|
|
69
|
+
for (const table of audited_tables_1.AUDITED_TABLE_NAMES) {
|
|
70
|
+
this.addSql((0, audited_tables_1.buildDropAuditTriggerSql)(table));
|
|
71
|
+
}
|
|
72
|
+
this.addSql(`DROP FUNCTION IF EXISTS ${audited_tables_1.AUDIT_TRIGGER_FUNCTION}();`);
|
|
73
|
+
this.addSql(`DROP INDEX IF EXISTS "IDX_deleted_records_audit_source";`);
|
|
74
|
+
this.addSql(`DROP INDEX IF EXISTS "IDX_deleted_records_audit_record_id";`);
|
|
75
|
+
this.addSql(`DROP INDEX IF EXISTS "IDX_deleted_records_audit_table_occurred";`);
|
|
76
|
+
this.addSql(`DROP INDEX IF EXISTS "IDX_deleted_records_audit_occurred_at";`);
|
|
77
|
+
this.addSql(`DROP TABLE IF EXISTS "deleted_records_audit";`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.Migration20261008120000 = Migration20261008120000;
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjEwMDgxMjAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kZWxldGVkLXJlY29yZHMtYXVkaXQvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MTAwODEyMDAwMC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBb0U7QUFDcEUsc0RBSzBCO0FBRTFCLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDcEQsS0FBSyxDQUFDLEVBQUU7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztLQWNYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7bUNBQ21CLHVDQUFzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F1QnBELENBQUMsQ0FBQTtRQUVGLEtBQUssTUFBTSxLQUFLLElBQUksb0NBQW1CLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUEsMkNBQTBCLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsS0FBSyxNQUFNLEtBQUssSUFBSSxvQ0FBbUIsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBQSx5Q0FBd0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQix1Q0FBc0IsS0FBSyxDQUFDLENBQUE7UUFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQywwREFBMEQsQ0FBQyxDQUFBO1FBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsNkRBQTZELENBQUMsQ0FBQTtRQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtFQUFrRSxDQUFDLENBQUE7UUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQywrREFBK0QsQ0FBQyxDQUFBO1FBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0NBQ0Y7QUE3RUQsMERBNkVDIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const DeletedRecordsAudit = utils_1.model.define("deleted_records_audit", {
|
|
5
|
+
id: utils_1.model.id().primaryKey(),
|
|
6
|
+
table_name: utils_1.model.text().searchable(),
|
|
7
|
+
record_id: utils_1.model.text().searchable().nullable(),
|
|
8
|
+
operation: utils_1.model.text().default("DELETE"),
|
|
9
|
+
old_data: utils_1.model.json().nullable(),
|
|
10
|
+
occurred_at: utils_1.model.dateTime(),
|
|
11
|
+
deleted_by: utils_1.model.text().nullable(),
|
|
12
|
+
source: utils_1.model.text().nullable(),
|
|
13
|
+
});
|
|
14
|
+
exports.default = DeletedRecordsAudit;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlZC1yZWNvcmRzLWF1ZGl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZGVsZXRlZC1yZWNvcmRzLWF1ZGl0L21vZGVscy9kZWxldGVkLXJlY29yZHMtYXVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFFakQsTUFBTSxtQkFBbUIsR0FBRyxhQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hFLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLFVBQVUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQ3JDLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQy9DLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUN6QyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNqQyxXQUFXLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRTtJQUM3QixVQUFVLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNoQyxDQUFDLENBQUE7QUFFRixrQkFBZSxtQkFBbUIsQ0FBQSJ9
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const deleted_records_audit_1 = __importDefault(require("./models/deleted-records-audit"));
|
|
8
|
+
const DELETED_BY_OPTIONS_LIMIT = 200;
|
|
9
|
+
function asString(value) {
|
|
10
|
+
if (value === null || value === undefined)
|
|
11
|
+
return null;
|
|
12
|
+
return String(value);
|
|
13
|
+
}
|
|
14
|
+
function asIso(value) {
|
|
15
|
+
if (value instanceof Date)
|
|
16
|
+
return value.toISOString();
|
|
17
|
+
const parsed = new Date(String(value));
|
|
18
|
+
return Number.isNaN(parsed.getTime()) ? String(value) : parsed.toISOString();
|
|
19
|
+
}
|
|
20
|
+
function asNumber(value) {
|
|
21
|
+
const n = typeof value === "number" ? value : Number(value);
|
|
22
|
+
return Number.isFinite(n) ? n : 0;
|
|
23
|
+
}
|
|
24
|
+
function asObject(value) {
|
|
25
|
+
if (value === null || value === undefined)
|
|
26
|
+
return null;
|
|
27
|
+
if (typeof value === "string") {
|
|
28
|
+
try {
|
|
29
|
+
const parsed = JSON.parse(value);
|
|
30
|
+
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
|
|
31
|
+
? parsed
|
|
32
|
+
: { value: parsed };
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return { value };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (typeof value === "object" && !Array.isArray(value))
|
|
39
|
+
return value;
|
|
40
|
+
return { value };
|
|
41
|
+
}
|
|
42
|
+
function rowsOf(result) {
|
|
43
|
+
if (typeof result === "object" && result !== null && "rows" in result) {
|
|
44
|
+
const rows = result.rows;
|
|
45
|
+
return Array.isArray(rows) ? rows : [];
|
|
46
|
+
}
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
function escapeLike(value) {
|
|
50
|
+
return value.replace(/[\\%_]/g, (ch) => `\\${ch}`);
|
|
51
|
+
}
|
|
52
|
+
class DeletedRecordsAuditModuleService extends (0, utils_1.MedusaService)({
|
|
53
|
+
DeletedRecordsAudit: deleted_records_audit_1.default,
|
|
54
|
+
}) {
|
|
55
|
+
constructor(container) {
|
|
56
|
+
super(container);
|
|
57
|
+
this.manager_ = container.manager;
|
|
58
|
+
}
|
|
59
|
+
toListItem(row) {
|
|
60
|
+
return {
|
|
61
|
+
id: String(row.id),
|
|
62
|
+
table_name: String(row.table_name),
|
|
63
|
+
record_id: asString(row.record_id),
|
|
64
|
+
operation: asString(row.operation) ?? "DELETE",
|
|
65
|
+
occurred_at: asIso(row.occurred_at),
|
|
66
|
+
deleted_by: asString(row.deleted_by),
|
|
67
|
+
source: asString(row.source),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async listAudits(filters) {
|
|
71
|
+
const where = [];
|
|
72
|
+
const params = [];
|
|
73
|
+
const q = filters.q?.trim();
|
|
74
|
+
if (q) {
|
|
75
|
+
where.push(`record_id ILIKE ? ESCAPE '\\'`);
|
|
76
|
+
params.push(`%${escapeLike(q)}%`);
|
|
77
|
+
}
|
|
78
|
+
if (filters.table_names?.length) {
|
|
79
|
+
where.push(`table_name IN (${filters.table_names.map(() => "?").join(", ")})`);
|
|
80
|
+
params.push(...filters.table_names);
|
|
81
|
+
}
|
|
82
|
+
if (filters.date_from) {
|
|
83
|
+
where.push(`occurred_at >= ?`);
|
|
84
|
+
params.push(filters.date_from);
|
|
85
|
+
}
|
|
86
|
+
if (filters.date_to) {
|
|
87
|
+
where.push(`occurred_at <= ?`);
|
|
88
|
+
params.push(filters.date_to);
|
|
89
|
+
}
|
|
90
|
+
if (filters.source) {
|
|
91
|
+
if (filters.source === "unknown") {
|
|
92
|
+
where.push(`source IS NULL`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
where.push(`source = ?`);
|
|
96
|
+
params.push(filters.source);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const deletedBy = filters.deleted_by?.trim();
|
|
100
|
+
if (deletedBy) {
|
|
101
|
+
where.push(`deleted_by ILIKE ? ESCAPE '\\'`);
|
|
102
|
+
params.push(`%${escapeLike(deletedBy)}%`);
|
|
103
|
+
}
|
|
104
|
+
const whereSql = where.length ? `WHERE ${where.join(" AND ")}` : "";
|
|
105
|
+
const knex = this.manager_.getKnex();
|
|
106
|
+
const [listResult, countResult] = await Promise.all([
|
|
107
|
+
knex.raw(`SELECT id, table_name, record_id, operation, occurred_at, deleted_by, source
|
|
108
|
+
FROM deleted_records_audit
|
|
109
|
+
${whereSql}
|
|
110
|
+
ORDER BY occurred_at DESC, id DESC
|
|
111
|
+
LIMIT ? OFFSET ?`, [...params, filters.limit, filters.offset]),
|
|
112
|
+
knex.raw(`SELECT COUNT(*)::int AS count FROM deleted_records_audit ${whereSql}`, params),
|
|
113
|
+
]);
|
|
114
|
+
return {
|
|
115
|
+
audits: rowsOf(listResult).map((row) => this.toListItem(row)),
|
|
116
|
+
count: asNumber(rowsOf(countResult)[0]?.count),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async retrieveAudit(id) {
|
|
120
|
+
const knex = this.manager_.getKnex();
|
|
121
|
+
const result = await knex.raw(`SELECT id, table_name, record_id, operation, old_data, occurred_at, deleted_by, source
|
|
122
|
+
FROM deleted_records_audit
|
|
123
|
+
WHERE id = ?
|
|
124
|
+
LIMIT 1`, [id]);
|
|
125
|
+
const row = rowsOf(result)[0];
|
|
126
|
+
if (!row)
|
|
127
|
+
return null;
|
|
128
|
+
return { ...this.toListItem(row), old_data: asObject(row.old_data) };
|
|
129
|
+
}
|
|
130
|
+
async getStats(options = {}) {
|
|
131
|
+
const knex = this.manager_.getKnex();
|
|
132
|
+
const todayStartSql = options.today_start ? "?::timestamptz" : "date_trunc('day', now())";
|
|
133
|
+
const todayParams = options.today_start ? [options.today_start, options.today_start] : [];
|
|
134
|
+
const [totalsResult, sourcesResult, deletedByResult] = await Promise.all([
|
|
135
|
+
knex.raw(`SELECT
|
|
136
|
+
COUNT(*)::int AS total,
|
|
137
|
+
COUNT(*) FILTER (WHERE occurred_at >= ${todayStartSql})::int AS today,
|
|
138
|
+
COUNT(*) FILTER (WHERE occurred_at >= (${todayStartSql}) - interval '6 days')::int AS last_7_days,
|
|
139
|
+
COUNT(DISTINCT table_name)::int AS tables_affected
|
|
140
|
+
FROM deleted_records_audit`, todayParams),
|
|
141
|
+
knex.raw(`SELECT DISTINCT source FROM deleted_records_audit WHERE source IS NOT NULL ORDER BY source`),
|
|
142
|
+
knex.raw(`SELECT deleted_by FROM deleted_records_audit
|
|
143
|
+
WHERE deleted_by IS NOT NULL
|
|
144
|
+
GROUP BY deleted_by
|
|
145
|
+
ORDER BY MAX(occurred_at) DESC
|
|
146
|
+
LIMIT ?`, [DELETED_BY_OPTIONS_LIMIT]),
|
|
147
|
+
]);
|
|
148
|
+
const totals = rowsOf(totalsResult)[0] ?? {};
|
|
149
|
+
return {
|
|
150
|
+
total: asNumber(totals.total),
|
|
151
|
+
today: asNumber(totals.today),
|
|
152
|
+
last_7_days: asNumber(totals.last_7_days),
|
|
153
|
+
tables_affected: asNumber(totals.tables_affected),
|
|
154
|
+
sources: rowsOf(sourcesResult)
|
|
155
|
+
.map((r) => asString(r.source))
|
|
156
|
+
.filter((s) => Boolean(s)),
|
|
157
|
+
deleted_by: rowsOf(deletedByResult)
|
|
158
|
+
.map((r) => asString(r.deleted_by))
|
|
159
|
+
.filter((s) => Boolean(s)),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.default = DeletedRecordsAuditModuleService;
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RlbGV0ZWQtcmVjb3Jkcy1hdWRpdC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQXlEO0FBRXpELDJGQUFnRTtBQWVoRSxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQTtBQUVwQyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxLQUFjO0lBQzNCLElBQUksS0FBSyxZQUFZLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUN0QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQzlFLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0QsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixJQUFJ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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kZWxldGVkLXJlY29yZHMtYXVkaXQvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|