Document scraper integration field fix
This commit is contained in:
@@ -2,9 +2,7 @@ package document_scraper
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"tm/internal/notice"
|
||||
"tm/internal/tender"
|
||||
"tm/pkg/logger"
|
||||
"tm/pkg/response"
|
||||
@@ -21,84 +19,32 @@ type Service interface {
|
||||
|
||||
type service struct {
|
||||
tenderRepo tender.TenderRepository
|
||||
noticeRepo notice.Repository
|
||||
tedParser *ted.TEDParser
|
||||
logger logger.Logger
|
||||
}
|
||||
|
||||
// NewService creates a new document scraper service
|
||||
func NewService(tenderRepo tender.TenderRepository, noticeRepo notice.Repository, logger logger.Logger) Service {
|
||||
func NewService(tenderRepo tender.TenderRepository, logger logger.Logger) Service {
|
||||
return &service{
|
||||
tenderRepo: tenderRepo,
|
||||
noticeRepo: noticeRepo,
|
||||
tedParser: ted.NewTEDParser(),
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// parseXMLToJSON converts raw XML content into a structured JSON object
|
||||
func (s *service) parseXMLToJSON(xmlContent string) interface{} {
|
||||
if xmlContent == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
parsedDoc, _, _, err := s.tedParser.ParseXML([]byte(xmlContent))
|
||||
if err != nil {
|
||||
s.logger.Warn("Failed to parse XML to JSON, returning raw XML string", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return xmlContent
|
||||
}
|
||||
|
||||
// Convert to a generic map to clean up the JSON output
|
||||
jsonBytes, err := json.Marshal(parsedDoc)
|
||||
if err != nil {
|
||||
s.logger.Warn("Failed to marshal parsed XML to JSON, returning raw XML string", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return xmlContent
|
||||
}
|
||||
|
||||
var result interface{}
|
||||
if err := json.Unmarshal(jsonBytes, &result); err != nil {
|
||||
s.logger.Warn("Failed to unmarshal parsed XML, returning raw XML string", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return xmlContent
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// buildTenderResponse creates a DocumentScraperTenderResponse from a tender and its notice
|
||||
func (s *service) buildTenderResponse(ctx context.Context, t *tender.Tender) *DocumentScraperTenderResponse {
|
||||
parsedXML := interface{}(nil)
|
||||
// buildTenderResponse creates a DocumentScraperTenderResponse from a tender
|
||||
func (s *service) buildTenderResponse(_ context.Context, t *tender.Tender) *DocumentScraperTenderResponse {
|
||||
documentURL := t.DocumentURI
|
||||
if documentURL == "" {
|
||||
documentURL = t.TenderURL
|
||||
}
|
||||
|
||||
// Try to get the parsed XML from the corresponding notice
|
||||
n, err := s.noticeRepo.GetByContractNoticeID(ctx, t.ContractNoticeID)
|
||||
if err != nil {
|
||||
s.logger.Warn("Failed to get notice for parsed XML", map[string]interface{}{
|
||||
"contract_notice_id": t.ContractNoticeID,
|
||||
"error": err.Error(),
|
||||
})
|
||||
} else if n != nil {
|
||||
parsedXML = s.parseXMLToJSON(n.ContentXML)
|
||||
if documentURL == "" {
|
||||
documentURL = n.DocumentURI
|
||||
}
|
||||
}
|
||||
|
||||
return &DocumentScraperTenderResponse{
|
||||
ID: t.ID.Hex(),
|
||||
NoticePublicationID: t.NoticePublicationID,
|
||||
DocumentURL: documentURL,
|
||||
Title: t.Title,
|
||||
Description: t.Description,
|
||||
ParsedXML: parsedXML,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user