@arela/uploader 0.2.12 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.env.template +66 -0
  2. package/.vscode/settings.json +1 -0
  3. package/README.md +134 -58
  4. package/SUPABASE_UPLOAD_FIX.md +157 -0
  5. package/package.json +3 -2
  6. package/scripts/cleanup-ds-store.js +109 -0
  7. package/scripts/cleanup-system-files.js +69 -0
  8. package/scripts/tests/phase-7-features.test.js +415 -0
  9. package/scripts/tests/signal-handling.test.js +275 -0
  10. package/scripts/tests/smart-watch-integration.test.js +554 -0
  11. package/scripts/tests/watch-service-integration.test.js +584 -0
  12. package/src/commands/UploadCommand.js +36 -2
  13. package/src/commands/WatchCommand.js +1305 -0
  14. package/src/config/config.js +113 -0
  15. package/src/document-type-shared.js +2 -0
  16. package/src/document-types/support-document.js +201 -0
  17. package/src/file-detection.js +2 -1
  18. package/src/index.js +44 -0
  19. package/src/services/AdvancedFilterService.js +505 -0
  20. package/src/services/AutoProcessingService.js +639 -0
  21. package/src/services/BenchmarkingService.js +381 -0
  22. package/src/services/DatabaseService.js +723 -170
  23. package/src/services/ErrorMonitor.js +275 -0
  24. package/src/services/LoggingService.js +419 -1
  25. package/src/services/MonitoringService.js +401 -0
  26. package/src/services/PerformanceOptimizer.js +511 -0
  27. package/src/services/ReportingService.js +511 -0
  28. package/src/services/SignalHandler.js +255 -0
  29. package/src/services/SmartWatchDatabaseService.js +527 -0
  30. package/src/services/WatchService.js +783 -0
  31. package/src/services/upload/ApiUploadService.js +30 -4
  32. package/src/services/upload/SupabaseUploadService.js +28 -6
  33. package/src/utils/CleanupManager.js +262 -0
  34. package/src/utils/FileOperations.js +41 -0
  35. package/src/utils/WatchEventHandler.js +517 -0
  36. package/supabase/migrations/001_create_initial_schema.sql +366 -0
  37. package/supabase/migrations/002_align_with_arela_api_schema.sql +145 -0
  38. package/commands.md +0 -6
@@ -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/commands.md DELETED
@@ -1,6 +0,0 @@
1
- node src/index.js --stats-only
2
- node src/index.js --detect-pdfs
3
- node src/index.js --propagate-arela-path
4
- node src/index.js --upload-by-rfc --folder-structure palco
5
-
6
- UPLOAD_RFCS="RFC1|RFC2" node src/index.js --upload-by-rfc --folder-structure target-folder