52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package sync
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"time"
|
|
)
|
|
|
|
// SeenPartnumber represents an unresolved vendor partnumber to report.
|
|
type SeenPartnumber struct {
|
|
Partnumber string
|
|
Description string
|
|
Ignored bool
|
|
}
|
|
|
|
// 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, is_ignored, last_seen_at)
|
|
VALUES
|
|
('manual', '', ?, ?, ?, ?)
|
|
ON DUPLICATE KEY UPDATE
|
|
last_seen_at = VALUES(last_seen_at),
|
|
is_ignored = VALUES(is_ignored),
|
|
description = COALESCE(NULLIF(VALUES(description), ''), description)
|
|
`, item.Partnumber, item.Description, item.Ignored, 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
|
|
}
|