86 lines
3.0 KiB
Go
86 lines
3.0 KiB
Go
package queue
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
// JobStatus represents the status of a queue job
|
|
type JobStatus string
|
|
|
|
const (
|
|
StatusPending JobStatus = "pending"
|
|
StatusInProgress JobStatus = "in_progress"
|
|
StatusCompleted JobStatus = "completed"
|
|
StatusFailed JobStatus = "failed"
|
|
StatusRetrying JobStatus = "retrying"
|
|
)
|
|
|
|
// DocumentScraperJob represents a document scraping task in the queue
|
|
type DocumentScraperJob struct {
|
|
ID string `json:"id"` // Unique job ID (typically tender ID)
|
|
NoticeID string `json:"notice_id"` // Notice publication ID
|
|
NoticeURL string `json:"notice_url"` // Document URL to scrape
|
|
TenderID string `json:"tender_id,omitempty"` // Associated tender ID from MongoDB
|
|
CreatedAt int64 `json:"created_at"`
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
Attempts int `json:"attempts"`
|
|
MaxRetries int `json:"max_retries"`
|
|
Status string `json:"status"`
|
|
Error string `json:"error,omitempty"`
|
|
NextRetryTime int64 `json:"next_retry_time,omitempty"`
|
|
CompletedAt int64 `json:"completed_at,omitempty"`
|
|
ProcessingStartedAt int64 `json:"processing_started_at,omitempty"`
|
|
}
|
|
|
|
// NewDocumentScraperJob creates a new document scraper job
|
|
func NewDocumentScraperJob(noticeID, noticeURL, tenderID string, maxRetries int) *DocumentScraperJob {
|
|
now := time.Now().Unix()
|
|
return &DocumentScraperJob{
|
|
ID: noticeID,
|
|
NoticeID: noticeID,
|
|
NoticeURL: noticeURL,
|
|
TenderID: tenderID,
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
Attempts: 0,
|
|
MaxRetries: maxRetries,
|
|
Status: string(StatusPending),
|
|
}
|
|
}
|
|
|
|
// ToJSON marshals the job to JSON
|
|
func (j *DocumentScraperJob) ToJSON() (string, error) {
|
|
data, err := json.Marshal(j)
|
|
return string(data), err
|
|
}
|
|
|
|
// FromJSON unmarshals JSON to DocumentScraperJob
|
|
func (j *DocumentScraperJob) FromJSON(data string) error {
|
|
return json.Unmarshal([]byte(data), j)
|
|
}
|
|
|
|
// QueueMetrics represents queue performance metrics
|
|
type QueueMetrics struct {
|
|
TotalJobs int64 `json:"total_jobs"`
|
|
PendingJobs int64 `json:"pending_jobs"`
|
|
InProgressJobs int64 `json:"in_progress_jobs"`
|
|
CompletedJobs int64 `json:"completed_jobs"`
|
|
FailedJobs int64 `json:"failed_jobs"`
|
|
AverageWaitTime time.Duration `json:"average_wait_time"`
|
|
AverageProcessTime time.Duration `json:"average_process_time"`
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
}
|
|
|
|
// JobResult represents the result of a completed job
|
|
type JobResult struct {
|
|
JobID string `json:"job_id"`
|
|
Status string `json:"status"`
|
|
Success bool `json:"success"`
|
|
Error string `json:"error,omitempty"`
|
|
CompletedAt int64 `json:"completed_at"`
|
|
Duration int64 `json:"duration_ms"`
|
|
UploadedCount int `json:"uploaded_count"`
|
|
Details map[string]interface{} `json:"details,omitempty"`
|
|
}
|