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
2 changes: 2 additions & 0 deletions internal/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ func Run(ctx context.Context, logger zerolog.Logger, settings *config.Settings,
mediator.WithHandler(&queries.GetCompatibilityR1SheetQuery{}, queries.NewCompatibilityR1SheetQueryHandler(settings)),
mediator.WithHandler(&queries.GetDeviceDefinitionByIDQueryV2{}, queries.NewGetDeviceDefinitionByIDQueryV2Handler(ddOnChainService, pdb.DBS)),
mediator.WithHandler(&queries.GetVINProfileQuery{}, queries.NewGetVINProfileQueryHandler(pdb.DBS, &logger)),

mediator.WithHandler(&queries.UpsertDecodingQuery{}, queries.NewUpsertDecodingQueryHandler(pdb.DBS, &logger, ddOnChainService)),
)

//fiber
Expand Down
13 changes: 13 additions & 0 deletions internal/api/grpc_vin_decoder_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package api
import (
"context"

"google.golang.org/protobuf/types/known/emptypb"

"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
"github.com/DIMO-Network/device-definitions-api/internal/core/queries"
p_grpc "github.com/DIMO-Network/device-definitions-api/pkg/grpc"
Expand Down Expand Up @@ -34,3 +36,14 @@ func (s *GrpcVinDecoderService) DecodeVin(ctx context.Context, in *p_grpc.Decode

return result, nil
}

func (s *GrpcVinDecoderService) UpsertDecoding(ctx context.Context, in *p_grpc.UpsertDecodingRequest) (*emptypb.Empty, error) {
_, err := s.Mediator.Send(ctx, &queries.UpsertDecodingQuery{
VIN: in.Vin,
DefinitionID: in.TargetDefinitionId,
})
if err != nil {
return nil, err
}
return &emptypb.Empty{}, nil
}
84 changes: 84 additions & 0 deletions internal/core/queries/upsert_vin_decode.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package queries

import (
"context"
"fmt"

"github.com/DIMO-Network/device-definitions-api/internal/core/mediator"
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/db/models"
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/exceptions"
"github.com/DIMO-Network/device-definitions-api/internal/infrastructure/gateways"
"github.com/DIMO-Network/shared/pkg/db"
"github.com/DIMO-Network/shared/pkg/logfields"
vinutils "github.com/DIMO-Network/shared/pkg/vin"
"github.com/pkg/errors"
"github.com/rs/zerolog"
"github.com/volatiletech/null/v8"
"github.com/volatiletech/sqlboiler/v4/boil"
)

type UpsertDecodingQueryHandler struct {
dbs func() *db.ReaderWriter
logger *zerolog.Logger
deviceDefinitionOnChainService gateways.DeviceDefinitionOnChainService
}

type UpsertDecodingQuery struct {
VIN string `json:"vin"`
DefinitionID string `json:"definitionId"`
}

func (*UpsertDecodingQuery) Key() string { return "UpsertDecodingQuery" }

func NewUpsertDecodingQueryHandler(dbs func() *db.ReaderWriter,
logger *zerolog.Logger,
deviceDefinitionOnChainService gateways.DeviceDefinitionOnChainService) UpsertDecodingQueryHandler {
return UpsertDecodingQueryHandler{
dbs: dbs,
logger: logger,
deviceDefinitionOnChainService: deviceDefinitionOnChainService,
}
}

func (dc UpsertDecodingQueryHandler) Handle(ctx context.Context, query mediator.Message) (interface{}, error) {
qry := query.(*UpsertDecodingQuery)
if len(qry.VIN) < 10 || len(qry.VIN) > 17 {
return nil, &exceptions.ValidationError{Err: fmt.Errorf("invalid vin %s", qry.VIN)}
}
vin := vinutils.VIN(qry.VIN)
wmi := vin.Wmi()

localLog := dc.logger.With().
Str("vin", vin.String()).
Str("handler", query.Key()).
Logger()

// check if the definition id exists on chain
dd, manuf, err := dc.deviceDefinitionOnChainService.GetDefinitionByID(ctx, qry.DefinitionID)
if err != nil {
return nil, errors.Wrapf(err, "failed to find device definition by id %s when upserting vin decoding", qry.DefinitionID)
}
manufacturerName, err := dc.deviceDefinitionOnChainService.GetManufacturerNameByID(ctx, manuf)
if err != nil {
return nil, errors.Wrapf(err, "failed to find manufacturer name by id %s when upserting vin decoding", manuf)
}
//upsert the vin
vinNumber := &models.VinNumber{
Vin: qry.VIN,
Wmi: null.StringFrom(wmi),
VDS: null.StringFrom(vin.VDS()),
CheckDigit: null.StringFrom(vin.CheckDigit()),
SerialNumber: vin.SerialNumber(),
Vis: null.StringFrom(vin.VIS()),
DecodeProvider: null.StringFrom("manual entry"),
Year: dd.Year,
DefinitionID: dd.ID,
ManufacturerName: manufacturerName,
}
err = vinNumber.Upsert(ctx, dc.dbs().Writer, true, []string{"vin"}, boil.Infer(), boil.Infer())
if err != nil {
return nil, errors.Wrapf(err, "failed to upsert vin number %s for manual update", qry.VIN)
}
localLog.Info().Str(logfields.VIN, qry.VIN).Str(logfields.FunctionName, qry.Key()).Msg("manually upserted new vin number")
return nil, nil
}
36 changes: 18 additions & 18 deletions pkg/grpc/decoder.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions pkg/grpc/decoder.proto
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,13 @@ message DecodeVinResponse {
string manufacturer = 11;
}

message ChangeDecodingRequest {
message UpsertDecodingRequest {
string vin = 1;
string target_definition_id = 2;
}

service VinDecoderService {
rpc DecodeVin(DecodeVinRequest) returns (DecodeVinResponse);
rpc ChangeDecoding(ChangeDecodingRequest) returns (google.protobuf.Empty);
// used to change what a vin points to or insert a new vin to definition id mapping
rpc UpsertDecoding(UpsertDecodingRequest) returns (google.protobuf.Empty);
}
30 changes: 16 additions & 14 deletions pkg/grpc/decoder_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading