Skip to content

Commit 3f01b1e

Browse files
authored
INTG-1700 vin upsert grpc (#291)
* update protobuf * grpc upsert vin impl
1 parent e2889ff commit 3f01b1e

6 files changed

Lines changed: 136 additions & 34 deletions

File tree

internal/api/api.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ func Run(ctx context.Context, logger zerolog.Logger, settings *config.Settings,
132132
mediator.WithHandler(&queries.GetCompatibilityR1SheetQuery{}, queries.NewCompatibilityR1SheetQueryHandler(settings)),
133133
mediator.WithHandler(&queries.GetDeviceDefinitionByIDQueryV2{}, queries.NewGetDeviceDefinitionByIDQueryV2Handler(ddOnChainService, pdb.DBS)),
134134
mediator.WithHandler(&queries.GetVINProfileQuery{}, queries.NewGetVINProfileQueryHandler(pdb.DBS, &logger)),
135+
136+
mediator.WithHandler(&queries.UpsertDecodingQuery{}, queries.NewUpsertDecodingQueryHandler(pdb.DBS, &logger, ddOnChainService)),
135137
)
136138

137139
//fiber

internal/api/grpc_vin_decoder_service.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package api
33
import (
44
"context"
55

6+
"google.golang.org/protobuf/types/known/emptypb"
7+
68
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
79
"github.com/DIMO-Network/device-definitions-api/internal/core/queries"
810
p_grpc "github.com/DIMO-Network/device-definitions-api/pkg/grpc"
@@ -34,3 +36,14 @@ func (s *GrpcVinDecoderService) DecodeVin(ctx context.Context, in *p_grpc.Decode
3436

3537
return result, nil
3638
}
39+
40+
func (s *GrpcVinDecoderService) UpsertDecoding(ctx context.Context, in *p_grpc.UpsertDecodingRequest) (*emptypb.Empty, error) {
41+
_, err := s.Mediator.Send(ctx, &queries.UpsertDecodingQuery{
42+
VIN: in.Vin,
43+
DefinitionID: in.TargetDefinitionId,
44+
})
45+
if err != nil {
46+
return nil, err
47+
}
48+
return &emptypb.Empty{}, nil
49+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package queries
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
8+
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/db/models"
9+
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/exceptions"
10+
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/gateways"
11+
"github.com/DIMO-Network/shared/pkg/db"
12+
"github.com/DIMO-Network/shared/pkg/logfields"
13+
vinutils "github.com/DIMO-Network/shared/pkg/vin"
14+
"github.com/pkg/errors"
15+
"github.com/rs/zerolog"
16+
"github.com/volatiletech/null/v8"
17+
"github.com/volatiletech/sqlboiler/v4/boil"
18+
)
19+
20+
type UpsertDecodingQueryHandler struct {
21+
dbs func() *db.ReaderWriter
22+
logger *zerolog.Logger
23+
deviceDefinitionOnChainService gateways.DeviceDefinitionOnChainService
24+
}
25+
26+
type UpsertDecodingQuery struct {
27+
VIN string `json:"vin"`
28+
DefinitionID string `json:"definitionId"`
29+
}
30+
31+
func (*UpsertDecodingQuery) Key() string { return "UpsertDecodingQuery" }
32+
33+
func NewUpsertDecodingQueryHandler(dbs func() *db.ReaderWriter,
34+
logger *zerolog.Logger,
35+
deviceDefinitionOnChainService gateways.DeviceDefinitionOnChainService) UpsertDecodingQueryHandler {
36+
return UpsertDecodingQueryHandler{
37+
dbs: dbs,
38+
logger: logger,
39+
deviceDefinitionOnChainService: deviceDefinitionOnChainService,
40+
}
41+
}
42+
43+
func (dc UpsertDecodingQueryHandler) Handle(ctx context.Context, query mediator.Message) (interface{}, error) {
44+
qry := query.(*UpsertDecodingQuery)
45+
if len(qry.VIN) < 10 || len(qry.VIN) > 17 {
46+
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid vin %s", qry.VIN)}
47+
}
48+
vin := vinutils.VIN(qry.VIN)
49+
wmi := vin.Wmi()
50+
51+
localLog := dc.logger.With().
52+
Str("vin", vin.String()).
53+
Str("handler", query.Key()).
54+
Logger()
55+
56+
// check if the definition id exists on chain
57+
dd, manuf, err := dc.deviceDefinitionOnChainService.GetDefinitionByID(ctx, qry.DefinitionID)
58+
if err != nil {
59+
return nil, errors.Wrapf(err, "failed to find device definition by id %s when upserting vin decoding", qry.DefinitionID)
60+
}
61+
manufacturerName, err := dc.deviceDefinitionOnChainService.GetManufacturerNameByID(ctx, manuf)
62+
if err != nil {
63+
return nil, errors.Wrapf(err, "failed to find manufacturer name by id %s when upserting vin decoding", manuf)
64+
}
65+
//upsert the vin
66+
vinNumber := &models.VinNumber{
67+
Vin: qry.VIN,
68+
Wmi: null.StringFrom(wmi),
69+
VDS: null.StringFrom(vin.VDS()),
70+
CheckDigit: null.StringFrom(vin.CheckDigit()),
71+
SerialNumber: vin.SerialNumber(),
72+
Vis: null.StringFrom(vin.VIS()),
73+
DecodeProvider: null.StringFrom("manual entry"),
74+
Year: dd.Year,
75+
DefinitionID: dd.ID,
76+
ManufacturerName: manufacturerName,
77+
}
78+
err = vinNumber.Upsert(ctx, dc.dbs().Writer, true, []string{"vin"}, boil.Infer(), boil.Infer())
79+
if err != nil {
80+
return nil, errors.Wrapf(err, "failed to upsert vin number %s for manual update", qry.VIN)
81+
}
82+
localLog.Info().Str(logfields.VIN, qry.VIN).Str(logfields.FunctionName, qry.Key()).Msg("manually upserted new vin number")
83+
return nil, nil
84+
}

pkg/grpc/decoder.pb.go

Lines changed: 18 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/grpc/decoder.proto

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ message DecodeVinResponse {
2626
string manufacturer = 11;
2727
}
2828

29-
message ChangeDecodingRequest {
29+
message UpsertDecodingRequest {
3030
string vin = 1;
3131
string target_definition_id = 2;
3232
}
3333

3434
service VinDecoderService {
3535
rpc DecodeVin(DecodeVinRequest) returns (DecodeVinResponse);
36-
rpc ChangeDecoding(ChangeDecodingRequest) returns (google.protobuf.Empty);
36+
// used to change what a vin points to or insert a new vin to definition id mapping
37+
rpc UpsertDecoding(UpsertDecodingRequest) returns (google.protobuf.Empty);
3738
}

pkg/grpc/decoder_grpc.pb.go

Lines changed: 16 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)