From 85c3f0e20a7a82db1dcf7fca46fdbf2717081747 Mon Sep 17 00:00:00 2001 From: Kamil Samigullin Date: Tue, 16 Oct 2018 18:01:41 +0300 Subject: [PATCH] fix #113: store request context --- env/docker/db/truncate.sql | 7 +- env/test/fixtures/demo.sql | 11 +- main_test.go | 2 +- pkg/domain/input.go | 20 ++-- pkg/server/grpc/common.pb.go | 10 +- pkg/server/grpc/event.pb.go | 38 +++--- pkg/server/grpc/mock_storage_test.go | 167 +++++++++++++++++++++++++++ pkg/server/grpc/storage.pb.go | 128 ++++++++++---------- pkg/service/contract.go | 12 +- pkg/service/internal_test.go | 48 ++++++++ pkg/service/mock_handler_test.go | 61 ---------- pkg/service/mock_storage_test.go | 14 +++ pkg/service/mock_tracker_test.go | 47 ++++++++ pkg/service/service.go | 158 ++++++++++++++++++++----- pkg/service/service_test.go | 121 +------------------ pkg/storage/public.go | 5 +- 16 files changed, 521 insertions(+), 328 deletions(-) create mode 100644 pkg/server/grpc/mock_storage_test.go create mode 100644 pkg/service/internal_test.go delete mode 100644 pkg/service/mock_handler_test.go create mode 100644 pkg/service/mock_tracker_test.go diff --git a/env/docker/db/truncate.sql b/env/docker/db/truncate.sql index b4dafd2..cec3ee7 100644 --- a/env/docker/db/truncate.sql +++ b/env/docker/db/truncate.sql @@ -1,5 +1,4 @@ -TRUNCATE TABLE "link" RESTART IDENTITY RESTRICT; -TRUNCATE TABLE "schema" RESTART IDENTITY RESTRICT; -TRUNCATE TABLE "template" RESTART IDENTITY RESTRICT; -TRUNCATE TABLE "input" RESTART IDENTITY RESTRICT; TRUNCATE TABLE "event" RESTART IDENTITY RESTRICT; +TRUNCATE TABLE "input" RESTART IDENTITY RESTRICT; +TRUNCATE TABLE "template" RESTART IDENTITY RESTRICT; +TRUNCATE TABLE "schema" RESTART IDENTITY RESTRICT; diff --git a/env/test/fixtures/demo.sql b/env/test/fixtures/demo.sql index 02efb81..1be98b6 100644 --- a/env/test/fixtures/demo.sql +++ b/env/test/fixtures/demo.sql @@ -5,14 +5,13 @@ DECLARE demoAccount "account"."id"%TYPE := '10000000-2000-4000-8000-1600000000 DECLARE form "schema"."id"%TYPE := '10000000-2000-4000-8000-160000000004'; DECLARE html "template"."id"%TYPE := '10000000-2000-4000-8000-160000000005'; BEGIN - TRUNCATE TABLE "account" RESTART IDENTITY RESTRICT; + TRUNCATE TABLE "event" RESTART IDENTITY RESTRICT; + TRUNCATE TABLE "input" RESTART IDENTITY RESTRICT; + TRUNCATE TABLE "template" RESTART IDENTITY RESTRICT; + TRUNCATE TABLE "schema" RESTART IDENTITY RESTRICT; TRUNCATE TABLE "token" RESTART IDENTITY RESTRICT; TRUNCATE TABLE "user" RESTART IDENTITY RESTRICT; - TRUNCATE TABLE "link" RESTART IDENTITY RESTRICT; - TRUNCATE TABLE "schema" RESTART IDENTITY RESTRICT; - TRUNCATE TABLE "template" RESTART IDENTITY RESTRICT; - TRUNCATE TABLE "input" RESTART IDENTITY RESTRICT; - TRUNCATE TABLE "event" RESTART IDENTITY RESTRICT; + TRUNCATE TABLE "account" RESTART IDENTITY RESTRICT; INSERT INTO "account" ("id", "name") VALUES (demoAccount, 'Demo Account'); diff --git a/main_test.go b/main_test.go index 88c402d..b4ac40c 100644 --- a/main_test.go +++ b/main_test.go @@ -20,7 +20,7 @@ import ( var ( _ grpc.ProtectedStorage = storage.Must() _ router.Server = server.New(config.ServerConfig{}, nil) - _ server.Service = service.New(config.ServiceConfig{}, nil, nil) + _ server.Service = service.New(config.ServiceConfig{TemplateDir: "static/templates"}, nil, nil) _ service.Storage = storage.Must() _ service.Tracker = storage.Must() ) diff --git a/pkg/domain/input.go b/pkg/domain/input.go index 2a7b4bc..54e6f97 100644 --- a/pkg/domain/input.go +++ b/pkg/domain/input.go @@ -19,14 +19,10 @@ const ( ) const ( - // RedirectKey TODO issue#173 - RedirectKey = "_redirect" - // ResourceKey TODO issue#173 - ResourceKey = "_resource" - // TemplateKey TODO issue#173 - TemplateKey = "_template" - // TimeoutKey TODO issue#173 - TimeoutKey = "_timeout" + redirectKey = "_redirect" + resourceKey = "_resource" + templateKey = "_template" + timeoutKey = "_timeout" ) // Input represents an element of an HTML form. @@ -49,7 +45,7 @@ type InputData url.Values // Redirect TODO issue#173 func (d InputData) Redirect(fallback ...string) string { - value := url.Values(d).Get(RedirectKey) + value := url.Values(d).Get(redirectKey) if value == "" { for _, value = range fallback { if value != "" { @@ -62,12 +58,12 @@ func (d InputData) Redirect(fallback ...string) string { // Resource TODO issue#173 func (d InputData) Resource() ID { - return ID(url.Values(d).Get(ResourceKey)) + return ID(url.Values(d).Get(resourceKey)) } // Template TODO issue#173 func (d InputData) Template() *ID { - var id = ID(url.Values(d).Get(TemplateKey)) + var id = ID(url.Values(d).Get(templateKey)) if id.IsValid() { return &id } @@ -76,7 +72,7 @@ func (d InputData) Template() *ID { // Timeout TODO issue#173 func (d InputData) Timeout() time.Duration { - timeout, err := time.ParseDuration(url.Values(d).Get(TimeoutKey)) + timeout, err := time.ParseDuration(url.Values(d).Get(timeoutKey)) if err != nil { return 30 * time.Second } diff --git a/pkg/server/grpc/common.pb.go b/pkg/server/grpc/common.pb.go index 209331a..256648e 100644 --- a/pkg/server/grpc/common.pb.go +++ b/pkg/server/grpc/common.pb.go @@ -31,7 +31,7 @@ func (m *TimestampRange) Reset() { *m = TimestampRange{} } func (m *TimestampRange) String() string { return proto.CompactTextString(m) } func (*TimestampRange) ProtoMessage() {} func (*TimestampRange) Descriptor() ([]byte, []int) { - return fileDescriptor_common_985811a027487c86, []int{0} + return fileDescriptor_555bd8c177793206, []int{0} } func (m *TimestampRange) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TimestampRange.Unmarshal(m, b) @@ -39,8 +39,8 @@ func (m *TimestampRange) XXX_Unmarshal(b []byte) error { func (m *TimestampRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TimestampRange.Marshal(b, m, deterministic) } -func (dst *TimestampRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimestampRange.Merge(dst, src) +func (m *TimestampRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_TimestampRange.Merge(m, src) } func (m *TimestampRange) XXX_Size() int { return xxx_messageInfo_TimestampRange.Size(m) @@ -69,9 +69,9 @@ func init() { proto.RegisterType((*TimestampRange)(nil), "grpc.TimestampRange") } -func init() { proto.RegisterFile("common.proto", fileDescriptor_common_985811a027487c86) } +func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) } -var fileDescriptor_common_985811a027487c86 = []byte{ +var fileDescriptor_555bd8c177793206 = []byte{ // 128 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x49, 0xce, 0xcf, 0xcd, 0xcd, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x49, 0x2f, 0x2a, 0x48, 0x96, 0x92, diff --git a/pkg/server/grpc/event.pb.go b/pkg/server/grpc/event.pb.go index 8730df7..c14d2dc 100644 --- a/pkg/server/grpc/event.pb.go +++ b/pkg/server/grpc/event.pb.go @@ -44,7 +44,7 @@ func (m *LogEntry) Reset() { *m = LogEntry{} } func (m *LogEntry) String() string { return proto.CompactTextString(m) } func (*LogEntry) ProtoMessage() {} func (*LogEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_event_6540864d84a83132, []int{0} + return fileDescriptor_2d17a9d3f0ddf27e, []int{0} } func (m *LogEntry) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LogEntry.Unmarshal(m, b) @@ -52,8 +52,8 @@ func (m *LogEntry) XXX_Unmarshal(b []byte) error { func (m *LogEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_LogEntry.Marshal(b, m, deterministic) } -func (dst *LogEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogEntry.Merge(dst, src) +func (m *LogEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_LogEntry.Merge(m, src) } func (m *LogEntry) XXX_Size() int { return xxx_messageInfo_LogEntry.Size(m) @@ -137,7 +137,7 @@ func (m *LogFilter) Reset() { *m = LogFilter{} } func (m *LogFilter) String() string { return proto.CompactTextString(m) } func (*LogFilter) ProtoMessage() {} func (*LogFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_event_6540864d84a83132, []int{1} + return fileDescriptor_2d17a9d3f0ddf27e, []int{1} } func (m *LogFilter) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LogFilter.Unmarshal(m, b) @@ -145,8 +145,8 @@ func (m *LogFilter) XXX_Unmarshal(b []byte) error { func (m *LogFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_LogFilter.Marshal(b, m, deterministic) } -func (dst *LogFilter) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogFilter.Merge(dst, src) +func (m *LogFilter) XXX_Merge(src proto.Message) { + xxx_messageInfo_LogFilter.Merge(m, src) } func (m *LogFilter) XXX_Size() int { return xxx_messageInfo_LogFilter.Size(m) @@ -220,7 +220,7 @@ func (m *ReadLogsRequest) Reset() { *m = ReadLogsRequest{} } func (m *ReadLogsRequest) String() string { return proto.CompactTextString(m) } func (*ReadLogsRequest) ProtoMessage() {} func (*ReadLogsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_event_6540864d84a83132, []int{2} + return fileDescriptor_2d17a9d3f0ddf27e, []int{2} } func (m *ReadLogsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadLogsRequest.Unmarshal(m, b) @@ -228,8 +228,8 @@ func (m *ReadLogsRequest) XXX_Unmarshal(b []byte) error { func (m *ReadLogsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadLogsRequest.Marshal(b, m, deterministic) } -func (dst *ReadLogsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadLogsRequest.Merge(dst, src) +func (m *ReadLogsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadLogsRequest.Merge(m, src) } func (m *ReadLogsRequest) XXX_Size() int { return xxx_messageInfo_ReadLogsRequest.Size(m) @@ -247,11 +247,13 @@ type isReadLogsRequest_Filter interface { type ReadLogsRequest_Id struct { Id uint32 `protobuf:"varint,1,opt,name=id,proto3,oneof"` } + type ReadLogsRequest_Condition struct { Condition *LogFilter `protobuf:"bytes,2,opt,name=condition,proto3,oneof"` } -func (*ReadLogsRequest_Id) isReadLogsRequest_Filter() {} +func (*ReadLogsRequest_Id) isReadLogsRequest_Filter() {} + func (*ReadLogsRequest_Condition) isReadLogsRequest_Filter() {} func (m *ReadLogsRequest) GetFilter() isReadLogsRequest_Filter { @@ -355,7 +357,7 @@ func (m *ReadLogsResponse) Reset() { *m = ReadLogsResponse{} } func (m *ReadLogsResponse) String() string { return proto.CompactTextString(m) } func (*ReadLogsResponse) ProtoMessage() {} func (*ReadLogsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_event_6540864d84a83132, []int{3} + return fileDescriptor_2d17a9d3f0ddf27e, []int{3} } func (m *ReadLogsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadLogsResponse.Unmarshal(m, b) @@ -363,8 +365,8 @@ func (m *ReadLogsResponse) XXX_Unmarshal(b []byte) error { func (m *ReadLogsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadLogsResponse.Marshal(b, m, deterministic) } -func (dst *ReadLogsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadLogsResponse.Merge(dst, src) +func (m *ReadLogsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadLogsResponse.Merge(m, src) } func (m *ReadLogsResponse) XXX_Size() int { return xxx_messageInfo_ReadLogsResponse.Size(m) @@ -393,7 +395,7 @@ func (m *ListenLogsRequest) Reset() { *m = ListenLogsRequest{} } func (m *ListenLogsRequest) String() string { return proto.CompactTextString(m) } func (*ListenLogsRequest) ProtoMessage() {} func (*ListenLogsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_event_6540864d84a83132, []int{4} + return fileDescriptor_2d17a9d3f0ddf27e, []int{4} } func (m *ListenLogsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListenLogsRequest.Unmarshal(m, b) @@ -401,8 +403,8 @@ func (m *ListenLogsRequest) XXX_Unmarshal(b []byte) error { func (m *ListenLogsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListenLogsRequest.Marshal(b, m, deterministic) } -func (dst *ListenLogsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListenLogsRequest.Merge(dst, src) +func (m *ListenLogsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListenLogsRequest.Merge(m, src) } func (m *ListenLogsRequest) XXX_Size() int { return xxx_messageInfo_ListenLogsRequest.Size(m) @@ -561,9 +563,9 @@ var _Log_serviceDesc = grpc.ServiceDesc{ Metadata: "event.proto", } -func init() { proto.RegisterFile("event.proto", fileDescriptor_event_6540864d84a83132) } +func init() { proto.RegisterFile("event.proto", fileDescriptor_2d17a9d3f0ddf27e) } -var fileDescriptor_event_6540864d84a83132 = []byte{ +var fileDescriptor_2d17a9d3f0ddf27e = []byte{ // 447 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x52, 0x41, 0x8f, 0xd3, 0x3c, 0x14, 0x8c, 0xdb, 0xb4, 0x4d, 0x5e, 0xf7, 0xdb, 0xee, 0x67, 0x2d, 0x60, 0x82, 0xc4, 0x46, 0xb9, diff --git a/pkg/server/grpc/mock_storage_test.go b/pkg/server/grpc/mock_storage_test.go new file mode 100644 index 0000000..aeb2689 --- /dev/null +++ b/pkg/server/grpc/mock_storage_test.go @@ -0,0 +1,167 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kamilsk/form-api/pkg/server/grpc (interfaces: ProtectedStorage) + +// Package grpc_test is a generated GoMock package. +package grpc_test + +import ( + context "context" + gomock "github.com/golang/mock/gomock" + domain "github.com/kamilsk/form-api/pkg/domain" + query "github.com/kamilsk/form-api/pkg/storage/query" + types "github.com/kamilsk/form-api/pkg/storage/types" + reflect "reflect" +) + +// MockProtectedStorage is a mock of ProtectedStorage interface +type MockProtectedStorage struct { + ctrl *gomock.Controller + recorder *MockProtectedStorageMockRecorder +} + +// MockProtectedStorageMockRecorder is the mock recorder for MockProtectedStorage +type MockProtectedStorageMockRecorder struct { + mock *MockProtectedStorage +} + +// NewMockProtectedStorage creates a new mock instance +func NewMockProtectedStorage(ctrl *gomock.Controller) *MockProtectedStorage { + mock := &MockProtectedStorage{ctrl: ctrl} + mock.recorder = &MockProtectedStorageMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockProtectedStorage) EXPECT() *MockProtectedStorageMockRecorder { + return m.recorder +} + +// CreateSchema mocks base method +func (m *MockProtectedStorage) CreateSchema(arg0 context.Context, arg1 domain.ID, arg2 query.CreateSchema) (types.Schema, error) { + ret := m.ctrl.Call(m, "CreateSchema", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Schema) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateSchema indicates an expected call of CreateSchema +func (mr *MockProtectedStorageMockRecorder) CreateSchema(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSchema", reflect.TypeOf((*MockProtectedStorage)(nil).CreateSchema), arg0, arg1, arg2) +} + +// CreateTemplate mocks base method +func (m *MockProtectedStorage) CreateTemplate(arg0 context.Context, arg1 domain.ID, arg2 query.CreateTemplate) (types.Template, error) { + ret := m.ctrl.Call(m, "CreateTemplate", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Template) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateTemplate indicates an expected call of CreateTemplate +func (mr *MockProtectedStorageMockRecorder) CreateTemplate(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTemplate", reflect.TypeOf((*MockProtectedStorage)(nil).CreateTemplate), arg0, arg1, arg2) +} + +// DeleteSchema mocks base method +func (m *MockProtectedStorage) DeleteSchema(arg0 context.Context, arg1 domain.ID, arg2 query.DeleteSchema) (types.Schema, error) { + ret := m.ctrl.Call(m, "DeleteSchema", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Schema) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteSchema indicates an expected call of DeleteSchema +func (mr *MockProtectedStorageMockRecorder) DeleteSchema(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteSchema", reflect.TypeOf((*MockProtectedStorage)(nil).DeleteSchema), arg0, arg1, arg2) +} + +// DeleteTemplate mocks base method +func (m *MockProtectedStorage) DeleteTemplate(arg0 context.Context, arg1 domain.ID, arg2 query.DeleteTemplate) (types.Template, error) { + ret := m.ctrl.Call(m, "DeleteTemplate", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Template) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteTemplate indicates an expected call of DeleteTemplate +func (mr *MockProtectedStorageMockRecorder) DeleteTemplate(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTemplate", reflect.TypeOf((*MockProtectedStorage)(nil).DeleteTemplate), arg0, arg1, arg2) +} + +// ReadInputByFilter mocks base method +func (m *MockProtectedStorage) ReadInputByFilter(arg0 context.Context, arg1 domain.ID, arg2 query.InputFilter) ([]types.Input, error) { + ret := m.ctrl.Call(m, "ReadInputByFilter", arg0, arg1, arg2) + ret0, _ := ret[0].([]types.Input) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadInputByFilter indicates an expected call of ReadInputByFilter +func (mr *MockProtectedStorageMockRecorder) ReadInputByFilter(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadInputByFilter", reflect.TypeOf((*MockProtectedStorage)(nil).ReadInputByFilter), arg0, arg1, arg2) +} + +// ReadInputByID mocks base method +func (m *MockProtectedStorage) ReadInputByID(arg0 context.Context, arg1, arg2 domain.ID) (types.Input, error) { + ret := m.ctrl.Call(m, "ReadInputByID", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Input) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadInputByID indicates an expected call of ReadInputByID +func (mr *MockProtectedStorageMockRecorder) ReadInputByID(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadInputByID", reflect.TypeOf((*MockProtectedStorage)(nil).ReadInputByID), arg0, arg1, arg2) +} + +// ReadSchema mocks base method +func (m *MockProtectedStorage) ReadSchema(arg0 context.Context, arg1 domain.ID, arg2 query.ReadSchema) (types.Schema, error) { + ret := m.ctrl.Call(m, "ReadSchema", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Schema) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadSchema indicates an expected call of ReadSchema +func (mr *MockProtectedStorageMockRecorder) ReadSchema(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadSchema", reflect.TypeOf((*MockProtectedStorage)(nil).ReadSchema), arg0, arg1, arg2) +} + +// ReadTemplate mocks base method +func (m *MockProtectedStorage) ReadTemplate(arg0 context.Context, arg1 domain.ID, arg2 query.ReadTemplate) (types.Template, error) { + ret := m.ctrl.Call(m, "ReadTemplate", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Template) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadTemplate indicates an expected call of ReadTemplate +func (mr *MockProtectedStorageMockRecorder) ReadTemplate(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadTemplate", reflect.TypeOf((*MockProtectedStorage)(nil).ReadTemplate), arg0, arg1, arg2) +} + +// UpdateSchema mocks base method +func (m *MockProtectedStorage) UpdateSchema(arg0 context.Context, arg1 domain.ID, arg2 query.UpdateSchema) (types.Schema, error) { + ret := m.ctrl.Call(m, "UpdateSchema", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Schema) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateSchema indicates an expected call of UpdateSchema +func (mr *MockProtectedStorageMockRecorder) UpdateSchema(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSchema", reflect.TypeOf((*MockProtectedStorage)(nil).UpdateSchema), arg0, arg1, arg2) +} + +// UpdateTemplate mocks base method +func (m *MockProtectedStorage) UpdateTemplate(arg0 context.Context, arg1 domain.ID, arg2 query.UpdateTemplate) (types.Template, error) { + ret := m.ctrl.Call(m, "UpdateTemplate", arg0, arg1, arg2) + ret0, _ := ret[0].(types.Template) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateTemplate indicates an expected call of UpdateTemplate +func (mr *MockProtectedStorageMockRecorder) UpdateTemplate(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTemplate", reflect.TypeOf((*MockProtectedStorage)(nil).UpdateTemplate), arg0, arg1, arg2) +} diff --git a/pkg/server/grpc/storage.pb.go b/pkg/server/grpc/storage.pb.go index e3d277c..4ceb0e8 100644 --- a/pkg/server/grpc/storage.pb.go +++ b/pkg/server/grpc/storage.pb.go @@ -39,7 +39,7 @@ func (m *CreateSchemaRequest) Reset() { *m = CreateSchemaRequest{} } func (m *CreateSchemaRequest) String() string { return proto.CompactTextString(m) } func (*CreateSchemaRequest) ProtoMessage() {} func (*CreateSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{0} + return fileDescriptor_0d2c4ccf1453ffdb, []int{0} } func (m *CreateSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CreateSchemaRequest.Unmarshal(m, b) @@ -47,8 +47,8 @@ func (m *CreateSchemaRequest) XXX_Unmarshal(b []byte) error { func (m *CreateSchemaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CreateSchemaRequest.Marshal(b, m, deterministic) } -func (dst *CreateSchemaRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateSchemaRequest.Merge(dst, src) +func (m *CreateSchemaRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateSchemaRequest.Merge(m, src) } func (m *CreateSchemaRequest) XXX_Size() int { return xxx_messageInfo_CreateSchemaRequest.Size(m) @@ -92,7 +92,7 @@ func (m *CreateSchemaResponse) Reset() { *m = CreateSchemaResponse{} } func (m *CreateSchemaResponse) String() string { return proto.CompactTextString(m) } func (*CreateSchemaResponse) ProtoMessage() {} func (*CreateSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{1} + return fileDescriptor_0d2c4ccf1453ffdb, []int{1} } func (m *CreateSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CreateSchemaResponse.Unmarshal(m, b) @@ -100,8 +100,8 @@ func (m *CreateSchemaResponse) XXX_Unmarshal(b []byte) error { func (m *CreateSchemaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CreateSchemaResponse.Marshal(b, m, deterministic) } -func (dst *CreateSchemaResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateSchemaResponse.Merge(dst, src) +func (m *CreateSchemaResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateSchemaResponse.Merge(m, src) } func (m *CreateSchemaResponse) XXX_Size() int { return xxx_messageInfo_CreateSchemaResponse.Size(m) @@ -137,7 +137,7 @@ func (m *ReadSchemaRequest) Reset() { *m = ReadSchemaRequest{} } func (m *ReadSchemaRequest) String() string { return proto.CompactTextString(m) } func (*ReadSchemaRequest) ProtoMessage() {} func (*ReadSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{2} + return fileDescriptor_0d2c4ccf1453ffdb, []int{2} } func (m *ReadSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadSchemaRequest.Unmarshal(m, b) @@ -145,8 +145,8 @@ func (m *ReadSchemaRequest) XXX_Unmarshal(b []byte) error { func (m *ReadSchemaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadSchemaRequest.Marshal(b, m, deterministic) } -func (dst *ReadSchemaRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadSchemaRequest.Merge(dst, src) +func (m *ReadSchemaRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadSchemaRequest.Merge(m, src) } func (m *ReadSchemaRequest) XXX_Size() int { return xxx_messageInfo_ReadSchemaRequest.Size(m) @@ -180,7 +180,7 @@ func (m *ReadSchemaResponse) Reset() { *m = ReadSchemaResponse{} } func (m *ReadSchemaResponse) String() string { return proto.CompactTextString(m) } func (*ReadSchemaResponse) ProtoMessage() {} func (*ReadSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{3} + return fileDescriptor_0d2c4ccf1453ffdb, []int{3} } func (m *ReadSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadSchemaResponse.Unmarshal(m, b) @@ -188,8 +188,8 @@ func (m *ReadSchemaResponse) XXX_Unmarshal(b []byte) error { func (m *ReadSchemaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadSchemaResponse.Marshal(b, m, deterministic) } -func (dst *ReadSchemaResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadSchemaResponse.Merge(dst, src) +func (m *ReadSchemaResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadSchemaResponse.Merge(m, src) } func (m *ReadSchemaResponse) XXX_Size() int { return xxx_messageInfo_ReadSchemaResponse.Size(m) @@ -255,7 +255,7 @@ func (m *UpdateSchemaRequest) Reset() { *m = UpdateSchemaRequest{} } func (m *UpdateSchemaRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSchemaRequest) ProtoMessage() {} func (*UpdateSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{4} + return fileDescriptor_0d2c4ccf1453ffdb, []int{4} } func (m *UpdateSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateSchemaRequest.Unmarshal(m, b) @@ -263,8 +263,8 @@ func (m *UpdateSchemaRequest) XXX_Unmarshal(b []byte) error { func (m *UpdateSchemaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateSchemaRequest.Marshal(b, m, deterministic) } -func (dst *UpdateSchemaRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateSchemaRequest.Merge(dst, src) +func (m *UpdateSchemaRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateSchemaRequest.Merge(m, src) } func (m *UpdateSchemaRequest) XXX_Size() int { return xxx_messageInfo_UpdateSchemaRequest.Size(m) @@ -307,7 +307,7 @@ func (m *UpdateSchemaResponse) Reset() { *m = UpdateSchemaResponse{} } func (m *UpdateSchemaResponse) String() string { return proto.CompactTextString(m) } func (*UpdateSchemaResponse) ProtoMessage() {} func (*UpdateSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{5} + return fileDescriptor_0d2c4ccf1453ffdb, []int{5} } func (m *UpdateSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateSchemaResponse.Unmarshal(m, b) @@ -315,8 +315,8 @@ func (m *UpdateSchemaResponse) XXX_Unmarshal(b []byte) error { func (m *UpdateSchemaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateSchemaResponse.Marshal(b, m, deterministic) } -func (dst *UpdateSchemaResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateSchemaResponse.Merge(dst, src) +func (m *UpdateSchemaResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateSchemaResponse.Merge(m, src) } func (m *UpdateSchemaResponse) XXX_Size() int { return xxx_messageInfo_UpdateSchemaResponse.Size(m) @@ -345,7 +345,7 @@ func (m *DeleteSchemaRequest) Reset() { *m = DeleteSchemaRequest{} } func (m *DeleteSchemaRequest) String() string { return proto.CompactTextString(m) } func (*DeleteSchemaRequest) ProtoMessage() {} func (*DeleteSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{6} + return fileDescriptor_0d2c4ccf1453ffdb, []int{6} } func (m *DeleteSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteSchemaRequest.Unmarshal(m, b) @@ -353,8 +353,8 @@ func (m *DeleteSchemaRequest) XXX_Unmarshal(b []byte) error { func (m *DeleteSchemaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteSchemaRequest.Marshal(b, m, deterministic) } -func (dst *DeleteSchemaRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteSchemaRequest.Merge(dst, src) +func (m *DeleteSchemaRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteSchemaRequest.Merge(m, src) } func (m *DeleteSchemaRequest) XXX_Size() int { return xxx_messageInfo_DeleteSchemaRequest.Size(m) @@ -383,7 +383,7 @@ func (m *DeleteSchemaResponse) Reset() { *m = DeleteSchemaResponse{} } func (m *DeleteSchemaResponse) String() string { return proto.CompactTextString(m) } func (*DeleteSchemaResponse) ProtoMessage() {} func (*DeleteSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{7} + return fileDescriptor_0d2c4ccf1453ffdb, []int{7} } func (m *DeleteSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteSchemaResponse.Unmarshal(m, b) @@ -391,8 +391,8 @@ func (m *DeleteSchemaResponse) XXX_Unmarshal(b []byte) error { func (m *DeleteSchemaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteSchemaResponse.Marshal(b, m, deterministic) } -func (dst *DeleteSchemaResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteSchemaResponse.Merge(dst, src) +func (m *DeleteSchemaResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteSchemaResponse.Merge(m, src) } func (m *DeleteSchemaResponse) XXX_Size() int { return xxx_messageInfo_DeleteSchemaResponse.Size(m) @@ -423,7 +423,7 @@ func (m *CreateTemplateRequest) Reset() { *m = CreateTemplateRequest{} } func (m *CreateTemplateRequest) String() string { return proto.CompactTextString(m) } func (*CreateTemplateRequest) ProtoMessage() {} func (*CreateTemplateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{8} + return fileDescriptor_0d2c4ccf1453ffdb, []int{8} } func (m *CreateTemplateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CreateTemplateRequest.Unmarshal(m, b) @@ -431,8 +431,8 @@ func (m *CreateTemplateRequest) XXX_Unmarshal(b []byte) error { func (m *CreateTemplateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CreateTemplateRequest.Marshal(b, m, deterministic) } -func (dst *CreateTemplateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateTemplateRequest.Merge(dst, src) +func (m *CreateTemplateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateTemplateRequest.Merge(m, src) } func (m *CreateTemplateRequest) XXX_Size() int { return xxx_messageInfo_CreateTemplateRequest.Size(m) @@ -476,7 +476,7 @@ func (m *CreateTemplateResponse) Reset() { *m = CreateTemplateResponse{} func (m *CreateTemplateResponse) String() string { return proto.CompactTextString(m) } func (*CreateTemplateResponse) ProtoMessage() {} func (*CreateTemplateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{9} + return fileDescriptor_0d2c4ccf1453ffdb, []int{9} } func (m *CreateTemplateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CreateTemplateResponse.Unmarshal(m, b) @@ -484,8 +484,8 @@ func (m *CreateTemplateResponse) XXX_Unmarshal(b []byte) error { func (m *CreateTemplateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CreateTemplateResponse.Marshal(b, m, deterministic) } -func (dst *CreateTemplateResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateTemplateResponse.Merge(dst, src) +func (m *CreateTemplateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateTemplateResponse.Merge(m, src) } func (m *CreateTemplateResponse) XXX_Size() int { return xxx_messageInfo_CreateTemplateResponse.Size(m) @@ -521,7 +521,7 @@ func (m *ReadTemplateRequest) Reset() { *m = ReadTemplateRequest{} } func (m *ReadTemplateRequest) String() string { return proto.CompactTextString(m) } func (*ReadTemplateRequest) ProtoMessage() {} func (*ReadTemplateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{10} + return fileDescriptor_0d2c4ccf1453ffdb, []int{10} } func (m *ReadTemplateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadTemplateRequest.Unmarshal(m, b) @@ -529,8 +529,8 @@ func (m *ReadTemplateRequest) XXX_Unmarshal(b []byte) error { func (m *ReadTemplateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadTemplateRequest.Marshal(b, m, deterministic) } -func (dst *ReadTemplateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadTemplateRequest.Merge(dst, src) +func (m *ReadTemplateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadTemplateRequest.Merge(m, src) } func (m *ReadTemplateRequest) XXX_Size() int { return xxx_messageInfo_ReadTemplateRequest.Size(m) @@ -564,7 +564,7 @@ func (m *ReadTemplateResponse) Reset() { *m = ReadTemplateResponse{} } func (m *ReadTemplateResponse) String() string { return proto.CompactTextString(m) } func (*ReadTemplateResponse) ProtoMessage() {} func (*ReadTemplateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{11} + return fileDescriptor_0d2c4ccf1453ffdb, []int{11} } func (m *ReadTemplateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadTemplateResponse.Unmarshal(m, b) @@ -572,8 +572,8 @@ func (m *ReadTemplateResponse) XXX_Unmarshal(b []byte) error { func (m *ReadTemplateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadTemplateResponse.Marshal(b, m, deterministic) } -func (dst *ReadTemplateResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadTemplateResponse.Merge(dst, src) +func (m *ReadTemplateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadTemplateResponse.Merge(m, src) } func (m *ReadTemplateResponse) XXX_Size() int { return xxx_messageInfo_ReadTemplateResponse.Size(m) @@ -639,7 +639,7 @@ func (m *UpdateTemplateRequest) Reset() { *m = UpdateTemplateRequest{} } func (m *UpdateTemplateRequest) String() string { return proto.CompactTextString(m) } func (*UpdateTemplateRequest) ProtoMessage() {} func (*UpdateTemplateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{12} + return fileDescriptor_0d2c4ccf1453ffdb, []int{12} } func (m *UpdateTemplateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateTemplateRequest.Unmarshal(m, b) @@ -647,8 +647,8 @@ func (m *UpdateTemplateRequest) XXX_Unmarshal(b []byte) error { func (m *UpdateTemplateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateTemplateRequest.Marshal(b, m, deterministic) } -func (dst *UpdateTemplateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateTemplateRequest.Merge(dst, src) +func (m *UpdateTemplateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateTemplateRequest.Merge(m, src) } func (m *UpdateTemplateRequest) XXX_Size() int { return xxx_messageInfo_UpdateTemplateRequest.Size(m) @@ -691,7 +691,7 @@ func (m *UpdateTemplateResponse) Reset() { *m = UpdateTemplateResponse{} func (m *UpdateTemplateResponse) String() string { return proto.CompactTextString(m) } func (*UpdateTemplateResponse) ProtoMessage() {} func (*UpdateTemplateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{13} + return fileDescriptor_0d2c4ccf1453ffdb, []int{13} } func (m *UpdateTemplateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateTemplateResponse.Unmarshal(m, b) @@ -699,8 +699,8 @@ func (m *UpdateTemplateResponse) XXX_Unmarshal(b []byte) error { func (m *UpdateTemplateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateTemplateResponse.Marshal(b, m, deterministic) } -func (dst *UpdateTemplateResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateTemplateResponse.Merge(dst, src) +func (m *UpdateTemplateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateTemplateResponse.Merge(m, src) } func (m *UpdateTemplateResponse) XXX_Size() int { return xxx_messageInfo_UpdateTemplateResponse.Size(m) @@ -729,7 +729,7 @@ func (m *DeleteTemplateRequest) Reset() { *m = DeleteTemplateRequest{} } func (m *DeleteTemplateRequest) String() string { return proto.CompactTextString(m) } func (*DeleteTemplateRequest) ProtoMessage() {} func (*DeleteTemplateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{14} + return fileDescriptor_0d2c4ccf1453ffdb, []int{14} } func (m *DeleteTemplateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteTemplateRequest.Unmarshal(m, b) @@ -737,8 +737,8 @@ func (m *DeleteTemplateRequest) XXX_Unmarshal(b []byte) error { func (m *DeleteTemplateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteTemplateRequest.Marshal(b, m, deterministic) } -func (dst *DeleteTemplateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteTemplateRequest.Merge(dst, src) +func (m *DeleteTemplateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteTemplateRequest.Merge(m, src) } func (m *DeleteTemplateRequest) XXX_Size() int { return xxx_messageInfo_DeleteTemplateRequest.Size(m) @@ -767,7 +767,7 @@ func (m *DeleteTemplateResponse) Reset() { *m = DeleteTemplateResponse{} func (m *DeleteTemplateResponse) String() string { return proto.CompactTextString(m) } func (*DeleteTemplateResponse) ProtoMessage() {} func (*DeleteTemplateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{15} + return fileDescriptor_0d2c4ccf1453ffdb, []int{15} } func (m *DeleteTemplateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteTemplateResponse.Unmarshal(m, b) @@ -775,8 +775,8 @@ func (m *DeleteTemplateResponse) XXX_Unmarshal(b []byte) error { func (m *DeleteTemplateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteTemplateResponse.Marshal(b, m, deterministic) } -func (dst *DeleteTemplateResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteTemplateResponse.Merge(dst, src) +func (m *DeleteTemplateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteTemplateResponse.Merge(m, src) } func (m *DeleteTemplateResponse) XXX_Size() int { return xxx_messageInfo_DeleteTemplateResponse.Size(m) @@ -808,7 +808,7 @@ func (m *InputEntry) Reset() { *m = InputEntry{} } func (m *InputEntry) String() string { return proto.CompactTextString(m) } func (*InputEntry) ProtoMessage() {} func (*InputEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{16} + return fileDescriptor_0d2c4ccf1453ffdb, []int{16} } func (m *InputEntry) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InputEntry.Unmarshal(m, b) @@ -816,8 +816,8 @@ func (m *InputEntry) XXX_Unmarshal(b []byte) error { func (m *InputEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InputEntry.Marshal(b, m, deterministic) } -func (dst *InputEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_InputEntry.Merge(dst, src) +func (m *InputEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_InputEntry.Merge(m, src) } func (m *InputEntry) XXX_Size() int { return xxx_messageInfo_InputEntry.Size(m) @@ -868,7 +868,7 @@ func (m *InputFilter) Reset() { *m = InputFilter{} } func (m *InputFilter) String() string { return proto.CompactTextString(m) } func (*InputFilter) ProtoMessage() {} func (*InputFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{17} + return fileDescriptor_0d2c4ccf1453ffdb, []int{17} } func (m *InputFilter) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InputFilter.Unmarshal(m, b) @@ -876,8 +876,8 @@ func (m *InputFilter) XXX_Unmarshal(b []byte) error { func (m *InputFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InputFilter.Marshal(b, m, deterministic) } -func (dst *InputFilter) XXX_Merge(src proto.Message) { - xxx_messageInfo_InputFilter.Merge(dst, src) +func (m *InputFilter) XXX_Merge(src proto.Message) { + xxx_messageInfo_InputFilter.Merge(m, src) } func (m *InputFilter) XXX_Size() int { return xxx_messageInfo_InputFilter.Size(m) @@ -916,7 +916,7 @@ func (m *ReadInputRequest) Reset() { *m = ReadInputRequest{} } func (m *ReadInputRequest) String() string { return proto.CompactTextString(m) } func (*ReadInputRequest) ProtoMessage() {} func (*ReadInputRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{18} + return fileDescriptor_0d2c4ccf1453ffdb, []int{18} } func (m *ReadInputRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadInputRequest.Unmarshal(m, b) @@ -924,8 +924,8 @@ func (m *ReadInputRequest) XXX_Unmarshal(b []byte) error { func (m *ReadInputRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadInputRequest.Marshal(b, m, deterministic) } -func (dst *ReadInputRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadInputRequest.Merge(dst, src) +func (m *ReadInputRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadInputRequest.Merge(m, src) } func (m *ReadInputRequest) XXX_Size() int { return xxx_messageInfo_ReadInputRequest.Size(m) @@ -943,11 +943,13 @@ type isReadInputRequest_Filter interface { type ReadInputRequest_Id struct { Id string `protobuf:"bytes,1,opt,name=id,proto3,oneof"` } + type ReadInputRequest_Condition struct { Condition *InputFilter `protobuf:"bytes,2,opt,name=condition,proto3,oneof"` } -func (*ReadInputRequest_Id) isReadInputRequest_Filter() {} +func (*ReadInputRequest_Id) isReadInputRequest_Filter() {} + func (*ReadInputRequest_Condition) isReadInputRequest_Filter() {} func (m *ReadInputRequest) GetFilter() isReadInputRequest_Filter { @@ -1052,7 +1054,7 @@ func (m *ReadInputResponse) Reset() { *m = ReadInputResponse{} } func (m *ReadInputResponse) String() string { return proto.CompactTextString(m) } func (*ReadInputResponse) ProtoMessage() {} func (*ReadInputResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_storage_a3e50ccb169f3ef3, []int{19} + return fileDescriptor_0d2c4ccf1453ffdb, []int{19} } func (m *ReadInputResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReadInputResponse.Unmarshal(m, b) @@ -1060,8 +1062,8 @@ func (m *ReadInputResponse) XXX_Unmarshal(b []byte) error { func (m *ReadInputResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ReadInputResponse.Marshal(b, m, deterministic) } -func (dst *ReadInputResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReadInputResponse.Merge(dst, src) +func (m *ReadInputResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadInputResponse.Merge(m, src) } func (m *ReadInputResponse) XXX_Size() int { return xxx_messageInfo_ReadInputResponse.Size(m) @@ -1500,9 +1502,9 @@ var _Input_serviceDesc = grpc.ServiceDesc{ Metadata: "storage.proto", } -func init() { proto.RegisterFile("storage.proto", fileDescriptor_storage_a3e50ccb169f3ef3) } +func init() { proto.RegisterFile("storage.proto", fileDescriptor_0d2c4ccf1453ffdb) } -var fileDescriptor_storage_a3e50ccb169f3ef3 = []byte{ +var fileDescriptor_0d2c4ccf1453ffdb = []byte{ // 670 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x55, 0xcd, 0x6e, 0xda, 0x40, 0x10, 0x36, 0x0e, 0x38, 0x61, 0x48, 0x2b, 0xb2, 0x18, 0xe2, 0x98, 0xaa, 0x45, 0xae, 0xa2, 0xa2, diff --git a/pkg/service/contract.go b/pkg/service/contract.go index 2c46be0..44e9eeb 100644 --- a/pkg/service/contract.go +++ b/pkg/service/contract.go @@ -13,12 +13,12 @@ type Storage interface { Schema(context.Context, domain.ID) (domain.Schema, error) // Template returns the form template with provided ID. Template(context.Context, domain.ID) (domain.Template, error) + // StoreInput stores an user input data. + StoreInput(context.Context, domain.ID, domain.InputData) (*types.Input, error) } -// InputHandler TODO issue#173 -type InputHandler interface { - // HandleInput TODO issue#173 - HandleInput(context.Context, domain.ID, domain.InputData) (*types.Input, error) - // LogRequest TODO issue#173 - LogRequest(context.Context, *types.Input, domain.InputContext) error +// Tracker TODO issue#173 +type Tracker interface { + // LogInput stores an input event. + LogInput(context.Context, domain.InputEvent) error } diff --git a/pkg/service/internal_test.go b/pkg/service/internal_test.go new file mode 100644 index 0000000..618e979 --- /dev/null +++ b/pkg/service/internal_test.go @@ -0,0 +1,48 @@ +package service + +import ( + "net/url" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_extend(t *testing.T) { + tests := []struct { + name string + url *url.URL + paths []string + expected string + }{ + {"without paths", &url.URL{Path: "/"}, nil, "/"}, + {"with some paths", &url.URL{Path: "/with"}, []string{"some", "paths"}, "/with/some/paths"}, + } + + for _, test := range tests { + tc := test + t.Run(test.name, func(t *testing.T) { + assert.Equal(t, tc.expected, extend(tc.url, tc.paths...)) + }) + } +} + +func Test_must(t *testing.T) { + tests := []struct { + name string + base, tpl string + panicked bool + }{ + {"non-existent template", "/", "_.tpl", true}, + } + + for _, test := range tests { + tc := test + t.Run(test.name, func(t *testing.T) { + if tc.panicked { + assert.Panics(t, func() { must(tc.base, tc.tpl) }) + } else { + assert.NotEmpty(t, must(tc.base, tc.tpl)) + } + }) + } +} diff --git a/pkg/service/mock_handler_test.go b/pkg/service/mock_handler_test.go deleted file mode 100644 index a6e9949..0000000 --- a/pkg/service/mock_handler_test.go +++ /dev/null @@ -1,61 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/kamilsk/form-api/pkg/service (interfaces: InputHandler) - -// Package service_test is a generated GoMock package. -package service_test - -import ( - context "context" - gomock "github.com/golang/mock/gomock" - domain "github.com/kamilsk/form-api/pkg/domain" - types "github.com/kamilsk/form-api/pkg/storage/types" - reflect "reflect" -) - -// MockInputHandler is a mock of InputHandler interface -type MockInputHandler struct { - ctrl *gomock.Controller - recorder *MockInputHandlerMockRecorder -} - -// MockInputHandlerMockRecorder is the mock recorder for MockInputHandler -type MockInputHandlerMockRecorder struct { - mock *MockInputHandler -} - -// NewMockInputHandler creates a new mock instance -func NewMockInputHandler(ctrl *gomock.Controller) *MockInputHandler { - mock := &MockInputHandler{ctrl: ctrl} - mock.recorder = &MockInputHandlerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockInputHandler) EXPECT() *MockInputHandlerMockRecorder { - return m.recorder -} - -// HandleInput mocks base method -func (m *MockInputHandler) HandleInput(arg0 context.Context, arg1 domain.ID, arg2 domain.InputData) (*types.Input, error) { - ret := m.ctrl.Call(m, "HandleInput", arg0, arg1, arg2) - ret0, _ := ret[0].(*types.Input) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// HandleInput indicates an expected call of HandleInput -func (mr *MockInputHandlerMockRecorder) HandleInput(arg0, arg1, arg2 interface{}) *gomock.Call { - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HandleInput", reflect.TypeOf((*MockInputHandler)(nil).HandleInput), arg0, arg1, arg2) -} - -// LogRequest mocks base method -func (m *MockInputHandler) LogRequest(arg0 context.Context, arg1 *types.Input, arg2 domain.InputContext) error { - ret := m.ctrl.Call(m, "LogRequest", arg0, arg1, arg2) - ret0, _ := ret[0].(error) - return ret0 -} - -// LogRequest indicates an expected call of LogRequest -func (mr *MockInputHandlerMockRecorder) LogRequest(arg0, arg1, arg2 interface{}) *gomock.Call { - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogRequest", reflect.TypeOf((*MockInputHandler)(nil).LogRequest), arg0, arg1, arg2) -} diff --git a/pkg/service/mock_storage_test.go b/pkg/service/mock_storage_test.go index 8f0c268..e471cb3 100644 --- a/pkg/service/mock_storage_test.go +++ b/pkg/service/mock_storage_test.go @@ -8,6 +8,7 @@ import ( context "context" gomock "github.com/golang/mock/gomock" domain "github.com/kamilsk/form-api/pkg/domain" + types "github.com/kamilsk/form-api/pkg/storage/types" reflect "reflect" ) @@ -47,6 +48,19 @@ func (mr *MockStorageMockRecorder) Schema(arg0, arg1 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Schema", reflect.TypeOf((*MockStorage)(nil).Schema), arg0, arg1) } +// StoreInput mocks base method +func (m *MockStorage) StoreInput(arg0 context.Context, arg1 domain.ID, arg2 domain.InputData) (*types.Input, error) { + ret := m.ctrl.Call(m, "StoreInput", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.Input) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StoreInput indicates an expected call of StoreInput +func (mr *MockStorageMockRecorder) StoreInput(arg0, arg1, arg2 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreInput", reflect.TypeOf((*MockStorage)(nil).StoreInput), arg0, arg1, arg2) +} + // Template mocks base method func (m *MockStorage) Template(arg0 context.Context, arg1 domain.ID) (domain.Template, error) { ret := m.ctrl.Call(m, "Template", arg0, arg1) diff --git a/pkg/service/mock_tracker_test.go b/pkg/service/mock_tracker_test.go new file mode 100644 index 0000000..a42d0ba --- /dev/null +++ b/pkg/service/mock_tracker_test.go @@ -0,0 +1,47 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kamilsk/form-api/pkg/service (interfaces: Tracker) + +// Package service_test is a generated GoMock package. +package service_test + +import ( + context "context" + gomock "github.com/golang/mock/gomock" + domain "github.com/kamilsk/form-api/pkg/domain" + reflect "reflect" +) + +// MockTracker is a mock of Tracker interface +type MockTracker struct { + ctrl *gomock.Controller + recorder *MockTrackerMockRecorder +} + +// MockTrackerMockRecorder is the mock recorder for MockTracker +type MockTrackerMockRecorder struct { + mock *MockTracker +} + +// NewMockTracker creates a new mock instance +func NewMockTracker(ctrl *gomock.Controller) *MockTracker { + mock := &MockTracker{ctrl: ctrl} + mock.recorder = &MockTrackerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTracker) EXPECT() *MockTrackerMockRecorder { + return m.recorder +} + +// LogInput mocks base method +func (m *MockTracker) LogInput(arg0 context.Context, arg1 domain.InputEvent) error { + ret := m.ctrl.Call(m, "LogInput", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// LogInput indicates an expected call of LogInput +func (mr *MockTrackerMockRecorder) LogInput(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogInput", reflect.TypeOf((*MockTracker)(nil).LogInput), arg0, arg1) +} diff --git a/pkg/service/service.go b/pkg/service/service.go index 493cea9..83c6a5c 100644 --- a/pkg/service/service.go +++ b/pkg/service/service.go @@ -2,58 +2,156 @@ package service import ( "context" + "encoding/base64" + "encoding/json" + "html/template" + "net/http" + "net/url" + "path" + "strings" + "time" + "github.com/kamilsk/form-api/pkg/config" "github.com/kamilsk/form-api/pkg/domain" "github.com/kamilsk/form-api/pkg/errors" - "github.com/kamilsk/form-api/pkg/storage/types" + "github.com/kamilsk/form-api/pkg/static" "github.com/kamilsk/form-api/pkg/transfer/api/v1" ) // New returns a new instance of the Forma service. -func New(storage Storage, handler InputHandler) *Forma { - return &Forma{storage: storage, handler: handler} +// It can raise the panic if base URL is invalid or HTML templates are not available. +func New(cnf config.ServiceConfig, storage Storage, tracker Tracker) *Forma { + u, err := url.Parse(cnf.BaseURL) + if err != nil { + panic(err) + } + return &Forma{config: cnf, storage: storage, tracker: tracker, + baseURL: u, templates: struct { + errorTpl *template.Template + redirectTpl *template.Template + }{ + errorTpl: template.Must(template.New("error").Parse(must(cnf.TemplateDir, "error.html"))), + redirectTpl: template.Must(template.New("redirect").Parse(must(cnf.TemplateDir, "redirect.html"))), + }} } // Forma is the primary application service. type Forma struct { + config config.ServiceConfig storage Storage - handler InputHandler + tracker Tracker + + baseURL *url.URL + templates struct { + errorTpl *template.Template + redirectTpl *template.Template + } } // HandleGetV1 handles an input request. -func (service *Forma) HandleGetV1(request v1.GetRequest) v1.GetResponse { - var response v1.GetResponse - response.Schema, response.Error = service.storage.Schema(context.Background(), request.ID) - return response +// Deprecated: TODO issue#version3.0 use SchemaEditor and gRPC gateway instead +func (service *Forma) HandleGetV1(ctx context.Context, req v1.GetRequest) (resp v1.GetResponse) { + resp.Schema, resp.Error = service.storage.Schema(ctx, req.ID) + if resp.Error != nil { + return + } + + // add form namespace to make its elements unique + enrich(service.baseURL, &resp.Schema) + + return } -// HandlePostV1 handles an input request. -func (service *Forma) HandlePostV1(request v1.PostRequest) v1.PostResponse { - var ( - response v1.PostResponse - verified domain.InputData - ) +// HandleInput handles an input request. +func (service *Forma) HandleInput(ctx context.Context, req v1.PostRequest) (resp v1.PostResponse) { + schema, readErr := service.storage.Schema(ctx, req.ID) + if readErr != nil { + resp.Error = readErr + return + } + + // add form namespace to make its elements unique + enrich(service.baseURL, &schema) + resp.URL = req.InputData.Redirect(req.Context.Referer(), schema.Action) - response.Schema, response.Error = service.storage.Schema(context.Background(), request.ID) - if response.Error != nil { - return response + verified, validateErr := schema.Apply(req.InputData) + if validateErr != nil { + service.templates.errorTpl.Execute(req.Output, static.ErrorPageContext{ + Schema: schema, + Error: validateErr, + Delay: 30 * time.Duration(len(validateErr.InputWithErrors())) * time.Second, + Redirect: resp.URL, + }) + resp.Error = errors.Validation(errors.InvalidFormDataMessage, validateErr, + "trying to apply data to the schema %q", req.ID) + return } - verified, response.Error = response.Schema.Apply(request.InputData) - if response.Error != nil { - response.Error = errors.Validation(errors.InvalidFormDataMessage, response.Error, - "trying to add data for schema %q", request.ID) - return response + + input, storeErr := service.storage.StoreInput(ctx, req.ID, verified) + if u, err := url.Parse(resp.URL); err == nil { + type feedback struct { + ID domain.ID `json:"input"` + SchemaID domain.ID `json:"id"` + Result string `json:"result"` + } + if storeErr != nil { + u.Fragment = base64.StdEncoding.EncodeToString(func() []byte { + raw, _ := json.Marshal(feedback{SchemaID: req.ID, Result: "failure"}) + return raw + }()) + } else { + u.Fragment = base64.StdEncoding.EncodeToString(func() []byte { + raw, _ := json.Marshal(feedback{ID: input.ID, SchemaID: req.ID, Result: "success"}) + return raw + }()) + } + resp.URL = u.String() } - var input *types.Input - input, response.Error = service.handler.HandleInput(context.Background(), request.ID, verified) - if response.Error != nil { - return response + if storeErr == nil && !req.Context.Option().NoLog && !ignore(req.Context) { + // if option.Anonymously {} + event := domain.InputEvent{ + SchemaID: req.ID, + InputID: input.ID, + TemplateID: req.InputData.Template(), + Identifier: nil, // TODO issue#171 + Context: req.Context, + Code: http.StatusFound, // TODO issue#design + URL: resp.URL, + } + resp.Error = service.tracker.LogInput(ctx, event) // TODO issue#109 } - response.ID = input.ID - // TODO issue#109 - _ = service.handler.LogRequest(context.Background(), input, request.InputContext) + return resp +} - return response +func enrich(base *url.URL, schema *domain.Schema) { + for i := range schema.Inputs { + schema.Inputs[i].ID = schema.ID + "_" + schema.Inputs[i].Name + } + // replace fallback by current API call + schema.Action = extend(base, "api/v1", schema.ID) + schema.Method = http.MethodPost + schema.EncodingType = "application/x-www-form-urlencoded" +} + +func extend(base *url.URL, paths ...string) string { + if len(paths) == 0 { + return base.String() + } + base.Path = path.Join(append([]string{base.Path}, paths...)...) + return base.String() +} + +func ignore(req domain.InputContext) bool { + // do not log curl request + return strings.HasPrefix(req.UserAgent(), "curl/") +} + +func must(base, tpl string) string { + b, err := static.LoadTemplate(base, tpl) + if err != nil { + panic(tpl) + } + return string(b) } diff --git a/pkg/service/service_test.go b/pkg/service/service_test.go index 5fe1f18..545e988 100644 --- a/pkg/service/service_test.go +++ b/pkg/service/service_test.go @@ -1,123 +1,4 @@ //go:generate echo $PWD/$GOPACKAGE/$GOFILE //go:generate mockgen -package service_test -destination $PWD/pkg/service/mock_storage_test.go github.com/kamilsk/form-api/pkg/service Storage -//go:generate mockgen -package service_test -destination $PWD/pkg/service/mock_handler_test.go github.com/kamilsk/form-api/pkg/service InputHandler +//go:generate mockgen -package service_test -destination $PWD/pkg/service/mock_tracker_test.go github.com/kamilsk/form-api/pkg/service Tracker package service_test - -import ( - "context" - "errors" - "testing" - "time" - - deep "github.com/pkg/errors" - - "github.com/golang/mock/gomock" - "github.com/kamilsk/form-api/pkg/domain" - "github.com/kamilsk/form-api/pkg/storage/types" - "github.com/kamilsk/form-api/pkg/transfer/api/v1" - "github.com/magiconair/properties/assert" - - . "github.com/kamilsk/form-api/pkg/service" -) - -const UUID domain.ID = "41ca5e09-3ce2-4094-b108-3ecc257c6fa4" - -func TestForma_HandleGetV1(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - var ( - storage = NewMockStorage(ctrl) - handler = NewMockInputHandler(ctrl) - api = New(storage, handler) - ) - - tests := []struct { - name string - data func() (v1.GetRequest, v1.GetResponse) - }{ - {"without error", func() (v1.GetRequest, v1.GetResponse) { - request, response := v1.GetRequest{ID: UUID}, v1.GetResponse{Schema: domain.Schema{}} - storage.EXPECT().Schema(context.Background(), request.ID).Return(response.Schema, nil) - return request, response - }}, - } - - for _, test := range tests { - tc := test - t.Run(test.name, func(t *testing.T) { - request, response := tc.data() - assert.Equal(t, response, api.HandleGetV1(request)) - }) - } -} - -func TestForma_HandlePostV1(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - var ( - storage = NewMockStorage(ctrl) - handler = NewMockInputHandler(ctrl) - api = New(storage, handler) - ) - - tests := []struct { - name string - data func() (v1.PostRequest, v1.PostResponse) - }{ - {"without error", func() (v1.PostRequest, v1.PostResponse) { - var ( - request = v1.PostRequest{ID: UUID, - InputData: domain.InputData{"name": {"val"}}, - InputContext: domain.InputContext{}, - } - response = v1.PostResponse{ID: UUID, Schema: domain.Schema{ - Inputs: []domain.Input{{Name: "name", Type: domain.TextType}}, - }} - input = &types.Input{ID: response.ID, - SchemaID: request.ID, Data: request.InputData, CreatedAt: time.Now(), - } - ) - - storage.EXPECT().Schema(context.Background(), request.ID).Return(response.Schema, nil) - handler.EXPECT().HandleInput(context.Background(), request.ID, request.InputData).Return(input, nil) - handler.EXPECT().LogRequest(context.Background(), input, request.InputContext).Return(nil) - - return request, response - }}, - {"not found error", func() (v1.PostRequest, v1.PostResponse) { - var ( - request = v1.PostRequest{ID: UUID, - InputData: domain.InputData{"name": {"val"}}, - } - response = v1.PostResponse{Error: errors.New("not found"), Schema: domain.Schema{}} - ) - storage.EXPECT().Schema(context.Background(), request.ID).Return(response.Schema, response.Error) - return request, response - }}, - {"validation error", func() (v1.PostRequest, v1.PostResponse) { - var ( - request = v1.PostRequest{ID: UUID, - InputData: domain.InputData{"email": {"test.me"}}, - } - response = v1.PostResponse{Schema: domain.Schema{ - Inputs: []domain.Input{{Name: "email", Type: domain.EmailType, Value: "test.me"}}, - }} - ) - storage.EXPECT().Schema(context.Background(), request.ID).Return(response.Schema, nil) - _, response.Error = response.Schema.Apply(request.InputData) - return request, response - }}, - } - - for _, test := range tests { - tc := test - t.Run(test.name, func(t *testing.T) { - request, response := tc.data() - actual := api.HandlePostV1(request) - actual.Error = deep.Cause(actual.Error) - assert.Equal(t, response, actual) - }) - } -} diff --git a/pkg/storage/public.go b/pkg/storage/public.go index 449218b..84fa115 100644 --- a/pkg/storage/public.go +++ b/pkg/storage/public.go @@ -22,6 +22,7 @@ func (storage *Storage) Schema(ctx context.Context, id domain.ID) (domain.Schema if err != nil { return schema, err } + entity.Definition.ID = entity.ID.String() entity.Definition.Title = entity.Title return entity.Definition, nil @@ -44,8 +45,8 @@ func (storage *Storage) Template(ctx context.Context, id domain.ID) (domain.Temp return entity.Definition, nil } -// HandleInput TODO issue#173 -func (storage *Storage) HandleInput(ctx context.Context, schemaID domain.ID, verified domain.InputData) (*types.Input, error) { +// StoreInput stores an user input data. +func (storage *Storage) StoreInput(ctx context.Context, schemaID domain.ID, verified domain.InputData) (*types.Input, error) { conn, closer, connErr := storage.connection(ctx) if connErr != nil { return nil, connErr