Files
tm_back/ted/notice_upsert.go

81 lines
2.2 KiB
Go

package ted
import (
"strconv"
"strings"
"time"
"tm/internal/notice"
)
// noticeNeedsRefresh reports whether incoming scraped data should replace an existing notice row.
func noticeNeedsRefresh(existing, incoming *notice.Notice) bool {
if incoming == nil || existing == nil {
return true
}
if strings.TrimSpace(incoming.ContentXML) != "" &&
strings.TrimSpace(existing.ContentXML) != strings.TrimSpace(incoming.ContentXML) {
return true
}
if normalizePublicationID(existing.NoticePublicationID) != normalizePublicationID(incoming.NoticePublicationID) {
return true
}
if compareNoticeVersions(incoming.NoticeVersion, existing.NoticeVersion) > 0 {
return true
}
return false
}
func normalizePublicationID(s string) string {
return strings.TrimSpace(s)
}
// compareNoticeVersions compares BT-757 notice versions (e.g. "01", "02"). Empty parses as 0.
func compareNoticeVersions(incoming, existing string) int {
vi := parseNoticeVersion(incoming)
ve := parseNoticeVersion(existing)
switch {
case vi > ve:
return 1
case vi < ve:
return -1
default:
return 0
}
}
func parseNoticeVersion(s string) int {
s = strings.TrimSpace(s)
if s == "" {
return 0
}
n, err := strconv.Atoi(s)
if err != nil {
return 0
}
return n
}
// MergeNoticeUpdate replaces scrape-derived fields from src into dst while preserving identity,
// creation time, and optional enrichment metadata already stored on dst.
func MergeNoticeUpdate(dst *notice.Notice, src *notice.Notice) {
preservedID := dst.ID
preservedCreated := dst.CreatedAt
oldEnrichment := dst.ProcessingMetadata.EnrichmentData
oldTranslated := dst.ProcessingMetadata.TranslatedData
oldTranslatedAt := dst.ProcessingMetadata.TranslatedAt
*dst = *src
dst.ID = preservedID
dst.CreatedAt = preservedCreated
dst.UpdatedAt = time.Now().Unix()
dst.ProcessingMetadata.Processed = false
if len(dst.ProcessingMetadata.EnrichmentData) == 0 && len(oldEnrichment) > 0 {
dst.ProcessingMetadata.EnrichmentData = oldEnrichment
}
if len(dst.ProcessingMetadata.TranslatedData) == 0 && len(oldTranslated) > 0 {
dst.ProcessingMetadata.TranslatedData = oldTranslated
dst.ProcessingMetadata.TranslatedAt = oldTranslatedAt
}
}