Skip to content

Commit 2d8ee68

Browse files
authored
refactor, remove mediatr dependency on decode vin path, update tests, linter (#300)
1 parent 8b92bb3 commit 2d8ee68

7 files changed

Lines changed: 67 additions & 84 deletions

File tree

internal/api/api.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func Run(ctx context.Context, logger zerolog.Logger, settings *config.Settings,
112112
mediator.WithHandler(&queries.GetIntegrationOptionsQuery{}, queries.NewGetIntegrationOptionsQueryHandler(pdb.DBS)),
113113
mediator.WithHandler(&commands.BulkValidateVinCommand{}, commands.NewBulkValidateVinCommandHandler(
114114
pdb.DBS,
115-
queries.NewDecodeVINQueryHandler(pdb.DBS, vincDecodingService, vinRepository, &logger, fuelAPIService, powerTrainTypeService, ddOnChainService, identityAPI),
115+
decodeVINHandler,
116116
queries.NewGetDeviceDefinitionByIDQueryHandler(ddOnChainService, pdb.DBS),
117117
)),
118118

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

127-
mediator.WithHandler(&queries.DecodeVINQuery{}, decodeVINHandler),
128127
mediator.WithHandler(&queries.UpsertDecodingQuery{}, upsertVINHandler),
129128
)
130129

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

149-
RegisterDeviceDefinitionsRoutes(app, *m, jwtAuth)
148+
RegisterDeviceDefinitionsRoutes(app, *m, jwtAuth, decodeVINHandler)
150149
RegisterIntegrationRoutes(app, *m)
151150
RegisterDeviceTypeRoutes(app, *m)
152151

internal/api/grpc_vin_decoder_service.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,11 @@ func (s *GrpcVinDecoderService) DecodeVin(ctx context.Context, in *p_grpc.Decode
2929
KnownYear: in.KnownYear,
3030
Country: in.Country,
3131
}
32-
qryResult, err := s.decodeVINHandler.Handle(ctx, &qry) // todo change Handle to require the actual type not mediator message
33-
// todo change handler to return p_grpc.DecodeVinResponse? But would need to change other places too
32+
result, err := s.decodeVINHandler.Handle(ctx, &qry)
3433
if err != nil {
3534
return nil, err
3635
}
3736

38-
result := qryResult.(*p_grpc.DecodeVinResponse)
39-
4037
return result, nil
4138
}
4239

internal/api/handlers/device_definition_handler.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88

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

11-
p_grpc "github.com/DIMO-Network/device-definitions-api/pkg/grpc"
12-
1311
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
1412
_ "github.com/DIMO-Network/device-definitions-api/internal/core/models" // required for swagger to generate models
1513
"github.com/DIMO-Network/device-definitions-api/internal/core/queries"
@@ -30,22 +28,21 @@ import (
3028
// @Failure 500
3129
// @Security BearerAuth
3230
// @Router /device-definitions/decode-vin [post]
33-
func DecodeVIN(m mediator.Mediator) fiber.Handler {
31+
func DecodeVIN(dvq queries.DecodeVINQueryHandler) fiber.Handler {
3432
return func(c *fiber.Ctx) error {
3533
var dvr DecodeVINRequest
3634
if err := c.BodyParser(&dvr); err != nil {
3735
return fiber.NewError(fiber.StatusBadRequest, "Couldn't parse request body.")
3836
}
3937
query := &queries.DecodeVINQuery{VIN: dvr.VIN, Country: dvr.CountryCode}
4038

41-
result, err := m.Send(c.UserContext(), query)
39+
result, err := dvq.Handle(c.UserContext(), query)
4240
if err != nil {
4341
return fiber.NewError(fiber.StatusInternalServerError, "Couldn't decode VIN.")
4442
}
45-
resp := result.(*p_grpc.DecodeVinResponse)
4643
dd := DecodeVINResponse{
47-
DeviceDefinitionID: resp.DefinitionId,
48-
NewTransactionHash: resp.NewTrxHash,
44+
DeviceDefinitionID: result.DefinitionId,
45+
NewTransactionHash: result.NewTrxHash,
4946
}
5047

5148
return c.Status(fiber.StatusOK).JSON(dd)

internal/api/routes.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package api
33
import (
44
"time"
55

6+
"github.com/DIMO-Network/device-definitions-api/internal/core/queries"
7+
68
"github.com/DIMO-Network/device-definitions-api/internal/api/handlers"
79
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
810
"github.com/gofiber/fiber/v2"
911
"github.com/gofiber/fiber/v2/middleware/cache"
1012
)
1113

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

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

2426
app.Get("/vin-profile/:vin", auth, handlers.VINProfile(m)).Name("vin-profile")
2527
}

internal/core/commands/bulk_validate_vin.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
coremodels "github.com/DIMO-Network/device-definitions-api/internal/core/models"
1010
"github.com/DIMO-Network/device-definitions-api/internal/core/queries"
1111
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/exceptions"
12-
pgrpc "github.com/DIMO-Network/device-definitions-api/pkg/grpc"
1312
"github.com/DIMO-Network/shared/pkg/db"
1413
)
1514

@@ -63,7 +62,7 @@ func (dc BulkValidateVinCommandHandler) Handle(ctx context.Context, query mediat
6362
continue
6463
}
6564

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

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

7574
decodedVINs = append(decodedVINs, DecodedVIN{
7675
VIN: vin,
77-
DefinitionID: decodedVIN.(*pgrpc.DecodeVinResponse).DefinitionId,
78-
DeviceYear: decodedVIN.(*pgrpc.DecodeVinResponse).Year,
76+
DefinitionID: decodedVIN.DefinitionId,
77+
DeviceYear: decodedVIN.Year,
7978
DeviceMake: dm,
8079
DeviceModel: devideDefinition.(*coremodels.GetDeviceDefinitionQueryResult).DeviceStyles[0].SubModel,
8180
})

internal/core/queries/decode_vin.go

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
"github.com/prometheus/client_golang/prometheus"
1717

1818
"github.com/DIMO-Network/device-definitions-api/internal/core/common"
19-
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
2019
coremodels "github.com/DIMO-Network/device-definitions-api/internal/core/models"
2120
"github.com/DIMO-Network/device-definitions-api/internal/core/services"
2221
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/db/models"
@@ -73,16 +72,18 @@ func NewDecodeVINQueryHandler(dbs func() *db.ReaderWriter, vinDecodingService se
7372
}
7473
}
7574

76-
func (dc DecodeVINQueryHandler) Handle(ctx context.Context, query mediator.Message) (interface{}, error) {
77-
qry := query.(*DecodeVINQuery)
78-
if len(qry.VIN) < 10 || len(qry.VIN) > 17 {
79-
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", qry.VIN)}
75+
func (dc DecodeVINQueryHandler) Handle(ctx context.Context, query *DecodeVINQuery) (*p_grpc.DecodeVinResponse, error) {
76+
if query == nil {
77+
return nil, &exceptions.ValidationError{Err: errors.New("query is nil")}
78+
}
79+
if len(query.VIN) < 10 || len(query.VIN) > 17 {
80+
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", query.VIN)}
8081
}
8182
resp := &p_grpc.DecodeVinResponse{}
82-
vinObj := vin.VIN(qry.VIN)
83+
vinObj := vin.VIN(query.VIN)
8384

8485
if !vinObj.IsValidJapanChassis() && !vinObj.IsValidVIN() {
85-
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", qry.VIN)}
86+
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid VIN %s", query.VIN)}
8687
}
8788

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

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

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

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

0 commit comments

Comments
 (0)