feat(platform): separate vehicle lookup key from VIN
This commit is contained in:
@@ -67,23 +67,29 @@ func (s *Service) VehicleDetail(ctx context.Context, vin string, protocol string
|
||||
return VehicleDetail{}, err
|
||||
}
|
||||
identity := resolveVehicleIdentity(keyword, vehicles.Items)
|
||||
resolvedVIN := keyword
|
||||
resolvedVIN := ""
|
||||
if identity != nil && strings.TrimSpace(identity.VIN) != "" {
|
||||
resolvedVIN = identity.VIN
|
||||
} else if isLikelyVIN(keyword) {
|
||||
resolvedVIN = keyword
|
||||
}
|
||||
queryVIN := resolvedVIN
|
||||
if queryVIN == "" {
|
||||
queryVIN = keyword
|
||||
}
|
||||
|
||||
realtimeQuery := url.Values{"vin": {resolvedVIN}, "limit": {"20"}}
|
||||
historyQuery := url.Values{"vin": {resolvedVIN}, "limit": {"20"}}
|
||||
rawQuery := RawFrameQuery{VIN: resolvedVIN, IncludeFields: true, Limit: 10}
|
||||
mileageQuery := url.Values{"vin": {resolvedVIN}, "limit": {"20"}}
|
||||
qualityQuery := url.Values{"vin": {resolvedVIN}, "limit": {"20"}}
|
||||
realtimeQuery := url.Values{"vin": {queryVIN}, "limit": {"20"}}
|
||||
historyQuery := url.Values{"vin": {queryVIN}, "limit": {"20"}}
|
||||
rawQuery := RawFrameQuery{VIN: queryVIN, IncludeFields: true, Limit: 10}
|
||||
mileageQuery := url.Values{"vin": {queryVIN}, "limit": {"20"}}
|
||||
qualityQuery := url.Values{"vin": {queryVIN}, "limit": {"20"}}
|
||||
if protocol != "" {
|
||||
realtimeQuery.Set("protocol", protocol)
|
||||
historyQuery.Set("protocol", protocol)
|
||||
rawQuery.Protocol = protocol
|
||||
qualityQuery.Set("protocol", protocol)
|
||||
}
|
||||
realtimeSummary, err := s.store.VehicleRealtime(ctx, url.Values{"vin": {resolvedVIN}, "limit": {"1"}})
|
||||
realtimeSummary, err := s.store.VehicleRealtime(ctx, url.Values{"vin": {queryVIN}, "limit": {"1"}})
|
||||
if err != nil {
|
||||
return VehicleDetail{}, err
|
||||
}
|
||||
@@ -112,9 +118,11 @@ func (s *Service) VehicleDetail(ctx context.Context, vin string, protocol string
|
||||
return VehicleDetail{}, err
|
||||
}
|
||||
sourceStatus := vehicleSourceStatus(vehicles.Items, realtime.Items, history.Items, raw.Items, mileage.Items)
|
||||
sourceStatus = s.enrichVehicleSourceStatus(ctx, resolvedVIN, sourceStatus)
|
||||
sourceStatus = s.enrichVehicleSourceStatus(ctx, queryVIN, sourceStatus)
|
||||
return VehicleDetail{
|
||||
VIN: resolvedVIN,
|
||||
LookupKey: keyword,
|
||||
LookupResolved: resolvedVIN != "",
|
||||
Identity: identity,
|
||||
RealtimeSummary: summary,
|
||||
Sources: sourceNames(sourceStatus),
|
||||
@@ -172,6 +180,23 @@ func resolveVehicleIdentity(keyword string, vehicles []VehicleRow) *VehicleRow {
|
||||
return nil
|
||||
}
|
||||
|
||||
func isLikelyVIN(value string) bool {
|
||||
value = strings.ToUpper(strings.TrimSpace(value))
|
||||
if len(value) != 17 {
|
||||
return false
|
||||
}
|
||||
for _, char := range value {
|
||||
if char >= '0' && char <= '9' {
|
||||
continue
|
||||
}
|
||||
if char >= 'A' && char <= 'Z' && char != 'I' && char != 'O' && char != 'Q' {
|
||||
continue
|
||||
}
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *Service) RealtimeLocations(ctx context.Context, query url.Values) (Page[RealtimeLocationRow], error) {
|
||||
return s.store.RealtimeLocations(ctx, query)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user