# Partner DLQ System Architecture Diagrams ## System Overview ```mermaid graph TB subgraph Users Web[Web Dashboard] API[API Client] CLI[CLI Tool] end Web -->|HTTP/REST| Router API -->|HTTP/REST| Router CLI -->|HTTP/REST| Router Router[Express Router
/api/dlq/*] Router --> Auth[Authentication
authAllowAdmin] Auth --> Controller[Partner DLQ Controller
partner_dlq.js] Controller --> RabbitMQ[RabbitMQ DLQ Queue] Controller --> MongoDB[MongoDB Tracker Status] subgraph Background Services Worker[DLQ Handler Worker
partner_dlq_handler.js
- Monitors DLQ
- Auto-processes messages
- Categorizes errors] end Worker -.-> RabbitMQ Worker -.-> MongoDB ``` ## Message Flow ```mermaid flowchart TD Polling[Polling Worker
Downloads] -->|Enqueue Task| Queue[Partner Tasks Queue
partner_tasks] Queue -->|Consume| Sync[Sync Worker
Process] Sync -->|Success| Processed[Status: PROCESSED] Sync -->|Retry < Max| Requeue[Back to Main Queue] Sync -->|Max Retries| DLQ[DLQ - Failed
partner_tasks_failed] DLQ -->|DLQ Handler| Handler{Error Analysis} Handler -->|Transient
Age < 2h| Retry[RETRY
Requeue] Handler -->|Validation
Non-recoverable| Archive1[ARCHIVE
Record] Handler -->|Other
Age > 24h| Archive2[ARCHIVE
Record] ``` ## Error Categorization ```mermaid flowchart TD Failed[Failed Message in DLQ] --> Analyze[Analyze Error Message] Analyze --> Keyword[Keyword Matching] Analyze --> Pattern[Pattern Recognition] Analyze --> Context[Context Analysis] Keyword --> Category[Error Category] Pattern --> Category Context --> Category Category --> Transient[TRANSIENT
• timeout
• network
• connref] Category --> Validation[VALIDATION
• invalid
• missing
• format] Category --> Processing[PROCESSING
• parse
• calc err
• data] Category --> Infrastructure[INFRASTRUCTURE
• database
• fs error
• disk] Category --> PartnerAPI[PARTNER API
• auth
• rate limit] Category --> Unknown[UNKNOWN
• ???] Transient -->|Age < 2h| Retry1[RETRY] Validation --> Archive1[ARCHIVE] Processing --> Keep1[KEEP] Infrastructure -->|Retry w/ backoff| Retry2[RETRY] PartnerAPI -->|Retry w/ delay| Retry3[RETRY] Unknown -->|Manual Review| Keep2[KEEP] ``` ## API Endpoint Structure ```mermaid graph TD Root[/api/dlq/] Root --> Stats[GET /stats] Root --> Messages[GET /messages?limit=50] Root --> Process[POST /process] Root --> RetryAll[POST /:queueName/retryAll] Root --> RetryPos[POST /:queueName/retryByPosition] Root --> RetryHeader[POST /:queueName/retryByHeader] Root --> Purge[DELETE /purge] Stats --> RMQ1[RabbitMQ.checkQueue
messageCount, consumerCount] Stats --> Mongo1[MongoDB.aggregate
status counts] Stats --> Mongo2[MongoDB.find
recent failures] Messages --> RMQ2[RabbitMQ.get noAck=false
Peek & requeue messages] Process --> RMQ3[RabbitMQ.get in loop
Parse message] Process --> Mongo3[MongoDB.findOne
Get error details] Process --> Cat[categorizeError
Determine category] Cat --> Decision{Decision Logic} Decision -->|RETRY| Update1[Update tracker + requeue] Decision -->|ARCHIVE| Update2[Update tracker + ack] Decision -->|KEEP| Requeue[Requeue unchanged] Retry --> Mongo4[MongoDB.findById
Validate tracker] Retry --> Mongo5[MongoDB.updateOne
Reset status to downloaded] Retry --> RMQ4[RabbitMQ.sendToQueue
Enqueue with retry headers] Archive --> Mongo6[MongoDB.updateOne
Set status=archived + metadata] Purge --> Validate[Validate confirm=true] Validate --> RMQ5[RabbitMQ.purgeQueue
Clear all DLQ messages] ``` ## Web Dashboard Architecture ```mermaid graph TD Dashboard[dlq-monitor.html] subgraph HTML Structure Stats[Statistics Grid
6 cards:
DLQ Messages, Failed Tasks
Processing, Downloaded
Processed, Archived] Actions[Actions Section
Refresh, Process DLQ
Dry Run, Purge] Failures[Failures List
Recent 20 failures
Error details, Category badge
Retry/Archive buttons] end %% subgraph CSS Styling %% Gradient[Gradient background] %% Cards[Card layouts Grid] %% Colors[Color coding:
Red=danger, Green=success
Yellow=warning, Blue=info] %% Responsive[Responsive design] %% end subgraph JavaScript Logic Refresh[refreshStats
fetch /api/dlq/partner_tasks/stats] ProcessDLQ[processDLQ dryRun
fetch /api/dlq/partner_tasks/process] RetryAll[retryAll queueName
fetch /api/dlq/:queueName/retryAll] RetryByPos[retryByPosition
fetch /api/dlq/:queueName/retryByPosition] RetryByHeader[retryByHeader
fetch /api/dlq/:queueName/retryByHeader] PurgeDLQ[purgeDLQ
fetch /api/dlq/partner_tasks/purge] Categorize[categorizeError
Pattern matching client-side] AutoRefresh[Auto-refresh 30s
setInterval refreshStats 30000] end Dashboard --> Stats Dashboard --> Actions Dashboard --> Failures Dashboard --> Gradient Dashboard --> Cards Dashboard --> Colors Dashboard --> Responsive Dashboard --> Refresh Dashboard --> ProcessDLQ Dashboard --> RetryTask Dashboard --> ArchiveTask Dashboard --> PurgeDLQ Dashboard --> Categorize Dashboard --> AutoRefresh Refresh -->|Updates| Stats Refresh -->|Populates| Failures ``` ## Data Models ```mermaid erDiagram PartnerLogTracker ||--o{ Partner : "partnerId" PartnerLogTracker ||--o{ Customer : "customerId" PartnerLogTracker { ObjectId _id String logFileName ObjectId partnerId ObjectId customerId String status String errorMessage Number retryCount Date processingStartedAt Date updatedAt Date archivedAt String archivedReason String archivedBy } Partner { String name String code } Customer { String name String email } DLQMessage { Buffer content Object properties Object fields } DLQMessage ||--|| Properties : has DLQMessage ||--|| Fields : has Properties { Date timestamp Object headers String deliveryTag } Fields { String routingKey Boolean redelivered } ``` **Status Values:** - `downloaded` → Initial state - `processing` → Currently being processed - `processed` → Successfully completed - `failed` → Triggers DLQ - `archived` → Manually archived from DLQ **DLQ Message Headers:** - `x-retry-count` - Number of retry attempts - `x-death` - Death information from RabbitMQ - `x-retry-from-dlq` - Flag indicating manual retry ## Security Flow ```mermaid flowchart TD Request[HTTP Request
Header: Authorization Bearer token] Request --> Router[Express Router] Router --> Auth[authAllowAdmin Middleware] Auth --> Verify{Verify JWT token} Verify -->|Invalid| Unauth[401 Unauthorized] Verify -->|Valid| Role{Check Role} Role -->|Admin| Allow[req.user = decoded
Allow access] Role -->|User| Forbid1[403 Forbidden] Role -->|Other| Forbid2[403 Forbidden] Allow --> Controller[Partner DLQ Controller
Authorized Access] ``` --- These diagrams provide a comprehensive visual understanding of the Partner DLQ system architecture, data flow, and component interactions.