Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions internal/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ func Run(ctx context.Context, logger zerolog.Logger, settings *config.Settings,
mediator.WithHandler(&queries.GetIntegrationOptionsQuery{}, queries.NewGetIntegrationOptionsQueryHandler(pdb.DBS)),
mediator.WithHandler(&commands.BulkValidateVinCommand{}, commands.NewBulkValidateVinCommandHandler(
pdb.DBS,
queries.NewDecodeVINQueryHandler(pdb.DBS, vincDecodingService, vinRepository, &logger, fuelAPIService, powerTrainTypeService, ddOnChainService, identityAPI),
decodeVINHandler,
queries.NewGetDeviceDefinitionByIDQueryHandler(ddOnChainService, pdb.DBS),
)),

Expand All @@ -124,7 +124,6 @@ func Run(ctx context.Context, logger zerolog.Logger, settings *config.Settings,
mediator.WithHandler(&queries.GetDeviceDefinitionByIDQueryV2{}, queries.NewGetDeviceDefinitionByIDQueryV2Handler(ddOnChainService, pdb.DBS)),
mediator.WithHandler(&queries.GetVINProfileQuery{}, queries.NewGetVINProfileQueryHandler(pdb.DBS, &logger, powerTrainTypeService)),

mediator.WithHandler(&queries.DecodeVINQuery{}, decodeVINHandler),
mediator.WithHandler(&queries.UpsertDecodingQuery{}, upsertVINHandler),
)

Expand All @@ -146,7 +145,7 @@ func Run(ctx context.Context, logger zerolog.Logger, settings *config.Settings,
JWKSetURLs: []string{settings.JwtKeySetURL},
})

RegisterDeviceDefinitionsRoutes(app, *m, jwtAuth)
RegisterDeviceDefinitionsRoutes(app, *m, jwtAuth, decodeVINHandler)
RegisterIntegrationRoutes(app, *m)
RegisterDeviceTypeRoutes(app, *m)

Expand Down
5 changes: 1 addition & 4 deletions internal/api/grpc_vin_decoder_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,11 @@ func (s *GrpcVinDecoderService) DecodeVin(ctx context.Context, in *p_grpc.Decode
KnownYear: in.KnownYear,
Country: in.Country,
}
qryResult, err := s.decodeVINHandler.Handle(ctx, &qry) // todo change Handle to require the actual type not mediator message
// todo change handler to return p_grpc.DecodeVinResponse? But would need to change other places too
result, err := s.decodeVINHandler.Handle(ctx, &qry)
if err != nil {
return nil, err
}

result := qryResult.(*p_grpc.DecodeVinResponse)

return result, nil
}

Expand Down
11 changes: 4 additions & 7 deletions internal/api/handlers/device_definition_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import (

"github.com/DIMO-Network/device-definitions-api/internal/api/common"

p_grpc "github.com/DIMO-Network/device-definitions-api/pkg/grpc"

"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
_ "github.com/DIMO-Network/device-definitions-api/internal/core/models" // required for swagger to generate models
"github.com/DIMO-Network/device-definitions-api/internal/core/queries"
Expand All @@ -30,22 +28,21 @@ import (
// @Failure 500
// @Security BearerAuth
// @Router /device-definitions/decode-vin [post]
func DecodeVIN(m mediator.Mediator) fiber.Handler {
func DecodeVIN(dvq queries.DecodeVINQueryHandler) fiber.Handler {
return func(c *fiber.Ctx) error {
var dvr DecodeVINRequest
if err := c.BodyParser(&dvr); err != nil {
return fiber.NewError(fiber.StatusBadRequest, "Couldn't parse request body.")
}
query := &queries.DecodeVINQuery{VIN: dvr.VIN, Country: dvr.CountryCode}

result, err := m.Send(c.UserContext(), query)
result, err := dvq.Handle(c.UserContext(), query)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, "Couldn't decode VIN.")
}
resp := result.(*p_grpc.DecodeVinResponse)
dd := DecodeVINResponse{
DeviceDefinitionID: resp.DefinitionId,
NewTransactionHash: resp.NewTrxHash,
DeviceDefinitionID: result.DefinitionId,
NewTransactionHash: result.NewTrxHash,
}

return c.Status(fiber.StatusOK).JSON(dd)
Expand Down
6 changes: 4 additions & 2 deletions internal/api/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ package api
import (
"time"

"github.com/DIMO-Network/device-definitions-api/internal/core/queries"

"github.com/DIMO-Network/device-definitions-api/internal/api/handlers"
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cache"
)

func RegisterDeviceDefinitionsRoutes(app fiber.Router, m mediator.Mediator, auth fiber.Handler) {
func RegisterDeviceDefinitionsRoutes(app fiber.Router, m mediator.Mediator, auth fiber.Handler, decodeHandler queries.DecodeVINQueryHandler) {
app.Get("/device-definitions/search", handlers.GetDeviceDefinitionSearch(m)).Name("device-definitions-search")
app.Get("/device-definitions/search-r1", handlers.GetR1CompatibilitySearch(m)).Name("r1-compatibility-search")
app.Get("/compatibility/r1-sheet", cache.New(cache.Config{Expiration: 5 * time.Minute}),
Expand All @@ -19,7 +21,7 @@ func RegisterDeviceDefinitionsRoutes(app fiber.Router, m mediator.Mediator, auth
// oems by external integration, used by mobile app
app.Get("/manufacturers/integrations/smartcar", handlers.GetSmartcarManufacturers()).Name("device-definitions-smartcar")

app.Post("/device-definitions/decode-vin", auth, handlers.DecodeVIN(m)).Name("device-definitions-decode-vin")
app.Post("/device-definitions/decode-vin", auth, handlers.DecodeVIN(decodeHandler)).Name("device-definitions-decode-vin")

app.Get("/vin-profile/:vin", auth, handlers.VINProfile(m)).Name("vin-profile")
}
Expand Down
7 changes: 3 additions & 4 deletions internal/core/commands/bulk_validate_vin.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
coremodels "github.com/DIMO-Network/device-definitions-api/internal/core/models"
"github.com/DIMO-Network/device-definitions-api/internal/core/queries"
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/exceptions"
pgrpc "github.com/DIMO-Network/device-definitions-api/pkg/grpc"
"github.com/DIMO-Network/shared/pkg/db"
)

Expand Down Expand Up @@ -63,7 +62,7 @@ func (dc BulkValidateVinCommandHandler) Handle(ctx context.Context, query mediat
continue
}

devideDefinition, err := dc.DeviceDefinitionDataHandler.Handle(ctx, &queries.GetDeviceDefinitionByIDQuery{DeviceDefinitionID: decodedVIN.(*pgrpc.DecodeVinResponse).DefinitionId}) //nolint
devideDefinition, err := dc.DeviceDefinitionDataHandler.Handle(ctx, &queries.GetDeviceDefinitionByIDQuery{DeviceDefinitionID: decodedVIN.DefinitionId}) //nolint

if err == nil {
dd := devideDefinition.(*coremodels.GetDeviceDefinitionQueryResult)
Expand All @@ -74,8 +73,8 @@ func (dc BulkValidateVinCommandHandler) Handle(ctx context.Context, query mediat

decodedVINs = append(decodedVINs, DecodedVIN{
VIN: vin,
DefinitionID: decodedVIN.(*pgrpc.DecodeVinResponse).DefinitionId,
DeviceYear: decodedVIN.(*pgrpc.DecodeVinResponse).Year,
DefinitionID: decodedVIN.DefinitionId,
DeviceYear: decodedVIN.Year,
DeviceMake: dm,
DeviceModel: devideDefinition.(*coremodels.GetDeviceDefinitionQueryResult).DeviceStyles[0].SubModel,
})
Expand Down
31 changes: 16 additions & 15 deletions internal/core/queries/decode_vin.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/prometheus/client_golang/prometheus"

"github.com/DIMO-Network/device-definitions-api/internal/core/common"
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
coremodels "github.com/DIMO-Network/device-definitions-api/internal/core/models"
"github.com/DIMO-Network/device-definitions-api/internal/core/services"
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/db/models"
Expand Down Expand Up @@ -73,16 +72,18 @@ func NewDecodeVINQueryHandler(dbs func() *db.ReaderWriter, vinDecodingService se
}
}

func (dc DecodeVINQueryHandler) Handle(ctx context.Context, query mediator.Message) (interface{}, error) {
qry := query.(*DecodeVINQuery)
if len(qry.VIN) < 10 || len(qry.VIN) > 17 {
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", qry.VIN)}
func (dc DecodeVINQueryHandler) Handle(ctx context.Context, query *DecodeVINQuery) (*p_grpc.DecodeVinResponse, error) {
if query == nil {
return nil, &exceptions.ValidationError{Err: errors.New("query is nil")}
}
if len(query.VIN) < 10 || len(query.VIN) > 17 {
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", query.VIN)}
}
resp := &p_grpc.DecodeVinResponse{}
vinObj := vin.VIN(qry.VIN)
vinObj := vin.VIN(query.VIN)

if !vinObj.IsValidJapanChassis() && !vinObj.IsValidVIN() {
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", qry.VIN)}
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", query.VIN)}
}

resp.Year = int32(vinObj.Year())
Expand All @@ -92,9 +93,9 @@ func (dc DecodeVINQueryHandler) Handle(ctx context.Context, query mediator.Messa
Str(logfields.VIN, vinObj.String()).
Str("handler", query.Key()).
Str("vinYear", fmt.Sprintf("%d", resp.Year)).
Str("knownModel", qry.KnownModel).
Str("knownYear", strconv.Itoa(int(qry.KnownYear))).
Str("country", qry.Country).
Str("knownModel", query.KnownModel).
Str("knownYear", strconv.Itoa(int(query.KnownYear))).
Str("country", query.Country).
Logger()

const (
Expand Down Expand Up @@ -140,21 +141,21 @@ func (dc DecodeVINQueryHandler) Handle(ctx context.Context, query mediator.Messa
dbWMI, err := models.Wmis(models.WmiWhere.Wmi.EQ(wmi)).One(ctx, dc.dbs().Reader)
if err == nil && dbWMI != nil {
if dbWMI.ManufacturerName == "Tesla" {
vinInfo, err = dc.vinDecodingService.GetVIN(ctx, vinObj.String(), coremodels.TeslaProvider, qry.Country)
vinInfo, err = dc.vinDecodingService.GetVIN(ctx, vinObj.String(), coremodels.TeslaProvider, query.Country)
resp.Manufacturer = "Tesla"
}
}
// not a tesla, regular decode path
if vinInfo == nil || vinInfo.Model == "" {
vinInfo, err = dc.vinDecodingService.GetVIN(ctx, vinObj.String(), coremodels.AllProviders, qry.Country) // this will try drivly first unless of japan
vinInfo, err = dc.vinDecodingService.GetVIN(ctx, vinObj.String(), coremodels.AllProviders, query.Country) // this will try drivly first unless of japan
}

// if no luck decoding VIN, try buildingVinInfo from known data passed in, typically smartcar or software connections
if err != nil {
if len(qry.KnownModel) > 0 && qry.KnownYear > 0 {
if len(query.KnownModel) > 0 && query.KnownYear > 0 {
// note if this is successful, err gets set to nil
// todo: the knownModel should correspond with the Make
vinInfo, err = dc.vinInfoFromKnown(vinObj, qry.KnownModel, qry.KnownYear)
vinInfo, err = dc.vinInfoFromKnown(vinObj, query.KnownModel, query.KnownYear)
}
}

Expand All @@ -167,7 +168,7 @@ func (dc DecodeVINQueryHandler) Handle(ctx context.Context, query mediator.Messa
if err == nil {
err = errors.New("failed to decode, vinInfo is nil")
}
localLog.Err(err).Msgf("failed to decode vinObj from provider, country: %s", qry.Country)
localLog.Err(err).Msgf("failed to decode vinObj from provider, country: %s", query.Country)
// todo track failed decodes
return nil, err
}
Expand Down
Loading
Loading