diff --git a/go.mod b/go.mod index c917828..f63591f 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( ) require ( + connectrpc.com/validate v0.1.0 // indirect github.com/aarondl/json v0.0.0-20221020222930-8b0db17ef1bf // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/google/cel-go v0.20.1 // indirect diff --git a/go.sum b/go.sum index f3a5e3e..0b01779 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ connectrpc.com/connect v1.16.2 h1:ybd6y+ls7GOlb7Bh5C8+ghA6SvCBajHwxssO2CGFjqE= connectrpc.com/connect v1.16.2/go.mod h1:n2kgwskMHXC+lVqb18wngEpF95ldBHXjZYJussz5FRc= connectrpc.com/cors v0.1.0 h1:f3gTXJyDZPrDIZCQ567jxfD9PAIpopHiRDnJRt3QuOQ= connectrpc.com/cors v0.1.0/go.mod h1:v8SJZCPfHtGH1zsm+Ttajpozd4cYIUryl4dFB6QEpfg= +connectrpc.com/validate v0.1.0 h1:r55jirxMK7HO/xZwVHj3w2XkVFarsUM77ZDy367NtH4= +connectrpc.com/validate v0.1.0/go.mod h1:GU47c9/x/gd+u9wRSPkrQOP46gx2rMN+Wo37EHgI3Ow= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= @@ -16,6 +18,7 @@ github.com/aarondl/opt v0.0.0-20240623220848-083f18ab9536 h1:vhpjulzH5Tr4S3uJ3Y/ github.com/aarondl/opt v0.0.0-20240623220848-083f18ab9536/go.mod h1:l4/5NZtYd/SIohsFhaJQQe+sPOTG22furpZ5FvcYOzk= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230321174746-8dcc6526cfb1 h1:X8MJ0fnN5FPdcGF5Ij2/OW+HgiJrRg3AfHAx1PJtIzM= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230321174746-8dcc6526cfb1/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= github.com/bufbuild/protovalidate-go v0.6.3 h1:wxQyzW035zM16Binbaz/nWAzS12dRIXhZdSUWRY7Fv0= diff --git a/go/cmd/bluemage/serve/serve.go b/go/cmd/bluemage/serve/serve.go index b23a8d9..5e77f77 100644 --- a/go/cmd/bluemage/serve/serve.go +++ b/go/cmd/bluemage/serve/serve.go @@ -10,6 +10,7 @@ import ( "time" "connectrpc.com/connect" + "connectrpc.com/validate" sqldblogger "github.com/simukti/sqldb-logger" "github.com/spf13/cobra" "github.com/stephenafamo/bob" @@ -51,8 +52,16 @@ var Cmd = &cobra.Command{ }, } + validationInterceptor, err := validate.NewInterceptor() + if err != nil { + return errs.Wrap(err, "failed to create validation interceptor") + } + mux := http.NewServeMux() - mux.Handle(v1connect.NewDeviceServiceHandler(handler, connect.WithInterceptors(server.LogInterceptor()))) + mux.Handle(v1connect.NewDeviceServiceHandler(handler, connect.WithInterceptors( + validationInterceptor, + server.LogInterceptor(), + ))) server := &http.Server{ Addr: ":8080", diff --git a/go/server/device_handlers.go b/go/server/device_handlers.go index 25243a8..0245113 100644 --- a/go/server/device_handlers.go +++ b/go/server/device_handlers.go @@ -4,7 +4,6 @@ import ( "context" "connectrpc.com/connect" - "github.com/bufbuild/protovalidate-go" "github.com/tigorlazuardi/bluemage/go/api" "github.com/tigorlazuardi/bluemage/go/gen/converter" device "github.com/tigorlazuardi/bluemage/go/gen/proto/device/v1" @@ -20,19 +19,12 @@ type DeviceHandler struct { v1connect.UnimplementedDeviceServiceHandler } -var ( - convert converter.DeviceConverterImpl - validate, _ = protovalidate.New() -) +var convert converter.DeviceConverterImpl // CreateDevice implements v1connect.DeviceServiceHandler. func (d *DeviceHandler) CreateDevice(ctx context.Context, request *connect.Request[device.CreateDeviceRequest]) (*connect.Response[device.CreateDeviceResponse], error) { - err := validate.Validate(request.Msg) - if err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, err) - } dev := convert.CreateDeviceRequestToModelsDevice(request.Msg) - dev, err = d.API.DevicesCreate(ctx, dev) + dev, err := d.API.DevicesCreate(ctx, dev) if err != nil { return nil, errs.IntoConnectError(err) } @@ -42,11 +34,6 @@ func (d *DeviceHandler) CreateDevice(ctx context.Context, request *connect.Reque // GetDevice implements v1connect.DeviceServiceHandler. func (d *DeviceHandler) GetDevice(ctx context.Context, request *connect.Request[device.GetDeviceRequest]) (*connect.Response[device.GetDeviceResponse], error) { - err := validate.Validate(request.Msg) - if err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, err) - } - dev, err := d.API.GetDevice(ctx, request.Msg.Slug) if err != nil { return nil, errs.IntoConnectError(err) @@ -86,10 +73,6 @@ func (de *DeviceHandler) UpdateDevice(ctx context.Context, request *connect.Requ func (de *DeviceHandler) DeviceExists(ctx context.Context, request *connect.Request[device.DeviceExistsRequest]) (*connect.Response[device.DeviceExistsResponse], error) { slug := request.Msg.Slug - if err := validate.Validate(request.Msg); err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, err) - } - exists, err := de.API.DevicesExist(ctx, slug) if err != nil { return nil, errs.IntoConnectError(err) diff --git a/schemas/proto/device/v1/update.proto b/schemas/proto/device/v1/update.proto index 130bc03..b3f6367 100644 --- a/schemas/proto/device/v1/update.proto +++ b/schemas/proto/device/v1/update.proto @@ -7,7 +7,7 @@ import "buf/validate/validate.proto"; option go_package = "github.com/tigorlazuardi/bluemage/go/gen/proto/device/v1"; message UpdateDeviceRequest { - string slug = 1; + string slug = 1 [(buf.validate.field).string.min_len = 1]; DeviceSetter set = 2; }