@@ -5,6 +5,10 @@ import (
55 "context"
66 "database/sql"
77 "fmt"
8+ coremodels "github.com/DIMO-Network/device-definitions-api/internal/core/models"
9+ "github.com/DIMO-Network/device-definitions-api/internal/core/services"
10+ "github.com/DIMO-Network/shared/pkg/logfields"
11+ "strings"
812
913 "github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
1014 "github.com/DIMO-Network/device-definitions-api/internal/infrastructure/db/models"
@@ -15,26 +19,29 @@ import (
1519)
1620
1721type GetVINProfileQueryHandler struct {
18- dbs func () * db.ReaderWriter
19- logger * zerolog.Logger
22+ dbs func () * db.ReaderWriter
23+ logger * zerolog.Logger
24+ powertrainSvc services.PowerTrainTypeService
2025}
2126
2227type GetVINProfileQuery struct {
2328 VIN string `json:"vin"`
2429}
2530
2631type GetVINProfileResponse struct {
27- VIN string `json:"vin"`
28- ProfileRaw []byte `json:"profileRaw"`
29- Vendor string `json:"vendor"`
32+ VIN string `json:"vin"`
33+ ProfileRaw []byte `json:"profileRaw"`
34+ Vendor string `json:"vendor"`
35+ PowertrainType string `json:"powertrainType,omitempty"`
3036}
3137
3238func (* GetVINProfileQuery ) Key () string { return "GetVINProfileQuery" }
3339
34- func NewGetVINProfileQueryHandler (dbs func () * db.ReaderWriter , logger * zerolog.Logger ) GetVINProfileQueryHandler {
40+ func NewGetVINProfileQueryHandler (dbs func () * db.ReaderWriter , logger * zerolog.Logger , powertrainSvc services. PowerTrainTypeService ) GetVINProfileQueryHandler {
3541 return GetVINProfileQueryHandler {
36- dbs : dbs ,
37- logger : logger ,
42+ dbs : dbs ,
43+ logger : logger ,
44+ powertrainSvc : powertrainSvc ,
3845 }
3946}
4047
@@ -44,18 +51,30 @@ func (dc GetVINProfileQueryHandler) Handle(ctx context.Context, query mediator.M
4451 return nil , & exceptions.ValidationError {Err : fmt .Errorf ("invalid vin %s" , qry .VIN )}
4552 }
4653
47- vinNumber , err := models .VinNumbers (models .VinNumberWhere .Vin .EQ (qry .VIN ), models . VinNumberWhere . DrivlyData . IsNotNull () ).One (ctx , dc .dbs ().Reader )
54+ vinNumber , err := models .VinNumbers (models .VinNumberWhere .Vin .EQ (qry .VIN )).One (ctx , dc .dbs ().Reader )
4855
4956 if err != nil {
5057 if errors .Is (err , sql .ErrNoRows ) {
5158 return nil , & exceptions.NotFoundError {Err : fmt .Errorf ("vin %s not found" , qry .VIN )}
5259 }
5360 return nil , & exceptions.InternalError {Err : fmt .Errorf ("failed to get vin %s" , qry .VIN )}
5461 }
62+ split := strings .Split (vinNumber .DefinitionID , "_" )
63+ powertrain := ""
64+ if len (split ) == 3 {
65+ powertrain , err = dc .powertrainSvc .ResolvePowerTrainType (split [0 ], split [1 ], vinNumber .DrivlyData , vinNumber .VincarioData )
66+ if err != nil {
67+ dc .logger .Error ().Err (err ).Str (logfields .VIN , qry .VIN ).Msg ("failed to resolve powertrain type for vin, continuing with ICE" )
68+ }
69+ }
70+ if powertrain == "" {
71+ powertrain = string (coremodels .ICE )
72+ }
5573
5674 return & GetVINProfileResponse {
57- VIN : qry .VIN ,
58- ProfileRaw : vinNumber .DrivlyData .JSON ,
59- Vendor : "drivly" ,
75+ VIN : qry .VIN ,
76+ ProfileRaw : vinNumber .DrivlyData .JSON ,
77+ Vendor : vinNumber .DecodeProvider .String ,
78+ PowertrainType : powertrain ,
6079 }, nil
6180}
0 commit comments