@arela/uploader 0.2.13 → 1.0.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.
- package/.env.template +66 -0
- package/README.md +263 -62
- package/docs/API_ENDPOINTS_FOR_DETECTION.md +647 -0
- package/docs/QUICK_REFERENCE_API_DETECTION.md +264 -0
- package/docs/REFACTORING_SUMMARY_DETECT_PEDIMENTOS.md +200 -0
- package/package.json +3 -2
- package/scripts/cleanup-ds-store.js +109 -0
- package/scripts/cleanup-system-files.js +69 -0
- package/scripts/tests/phase-7-features.test.js +415 -0
- package/scripts/tests/signal-handling.test.js +275 -0
- package/scripts/tests/smart-watch-integration.test.js +554 -0
- package/scripts/tests/watch-service-integration.test.js +584 -0
- package/src/commands/UploadCommand.js +31 -4
- package/src/commands/WatchCommand.js +1342 -0
- package/src/config/config.js +270 -2
- package/src/document-type-shared.js +2 -0
- package/src/document-types/support-document.js +200 -0
- package/src/file-detection.js +9 -1
- package/src/index.js +163 -4
- package/src/services/AdvancedFilterService.js +505 -0
- package/src/services/AutoProcessingService.js +749 -0
- package/src/services/BenchmarkingService.js +381 -0
- package/src/services/DatabaseService.js +1019 -539
- package/src/services/ErrorMonitor.js +275 -0
- package/src/services/LoggingService.js +419 -1
- package/src/services/MonitoringService.js +401 -0
- package/src/services/PerformanceOptimizer.js +511 -0
- package/src/services/ReportingService.js +511 -0
- package/src/services/SignalHandler.js +255 -0
- package/src/services/SmartWatchDatabaseService.js +527 -0
- package/src/services/WatchService.js +783 -0
- package/src/services/upload/ApiUploadService.js +447 -3
- package/src/services/upload/MultiApiUploadService.js +233 -0
- package/src/services/upload/SupabaseUploadService.js +12 -5
- package/src/services/upload/UploadServiceFactory.js +24 -0
- package/src/utils/CleanupManager.js +262 -0
- package/src/utils/FileOperations.js +44 -0
- package/src/utils/WatchEventHandler.js +522 -0
- package/supabase/migrations/001_create_initial_schema.sql +366 -0
- package/supabase/migrations/002_align_with_arela_api_schema.sql +145 -0
- package/.envbackup +0 -37
- package/SUPABASE_UPLOAD_FIX.md +0 -157
- package/commands.md +0 -14
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
-- Migration: Create Initial Schema for ARELA-UPLOADER
|
|
2
|
+
-- Date: 2025-11-14
|
|
3
|
+
-- Description: Creates all necessary tables for file uploading, watch monitoring, and session tracking
|
|
4
|
+
|
|
5
|
+
-- ============================================================================
|
|
6
|
+
-- Main Uploader Table
|
|
7
|
+
-- Stores metadata about files being uploaded
|
|
8
|
+
-- ============================================================================
|
|
9
|
+
CREATE TABLE IF NOT EXISTS uploader (
|
|
10
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
11
|
+
|
|
12
|
+
-- File Identification
|
|
13
|
+
filename VARCHAR(255) NOT NULL,
|
|
14
|
+
original_path VARCHAR(2048) NOT NULL UNIQUE,
|
|
15
|
+
file_extension VARCHAR(10),
|
|
16
|
+
size BIGINT,
|
|
17
|
+
|
|
18
|
+
-- Document Detection
|
|
19
|
+
document_type VARCHAR(100),
|
|
20
|
+
num_pedimento VARCHAR(50),
|
|
21
|
+
is_like_simplificado BOOLEAN DEFAULT FALSE,
|
|
22
|
+
year INTEGER,
|
|
23
|
+
|
|
24
|
+
-- Upload Status
|
|
25
|
+
status VARCHAR(50) DEFAULT 'stats',
|
|
26
|
+
-- Possible values: 'stats', 'fs-stats', 'detected', 'not-detected',
|
|
27
|
+
-- 'detection-error', 'unsupported', 'ready', 'uploading', 'uploaded', 'failed'
|
|
28
|
+
|
|
29
|
+
-- Upload Details
|
|
30
|
+
arela_path VARCHAR(2048),
|
|
31
|
+
rfc VARCHAR(13),
|
|
32
|
+
message TEXT,
|
|
33
|
+
|
|
34
|
+
-- Timestamps
|
|
35
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
36
|
+
modified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
37
|
+
uploaded_at TIMESTAMP,
|
|
38
|
+
|
|
39
|
+
-- Metadata
|
|
40
|
+
metadata JSONB
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
-- Indexes for uploader table
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_uploader_status ON uploader(status);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_uploader_rfc ON uploader(rfc);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_uploader_year ON uploader(year);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_uploader_document_type ON uploader(document_type);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_uploader_original_path ON uploader(original_path);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_uploader_created_at ON uploader(created_at);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_uploader_num_pedimento ON uploader(num_pedimento);
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
-- ============================================================================
|
|
54
|
+
-- Watch Sessions Table
|
|
55
|
+
-- Tracks individual watch monitoring sessions
|
|
56
|
+
-- ============================================================================
|
|
57
|
+
CREATE TABLE IF NOT EXISTS watch_sessions (
|
|
58
|
+
id VARCHAR(36) PRIMARY KEY,
|
|
59
|
+
|
|
60
|
+
-- Session Metadata
|
|
61
|
+
user_id VARCHAR(255),
|
|
62
|
+
start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
63
|
+
end_time TIMESTAMP,
|
|
64
|
+
|
|
65
|
+
-- Session Status
|
|
66
|
+
status VARCHAR(20) DEFAULT 'active',
|
|
67
|
+
-- Possible values: 'active', 'paused', 'completed', 'error', 'interrupted'
|
|
68
|
+
|
|
69
|
+
-- Statistics
|
|
70
|
+
total_uploads INTEGER DEFAULT 0,
|
|
71
|
+
total_retries INTEGER DEFAULT 0,
|
|
72
|
+
total_files_processed INTEGER DEFAULT 0,
|
|
73
|
+
total_errors INTEGER DEFAULT 0,
|
|
74
|
+
|
|
75
|
+
-- Timestamps
|
|
76
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
77
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
78
|
+
|
|
79
|
+
-- Metadata
|
|
80
|
+
metadata JSONB
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
-- Indexes for watch_sessions table
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_watch_sessions_status ON watch_sessions(status);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_watch_sessions_start_time ON watch_sessions(start_time);
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_watch_sessions_user_id ON watch_sessions(user_id);
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
-- ============================================================================
|
|
90
|
+
-- Watch Uploads Table
|
|
91
|
+
-- Records individual upload events in watch mode
|
|
92
|
+
-- ============================================================================
|
|
93
|
+
CREATE TABLE IF NOT EXISTS watch_uploads (
|
|
94
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
95
|
+
|
|
96
|
+
-- Session Reference
|
|
97
|
+
session_id VARCHAR(36) NOT NULL,
|
|
98
|
+
|
|
99
|
+
-- Upload Details
|
|
100
|
+
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
101
|
+
strategy VARCHAR(20) NOT NULL,
|
|
102
|
+
-- Possible values: 'individual', 'batch', 'full-structure'
|
|
103
|
+
|
|
104
|
+
-- Statistics
|
|
105
|
+
file_count INTEGER NOT NULL DEFAULT 0,
|
|
106
|
+
success_count INTEGER NOT NULL DEFAULT 0,
|
|
107
|
+
failure_count INTEGER NOT NULL DEFAULT 0,
|
|
108
|
+
retry_count INTEGER NOT NULL DEFAULT 0,
|
|
109
|
+
duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
110
|
+
|
|
111
|
+
-- Status
|
|
112
|
+
status VARCHAR(20) DEFAULT 'completed',
|
|
113
|
+
-- Possible values: 'pending', 'in-progress', 'completed', 'failed', 'partial'
|
|
114
|
+
|
|
115
|
+
-- File References
|
|
116
|
+
file_paths TEXT ARRAY,
|
|
117
|
+
|
|
118
|
+
-- Timestamps
|
|
119
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
120
|
+
|
|
121
|
+
-- Metadata
|
|
122
|
+
metadata JSONB,
|
|
123
|
+
|
|
124
|
+
-- Constraints
|
|
125
|
+
CONSTRAINT fk_watch_uploads_session
|
|
126
|
+
FOREIGN KEY (session_id) REFERENCES watch_sessions(id) ON DELETE CASCADE
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
-- Indexes for watch_uploads table
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_watch_uploads_session_id ON watch_uploads(session_id);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_watch_uploads_timestamp ON watch_uploads(timestamp);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_watch_uploads_strategy ON watch_uploads(strategy);
|
|
133
|
+
CREATE INDEX IF NOT EXISTS idx_watch_uploads_status ON watch_uploads(status);
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
-- ============================================================================
|
|
137
|
+
-- Watch Events Table
|
|
138
|
+
-- Records detailed events during upload operations (retries, errors, warnings)
|
|
139
|
+
-- ============================================================================
|
|
140
|
+
CREATE TABLE IF NOT EXISTS watch_events (
|
|
141
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
142
|
+
|
|
143
|
+
-- Session and Upload References
|
|
144
|
+
upload_event_id UUID,
|
|
145
|
+
session_id VARCHAR(36) NOT NULL,
|
|
146
|
+
|
|
147
|
+
-- Event Details
|
|
148
|
+
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
149
|
+
type VARCHAR(20) NOT NULL,
|
|
150
|
+
-- Possible values: 'retry', 'error', 'warning', 'info', 'success', 'timeout'
|
|
151
|
+
|
|
152
|
+
-- Retry Information
|
|
153
|
+
attempt_number INTEGER,
|
|
154
|
+
backoff_ms INTEGER DEFAULT 0,
|
|
155
|
+
|
|
156
|
+
-- Error Details
|
|
157
|
+
error_message VARCHAR(500),
|
|
158
|
+
error_code VARCHAR(50),
|
|
159
|
+
stack_trace TEXT,
|
|
160
|
+
|
|
161
|
+
-- File Information
|
|
162
|
+
file_path VARCHAR(2048),
|
|
163
|
+
file_name VARCHAR(255),
|
|
164
|
+
|
|
165
|
+
-- Timestamps
|
|
166
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
167
|
+
|
|
168
|
+
-- Metadata
|
|
169
|
+
metadata JSONB,
|
|
170
|
+
|
|
171
|
+
-- Constraints
|
|
172
|
+
CONSTRAINT fk_watch_events_upload
|
|
173
|
+
FOREIGN KEY (upload_event_id) REFERENCES watch_uploads(id) ON DELETE CASCADE,
|
|
174
|
+
CONSTRAINT fk_watch_events_session
|
|
175
|
+
FOREIGN KEY (session_id) REFERENCES watch_sessions(id) ON DELETE CASCADE
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
-- Indexes for watch_events table
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_watch_events_upload_id ON watch_events(upload_event_id);
|
|
180
|
+
CREATE INDEX IF NOT EXISTS idx_watch_events_session_id ON watch_events(session_id);
|
|
181
|
+
CREATE INDEX IF NOT EXISTS idx_watch_events_timestamp ON watch_events(timestamp);
|
|
182
|
+
CREATE INDEX IF NOT EXISTS idx_watch_events_type ON watch_events(type);
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
-- ============================================================================
|
|
186
|
+
-- Upload Logs Table
|
|
187
|
+
-- Maintains detailed logs of all upload operations for debugging and analytics
|
|
188
|
+
-- ============================================================================
|
|
189
|
+
CREATE TABLE IF NOT EXISTS upload_logs (
|
|
190
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
191
|
+
|
|
192
|
+
-- Session Reference
|
|
193
|
+
session_id VARCHAR(36),
|
|
194
|
+
|
|
195
|
+
-- Upload Reference
|
|
196
|
+
upload_event_id UUID,
|
|
197
|
+
|
|
198
|
+
-- File Information
|
|
199
|
+
file_path VARCHAR(2048),
|
|
200
|
+
file_name VARCHAR(255),
|
|
201
|
+
file_size BIGINT,
|
|
202
|
+
|
|
203
|
+
-- Log Details
|
|
204
|
+
log_level VARCHAR(20),
|
|
205
|
+
-- Possible values: 'debug', 'info', 'warn', 'error', 'fatal'
|
|
206
|
+
|
|
207
|
+
message TEXT NOT NULL,
|
|
208
|
+
details TEXT,
|
|
209
|
+
|
|
210
|
+
-- Timestamps
|
|
211
|
+
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
212
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
213
|
+
|
|
214
|
+
-- Metadata
|
|
215
|
+
metadata JSONB
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
-- Indexes for upload_logs table
|
|
219
|
+
CREATE INDEX IF NOT EXISTS idx_upload_logs_session_id ON upload_logs(session_id);
|
|
220
|
+
CREATE INDEX IF NOT EXISTS idx_upload_logs_upload_event_id ON upload_logs(upload_event_id);
|
|
221
|
+
CREATE INDEX IF NOT EXISTS idx_upload_logs_timestamp ON upload_logs(timestamp);
|
|
222
|
+
CREATE INDEX IF NOT EXISTS idx_upload_logs_log_level ON upload_logs(log_level);
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
-- ============================================================================
|
|
226
|
+
-- Performance Metrics Table
|
|
227
|
+
-- Tracks performance metrics for optimization and monitoring
|
|
228
|
+
-- ============================================================================
|
|
229
|
+
CREATE TABLE IF NOT EXISTS performance_metrics (
|
|
230
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
231
|
+
|
|
232
|
+
-- Session Reference
|
|
233
|
+
session_id VARCHAR(36),
|
|
234
|
+
|
|
235
|
+
-- Metric Information
|
|
236
|
+
metric_name VARCHAR(100) NOT NULL,
|
|
237
|
+
metric_value NUMERIC NOT NULL,
|
|
238
|
+
metric_unit VARCHAR(50),
|
|
239
|
+
|
|
240
|
+
-- Context
|
|
241
|
+
operation VARCHAR(100),
|
|
242
|
+
file_path VARCHAR(2048),
|
|
243
|
+
|
|
244
|
+
-- Timestamps
|
|
245
|
+
recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
246
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
247
|
+
|
|
248
|
+
-- Metadata
|
|
249
|
+
metadata JSONB
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
-- Indexes for performance_metrics table
|
|
253
|
+
CREATE INDEX IF NOT EXISTS idx_performance_metrics_session_id ON performance_metrics(session_id);
|
|
254
|
+
CREATE INDEX IF NOT EXISTS idx_performance_metrics_metric_name ON performance_metrics(metric_name);
|
|
255
|
+
CREATE INDEX IF NOT EXISTS idx_performance_metrics_recorded_at ON performance_metrics(recorded_at);
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
-- ============================================================================
|
|
259
|
+
-- Error Tracking Table
|
|
260
|
+
-- Centralized tracking of all errors for debugging and monitoring
|
|
261
|
+
-- ============================================================================
|
|
262
|
+
CREATE TABLE IF NOT EXISTS error_tracking (
|
|
263
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
264
|
+
|
|
265
|
+
-- Error Information
|
|
266
|
+
error_code VARCHAR(50),
|
|
267
|
+
error_type VARCHAR(100) NOT NULL,
|
|
268
|
+
error_message TEXT NOT NULL,
|
|
269
|
+
stack_trace TEXT,
|
|
270
|
+
|
|
271
|
+
-- Context
|
|
272
|
+
session_id VARCHAR(36),
|
|
273
|
+
file_path VARCHAR(2048),
|
|
274
|
+
operation VARCHAR(100),
|
|
275
|
+
|
|
276
|
+
-- Severity
|
|
277
|
+
severity VARCHAR(20) DEFAULT 'error',
|
|
278
|
+
-- Possible values: 'warning', 'error', 'critical'
|
|
279
|
+
|
|
280
|
+
-- Status
|
|
281
|
+
resolved BOOLEAN DEFAULT FALSE,
|
|
282
|
+
resolution_notes TEXT,
|
|
283
|
+
|
|
284
|
+
-- Timestamps
|
|
285
|
+
occurred_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
286
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
287
|
+
resolved_at TIMESTAMP,
|
|
288
|
+
|
|
289
|
+
-- Metadata
|
|
290
|
+
metadata JSONB
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
-- Indexes for error_tracking table
|
|
294
|
+
CREATE INDEX IF NOT EXISTS idx_error_tracking_session_id ON error_tracking(session_id);
|
|
295
|
+
CREATE INDEX IF NOT EXISTS idx_error_tracking_error_type ON error_tracking(error_type);
|
|
296
|
+
CREATE INDEX IF NOT EXISTS idx_error_tracking_severity ON error_tracking(severity);
|
|
297
|
+
CREATE INDEX IF NOT EXISTS idx_error_tracking_occurred_at ON error_tracking(occurred_at);
|
|
298
|
+
CREATE INDEX IF NOT EXISTS idx_error_tracking_resolved ON error_tracking(resolved);
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
-- ============================================================================
|
|
302
|
+
-- Enable RLS (Row Level Security) - Optional but recommended for multi-tenant apps
|
|
303
|
+
-- ============================================================================
|
|
304
|
+
-- ALTER TABLE uploader ENABLE ROW LEVEL SECURITY;
|
|
305
|
+
-- ALTER TABLE watch_sessions ENABLE ROW LEVEL SECURITY;
|
|
306
|
+
-- ALTER TABLE watch_uploads ENABLE ROW LEVEL SECURITY;
|
|
307
|
+
-- ALTER TABLE watch_events ENABLE ROW LEVEL SECURITY;
|
|
308
|
+
-- ALTER TABLE upload_logs ENABLE ROW LEVEL SECURITY;
|
|
309
|
+
-- ALTER TABLE performance_metrics ENABLE ROW LEVEL SECURITY;
|
|
310
|
+
-- ALTER TABLE error_tracking ENABLE ROW LEVEL SECURITY;
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
-- ============================================================================
|
|
314
|
+
-- Cleanup Scripts (Optional)
|
|
315
|
+
-- ============================================================================
|
|
316
|
+
-- These functions can be used for automated cleanup of old data
|
|
317
|
+
|
|
318
|
+
CREATE OR REPLACE FUNCTION cleanup_old_sessions(days_to_keep INTEGER DEFAULT 30)
|
|
319
|
+
RETURNS void AS $$
|
|
320
|
+
BEGIN
|
|
321
|
+
DELETE FROM watch_sessions
|
|
322
|
+
WHERE status = 'completed'
|
|
323
|
+
AND end_time < CURRENT_TIMESTAMP - (days_to_keep || ' days')::INTERVAL;
|
|
324
|
+
END;
|
|
325
|
+
$$ LANGUAGE plpgsql;
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
CREATE OR REPLACE FUNCTION cleanup_old_logs(days_to_keep INTEGER DEFAULT 30)
|
|
329
|
+
RETURNS void AS $$
|
|
330
|
+
BEGIN
|
|
331
|
+
DELETE FROM upload_logs
|
|
332
|
+
WHERE created_at < CURRENT_TIMESTAMP - (days_to_keep || ' days')::INTERVAL;
|
|
333
|
+
END;
|
|
334
|
+
$$ LANGUAGE plpgsql;
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
CREATE OR REPLACE FUNCTION update_modified_timestamp()
|
|
338
|
+
RETURNS TRIGGER AS $$
|
|
339
|
+
BEGIN
|
|
340
|
+
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
341
|
+
RETURN NEW;
|
|
342
|
+
END;
|
|
343
|
+
$$ LANGUAGE plpgsql;
|
|
344
|
+
|
|
345
|
+
-- Apply trigger to tables that have updated_at
|
|
346
|
+
CREATE TRIGGER update_uploader_timestamp
|
|
347
|
+
BEFORE UPDATE ON uploader
|
|
348
|
+
FOR EACH ROW
|
|
349
|
+
EXECUTE FUNCTION update_modified_timestamp();
|
|
350
|
+
|
|
351
|
+
CREATE TRIGGER update_watch_sessions_timestamp
|
|
352
|
+
BEFORE UPDATE ON watch_sessions
|
|
353
|
+
FOR EACH ROW
|
|
354
|
+
EXECUTE FUNCTION update_modified_timestamp();
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
-- ============================================================================
|
|
358
|
+
-- Grant Permissions (Optional - adjust based on your security requirements)
|
|
359
|
+
-- ============================================================================
|
|
360
|
+
-- GRANT SELECT, INSERT, UPDATE ON uploader TO public;
|
|
361
|
+
-- GRANT SELECT, INSERT, UPDATE ON watch_sessions TO public;
|
|
362
|
+
-- GRANT SELECT, INSERT, UPDATE ON watch_uploads TO public;
|
|
363
|
+
-- GRANT SELECT, INSERT ON watch_events TO public;
|
|
364
|
+
-- GRANT SELECT, INSERT ON upload_logs TO public;
|
|
365
|
+
-- GRANT SELECT, INSERT ON performance_metrics TO public;
|
|
366
|
+
-- GRANT SELECT, INSERT ON error_tracking TO public;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
-- Migration: Align arela-uploader schema with arela-api (BaseEntity + Queue Monitor)
|
|
2
|
+
-- Date: 2025-11-16
|
|
3
|
+
-- Description: Add missing columns, rename timestamps to match BaseEntity, create proper indexes
|
|
4
|
+
|
|
5
|
+
-- ============================================================================
|
|
6
|
+
-- Step 1: Ensure columns exist (idempotent - won't fail if they already exist)
|
|
7
|
+
-- ============================================================================
|
|
8
|
+
|
|
9
|
+
-- Convert created_at to TIMESTAMP WITH TIME ZONE (match BaseEntity)
|
|
10
|
+
DO $$
|
|
11
|
+
BEGIN
|
|
12
|
+
IF EXISTS(SELECT 1 FROM information_schema.columns
|
|
13
|
+
WHERE table_name='uploader' AND column_name='created_at')
|
|
14
|
+
THEN
|
|
15
|
+
ALTER TABLE uploader ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE USING created_at AT TIME ZONE 'UTC';
|
|
16
|
+
ALTER TABLE uploader ALTER COLUMN created_at SET DEFAULT CURRENT_TIMESTAMP;
|
|
17
|
+
END IF;
|
|
18
|
+
END $$;
|
|
19
|
+
|
|
20
|
+
-- Add updated_at if it doesn't exist (replaces modified_at from old schema)
|
|
21
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP;
|
|
22
|
+
|
|
23
|
+
-- Add soft delete column (from BaseEntity)
|
|
24
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
|
|
25
|
+
|
|
26
|
+
-- Add audit columns (from BaseEntity)
|
|
27
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS created_by VARCHAR(255);
|
|
28
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS updated_by VARCHAR(255);
|
|
29
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS deleted_by VARCHAR(255);
|
|
30
|
+
|
|
31
|
+
-- Add seq (auto-increment for display order - from BaseEntity)
|
|
32
|
+
-- Note: seq will be auto-populated by TypeORM's @Generated('increment')
|
|
33
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS seq INTEGER;
|
|
34
|
+
|
|
35
|
+
-- Add queue/processing related columns
|
|
36
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS processing_status VARCHAR(50) NOT NULL DEFAULT 'PENDING';
|
|
37
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS depends_on_path TEXT;
|
|
38
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS pedimento_detected_at TIMESTAMP;
|
|
39
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS upload_attempts INTEGER NOT NULL DEFAULT 0;
|
|
40
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS last_error TEXT;
|
|
41
|
+
ALTER TABLE uploader ADD COLUMN IF NOT EXISTS file_order INTEGER;
|
|
42
|
+
|
|
43
|
+
-- Fix data types to match schema (PostgreSQL)
|
|
44
|
+
DO $$
|
|
45
|
+
BEGIN
|
|
46
|
+
ALTER TABLE uploader ALTER COLUMN filename TYPE TEXT;
|
|
47
|
+
EXCEPTION WHEN OTHERS THEN NULL;
|
|
48
|
+
END $$;
|
|
49
|
+
|
|
50
|
+
DO $$
|
|
51
|
+
BEGIN
|
|
52
|
+
ALTER TABLE uploader ALTER COLUMN original_path TYPE TEXT;
|
|
53
|
+
EXCEPTION WHEN OTHERS THEN NULL;
|
|
54
|
+
END $$;
|
|
55
|
+
|
|
56
|
+
DO $$
|
|
57
|
+
BEGIN
|
|
58
|
+
ALTER TABLE uploader ALTER COLUMN arela_path TYPE TEXT;
|
|
59
|
+
EXCEPTION WHEN OTHERS THEN NULL;
|
|
60
|
+
END $$;
|
|
61
|
+
|
|
62
|
+
DO $$
|
|
63
|
+
BEGIN
|
|
64
|
+
ALTER TABLE uploader ALTER COLUMN file_extension TYPE VARCHAR(30);
|
|
65
|
+
EXCEPTION WHEN OTHERS THEN NULL;
|
|
66
|
+
END $$;
|
|
67
|
+
|
|
68
|
+
DO $$
|
|
69
|
+
BEGIN
|
|
70
|
+
ALTER TABLE uploader ALTER COLUMN rfc TYPE VARCHAR(30);
|
|
71
|
+
EXCEPTION WHEN OTHERS THEN NULL;
|
|
72
|
+
END $$;
|
|
73
|
+
|
|
74
|
+
DO $$
|
|
75
|
+
BEGIN
|
|
76
|
+
ALTER TABLE uploader ALTER COLUMN document_type TYPE VARCHAR(256);
|
|
77
|
+
EXCEPTION WHEN OTHERS THEN NULL;
|
|
78
|
+
END $$;
|
|
79
|
+
|
|
80
|
+
DO $$
|
|
81
|
+
BEGIN
|
|
82
|
+
ALTER TABLE uploader ALTER COLUMN size TYPE NUMERIC;
|
|
83
|
+
EXCEPTION WHEN OTHERS THEN NULL;
|
|
84
|
+
END $$;
|
|
85
|
+
|
|
86
|
+
-- ============================================================================
|
|
87
|
+
-- Step 2: Create/Update Indexes (match arela-api schema exactly)
|
|
88
|
+
-- ============================================================================
|
|
89
|
+
|
|
90
|
+
-- Unique index on original_path
|
|
91
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "IDX_b9e1e6885fffe886a09d5b94be" ON uploader(original_path);
|
|
92
|
+
|
|
93
|
+
-- Composite indexes for common query patterns
|
|
94
|
+
CREATE INDEX IF NOT EXISTS "IDX_75541ccf793dc13fbaf3fb43be" ON uploader(status, file_extension);
|
|
95
|
+
CREATE INDEX IF NOT EXISTS "IDX_151b34d21e0a7d8f9e6c7d2f67" ON uploader(file_extension);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS "IDX_cb4f73612a275f1b561044fa5d" ON uploader(num_pedimento);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS "IDX_778b0d7e1fa6ef549b63adf1cd" ON uploader(status);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS "IDX_f82df9c75e54eee33bca87c977" ON uploader(rfc);
|
|
99
|
+
CREATE INDEX IF NOT EXISTS "IDX_33560ea61a522a949bcfa87844" ON uploader(rfc, arela_path);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS "IDX_d896431e5a737baf88e328029a" ON uploader(rfc, num_pedimento);
|
|
101
|
+
CREATE INDEX IF NOT EXISTS "IDX_9b857c099b53cb010e0c11f4ce" ON uploader(arela_path);
|
|
102
|
+
CREATE INDEX IF NOT EXISTS "IDX_743fb9d6f62296e58856ef65b8" ON uploader(year);
|
|
103
|
+
|
|
104
|
+
-- Processing status indexes (for arela-api queue monitor)
|
|
105
|
+
CREATE INDEX IF NOT EXISTS "IDX_322a218380879cac432274bdf6" ON uploader(processing_status, created_at);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS "IDX_46dfb9f259182be2bda72b36c6" ON uploader(created_at);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS "IDX_ebf662fa6711846fb0c2bb1e6b" ON uploader(processing_status, depends_on_path);
|
|
108
|
+
CREATE INDEX IF NOT EXISTS "IDX_9df55a168a5430fb2ad2abac78" ON uploader(depends_on_path);
|
|
109
|
+
CREATE INDEX IF NOT EXISTS "IDX_093aff5c97826ac35184ccb095" ON uploader(processing_status);
|
|
110
|
+
|
|
111
|
+
-- ============================================================================
|
|
112
|
+
-- Step 3: Remove unused tables that were creating confusion
|
|
113
|
+
-- ============================================================================
|
|
114
|
+
|
|
115
|
+
-- These tables were created but never used in either application
|
|
116
|
+
DROP TABLE IF EXISTS error_tracking CASCADE;
|
|
117
|
+
DROP TABLE IF EXISTS upload_logs CASCADE;
|
|
118
|
+
DROP TABLE IF EXISTS performance_metrics CASCADE;
|
|
119
|
+
DROP TABLE IF EXISTS watch_sessions CASCADE;
|
|
120
|
+
|
|
121
|
+
-- ============================================================================
|
|
122
|
+
-- Step 4: Documentation / Schema Comments
|
|
123
|
+
-- ============================================================================
|
|
124
|
+
|
|
125
|
+
COMMENT ON TABLE uploader IS 'File upload tracking table shared between arela-uploader and arela-api';
|
|
126
|
+
|
|
127
|
+
COMMENT ON COLUMN uploader.status IS 'Internal arela-uploader status (detection lifecycle): stats, detected, detection-error, unsupported, etc';
|
|
128
|
+
|
|
129
|
+
COMMENT ON COLUMN uploader.processing_status IS 'API processing status (queue/upload lifecycle): PENDING, READY_TO_UPLOAD, PROCESSING, UPLOADED, FAILED';
|
|
130
|
+
|
|
131
|
+
COMMENT ON COLUMN uploader.upload_attempts IS 'Number of upload attempts made by arela-api';
|
|
132
|
+
|
|
133
|
+
COMMENT ON COLUMN uploader.last_error IS 'Last error message from upload attempt';
|
|
134
|
+
|
|
135
|
+
COMMENT ON COLUMN uploader.depends_on_path IS 'File path this record depends on (e.g., pedimento path for related files)';
|
|
136
|
+
|
|
137
|
+
COMMENT ON COLUMN uploader.pedimento_detected_at IS 'Timestamp when pedimento simplificado was detected';
|
|
138
|
+
|
|
139
|
+
COMMENT ON COLUMN uploader.created_by IS 'User who created the record (audit)';
|
|
140
|
+
|
|
141
|
+
COMMENT ON COLUMN uploader.updated_by IS 'User who last updated the record (audit)';
|
|
142
|
+
|
|
143
|
+
COMMENT ON COLUMN uploader.deleted_by IS 'User who soft-deleted the record (audit)';
|
|
144
|
+
|
|
145
|
+
COMMENT ON COLUMN uploader.file_order IS 'Order for display/processing (when null, uses created_at order)';
|
package/.envbackup
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# SUPABASE_URL=https://supabase.prod.app.trader-docs.com
|
|
2
|
-
# SUPABASE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaXNzIjoic3VwYWJhc2UiLCJpYXQiOjE3NDU3MzM2MDAsImV4cCI6MTkwMzUwMDAwMH0.eAoXvaBZzZa31txItwEkoLnplWG10ee-U5GMc265xwk
|
|
3
|
-
# SUPABASE_BUCKET=sample
|
|
4
|
-
|
|
5
|
-
# PATH_VARS=o:/ExpedienteElectronicko/expediente/archivos/:rfcPatente/:patente-:aduana/:year/:pedimento/ALSJDKHF ASD,KFHJA SDFK,ASLDKJFH
|
|
6
|
-
|
|
7
|
-
SUPABASE_URL=http://127.0.0.1:54321
|
|
8
|
-
SUPABASE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU
|
|
9
|
-
SUPABASE_BUCKET=arela
|
|
10
|
-
|
|
11
|
-
# Arela API Configuration
|
|
12
|
-
ARELA_API_URL=http://localhost:3010
|
|
13
|
-
ARELA_API_TOKEN=f0608f83e5faa4c6be32c19975635c4e9012b31f7249a9f0a9270f54d74ec599
|
|
14
|
-
|
|
15
|
-
# Upload Configuration
|
|
16
|
-
UPLOAD_BASE_PATH=./sample
|
|
17
|
-
UPLOAD_SOURCES=2023|2024
|
|
18
|
-
|
|
19
|
-
# RFC Upload Configuration
|
|
20
|
-
# Pipe-separated list of RFCs to upload files for
|
|
21
|
-
# Example: MMJ0810145N1|ABC1234567XY|DEF9876543ZZ
|
|
22
|
-
UPLOAD_RFCS=AKS151005E46|IMS030409FZ0|RDG1107154L7|SHP031226BV2|CSM9301219B4|LIN960124HT8|LME971009SW4|AKM9707151B6|FEL000822AG2|FDM060802J54|MTM9807279B4|AUM9207011CA|MMJ0810145N1|ACC010328EQ6|PED781129JT6|CAD890407NK7|SME140411IK7|JME1903121C2|EIJ110429NF9|PTJ080414TM6|TME050503BM4
|
|
23
|
-
|
|
24
|
-
# AKS151005E46|IMS030409FZ0|RDG1107154L7|SHP031226BV2|CSM9301219B4|LIN960124HT8|LME971009SW4|AKM9707151B6|FEL000822AG2|PTJ080414TM6|TME050503BM4
|
|
25
|
-
# FDM060802J54|MTM9807279B4|AUM9207011CA|MMJ0810145N1|ACC010328EQ6|PED781129JT6|CAD890407NK7|SME140411IK7|JME1903121C2|EIJ110429NF9
|
|
26
|
-
|
|
27
|
-
# Logging and Verbosity
|
|
28
|
-
VERBOSE_LOGGING=true # Disable verbose path logging for better performance
|
|
29
|
-
BATCH_DELAY=50 # Reduce delay between batches (default: 100ms)
|
|
30
|
-
PROGRESS_UPDATE_INTERVAL=20 # Update progress every 20 items (default: 10)
|
|
31
|
-
|
|
32
|
-
# Log Buffering
|
|
33
|
-
LOG_BUFFER_SIZE=200 # Increase buffer size for fewer I/O ops (default: 100)
|
|
34
|
-
LOG_FLUSH_INTERVAL=3000 # Flush logs every 3 seconds (default: 5000ms)
|
|
35
|
-
|
|
36
|
-
# Example for maximum performance
|
|
37
|
-
# VERBOSE_LOGGING=false BATCH_DELAY=25 LOG_BUFFER_SIZE=500 arela --stats-only /path/to/files
|