package sync import ( "fmt" "log/slog" "time" ) // SeenPartnumber represents an unresolved vendor partnumber to report. type SeenPartnumber struct { Partnumber string Description string } // PushPartnumberSeen inserts unresolved vendor partnumbers into qt_vendor_partnumber_seen on MariaDB. // Uses INSERT ... ON DUPLICATE KEY UPDATE so existing rows are updated (last_seen_at) without error. func (s *Service) PushPartnumberSeen(items []SeenPartnumber) error { if len(items) == 0 { return nil } mariaDB, err := s.getDB() if err != nil { return fmt.Errorf("database not available: %w", err) } now := time.Now().UTC() for _, item := range items { if item.Partnumber == "" { continue } err := mariaDB.Exec(` INSERT INTO qt_vendor_partnumber_seen (source_type, vendor, partnumber, description, last_seen_at) VALUES ('manual', '', ?, ?, ?) ON DUPLICATE KEY UPDATE last_seen_at = VALUES(last_seen_at), description = COALESCE(NULLIF(VALUES(description), ''), description) `, item.Partnumber, item.Description, now).Error if err != nil { slog.Error("failed to upsert partnumber_seen", "partnumber", item.Partnumber, "error", err) // Continue with remaining items } } slog.Info("partnumber_seen pushed to server", "count", len(items)) return nil }