From c9079be37a23e5071bc761571e2d04f05b653d4e Mon Sep 17 00:00:00 2001 From: jcd <929760274@qq.com> Date: Fri, 22 Sep 2023 18:01:52 +0800 Subject: [PATCH] fix:add get histroy info method --- genproto/v1/gw/product.pb.gw.go | 87 - genproto/v1/product.pb.go | 1488 +++++++++-------- genproto/v1/product_grpc.pb.go | 184 +- proto/v1/product.proto | 100 +- proto/v1/product.yaml | 2 - service/server.go | 97 +- service/store/models.go | 154 +- service/store/sql/fake.db | Bin 0 -> 57344 bytes service/store/sql/inactive_product_changes.go | 120 ++ service/store/sql/product_changes.go | 119 ++ service/store/sql/product_details.go | 89 +- service/store/sql/products.go | 2 +- service/store/sql/sql.go | 8 + service/store/sql/store_test.go | 71 +- service/store/store.go | 17 +- 15 files changed, 1547 insertions(+), 991 deletions(-) create mode 100644 service/store/sql/fake.db create mode 100644 service/store/sql/inactive_product_changes.go create mode 100644 service/store/sql/product_changes.go diff --git a/genproto/v1/gw/product.pb.gw.go b/genproto/v1/gw/product.pb.gw.go index 6ccaf3d..032a8ca 100644 --- a/genproto/v1/gw/product.pb.gw.go +++ b/genproto/v1/gw/product.pb.gw.go @@ -248,42 +248,6 @@ func local_request_ProductService_AppendAmzProductInactiveDetail_0(ctx context.C } -var ( - filter_ProductService_GetAmzProductLatestInfo_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_ProductService_GetAmzProductLatestInfo_0(ctx context.Context, marshaler runtime.Marshaler, client extV1.ProductServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq extV1.GetAmzProductLatestInfoRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProductService_GetAmzProductLatestInfo_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.GetAmzProductLatestInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ProductService_GetAmzProductLatestInfo_0(ctx context.Context, marshaler runtime.Marshaler, server extV1.ProductServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq extV1.GetAmzProductLatestInfoRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProductService_GetAmzProductLatestInfo_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.GetAmzProductLatestInfo(ctx, &protoReq) - return msg, metadata, err - -} - // RegisterProductServiceHandlerServer registers the http handlers for service ProductService to "mux". // UnaryRPC :call ProductServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -440,31 +404,6 @@ func RegisterProductServiceHandlerServer(ctx context.Context, mux *runtime.Serve }) - mux.Handle("GET", pattern_ProductService_GetAmzProductLatestInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/superjcd.productservice.v1.ProductService/GetAmzProductLatestInfo", runtime.WithHTTPPathPattern("/v1/products/info/latest")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ProductService_GetAmzProductLatestInfo_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_ProductService_GetAmzProductLatestInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -638,28 +577,6 @@ func RegisterProductServiceHandlerClient(ctx context.Context, mux *runtime.Serve }) - mux.Handle("GET", pattern_ProductService_GetAmzProductLatestInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/superjcd.productservice.v1.ProductService/GetAmzProductLatestInfo", runtime.WithHTTPPathPattern("/v1/products/info/latest")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ProductService_GetAmzProductLatestInfo_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_ProductService_GetAmzProductLatestInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -675,8 +592,6 @@ var ( pattern_ProductService_AppendAmzProductActiveDetail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "products", "info", "history", "active"}, "")) pattern_ProductService_AppendAmzProductInactiveDetail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "products", "info", "history", "inactive"}, "")) - - pattern_ProductService_GetAmzProductLatestInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "products", "info", "latest"}, "")) ) var ( @@ -691,6 +606,4 @@ var ( forward_ProductService_AppendAmzProductActiveDetail_0 = runtime.ForwardResponseMessage forward_ProductService_AppendAmzProductInactiveDetail_0 = runtime.ForwardResponseMessage - - forward_ProductService_GetAmzProductLatestInfo_0 = runtime.ForwardResponseMessage ) diff --git a/genproto/v1/product.pb.go b/genproto/v1/product.pb.go index 1bc6541..8e5dd3b 100644 --- a/genproto/v1/product.pb.go +++ b/genproto/v1/product.pb.go @@ -943,17 +943,16 @@ func (x *DeleteProductResponse) GetStatus() Status { return Status_success } -type GetAmzProductLatestInfoRequest struct { +type AppendAmzProductInactiveDetailRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Asin string `protobuf:"bytes,1,opt,name=asin,proto3" json:"asin,omitempty"` - Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` + Details []*AmzProductInactivateDetail `protobuf:"bytes,1,rep,name=details,proto3" json:"details,omitempty"` } -func (x *GetAmzProductLatestInfoRequest) Reset() { - *x = GetAmzProductLatestInfoRequest{} +func (x *AppendAmzProductInactiveDetailRequest) Reset() { + *x = AppendAmzProductInactiveDetailRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -961,13 +960,13 @@ func (x *GetAmzProductLatestInfoRequest) Reset() { } } -func (x *GetAmzProductLatestInfoRequest) String() string { +func (x *AppendAmzProductInactiveDetailRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAmzProductLatestInfoRequest) ProtoMessage() {} +func (*AppendAmzProductInactiveDetailRequest) ProtoMessage() {} -func (x *GetAmzProductLatestInfoRequest) ProtoReflect() protoreflect.Message { +func (x *AppendAmzProductInactiveDetailRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -979,38 +978,29 @@ func (x *GetAmzProductLatestInfoRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAmzProductLatestInfoRequest.ProtoReflect.Descriptor instead. -func (*GetAmzProductLatestInfoRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use AppendAmzProductInactiveDetailRequest.ProtoReflect.Descriptor instead. +func (*AppendAmzProductInactiveDetailRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{11} } -func (x *GetAmzProductLatestInfoRequest) GetAsin() string { - if x != nil { - return x.Asin - } - return "" -} - -func (x *GetAmzProductLatestInfoRequest) GetCountry() string { +func (x *AppendAmzProductInactiveDetailRequest) GetDetails() []*AmzProductInactivateDetail { if x != nil { - return x.Country + return x.Details } - return "" + return nil } -type GetAmzProductLatestInfoResponse struct { +type AppendAmzProductInactiveDetailResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` - AmzProductIncativeDetails *AmzProductInactivateDetail `protobuf:"bytes,3,opt,name=amz_product_incative_details,json=amzProductIncativeDetails,proto3" json:"amz_product_incative_details,omitempty"` - AmzProductAtiveDetails *AmzProductActiveDetail `protobuf:"bytes,4,opt,name=amz_product_ative_details,json=amzProductAtiveDetails,proto3" json:"amz_product_ative_details,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` } -func (x *GetAmzProductLatestInfoResponse) Reset() { - *x = GetAmzProductLatestInfoResponse{} +func (x *AppendAmzProductInactiveDetailResponse) Reset() { + *x = AppendAmzProductInactiveDetailResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1018,13 +1008,13 @@ func (x *GetAmzProductLatestInfoResponse) Reset() { } } -func (x *GetAmzProductLatestInfoResponse) String() string { +func (x *AppendAmzProductInactiveDetailResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAmzProductLatestInfoResponse) ProtoMessage() {} +func (*AppendAmzProductInactiveDetailResponse) ProtoMessage() {} -func (x *GetAmzProductLatestInfoResponse) ProtoReflect() protoreflect.Message { +func (x *AppendAmzProductInactiveDetailResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1036,53 +1026,35 @@ func (x *GetAmzProductLatestInfoResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAmzProductLatestInfoResponse.ProtoReflect.Descriptor instead. -func (*GetAmzProductLatestInfoResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use AppendAmzProductInactiveDetailResponse.ProtoReflect.Descriptor instead. +func (*AppendAmzProductInactiveDetailResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{12} } -func (x *GetAmzProductLatestInfoResponse) GetMsg() string { +func (x *AppendAmzProductInactiveDetailResponse) GetMsg() string { if x != nil { return x.Msg } return "" } -func (x *GetAmzProductLatestInfoResponse) GetStatus() Status { +func (x *AppendAmzProductInactiveDetailResponse) GetStatus() Status { if x != nil { return x.Status } return Status_success } -func (x *GetAmzProductLatestInfoResponse) GetAmzProductIncativeDetails() *AmzProductInactivateDetail { - if x != nil { - return x.AmzProductIncativeDetails - } - return nil -} - -func (x *GetAmzProductLatestInfoResponse) GetAmzProductAtiveDetails() *AmzProductActiveDetail { - if x != nil { - return x.AmzProductAtiveDetails - } - return nil -} - -type GetAmzProductHistoryInfoRequest struct { +type AppendAmzProductActiveDetailRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Asin string `protobuf:"bytes,1,opt,name=asin,proto3" json:"asin,omitempty"` - Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` - Field string `protobuf:"bytes,3,opt,name=field,proto3" json:"field,omitempty"` - StartDate string `protobuf:"bytes,4,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` - EndDate string `protobuf:"bytes,5,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` + Details []*AmzProductActiveDetail `protobuf:"bytes,1,rep,name=details,proto3" json:"details,omitempty"` } -func (x *GetAmzProductHistoryInfoRequest) Reset() { - *x = GetAmzProductHistoryInfoRequest{} +func (x *AppendAmzProductActiveDetailRequest) Reset() { + *x = AppendAmzProductActiveDetailRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1090,13 +1062,13 @@ func (x *GetAmzProductHistoryInfoRequest) Reset() { } } -func (x *GetAmzProductHistoryInfoRequest) String() string { +func (x *AppendAmzProductActiveDetailRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAmzProductHistoryInfoRequest) ProtoMessage() {} +func (*AppendAmzProductActiveDetailRequest) ProtoMessage() {} -func (x *GetAmzProductHistoryInfoRequest) ProtoReflect() protoreflect.Message { +func (x *AppendAmzProductActiveDetailRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1108,57 +1080,29 @@ func (x *GetAmzProductHistoryInfoRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAmzProductHistoryInfoRequest.ProtoReflect.Descriptor instead. -func (*GetAmzProductHistoryInfoRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use AppendAmzProductActiveDetailRequest.ProtoReflect.Descriptor instead. +func (*AppendAmzProductActiveDetailRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{13} } -func (x *GetAmzProductHistoryInfoRequest) GetAsin() string { - if x != nil { - return x.Asin - } - return "" -} - -func (x *GetAmzProductHistoryInfoRequest) GetCountry() string { - if x != nil { - return x.Country - } - return "" -} - -func (x *GetAmzProductHistoryInfoRequest) GetField() string { - if x != nil { - return x.Field - } - return "" -} - -func (x *GetAmzProductHistoryInfoRequest) GetStartDate() string { - if x != nil { - return x.StartDate - } - return "" -} - -func (x *GetAmzProductHistoryInfoRequest) GetEndDate() string { +func (x *AppendAmzProductActiveDetailRequest) GetDetails() []*AmzProductActiveDetail { if x != nil { - return x.EndDate + return x.Details } - return "" + return nil } -type AmzProductHistoryInfoResponse struct { +type AppendAmzProductActiveDetailResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Datetimes []string `protobuf:"bytes,1,rep,name=datetimes,proto3" json:"datetimes,omitempty"` - Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` } -func (x *AmzProductHistoryInfoResponse) Reset() { - *x = AmzProductHistoryInfoResponse{} +func (x *AppendAmzProductActiveDetailResponse) Reset() { + *x = AppendAmzProductActiveDetailResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1166,13 +1110,13 @@ func (x *AmzProductHistoryInfoResponse) Reset() { } } -func (x *AmzProductHistoryInfoResponse) String() string { +func (x *AppendAmzProductActiveDetailResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AmzProductHistoryInfoResponse) ProtoMessage() {} +func (*AppendAmzProductActiveDetailResponse) ProtoMessage() {} -func (x *AmzProductHistoryInfoResponse) ProtoReflect() protoreflect.Message { +func (x *AppendAmzProductActiveDetailResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1184,37 +1128,35 @@ func (x *AmzProductHistoryInfoResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AmzProductHistoryInfoResponse.ProtoReflect.Descriptor instead. -func (*AmzProductHistoryInfoResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use AppendAmzProductActiveDetailResponse.ProtoReflect.Descriptor instead. +func (*AppendAmzProductActiveDetailResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{14} } -func (x *AmzProductHistoryInfoResponse) GetDatetimes() []string { +func (x *AppendAmzProductActiveDetailResponse) GetMsg() string { if x != nil { - return x.Datetimes + return x.Msg } - return nil + return "" } -func (x *AmzProductHistoryInfoResponse) GetValues() []string { +func (x *AppendAmzProductActiveDetailResponse) GetStatus() Status { if x != nil { - return x.Values + return x.Status } - return nil + return Status_success } -type GetAmzProductHistoryInfoResponse struct { +type DeleteAmzProductActiveDetailRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` - Data *AmzProductHistoryInfoResponse `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + MinCreateDate string `protobuf:"bytes,1,opt,name=min_create_date,json=minCreateDate,proto3" json:"min_create_date,omitempty"` } -func (x *GetAmzProductHistoryInfoResponse) Reset() { - *x = GetAmzProductHistoryInfoResponse{} +func (x *DeleteAmzProductActiveDetailRequest) Reset() { + *x = DeleteAmzProductActiveDetailRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1222,13 +1164,13 @@ func (x *GetAmzProductHistoryInfoResponse) Reset() { } } -func (x *GetAmzProductHistoryInfoResponse) String() string { +func (x *DeleteAmzProductActiveDetailRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAmzProductHistoryInfoResponse) ProtoMessage() {} +func (*DeleteAmzProductActiveDetailRequest) ProtoMessage() {} -func (x *GetAmzProductHistoryInfoResponse) ProtoReflect() protoreflect.Message { +func (x *DeleteAmzProductActiveDetailRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1240,42 +1182,29 @@ func (x *GetAmzProductHistoryInfoResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAmzProductHistoryInfoResponse.ProtoReflect.Descriptor instead. -func (*GetAmzProductHistoryInfoResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteAmzProductActiveDetailRequest.ProtoReflect.Descriptor instead. +func (*DeleteAmzProductActiveDetailRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{15} } -func (x *GetAmzProductHistoryInfoResponse) GetMsg() string { +func (x *DeleteAmzProductActiveDetailRequest) GetMinCreateDate() string { if x != nil { - return x.Msg + return x.MinCreateDate } return "" } -func (x *GetAmzProductHistoryInfoResponse) GetStatus() Status { - if x != nil { - return x.Status - } - return Status_success -} - -func (x *GetAmzProductHistoryInfoResponse) GetData() *AmzProductHistoryInfoResponse { - if x != nil { - return x.Data - } - return nil -} - -type AppendAmzProductInactiveDetailRequest struct { +type DeleteAmzProductActiveDetailResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Details []*AmzProductInactivateDetail `protobuf:"bytes,1,rep,name=details,proto3" json:"details,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` } -func (x *AppendAmzProductInactiveDetailRequest) Reset() { - *x = AppendAmzProductInactiveDetailRequest{} +func (x *DeleteAmzProductActiveDetailResponse) Reset() { + *x = DeleteAmzProductActiveDetailResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1283,13 +1212,13 @@ func (x *AppendAmzProductInactiveDetailRequest) Reset() { } } -func (x *AppendAmzProductInactiveDetailRequest) String() string { +func (x *DeleteAmzProductActiveDetailResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendAmzProductInactiveDetailRequest) ProtoMessage() {} +func (*DeleteAmzProductActiveDetailResponse) ProtoMessage() {} -func (x *AppendAmzProductInactiveDetailRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteAmzProductActiveDetailResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1301,29 +1230,35 @@ func (x *AppendAmzProductInactiveDetailRequest) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use AppendAmzProductInactiveDetailRequest.ProtoReflect.Descriptor instead. -func (*AppendAmzProductInactiveDetailRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteAmzProductActiveDetailResponse.ProtoReflect.Descriptor instead. +func (*DeleteAmzProductActiveDetailResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{16} } -func (x *AppendAmzProductInactiveDetailRequest) GetDetails() []*AmzProductInactivateDetail { +func (x *DeleteAmzProductActiveDetailResponse) GetMsg() string { if x != nil { - return x.Details + return x.Msg } - return nil + return "" } -type AppendAmzProductInactiveDetailResponse struct { +func (x *DeleteAmzProductActiveDetailResponse) GetStatus() Status { + if x != nil { + return x.Status + } + return Status_success +} + +type DeleteAmzProductInactiveDetailRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + MinCreateDate string `protobuf:"bytes,1,opt,name=min_create_date,json=minCreateDate,proto3" json:"min_create_date,omitempty"` } -func (x *AppendAmzProductInactiveDetailResponse) Reset() { - *x = AppendAmzProductInactiveDetailResponse{} +func (x *DeleteAmzProductInactiveDetailRequest) Reset() { + *x = DeleteAmzProductInactiveDetailRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1331,13 +1266,13 @@ func (x *AppendAmzProductInactiveDetailResponse) Reset() { } } -func (x *AppendAmzProductInactiveDetailResponse) String() string { +func (x *DeleteAmzProductInactiveDetailRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendAmzProductInactiveDetailResponse) ProtoMessage() {} +func (*DeleteAmzProductInactiveDetailRequest) ProtoMessage() {} -func (x *AppendAmzProductInactiveDetailResponse) ProtoReflect() protoreflect.Message { +func (x *DeleteAmzProductInactiveDetailRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1349,35 +1284,29 @@ func (x *AppendAmzProductInactiveDetailResponse) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use AppendAmzProductInactiveDetailResponse.ProtoReflect.Descriptor instead. -func (*AppendAmzProductInactiveDetailResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteAmzProductInactiveDetailRequest.ProtoReflect.Descriptor instead. +func (*DeleteAmzProductInactiveDetailRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{17} } -func (x *AppendAmzProductInactiveDetailResponse) GetMsg() string { +func (x *DeleteAmzProductInactiveDetailRequest) GetMinCreateDate() string { if x != nil { - return x.Msg + return x.MinCreateDate } return "" } -func (x *AppendAmzProductInactiveDetailResponse) GetStatus() Status { - if x != nil { - return x.Status - } - return Status_success -} - -type AppendAmzProductActiveDetailRequest struct { +type DeleteAmzProductInactiveDetailResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Details []*AmzProductActiveDetail `protobuf:"bytes,1,rep,name=details,proto3" json:"details,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` } -func (x *AppendAmzProductActiveDetailRequest) Reset() { - *x = AppendAmzProductActiveDetailRequest{} +func (x *DeleteAmzProductInactiveDetailResponse) Reset() { + *x = DeleteAmzProductInactiveDetailResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1385,13 +1314,13 @@ func (x *AppendAmzProductActiveDetailRequest) Reset() { } } -func (x *AppendAmzProductActiveDetailRequest) String() string { +func (x *DeleteAmzProductInactiveDetailResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendAmzProductActiveDetailRequest) ProtoMessage() {} +func (*DeleteAmzProductInactiveDetailResponse) ProtoMessage() {} -func (x *AppendAmzProductActiveDetailRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteAmzProductInactiveDetailResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1403,29 +1332,37 @@ func (x *AppendAmzProductActiveDetailRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use AppendAmzProductActiveDetailRequest.ProtoReflect.Descriptor instead. -func (*AppendAmzProductActiveDetailRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteAmzProductInactiveDetailResponse.ProtoReflect.Descriptor instead. +func (*DeleteAmzProductInactiveDetailResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{18} } -func (x *AppendAmzProductActiveDetailRequest) GetDetails() []*AmzProductActiveDetail { +func (x *DeleteAmzProductInactiveDetailResponse) GetMsg() string { if x != nil { - return x.Details + return x.Msg } - return nil + return "" } -type AppendAmzProductActiveDetailResponse struct { +func (x *DeleteAmzProductInactiveDetailResponse) GetStatus() Status { + if x != nil { + return x.Status + } + return Status_success +} + +type AppendProductChangesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + OldDate string `protobuf:"bytes,1,opt,name=old_date,json=oldDate,proto3" json:"old_date,omitempty"` + NewDate string `protobuf:"bytes,2,opt,name=new_date,json=newDate,proto3" json:"new_date,omitempty"` + Field string `protobuf:"bytes,3,opt,name=field,proto3" json:"field,omitempty"` } -func (x *AppendAmzProductActiveDetailResponse) Reset() { - *x = AppendAmzProductActiveDetailResponse{} +func (x *AppendProductChangesRequest) Reset() { + *x = AppendProductChangesRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1433,13 +1370,13 @@ func (x *AppendAmzProductActiveDetailResponse) Reset() { } } -func (x *AppendAmzProductActiveDetailResponse) String() string { +func (x *AppendProductChangesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendAmzProductActiveDetailResponse) ProtoMessage() {} +func (*AppendProductChangesRequest) ProtoMessage() {} -func (x *AppendAmzProductActiveDetailResponse) ProtoReflect() protoreflect.Message { +func (x *AppendProductChangesRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1451,35 +1388,43 @@ func (x *AppendAmzProductActiveDetailResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use AppendAmzProductActiveDetailResponse.ProtoReflect.Descriptor instead. -func (*AppendAmzProductActiveDetailResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use AppendProductChangesRequest.ProtoReflect.Descriptor instead. +func (*AppendProductChangesRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{19} } -func (x *AppendAmzProductActiveDetailResponse) GetMsg() string { +func (x *AppendProductChangesRequest) GetOldDate() string { if x != nil { - return x.Msg + return x.OldDate } return "" } -func (x *AppendAmzProductActiveDetailResponse) GetStatus() Status { +func (x *AppendProductChangesRequest) GetNewDate() string { if x != nil { - return x.Status + return x.NewDate } - return Status_success + return "" } -type DeleteAmzProductActiveDetailRequest struct { +func (x *AppendProductChangesRequest) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +type AppendProductChangesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MinCreateDate string `protobuf:"bytes,1,opt,name=min_create_date,json=minCreateDate,proto3" json:"min_create_date,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` } -func (x *DeleteAmzProductActiveDetailRequest) Reset() { - *x = DeleteAmzProductActiveDetailRequest{} +func (x *AppendProductChangesResponse) Reset() { + *x = AppendProductChangesResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1487,13 +1432,13 @@ func (x *DeleteAmzProductActiveDetailRequest) Reset() { } } -func (x *DeleteAmzProductActiveDetailRequest) String() string { +func (x *AppendProductChangesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteAmzProductActiveDetailRequest) ProtoMessage() {} +func (*AppendProductChangesResponse) ProtoMessage() {} -func (x *DeleteAmzProductActiveDetailRequest) ProtoReflect() protoreflect.Message { +func (x *AppendProductChangesResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1505,29 +1450,40 @@ func (x *DeleteAmzProductActiveDetailRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use DeleteAmzProductActiveDetailRequest.ProtoReflect.Descriptor instead. -func (*DeleteAmzProductActiveDetailRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use AppendProductChangesResponse.ProtoReflect.Descriptor instead. +func (*AppendProductChangesResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{20} } -func (x *DeleteAmzProductActiveDetailRequest) GetMinCreateDate() string { +func (x *AppendProductChangesResponse) GetMsg() string { if x != nil { - return x.MinCreateDate + return x.Msg } return "" } -type DeleteAmzProductActiveDetailResponse struct { +func (x *AppendProductChangesResponse) GetStatus() Status { + if x != nil { + return x.Status + } + return Status_success +} + +type ListProductChangesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + Shop string `protobuf:"bytes,1,opt,name=shop,proto3" json:"shop,omitempty"` + Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` + CreateDate string `protobuf:"bytes,3,opt,name=create_date,json=createDate,proto3" json:"create_date,omitempty"` + Field string `protobuf:"bytes,4,opt,name=field,proto3" json:"field,omitempty"` + Offset int32 `protobuf:"varint,5,opt,name=offset,proto3" json:"offset,omitempty"` + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` } -func (x *DeleteAmzProductActiveDetailResponse) Reset() { - *x = DeleteAmzProductActiveDetailResponse{} +func (x *ListProductChangesRequest) Reset() { + *x = ListProductChangesRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1535,13 +1491,13 @@ func (x *DeleteAmzProductActiveDetailResponse) Reset() { } } -func (x *DeleteAmzProductActiveDetailResponse) String() string { +func (x *ListProductChangesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteAmzProductActiveDetailResponse) ProtoMessage() {} +func (*ListProductChangesRequest) ProtoMessage() {} -func (x *DeleteAmzProductActiveDetailResponse) ProtoReflect() protoreflect.Message { +func (x *ListProductChangesRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1553,35 +1509,67 @@ func (x *DeleteAmzProductActiveDetailResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use DeleteAmzProductActiveDetailResponse.ProtoReflect.Descriptor instead. -func (*DeleteAmzProductActiveDetailResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ListProductChangesRequest.ProtoReflect.Descriptor instead. +func (*ListProductChangesRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{21} } -func (x *DeleteAmzProductActiveDetailResponse) GetMsg() string { +func (x *ListProductChangesRequest) GetShop() string { if x != nil { - return x.Msg + return x.Shop } return "" } -func (x *DeleteAmzProductActiveDetailResponse) GetStatus() Status { +func (x *ListProductChangesRequest) GetCountry() string { if x != nil { - return x.Status + return x.Country } - return Status_success + return "" } -type DeleteAmzProductInactiveDetailRequest struct { +func (x *ListProductChangesRequest) GetCreateDate() string { + if x != nil { + return x.CreateDate + } + return "" +} + +func (x *ListProductChangesRequest) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *ListProductChangesRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *ListProductChangesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +type ProductChange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MinCreateDate string `protobuf:"bytes,1,opt,name=min_create_date,json=minCreateDate,proto3" json:"min_create_date,omitempty"` + Asin string `protobuf:"bytes,1,opt,name=asin,proto3" json:"asin,omitempty"` + Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` + Field string `protobuf:"bytes,3,opt,name=field,proto3" json:"field,omitempty"` + OldValue string `protobuf:"bytes,4,opt,name=old_value,json=oldValue,proto3" json:"old_value,omitempty"` + NewValue string `protobuf:"bytes,5,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` } -func (x *DeleteAmzProductInactiveDetailRequest) Reset() { - *x = DeleteAmzProductInactiveDetailRequest{} +func (x *ProductChange) Reset() { + *x = ProductChange{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1589,13 +1577,13 @@ func (x *DeleteAmzProductInactiveDetailRequest) Reset() { } } -func (x *DeleteAmzProductInactiveDetailRequest) String() string { +func (x *ProductChange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteAmzProductInactiveDetailRequest) ProtoMessage() {} +func (*ProductChange) ProtoMessage() {} -func (x *DeleteAmzProductInactiveDetailRequest) ProtoReflect() protoreflect.Message { +func (x *ProductChange) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1607,29 +1595,58 @@ func (x *DeleteAmzProductInactiveDetailRequest) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use DeleteAmzProductInactiveDetailRequest.ProtoReflect.Descriptor instead. -func (*DeleteAmzProductInactiveDetailRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ProductChange.ProtoReflect.Descriptor instead. +func (*ProductChange) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{22} } -func (x *DeleteAmzProductInactiveDetailRequest) GetMinCreateDate() string { +func (x *ProductChange) GetAsin() string { if x != nil { - return x.MinCreateDate + return x.Asin } return "" } -type DeleteAmzProductInactiveDetailResponse struct { +func (x *ProductChange) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *ProductChange) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *ProductChange) GetOldValue() string { + if x != nil { + return x.OldValue + } + return "" +} + +func (x *ProductChange) GetNewValue() string { + if x != nil { + return x.NewValue + } + return "" +} + +type ListProductChangesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + ProductChanges []*ProductChange `protobuf:"bytes,3,rep,name=Product_changes,json=ProductChanges,proto3" json:"Product_changes,omitempty"` } -func (x *DeleteAmzProductInactiveDetailResponse) Reset() { - *x = DeleteAmzProductInactiveDetailResponse{} +func (x *ListProductChangesResponse) Reset() { + *x = ListProductChangesResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1637,13 +1654,13 @@ func (x *DeleteAmzProductInactiveDetailResponse) Reset() { } } -func (x *DeleteAmzProductInactiveDetailResponse) String() string { +func (x *ListProductChangesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteAmzProductInactiveDetailResponse) ProtoMessage() {} +func (*ListProductChangesResponse) ProtoMessage() {} -func (x *DeleteAmzProductInactiveDetailResponse) ProtoReflect() protoreflect.Message { +func (x *ListProductChangesResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1655,37 +1672,42 @@ func (x *DeleteAmzProductInactiveDetailResponse) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use DeleteAmzProductInactiveDetailResponse.ProtoReflect.Descriptor instead. -func (*DeleteAmzProductInactiveDetailResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ListProductChangesResponse.ProtoReflect.Descriptor instead. +func (*ListProductChangesResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{23} } -func (x *DeleteAmzProductInactiveDetailResponse) GetMsg() string { +func (x *ListProductChangesResponse) GetMsg() string { if x != nil { return x.Msg } return "" } -func (x *DeleteAmzProductInactiveDetailResponse) GetStatus() Status { +func (x *ListProductChangesResponse) GetStatus() Status { if x != nil { return x.Status } return Status_success } -type AppendProductChangesRequest struct { +func (x *ListProductChangesResponse) GetProductChanges() []*ProductChange { + if x != nil { + return x.ProductChanges + } + return nil +} + +type DeleteProductChangesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OldDate string `protobuf:"bytes,1,opt,name=old_date,json=oldDate,proto3" json:"old_date,omitempty"` - NewDate string `protobuf:"bytes,2,opt,name=new_date,json=newDate,proto3" json:"new_date,omitempty"` - Field string `protobuf:"bytes,3,opt,name=field,proto3" json:"field,omitempty"` + MinCreateDate string `protobuf:"bytes,1,opt,name=min_create_date,json=minCreateDate,proto3" json:"min_create_date,omitempty"` } -func (x *AppendProductChangesRequest) Reset() { - *x = AppendProductChangesRequest{} +func (x *DeleteProductChangesRequest) Reset() { + *x = DeleteProductChangesRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1693,13 +1715,13 @@ func (x *AppendProductChangesRequest) Reset() { } } -func (x *AppendProductChangesRequest) String() string { +func (x *DeleteProductChangesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendProductChangesRequest) ProtoMessage() {} +func (*DeleteProductChangesRequest) ProtoMessage() {} -func (x *AppendProductChangesRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteProductChangesRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1711,33 +1733,19 @@ func (x *AppendProductChangesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AppendProductChangesRequest.ProtoReflect.Descriptor instead. -func (*AppendProductChangesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteProductChangesRequest.ProtoReflect.Descriptor instead. +func (*DeleteProductChangesRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{24} } -func (x *AppendProductChangesRequest) GetOldDate() string { - if x != nil { - return x.OldDate - } - return "" -} - -func (x *AppendProductChangesRequest) GetNewDate() string { - if x != nil { - return x.NewDate - } - return "" -} - -func (x *AppendProductChangesRequest) GetField() string { +func (x *DeleteProductChangesRequest) GetMinCreateDate() string { if x != nil { - return x.Field + return x.MinCreateDate } return "" } -type AppendProductChangesResponse struct { +type DeleteProductChangesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1746,8 +1754,8 @@ type AppendProductChangesResponse struct { Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` } -func (x *AppendProductChangesResponse) Reset() { - *x = AppendProductChangesResponse{} +func (x *DeleteProductChangesResponse) Reset() { + *x = DeleteProductChangesResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1755,13 +1763,13 @@ func (x *AppendProductChangesResponse) Reset() { } } -func (x *AppendProductChangesResponse) String() string { +func (x *DeleteProductChangesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendProductChangesResponse) ProtoMessage() {} +func (*DeleteProductChangesResponse) ProtoMessage() {} -func (x *AppendProductChangesResponse) ProtoReflect() protoreflect.Message { +func (x *DeleteProductChangesResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1773,40 +1781,39 @@ func (x *AppendProductChangesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AppendProductChangesResponse.ProtoReflect.Descriptor instead. -func (*AppendProductChangesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteProductChangesResponse.ProtoReflect.Descriptor instead. +func (*DeleteProductChangesResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{25} } -func (x *AppendProductChangesResponse) GetMsg() string { +func (x *DeleteProductChangesResponse) GetMsg() string { if x != nil { return x.Msg } return "" } -func (x *AppendProductChangesResponse) GetStatus() Status { +func (x *DeleteProductChangesResponse) GetStatus() Status { if x != nil { return x.Status } return Status_success } -type ListProductChangesRequest struct { +type ListAmzProductDetailsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Shop string `protobuf:"bytes,1,opt,name=shop,proto3" json:"shop,omitempty"` Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` CreateDate string `protobuf:"bytes,3,opt,name=create_date,json=createDate,proto3" json:"create_date,omitempty"` - Field string `protobuf:"bytes,4,opt,name=field,proto3" json:"field,omitempty"` - Offset int32 `protobuf:"varint,5,opt,name=offset,proto3" json:"offset,omitempty"` - Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` + Limit int32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"` } -func (x *ListProductChangesRequest) Reset() { - *x = ListProductChangesRequest{} +func (x *ListAmzProductDetailsRequest) Reset() { + *x = ListAmzProductDetailsRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1814,13 +1821,13 @@ func (x *ListProductChangesRequest) Reset() { } } -func (x *ListProductChangesRequest) String() string { +func (x *ListAmzProductDetailsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProductChangesRequest) ProtoMessage() {} +func (*ListAmzProductDetailsRequest) ProtoMessage() {} -func (x *ListProductChangesRequest) ProtoReflect() protoreflect.Message { +func (x *ListAmzProductDetailsRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1832,68 +1839,58 @@ func (x *ListProductChangesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProductChangesRequest.ProtoReflect.Descriptor instead. -func (*ListProductChangesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ListAmzProductDetailsRequest.ProtoReflect.Descriptor instead. +func (*ListAmzProductDetailsRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{26} } -func (x *ListProductChangesRequest) GetUser() string { +func (x *ListAmzProductDetailsRequest) GetShop() string { if x != nil { - return x.User + return x.Shop } return "" } -func (x *ListProductChangesRequest) GetCountry() string { +func (x *ListAmzProductDetailsRequest) GetCountry() string { if x != nil { return x.Country } return "" } -func (x *ListProductChangesRequest) GetCreateDate() string { +func (x *ListAmzProductDetailsRequest) GetCreateDate() string { if x != nil { return x.CreateDate } return "" } -func (x *ListProductChangesRequest) GetField() string { - if x != nil { - return x.Field - } - return "" -} - -func (x *ListProductChangesRequest) GetOffset() int32 { +func (x *ListAmzProductDetailsRequest) GetOffset() int32 { if x != nil { return x.Offset } return 0 } -func (x *ListProductChangesRequest) GetLimit() int32 { +func (x *ListAmzProductDetailsRequest) GetLimit() int32 { if x != nil { return x.Limit } return 0 } -type ProductChange struct { +type ListAmzProductDetailsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MyAsin string `protobuf:"bytes,1,opt,name=my_asin,json=myAsin,proto3" json:"my_asin,omitempty"` - ProductAsin string `protobuf:"bytes,2,opt,name=Product_asin,json=ProductAsin,proto3" json:"Product_asin,omitempty"` - Country string `protobuf:"bytes,3,opt,name=country,proto3" json:"country,omitempty"` - Field string `protobuf:"bytes,4,opt,name=field,proto3" json:"field,omitempty"` - OldValue string `protobuf:"bytes,5,opt,name=old_value,json=oldValue,proto3" json:"old_value,omitempty"` - NewValue string `protobuf:"bytes,6,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + Details []*AmzProductActiveDetail `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"` } -func (x *ProductChange) Reset() { - *x = ProductChange{} +func (x *ListAmzProductDetailsResponse) Reset() { + *x = ListAmzProductDetailsResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1901,13 +1898,13 @@ func (x *ProductChange) Reset() { } } -func (x *ProductChange) String() string { +func (x *ListAmzProductDetailsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProductChange) ProtoMessage() {} +func (*ListAmzProductDetailsResponse) ProtoMessage() {} -func (x *ProductChange) ProtoReflect() protoreflect.Message { +func (x *ListAmzProductDetailsResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1919,65 +1916,46 @@ func (x *ProductChange) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProductChange.ProtoReflect.Descriptor instead. -func (*ProductChange) Descriptor() ([]byte, []int) { +// Deprecated: Use ListAmzProductDetailsResponse.ProtoReflect.Descriptor instead. +func (*ListAmzProductDetailsResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{27} } -func (x *ProductChange) GetMyAsin() string { - if x != nil { - return x.MyAsin - } - return "" -} - -func (x *ProductChange) GetProductAsin() string { +func (x *ListAmzProductDetailsResponse) GetMsg() string { if x != nil { - return x.ProductAsin - } - return "" -} - -func (x *ProductChange) GetCountry() string { - if x != nil { - return x.Country - } - return "" -} - -func (x *ProductChange) GetField() string { - if x != nil { - return x.Field + return x.Msg } return "" } -func (x *ProductChange) GetOldValue() string { +func (x *ListAmzProductDetailsResponse) GetStatus() Status { if x != nil { - return x.OldValue + return x.Status } - return "" + return Status_success } -func (x *ProductChange) GetNewValue() string { +func (x *ListAmzProductDetailsResponse) GetDetails() []*AmzProductActiveDetail { if x != nil { - return x.NewValue + return x.Details } - return "" + return nil } -type ListProductChangesResponse struct { +type GetProductHistoryInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` - ProductChanges []*ProductChange `protobuf:"bytes,3,rep,name=Product_changes,json=ProductChanges,proto3" json:"Product_changes,omitempty"` + Asin string `protobuf:"bytes,1,opt,name=asin,proto3" json:"asin,omitempty"` + Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` + Field string `protobuf:"bytes,3,opt,name=field,proto3" json:"field,omitempty"` + StartDate string `protobuf:"bytes,4,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` + EndDate string `protobuf:"bytes,5,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` } -func (x *ListProductChangesResponse) Reset() { - *x = ListProductChangesResponse{} +func (x *GetProductHistoryInfoRequest) Reset() { + *x = GetProductHistoryInfoRequest{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1985,13 +1963,13 @@ func (x *ListProductChangesResponse) Reset() { } } -func (x *ListProductChangesResponse) String() string { +func (x *GetProductHistoryInfoRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProductChangesResponse) ProtoMessage() {} +func (*GetProductHistoryInfoRequest) ProtoMessage() {} -func (x *ListProductChangesResponse) ProtoReflect() protoreflect.Message { +func (x *GetProductHistoryInfoRequest) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2003,42 +1981,57 @@ func (x *ListProductChangesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProductChangesResponse.ProtoReflect.Descriptor instead. -func (*ListProductChangesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetProductHistoryInfoRequest.ProtoReflect.Descriptor instead. +func (*GetProductHistoryInfoRequest) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{28} } -func (x *ListProductChangesResponse) GetMsg() string { +func (x *GetProductHistoryInfoRequest) GetAsin() string { if x != nil { - return x.Msg + return x.Asin } return "" } -func (x *ListProductChangesResponse) GetStatus() Status { +func (x *GetProductHistoryInfoRequest) GetCountry() string { if x != nil { - return x.Status + return x.Country } - return Status_success + return "" } -func (x *ListProductChangesResponse) GetProductChanges() []*ProductChange { +func (x *GetProductHistoryInfoRequest) GetField() string { if x != nil { - return x.ProductChanges + return x.Field } - return nil + return "" } -type DeleteProductChangesRequest struct { +func (x *GetProductHistoryInfoRequest) GetStartDate() string { + if x != nil { + return x.StartDate + } + return "" +} + +func (x *GetProductHistoryInfoRequest) GetEndDate() string { + if x != nil { + return x.EndDate + } + return "" +} + +type HistoryInfoRecord struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MinCreateDate string `protobuf:"bytes,1,opt,name=min_create_date,json=minCreateDate,proto3" json:"min_create_date,omitempty"` + Datetime string `protobuf:"bytes,1,opt,name=datetime,proto3" json:"datetime,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (x *DeleteProductChangesRequest) Reset() { - *x = DeleteProductChangesRequest{} +func (x *HistoryInfoRecord) Reset() { + *x = HistoryInfoRecord{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2046,13 +2039,13 @@ func (x *DeleteProductChangesRequest) Reset() { } } -func (x *DeleteProductChangesRequest) String() string { +func (x *HistoryInfoRecord) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProductChangesRequest) ProtoMessage() {} +func (*HistoryInfoRecord) ProtoMessage() {} -func (x *DeleteProductChangesRequest) ProtoReflect() protoreflect.Message { +func (x *HistoryInfoRecord) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2064,29 +2057,37 @@ func (x *DeleteProductChangesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProductChangesRequest.ProtoReflect.Descriptor instead. -func (*DeleteProductChangesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use HistoryInfoRecord.ProtoReflect.Descriptor instead. +func (*HistoryInfoRecord) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{29} } -func (x *DeleteProductChangesRequest) GetMinCreateDate() string { +func (x *HistoryInfoRecord) GetDatetime() string { if x != nil { - return x.MinCreateDate + return x.Datetime } return "" } -type DeleteProductChangesResponse struct { +func (x *HistoryInfoRecord) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +type GetProductHistoryInfoResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=superjcd.productservice.v1.Status" json:"status,omitempty"` + Records []*HistoryInfoRecord `protobuf:"bytes,3,rep,name=records,proto3" json:"records,omitempty"` } -func (x *DeleteProductChangesResponse) Reset() { - *x = DeleteProductChangesResponse{} +func (x *GetProductHistoryInfoResponse) Reset() { + *x = GetProductHistoryInfoResponse{} if protoimpl.UnsafeEnabled { mi := &file_product_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2094,13 +2095,13 @@ func (x *DeleteProductChangesResponse) Reset() { } } -func (x *DeleteProductChangesResponse) String() string { +func (x *GetProductHistoryInfoResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProductChangesResponse) ProtoMessage() {} +func (*GetProductHistoryInfoResponse) ProtoMessage() {} -func (x *DeleteProductChangesResponse) ProtoReflect() protoreflect.Message { +func (x *GetProductHistoryInfoResponse) ProtoReflect() protoreflect.Message { mi := &file_product_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2112,25 +2113,32 @@ func (x *DeleteProductChangesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProductChangesResponse.ProtoReflect.Descriptor instead. -func (*DeleteProductChangesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetProductHistoryInfoResponse.ProtoReflect.Descriptor instead. +func (*GetProductHistoryInfoResponse) Descriptor() ([]byte, []int) { return file_product_proto_rawDescGZIP(), []int{30} } -func (x *DeleteProductChangesResponse) GetMsg() string { +func (x *GetProductHistoryInfoResponse) GetMsg() string { if x != nil { return x.Msg } return "" } -func (x *DeleteProductChangesResponse) GetStatus() Status { +func (x *GetProductHistoryInfoResponse) GetStatus() Status { if x != nil { return x.Status } return Status_success } +func (x *GetProductHistoryInfoResponse) GetRecords() []*HistoryInfoRecord { + if x != nil { + return x.Records + } + return nil +} + var File_product_proto protoreflect.FileDescriptor var file_product_proto_rawDesc = []byte{ @@ -2243,291 +2251,318 @@ var file_product_proto_rawDesc = []byte{ 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4e, 0x0a, 0x1e, 0x47, 0x65, 0x74, - 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x73, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x73, 0x69, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xd7, 0x02, 0x0a, 0x1f, 0x47, 0x65, - 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, - 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x77, 0x0a, 0x1c, 0x61, - 0x6d, 0x7a, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x19, 0x61, 0x6d, 0x7a, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x12, 0x6d, 0x0a, 0x19, 0x61, 0x6d, 0x7a, 0x5f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x5f, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, - 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x16, 0x61, 0x6d, 0x7a, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x73, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x73, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x55, 0x0a, 0x1d, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbf, 0x01, 0x0a, - 0x20, 0x47, 0x65, 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x4d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, - 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6d, 0x7a, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x79, - 0x0a, 0x25, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, - 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x76, 0x0a, 0x26, 0x41, 0x70, 0x70, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x79, 0x0a, 0x25, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, - 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x73, 0x0a, 0x23, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x50, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x22, 0x76, 0x0a, 0x26, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, + 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, + 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x73, 0x0a, 0x23, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x22, 0x74, 0x0a, 0x24, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x75, 0x70, 0x65, - 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x74, 0x0a, 0x24, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, + 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x74, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x23, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4f, 0x0a, 0x25, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x74, 0x0a, 0x24, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, - 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x4f, 0x0a, 0x25, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, - 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x22, 0x76, 0x0a, 0x26, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x69, 0x0a, 0x1b, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, - 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, - 0x44, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x76, 0x0a, + 0x26, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x69, 0x0a, 0x1b, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x44, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x22, 0x6c, 0x0a, 0x1c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, + 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xae, + 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x68, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x70, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0x8d, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x73, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x61, 0x73, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x6c, 0x0a, 0x1c, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0xbe, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, + 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x52, 0x0a, 0x0f, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x22, 0x45, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x6c, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9b, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6d, + 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x22, 0xbb, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6d, 0x7a, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0xae, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x79, 0x5f, 0x61, 0x73, 0x69, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x79, 0x41, 0x73, 0x69, 0x6e, 0x12, - 0x21, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x61, 0x73, 0x69, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x73, - 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xbe, 0x01, 0x0a, - 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, - 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, + 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x73, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x61, 0x73, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, + 0x22, 0x45, 0x0a, 0x11, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x47, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, + 0x2a, 0x22, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x10, 0x01, 0x2a, 0x53, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x09, 0x0a, + 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x73, 0x74, 0x61, 0x72, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x10, 0x02, 0x12, + 0x11, 0x0a, 0x0d, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x6b, + 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x74, 0x6f, 0x70, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x10, 0x04, 0x32, 0x89, 0x12, 0x0a, 0x0e, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76, 0x0a, 0x0d, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x45, 0x0a, - 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, - 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x65, 0x22, 0x6c, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, - 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x2a, 0x22, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x66, 0x61, 0x69, - 0x6c, 0x75, 0x72, 0x65, 0x10, 0x01, 0x2a, 0x53, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x09, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x73, 0x74, - 0x61, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x10, - 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x61, - 0x6e, 0x6b, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x74, 0x6f, 0x70, 0x5f, 0x63, 0x61, 0x74, 0x65, - 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x10, 0x04, 0x32, 0xc7, 0x0d, 0x0a, 0x0e, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76, - 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, - 0x30, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, - 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, - 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x76, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x73, 0x75, 0x70, 0x65, - 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x76, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x12, 0x30, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa3, 0x01, 0x0a, 0x1c, 0x41, 0x70, 0x70, - 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x3f, 0x2e, 0x73, 0x75, 0x70, 0x65, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x76, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, + 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x73, 0x75, 0x70, - 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, - 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa3, - 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, - 0x3f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x76, + 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, + 0x30, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x40, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0xa9, 0x01, 0x0a, 0x1e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, - 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x41, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, + 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x31, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa3, 0x01, 0x0a, 0x1c, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x3f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x73, 0x75, 0x70, - 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, - 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x6d, 0x7a, 0x44, + 0x65, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x38, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x39, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa3, 0x01, 0x0a, 0x1c, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x3f, 0x2e, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0xa9, 0x01, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, + 0x12, 0xa9, 0x01, 0x0a, 0x1e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x41, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x89, 0x01, 0x0a, - 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, + 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa9, 0x01, 0x0a, + 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, + 0x41, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8e, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x38, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x89, 0x01, 0x0a, 0x14, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x12, 0x37, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x35, 0x2e, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, + 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x38, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x8d, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x35, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, - 0x35, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, - 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x8b, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x73, 0x75, 0x70, 0x65, + 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x93, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x12, 0x37, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x94, - 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3a, 0x2e, 0x73, 0x75, 0x70, - 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, - 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6d, 0x7a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x6a, 0x63, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x70, @@ -2562,26 +2597,26 @@ var file_product_proto_goTypes = []interface{}{ (*UpdateProductResponse)(nil), // 10: superjcd.productservice.v1.UpdateProductResponse (*DeleteProductRequest)(nil), // 11: superjcd.productservice.v1.DeleteProductRequest (*DeleteProductResponse)(nil), // 12: superjcd.productservice.v1.DeleteProductResponse - (*GetAmzProductLatestInfoRequest)(nil), // 13: superjcd.productservice.v1.GetAmzProductLatestInfoRequest - (*GetAmzProductLatestInfoResponse)(nil), // 14: superjcd.productservice.v1.GetAmzProductLatestInfoResponse - (*GetAmzProductHistoryInfoRequest)(nil), // 15: superjcd.productservice.v1.GetAmzProductHistoryInfoRequest - (*AmzProductHistoryInfoResponse)(nil), // 16: superjcd.productservice.v1.AmzProductHistoryInfoResponse - (*GetAmzProductHistoryInfoResponse)(nil), // 17: superjcd.productservice.v1.GetAmzProductHistoryInfoResponse - (*AppendAmzProductInactiveDetailRequest)(nil), // 18: superjcd.productservice.v1.AppendAmzProductInactiveDetailRequest - (*AppendAmzProductInactiveDetailResponse)(nil), // 19: superjcd.productservice.v1.AppendAmzProductInactiveDetailResponse - (*AppendAmzProductActiveDetailRequest)(nil), // 20: superjcd.productservice.v1.AppendAmzProductActiveDetailRequest - (*AppendAmzProductActiveDetailResponse)(nil), // 21: superjcd.productservice.v1.AppendAmzProductActiveDetailResponse - (*DeleteAmzProductActiveDetailRequest)(nil), // 22: superjcd.productservice.v1.DeleteAmzProductActiveDetailRequest - (*DeleteAmzProductActiveDetailResponse)(nil), // 23: superjcd.productservice.v1.DeleteAmzProductActiveDetailResponse - (*DeleteAmzProductInactiveDetailRequest)(nil), // 24: superjcd.productservice.v1.DeleteAmzProductInactiveDetailRequest - (*DeleteAmzProductInactiveDetailResponse)(nil), // 25: superjcd.productservice.v1.DeleteAmzProductInactiveDetailResponse - (*AppendProductChangesRequest)(nil), // 26: superjcd.productservice.v1.AppendProductChangesRequest - (*AppendProductChangesResponse)(nil), // 27: superjcd.productservice.v1.AppendProductChangesResponse - (*ListProductChangesRequest)(nil), // 28: superjcd.productservice.v1.ListProductChangesRequest - (*ProductChange)(nil), // 29: superjcd.productservice.v1.ProductChange - (*ListProductChangesResponse)(nil), // 30: superjcd.productservice.v1.ListProductChangesResponse - (*DeleteProductChangesRequest)(nil), // 31: superjcd.productservice.v1.DeleteProductChangesRequest - (*DeleteProductChangesResponse)(nil), // 32: superjcd.productservice.v1.DeleteProductChangesResponse + (*AppendAmzProductInactiveDetailRequest)(nil), // 13: superjcd.productservice.v1.AppendAmzProductInactiveDetailRequest + (*AppendAmzProductInactiveDetailResponse)(nil), // 14: superjcd.productservice.v1.AppendAmzProductInactiveDetailResponse + (*AppendAmzProductActiveDetailRequest)(nil), // 15: superjcd.productservice.v1.AppendAmzProductActiveDetailRequest + (*AppendAmzProductActiveDetailResponse)(nil), // 16: superjcd.productservice.v1.AppendAmzProductActiveDetailResponse + (*DeleteAmzProductActiveDetailRequest)(nil), // 17: superjcd.productservice.v1.DeleteAmzProductActiveDetailRequest + (*DeleteAmzProductActiveDetailResponse)(nil), // 18: superjcd.productservice.v1.DeleteAmzProductActiveDetailResponse + (*DeleteAmzProductInactiveDetailRequest)(nil), // 19: superjcd.productservice.v1.DeleteAmzProductInactiveDetailRequest + (*DeleteAmzProductInactiveDetailResponse)(nil), // 20: superjcd.productservice.v1.DeleteAmzProductInactiveDetailResponse + (*AppendProductChangesRequest)(nil), // 21: superjcd.productservice.v1.AppendProductChangesRequest + (*AppendProductChangesResponse)(nil), // 22: superjcd.productservice.v1.AppendProductChangesResponse + (*ListProductChangesRequest)(nil), // 23: superjcd.productservice.v1.ListProductChangesRequest + (*ProductChange)(nil), // 24: superjcd.productservice.v1.ProductChange + (*ListProductChangesResponse)(nil), // 25: superjcd.productservice.v1.ListProductChangesResponse + (*DeleteProductChangesRequest)(nil), // 26: superjcd.productservice.v1.DeleteProductChangesRequest + (*DeleteProductChangesResponse)(nil), // 27: superjcd.productservice.v1.DeleteProductChangesResponse + (*ListAmzProductDetailsRequest)(nil), // 28: superjcd.productservice.v1.ListAmzProductDetailsRequest + (*ListAmzProductDetailsResponse)(nil), // 29: superjcd.productservice.v1.ListAmzProductDetailsResponse + (*GetProductHistoryInfoRequest)(nil), // 30: superjcd.productservice.v1.GetProductHistoryInfoRequest + (*HistoryInfoRecord)(nil), // 31: superjcd.productservice.v1.HistoryInfoRecord + (*GetProductHistoryInfoResponse)(nil), // 32: superjcd.productservice.v1.GetProductHistoryInfoResponse } var file_product_proto_depIdxs = []int32{ 2, // 0: superjcd.productservice.v1.CreateProductRequest.products:type_name -> superjcd.productservice.v1.Product @@ -2590,50 +2625,57 @@ var file_product_proto_depIdxs = []int32{ 2, // 3: superjcd.productservice.v1.ListProductResponse.products:type_name -> superjcd.productservice.v1.Product 0, // 4: superjcd.productservice.v1.UpdateProductResponse.status:type_name -> superjcd.productservice.v1.Status 0, // 5: superjcd.productservice.v1.DeleteProductResponse.status:type_name -> superjcd.productservice.v1.Status - 0, // 6: superjcd.productservice.v1.GetAmzProductLatestInfoResponse.status:type_name -> superjcd.productservice.v1.Status - 3, // 7: superjcd.productservice.v1.GetAmzProductLatestInfoResponse.amz_product_incative_details:type_name -> superjcd.productservice.v1.AmzProductInactivateDetail - 4, // 8: superjcd.productservice.v1.GetAmzProductLatestInfoResponse.amz_product_ative_details:type_name -> superjcd.productservice.v1.AmzProductActiveDetail - 0, // 9: superjcd.productservice.v1.GetAmzProductHistoryInfoResponse.status:type_name -> superjcd.productservice.v1.Status - 16, // 10: superjcd.productservice.v1.GetAmzProductHistoryInfoResponse.data:type_name -> superjcd.productservice.v1.AmzProductHistoryInfoResponse - 3, // 11: superjcd.productservice.v1.AppendAmzProductInactiveDetailRequest.details:type_name -> superjcd.productservice.v1.AmzProductInactivateDetail - 0, // 12: superjcd.productservice.v1.AppendAmzProductInactiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status - 4, // 13: superjcd.productservice.v1.AppendAmzProductActiveDetailRequest.details:type_name -> superjcd.productservice.v1.AmzProductActiveDetail - 0, // 14: superjcd.productservice.v1.AppendAmzProductActiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status - 0, // 15: superjcd.productservice.v1.DeleteAmzProductActiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status - 0, // 16: superjcd.productservice.v1.DeleteAmzProductInactiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status - 0, // 17: superjcd.productservice.v1.AppendProductChangesResponse.status:type_name -> superjcd.productservice.v1.Status - 0, // 18: superjcd.productservice.v1.ListProductChangesResponse.status:type_name -> superjcd.productservice.v1.Status - 29, // 19: superjcd.productservice.v1.ListProductChangesResponse.Product_changes:type_name -> superjcd.productservice.v1.ProductChange - 0, // 20: superjcd.productservice.v1.DeleteProductChangesResponse.status:type_name -> superjcd.productservice.v1.Status - 5, // 21: superjcd.productservice.v1.ProductService.CreateProduct:input_type -> superjcd.productservice.v1.CreateProductRequest - 7, // 22: superjcd.productservice.v1.ProductService.ListProduct:input_type -> superjcd.productservice.v1.ListProductRequest - 9, // 23: superjcd.productservice.v1.ProductService.UpdateProduct:input_type -> superjcd.productservice.v1.UpdateProductRequest - 11, // 24: superjcd.productservice.v1.ProductService.DeleteProduct:input_type -> superjcd.productservice.v1.DeleteProductRequest - 20, // 25: superjcd.productservice.v1.ProductService.AppendAmzProductActiveDetail:input_type -> superjcd.productservice.v1.AppendAmzProductActiveDetailRequest - 22, // 26: superjcd.productservice.v1.ProductService.DeleteAmzProductActiveDetail:input_type -> superjcd.productservice.v1.DeleteAmzProductActiveDetailRequest - 18, // 27: superjcd.productservice.v1.ProductService.AppendAmzProductInactiveDetail:input_type -> superjcd.productservice.v1.AppendAmzProductInactiveDetailRequest - 24, // 28: superjcd.productservice.v1.ProductService.DeleteAmzProductInactiveDetail:input_type -> superjcd.productservice.v1.DeleteAmzProductInactiveDetailRequest - 26, // 29: superjcd.productservice.v1.ProductService.AppendProductChanges:input_type -> superjcd.productservice.v1.AppendProductChangesRequest - 28, // 30: superjcd.productservice.v1.ProductService.ListProductChanges:input_type -> superjcd.productservice.v1.ListProductChangesRequest - 31, // 31: superjcd.productservice.v1.ProductService.DeleteProductChanges:input_type -> superjcd.productservice.v1.DeleteProductChangesRequest - 13, // 32: superjcd.productservice.v1.ProductService.GetAmzProductLatestInfo:input_type -> superjcd.productservice.v1.GetAmzProductLatestInfoRequest - 6, // 33: superjcd.productservice.v1.ProductService.CreateProduct:output_type -> superjcd.productservice.v1.CreateProductResponse - 8, // 34: superjcd.productservice.v1.ProductService.ListProduct:output_type -> superjcd.productservice.v1.ListProductResponse - 10, // 35: superjcd.productservice.v1.ProductService.UpdateProduct:output_type -> superjcd.productservice.v1.UpdateProductResponse - 12, // 36: superjcd.productservice.v1.ProductService.DeleteProduct:output_type -> superjcd.productservice.v1.DeleteProductResponse - 21, // 37: superjcd.productservice.v1.ProductService.AppendAmzProductActiveDetail:output_type -> superjcd.productservice.v1.AppendAmzProductActiveDetailResponse - 23, // 38: superjcd.productservice.v1.ProductService.DeleteAmzProductActiveDetail:output_type -> superjcd.productservice.v1.DeleteAmzProductActiveDetailResponse - 19, // 39: superjcd.productservice.v1.ProductService.AppendAmzProductInactiveDetail:output_type -> superjcd.productservice.v1.AppendAmzProductInactiveDetailResponse - 25, // 40: superjcd.productservice.v1.ProductService.DeleteAmzProductInactiveDetail:output_type -> superjcd.productservice.v1.DeleteAmzProductInactiveDetailResponse - 27, // 41: superjcd.productservice.v1.ProductService.AppendProductChanges:output_type -> superjcd.productservice.v1.AppendProductChangesResponse - 30, // 42: superjcd.productservice.v1.ProductService.ListProductChanges:output_type -> superjcd.productservice.v1.ListProductChangesResponse - 32, // 43: superjcd.productservice.v1.ProductService.DeleteProductChanges:output_type -> superjcd.productservice.v1.DeleteProductChangesResponse - 14, // 44: superjcd.productservice.v1.ProductService.GetAmzProductLatestInfo:output_type -> superjcd.productservice.v1.GetAmzProductLatestInfoResponse - 33, // [33:45] is the sub-list for method output_type - 21, // [21:33] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 3, // 6: superjcd.productservice.v1.AppendAmzProductInactiveDetailRequest.details:type_name -> superjcd.productservice.v1.AmzProductInactivateDetail + 0, // 7: superjcd.productservice.v1.AppendAmzProductInactiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status + 4, // 8: superjcd.productservice.v1.AppendAmzProductActiveDetailRequest.details:type_name -> superjcd.productservice.v1.AmzProductActiveDetail + 0, // 9: superjcd.productservice.v1.AppendAmzProductActiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status + 0, // 10: superjcd.productservice.v1.DeleteAmzProductActiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status + 0, // 11: superjcd.productservice.v1.DeleteAmzProductInactiveDetailResponse.status:type_name -> superjcd.productservice.v1.Status + 0, // 12: superjcd.productservice.v1.AppendProductChangesResponse.status:type_name -> superjcd.productservice.v1.Status + 0, // 13: superjcd.productservice.v1.ListProductChangesResponse.status:type_name -> superjcd.productservice.v1.Status + 24, // 14: superjcd.productservice.v1.ListProductChangesResponse.Product_changes:type_name -> superjcd.productservice.v1.ProductChange + 0, // 15: superjcd.productservice.v1.DeleteProductChangesResponse.status:type_name -> superjcd.productservice.v1.Status + 0, // 16: superjcd.productservice.v1.ListAmzProductDetailsResponse.status:type_name -> superjcd.productservice.v1.Status + 4, // 17: superjcd.productservice.v1.ListAmzProductDetailsResponse.details:type_name -> superjcd.productservice.v1.AmzProductActiveDetail + 0, // 18: superjcd.productservice.v1.GetProductHistoryInfoResponse.status:type_name -> superjcd.productservice.v1.Status + 31, // 19: superjcd.productservice.v1.GetProductHistoryInfoResponse.records:type_name -> superjcd.productservice.v1.HistoryInfoRecord + 5, // 20: superjcd.productservice.v1.ProductService.CreateProduct:input_type -> superjcd.productservice.v1.CreateProductRequest + 7, // 21: superjcd.productservice.v1.ProductService.ListProduct:input_type -> superjcd.productservice.v1.ListProductRequest + 9, // 22: superjcd.productservice.v1.ProductService.UpdateProduct:input_type -> superjcd.productservice.v1.UpdateProductRequest + 11, // 23: superjcd.productservice.v1.ProductService.DeleteProduct:input_type -> superjcd.productservice.v1.DeleteProductRequest + 15, // 24: superjcd.productservice.v1.ProductService.AppendAmzProductActiveDetail:input_type -> superjcd.productservice.v1.AppendAmzProductActiveDetailRequest + 28, // 25: superjcd.productservice.v1.ProductService.ListProductAmzDetals:input_type -> superjcd.productservice.v1.ListAmzProductDetailsRequest + 17, // 26: superjcd.productservice.v1.ProductService.DeleteAmzProductActiveDetail:input_type -> superjcd.productservice.v1.DeleteAmzProductActiveDetailRequest + 13, // 27: superjcd.productservice.v1.ProductService.AppendAmzProductInactiveDetail:input_type -> superjcd.productservice.v1.AppendAmzProductInactiveDetailRequest + 19, // 28: superjcd.productservice.v1.ProductService.DeleteAmzProductInactiveDetail:input_type -> superjcd.productservice.v1.DeleteAmzProductInactiveDetailRequest + 30, // 29: superjcd.productservice.v1.ProductService.GetProductHistoryInfo:input_type -> superjcd.productservice.v1.GetProductHistoryInfoRequest + 21, // 30: superjcd.productservice.v1.ProductService.AppendProductChanges:input_type -> superjcd.productservice.v1.AppendProductChangesRequest + 23, // 31: superjcd.productservice.v1.ProductService.ListProductChanges:input_type -> superjcd.productservice.v1.ListProductChangesRequest + 26, // 32: superjcd.productservice.v1.ProductService.DeleteProductChanges:input_type -> superjcd.productservice.v1.DeleteProductChangesRequest + 21, // 33: superjcd.productservice.v1.ProductService.AppendInactiveProductChanges:input_type -> superjcd.productservice.v1.AppendProductChangesRequest + 23, // 34: superjcd.productservice.v1.ProductService.ListInactiveProductChanges:input_type -> superjcd.productservice.v1.ListProductChangesRequest + 26, // 35: superjcd.productservice.v1.ProductService.DeleteInactiveProductChanges:input_type -> superjcd.productservice.v1.DeleteProductChangesRequest + 6, // 36: superjcd.productservice.v1.ProductService.CreateProduct:output_type -> superjcd.productservice.v1.CreateProductResponse + 8, // 37: superjcd.productservice.v1.ProductService.ListProduct:output_type -> superjcd.productservice.v1.ListProductResponse + 10, // 38: superjcd.productservice.v1.ProductService.UpdateProduct:output_type -> superjcd.productservice.v1.UpdateProductResponse + 12, // 39: superjcd.productservice.v1.ProductService.DeleteProduct:output_type -> superjcd.productservice.v1.DeleteProductResponse + 16, // 40: superjcd.productservice.v1.ProductService.AppendAmzProductActiveDetail:output_type -> superjcd.productservice.v1.AppendAmzProductActiveDetailResponse + 29, // 41: superjcd.productservice.v1.ProductService.ListProductAmzDetals:output_type -> superjcd.productservice.v1.ListAmzProductDetailsResponse + 18, // 42: superjcd.productservice.v1.ProductService.DeleteAmzProductActiveDetail:output_type -> superjcd.productservice.v1.DeleteAmzProductActiveDetailResponse + 14, // 43: superjcd.productservice.v1.ProductService.AppendAmzProductInactiveDetail:output_type -> superjcd.productservice.v1.AppendAmzProductInactiveDetailResponse + 20, // 44: superjcd.productservice.v1.ProductService.DeleteAmzProductInactiveDetail:output_type -> superjcd.productservice.v1.DeleteAmzProductInactiveDetailResponse + 32, // 45: superjcd.productservice.v1.ProductService.GetProductHistoryInfo:output_type -> superjcd.productservice.v1.GetProductHistoryInfoResponse + 22, // 46: superjcd.productservice.v1.ProductService.AppendProductChanges:output_type -> superjcd.productservice.v1.AppendProductChangesResponse + 25, // 47: superjcd.productservice.v1.ProductService.ListProductChanges:output_type -> superjcd.productservice.v1.ListProductChangesResponse + 27, // 48: superjcd.productservice.v1.ProductService.DeleteProductChanges:output_type -> superjcd.productservice.v1.DeleteProductChangesResponse + 22, // 49: superjcd.productservice.v1.ProductService.AppendInactiveProductChanges:output_type -> superjcd.productservice.v1.AppendProductChangesResponse + 25, // 50: superjcd.productservice.v1.ProductService.ListInactiveProductChanges:output_type -> superjcd.productservice.v1.ListProductChangesResponse + 27, // 51: superjcd.productservice.v1.ProductService.DeleteInactiveProductChanges:output_type -> superjcd.productservice.v1.DeleteProductChangesResponse + 36, // [36:52] is the sub-list for method output_type + 20, // [20:36] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_product_proto_init() } @@ -2775,7 +2817,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAmzProductLatestInfoRequest); i { + switch v := v.(*AppendAmzProductInactiveDetailRequest); i { case 0: return &v.state case 1: @@ -2787,7 +2829,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAmzProductLatestInfoResponse); i { + switch v := v.(*AppendAmzProductInactiveDetailResponse); i { case 0: return &v.state case 1: @@ -2799,7 +2841,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAmzProductHistoryInfoRequest); i { + switch v := v.(*AppendAmzProductActiveDetailRequest); i { case 0: return &v.state case 1: @@ -2811,7 +2853,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AmzProductHistoryInfoResponse); i { + switch v := v.(*AppendAmzProductActiveDetailResponse); i { case 0: return &v.state case 1: @@ -2823,7 +2865,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAmzProductHistoryInfoResponse); i { + switch v := v.(*DeleteAmzProductActiveDetailRequest); i { case 0: return &v.state case 1: @@ -2835,7 +2877,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendAmzProductInactiveDetailRequest); i { + switch v := v.(*DeleteAmzProductActiveDetailResponse); i { case 0: return &v.state case 1: @@ -2847,7 +2889,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendAmzProductInactiveDetailResponse); i { + switch v := v.(*DeleteAmzProductInactiveDetailRequest); i { case 0: return &v.state case 1: @@ -2859,7 +2901,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendAmzProductActiveDetailRequest); i { + switch v := v.(*DeleteAmzProductInactiveDetailResponse); i { case 0: return &v.state case 1: @@ -2871,7 +2913,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendAmzProductActiveDetailResponse); i { + switch v := v.(*AppendProductChangesRequest); i { case 0: return &v.state case 1: @@ -2883,7 +2925,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteAmzProductActiveDetailRequest); i { + switch v := v.(*AppendProductChangesResponse); i { case 0: return &v.state case 1: @@ -2895,7 +2937,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteAmzProductActiveDetailResponse); i { + switch v := v.(*ListProductChangesRequest); i { case 0: return &v.state case 1: @@ -2907,7 +2949,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteAmzProductInactiveDetailRequest); i { + switch v := v.(*ProductChange); i { case 0: return &v.state case 1: @@ -2919,7 +2961,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteAmzProductInactiveDetailResponse); i { + switch v := v.(*ListProductChangesResponse); i { case 0: return &v.state case 1: @@ -2931,7 +2973,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendProductChangesRequest); i { + switch v := v.(*DeleteProductChangesRequest); i { case 0: return &v.state case 1: @@ -2943,7 +2985,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendProductChangesResponse); i { + switch v := v.(*DeleteProductChangesResponse); i { case 0: return &v.state case 1: @@ -2955,7 +2997,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProductChangesRequest); i { + switch v := v.(*ListAmzProductDetailsRequest); i { case 0: return &v.state case 1: @@ -2967,7 +3009,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProductChange); i { + switch v := v.(*ListAmzProductDetailsResponse); i { case 0: return &v.state case 1: @@ -2979,7 +3021,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProductChangesResponse); i { + switch v := v.(*GetProductHistoryInfoRequest); i { case 0: return &v.state case 1: @@ -2991,7 +3033,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteProductChangesRequest); i { + switch v := v.(*HistoryInfoRecord); i { case 0: return &v.state case 1: @@ -3003,7 +3045,7 @@ func file_product_proto_init() { } } file_product_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteProductChangesResponse); i { + switch v := v.(*GetProductHistoryInfoResponse); i { case 0: return &v.state case 1: diff --git a/genproto/v1/product_grpc.pb.go b/genproto/v1/product_grpc.pb.go index a1152f9..91edc5c 100644 --- a/genproto/v1/product_grpc.pb.go +++ b/genproto/v1/product_grpc.pb.go @@ -24,13 +24,17 @@ const ( ProductService_UpdateProduct_FullMethodName = "/superjcd.productservice.v1.ProductService/UpdateProduct" ProductService_DeleteProduct_FullMethodName = "/superjcd.productservice.v1.ProductService/DeleteProduct" ProductService_AppendAmzProductActiveDetail_FullMethodName = "/superjcd.productservice.v1.ProductService/AppendAmzProductActiveDetail" + ProductService_ListProductAmzDetals_FullMethodName = "/superjcd.productservice.v1.ProductService/ListProductAmzDetals" ProductService_DeleteAmzProductActiveDetail_FullMethodName = "/superjcd.productservice.v1.ProductService/DeleteAmzProductActiveDetail" ProductService_AppendAmzProductInactiveDetail_FullMethodName = "/superjcd.productservice.v1.ProductService/AppendAmzProductInactiveDetail" ProductService_DeleteAmzProductInactiveDetail_FullMethodName = "/superjcd.productservice.v1.ProductService/DeleteAmzProductInactiveDetail" + ProductService_GetProductHistoryInfo_FullMethodName = "/superjcd.productservice.v1.ProductService/GetProductHistoryInfo" ProductService_AppendProductChanges_FullMethodName = "/superjcd.productservice.v1.ProductService/AppendProductChanges" ProductService_ListProductChanges_FullMethodName = "/superjcd.productservice.v1.ProductService/ListProductChanges" ProductService_DeleteProductChanges_FullMethodName = "/superjcd.productservice.v1.ProductService/DeleteProductChanges" - ProductService_GetAmzProductLatestInfo_FullMethodName = "/superjcd.productservice.v1.ProductService/GetAmzProductLatestInfo" + ProductService_AppendInactiveProductChanges_FullMethodName = "/superjcd.productservice.v1.ProductService/AppendInactiveProductChanges" + ProductService_ListInactiveProductChanges_FullMethodName = "/superjcd.productservice.v1.ProductService/ListInactiveProductChanges" + ProductService_DeleteInactiveProductChanges_FullMethodName = "/superjcd.productservice.v1.ProductService/DeleteInactiveProductChanges" ) // ProductServiceClient is the client API for ProductService service. @@ -44,14 +48,19 @@ type ProductServiceClient interface { DeleteProduct(ctx context.Context, in *DeleteProductRequest, opts ...grpc.CallOption) (*DeleteProductResponse, error) // TODO: append multiple AppendAmzProductActiveDetail(ctx context.Context, in *AppendAmzProductActiveDetailRequest, opts ...grpc.CallOption) (*AppendAmzProductActiveDetailResponse, error) + ListProductAmzDetals(ctx context.Context, in *ListAmzProductDetailsRequest, opts ...grpc.CallOption) (*ListAmzProductDetailsResponse, error) DeleteAmzProductActiveDetail(ctx context.Context, in *DeleteAmzProductActiveDetailRequest, opts ...grpc.CallOption) (*DeleteAmzProductActiveDetailResponse, error) AppendAmzProductInactiveDetail(ctx context.Context, in *AppendAmzProductInactiveDetailRequest, opts ...grpc.CallOption) (*AppendAmzProductInactiveDetailResponse, error) DeleteAmzProductInactiveDetail(ctx context.Context, in *DeleteAmzProductInactiveDetailRequest, opts ...grpc.CallOption) (*DeleteAmzProductInactiveDetailResponse, error) + GetProductHistoryInfo(ctx context.Context, in *GetProductHistoryInfoRequest, opts ...grpc.CallOption) (*GetProductHistoryInfoResponse, error) + // active 变化 AppendProductChanges(ctx context.Context, in *AppendProductChangesRequest, opts ...grpc.CallOption) (*AppendProductChangesResponse, error) ListProductChanges(ctx context.Context, in *ListProductChangesRequest, opts ...grpc.CallOption) (*ListProductChangesResponse, error) DeleteProductChanges(ctx context.Context, in *DeleteProductChangesRequest, opts ...grpc.CallOption) (*DeleteProductChangesResponse, error) - // 获取详情;TODO: 获取某个字段的连续变动信息 - GetAmzProductLatestInfo(ctx context.Context, in *GetAmzProductLatestInfoRequest, opts ...grpc.CallOption) (*GetAmzProductLatestInfoResponse, error) + // inactive details + AppendInactiveProductChanges(ctx context.Context, in *AppendProductChangesRequest, opts ...grpc.CallOption) (*AppendProductChangesResponse, error) + ListInactiveProductChanges(ctx context.Context, in *ListProductChangesRequest, opts ...grpc.CallOption) (*ListProductChangesResponse, error) + DeleteInactiveProductChanges(ctx context.Context, in *DeleteProductChangesRequest, opts ...grpc.CallOption) (*DeleteProductChangesResponse, error) } type productServiceClient struct { @@ -107,6 +116,15 @@ func (c *productServiceClient) AppendAmzProductActiveDetail(ctx context.Context, return out, nil } +func (c *productServiceClient) ListProductAmzDetals(ctx context.Context, in *ListAmzProductDetailsRequest, opts ...grpc.CallOption) (*ListAmzProductDetailsResponse, error) { + out := new(ListAmzProductDetailsResponse) + err := c.cc.Invoke(ctx, ProductService_ListProductAmzDetals_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) DeleteAmzProductActiveDetail(ctx context.Context, in *DeleteAmzProductActiveDetailRequest, opts ...grpc.CallOption) (*DeleteAmzProductActiveDetailResponse, error) { out := new(DeleteAmzProductActiveDetailResponse) err := c.cc.Invoke(ctx, ProductService_DeleteAmzProductActiveDetail_FullMethodName, in, out, opts...) @@ -134,6 +152,15 @@ func (c *productServiceClient) DeleteAmzProductInactiveDetail(ctx context.Contex return out, nil } +func (c *productServiceClient) GetProductHistoryInfo(ctx context.Context, in *GetProductHistoryInfoRequest, opts ...grpc.CallOption) (*GetProductHistoryInfoResponse, error) { + out := new(GetProductHistoryInfoResponse) + err := c.cc.Invoke(ctx, ProductService_GetProductHistoryInfo_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *productServiceClient) AppendProductChanges(ctx context.Context, in *AppendProductChangesRequest, opts ...grpc.CallOption) (*AppendProductChangesResponse, error) { out := new(AppendProductChangesResponse) err := c.cc.Invoke(ctx, ProductService_AppendProductChanges_FullMethodName, in, out, opts...) @@ -161,9 +188,27 @@ func (c *productServiceClient) DeleteProductChanges(ctx context.Context, in *Del return out, nil } -func (c *productServiceClient) GetAmzProductLatestInfo(ctx context.Context, in *GetAmzProductLatestInfoRequest, opts ...grpc.CallOption) (*GetAmzProductLatestInfoResponse, error) { - out := new(GetAmzProductLatestInfoResponse) - err := c.cc.Invoke(ctx, ProductService_GetAmzProductLatestInfo_FullMethodName, in, out, opts...) +func (c *productServiceClient) AppendInactiveProductChanges(ctx context.Context, in *AppendProductChangesRequest, opts ...grpc.CallOption) (*AppendProductChangesResponse, error) { + out := new(AppendProductChangesResponse) + err := c.cc.Invoke(ctx, ProductService_AppendInactiveProductChanges_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) ListInactiveProductChanges(ctx context.Context, in *ListProductChangesRequest, opts ...grpc.CallOption) (*ListProductChangesResponse, error) { + out := new(ListProductChangesResponse) + err := c.cc.Invoke(ctx, ProductService_ListInactiveProductChanges_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *productServiceClient) DeleteInactiveProductChanges(ctx context.Context, in *DeleteProductChangesRequest, opts ...grpc.CallOption) (*DeleteProductChangesResponse, error) { + out := new(DeleteProductChangesResponse) + err := c.cc.Invoke(ctx, ProductService_DeleteInactiveProductChanges_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -181,14 +226,19 @@ type ProductServiceServer interface { DeleteProduct(context.Context, *DeleteProductRequest) (*DeleteProductResponse, error) // TODO: append multiple AppendAmzProductActiveDetail(context.Context, *AppendAmzProductActiveDetailRequest) (*AppendAmzProductActiveDetailResponse, error) + ListProductAmzDetals(context.Context, *ListAmzProductDetailsRequest) (*ListAmzProductDetailsResponse, error) DeleteAmzProductActiveDetail(context.Context, *DeleteAmzProductActiveDetailRequest) (*DeleteAmzProductActiveDetailResponse, error) AppendAmzProductInactiveDetail(context.Context, *AppendAmzProductInactiveDetailRequest) (*AppendAmzProductInactiveDetailResponse, error) DeleteAmzProductInactiveDetail(context.Context, *DeleteAmzProductInactiveDetailRequest) (*DeleteAmzProductInactiveDetailResponse, error) + GetProductHistoryInfo(context.Context, *GetProductHistoryInfoRequest) (*GetProductHistoryInfoResponse, error) + // active 变化 AppendProductChanges(context.Context, *AppendProductChangesRequest) (*AppendProductChangesResponse, error) ListProductChanges(context.Context, *ListProductChangesRequest) (*ListProductChangesResponse, error) DeleteProductChanges(context.Context, *DeleteProductChangesRequest) (*DeleteProductChangesResponse, error) - // 获取详情;TODO: 获取某个字段的连续变动信息 - GetAmzProductLatestInfo(context.Context, *GetAmzProductLatestInfoRequest) (*GetAmzProductLatestInfoResponse, error) + // inactive details + AppendInactiveProductChanges(context.Context, *AppendProductChangesRequest) (*AppendProductChangesResponse, error) + ListInactiveProductChanges(context.Context, *ListProductChangesRequest) (*ListProductChangesResponse, error) + DeleteInactiveProductChanges(context.Context, *DeleteProductChangesRequest) (*DeleteProductChangesResponse, error) mustEmbedUnimplementedProductServiceServer() } @@ -211,6 +261,9 @@ func (UnimplementedProductServiceServer) DeleteProduct(context.Context, *DeleteP func (UnimplementedProductServiceServer) AppendAmzProductActiveDetail(context.Context, *AppendAmzProductActiveDetailRequest) (*AppendAmzProductActiveDetailResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AppendAmzProductActiveDetail not implemented") } +func (UnimplementedProductServiceServer) ListProductAmzDetals(context.Context, *ListAmzProductDetailsRequest) (*ListAmzProductDetailsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListProductAmzDetals not implemented") +} func (UnimplementedProductServiceServer) DeleteAmzProductActiveDetail(context.Context, *DeleteAmzProductActiveDetailRequest) (*DeleteAmzProductActiveDetailResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteAmzProductActiveDetail not implemented") } @@ -220,6 +273,9 @@ func (UnimplementedProductServiceServer) AppendAmzProductInactiveDetail(context. func (UnimplementedProductServiceServer) DeleteAmzProductInactiveDetail(context.Context, *DeleteAmzProductInactiveDetailRequest) (*DeleteAmzProductInactiveDetailResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteAmzProductInactiveDetail not implemented") } +func (UnimplementedProductServiceServer) GetProductHistoryInfo(context.Context, *GetProductHistoryInfoRequest) (*GetProductHistoryInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetProductHistoryInfo not implemented") +} func (UnimplementedProductServiceServer) AppendProductChanges(context.Context, *AppendProductChangesRequest) (*AppendProductChangesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AppendProductChanges not implemented") } @@ -229,8 +285,14 @@ func (UnimplementedProductServiceServer) ListProductChanges(context.Context, *Li func (UnimplementedProductServiceServer) DeleteProductChanges(context.Context, *DeleteProductChangesRequest) (*DeleteProductChangesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteProductChanges not implemented") } -func (UnimplementedProductServiceServer) GetAmzProductLatestInfo(context.Context, *GetAmzProductLatestInfoRequest) (*GetAmzProductLatestInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAmzProductLatestInfo not implemented") +func (UnimplementedProductServiceServer) AppendInactiveProductChanges(context.Context, *AppendProductChangesRequest) (*AppendProductChangesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AppendInactiveProductChanges not implemented") +} +func (UnimplementedProductServiceServer) ListInactiveProductChanges(context.Context, *ListProductChangesRequest) (*ListProductChangesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListInactiveProductChanges not implemented") +} +func (UnimplementedProductServiceServer) DeleteInactiveProductChanges(context.Context, *DeleteProductChangesRequest) (*DeleteProductChangesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteInactiveProductChanges not implemented") } func (UnimplementedProductServiceServer) mustEmbedUnimplementedProductServiceServer() {} @@ -335,6 +397,24 @@ func _ProductService_AppendAmzProductActiveDetail_Handler(srv interface{}, ctx c return interceptor(ctx, in, info, handler) } +func _ProductService_ListProductAmzDetals_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListAmzProductDetailsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).ListProductAmzDetals(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_ListProductAmzDetals_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).ListProductAmzDetals(ctx, req.(*ListAmzProductDetailsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_DeleteAmzProductActiveDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteAmzProductActiveDetailRequest) if err := dec(in); err != nil { @@ -389,6 +469,24 @@ func _ProductService_DeleteAmzProductInactiveDetail_Handler(srv interface{}, ctx return interceptor(ctx, in, info, handler) } +func _ProductService_GetProductHistoryInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetProductHistoryInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).GetProductHistoryInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_GetProductHistoryInfo_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).GetProductHistoryInfo(ctx, req.(*GetProductHistoryInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ProductService_AppendProductChanges_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AppendProductChangesRequest) if err := dec(in); err != nil { @@ -443,20 +541,56 @@ func _ProductService_DeleteProductChanges_Handler(srv interface{}, ctx context.C return interceptor(ctx, in, info, handler) } -func _ProductService_GetAmzProductLatestInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAmzProductLatestInfoRequest) +func _ProductService_AppendInactiveProductChanges_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AppendProductChangesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ProductServiceServer).GetAmzProductLatestInfo(ctx, in) + return srv.(ProductServiceServer).AppendInactiveProductChanges(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ProductService_GetAmzProductLatestInfo_FullMethodName, + FullMethod: ProductService_AppendInactiveProductChanges_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProductServiceServer).GetAmzProductLatestInfo(ctx, req.(*GetAmzProductLatestInfoRequest)) + return srv.(ProductServiceServer).AppendInactiveProductChanges(ctx, req.(*AppendProductChangesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_ListInactiveProductChanges_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListProductChangesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).ListInactiveProductChanges(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_ListInactiveProductChanges_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).ListInactiveProductChanges(ctx, req.(*ListProductChangesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProductService_DeleteInactiveProductChanges_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteProductChangesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProductServiceServer).DeleteInactiveProductChanges(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProductService_DeleteInactiveProductChanges_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProductServiceServer).DeleteInactiveProductChanges(ctx, req.(*DeleteProductChangesRequest)) } return interceptor(ctx, in, info, handler) } @@ -488,6 +622,10 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "AppendAmzProductActiveDetail", Handler: _ProductService_AppendAmzProductActiveDetail_Handler, }, + { + MethodName: "ListProductAmzDetals", + Handler: _ProductService_ListProductAmzDetals_Handler, + }, { MethodName: "DeleteAmzProductActiveDetail", Handler: _ProductService_DeleteAmzProductActiveDetail_Handler, @@ -500,6 +638,10 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DeleteAmzProductInactiveDetail", Handler: _ProductService_DeleteAmzProductInactiveDetail_Handler, }, + { + MethodName: "GetProductHistoryInfo", + Handler: _ProductService_GetProductHistoryInfo_Handler, + }, { MethodName: "AppendProductChanges", Handler: _ProductService_AppendProductChanges_Handler, @@ -513,8 +655,16 @@ var ProductService_ServiceDesc = grpc.ServiceDesc{ Handler: _ProductService_DeleteProductChanges_Handler, }, { - MethodName: "GetAmzProductLatestInfo", - Handler: _ProductService_GetAmzProductLatestInfo_Handler, + MethodName: "AppendInactiveProductChanges", + Handler: _ProductService_AppendInactiveProductChanges_Handler, + }, + { + MethodName: "ListInactiveProductChanges", + Handler: _ProductService_ListInactiveProductChanges_Handler, + }, + { + MethodName: "DeleteInactiveProductChanges", + Handler: _ProductService_DeleteInactiveProductChanges_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/proto/v1/product.proto b/proto/v1/product.proto index 812b162..4da04c8 100644 --- a/proto/v1/product.proto +++ b/proto/v1/product.proto @@ -9,23 +9,29 @@ option go_package = "github.com/superjcd/productservice/genproto/v1"; service ProductService { // todo : create multiple rpc CreateProduct(CreateProductRequest) returns (CreateProductResponse){}; - rpc ListProduct(ListProductRequest) returns (ListProductResponse){}; + rpc ListProduct(ListProductRequest) returns (ListProductResponse){}; // 获取的是 + rpc UpdateProduct(UpdateProductRequest) returns (UpdateProductResponse){}; rpc DeleteProduct(DeleteProductRequest) returns (DeleteProductResponse){}; // TODO: append multiple rpc AppendAmzProductActiveDetail(AppendAmzProductActiveDetailRequest) returns (AppendAmzProductActiveDetailResponse){}; + rpc ListProductAmzDetals(ListAmzProductDetailsRequest) returns (ListAmzProductDetailsResponse); rpc DeleteAmzProductActiveDetail(DeleteAmzProductActiveDetailRequest) returns (DeleteAmzProductActiveDetailResponse){}; rpc AppendAmzProductInactiveDetail(AppendAmzProductInactiveDetailRequest) returns (AppendAmzProductInactiveDetailResponse){}; rpc DeleteAmzProductInactiveDetail(DeleteAmzProductInactiveDetailRequest) returns (DeleteAmzProductInactiveDetailResponse){}; + rpc GetProductHistoryInfo(GetProductHistoryInfoRequest) returns (GetProductHistoryInfoResponse){}; + // active 变化 rpc AppendProductChanges(AppendProductChangesRequest) returns (AppendProductChangesResponse); rpc ListProductChanges(ListProductChangesRequest) returns (ListProductChangesResponse){}; rpc DeleteProductChanges(DeleteProductChangesRequest) returns (DeleteProductChangesResponse) {}; + + // inactive details + rpc AppendInactiveProductChanges(AppendProductChangesRequest) returns (AppendProductChangesResponse); + rpc ListInactiveProductChanges(ListProductChangesRequest) returns (ListProductChangesResponse){}; + rpc DeleteInactiveProductChanges(DeleteProductChangesRequest) returns (DeleteProductChangesResponse) {}; - - // 获取详情;TODO: 获取某个字段的连续变动信息 - rpc GetAmzProductLatestInfo(GetAmzProductLatestInfoRequest) returns (GetAmzProductLatestInfoResponse){}; } enum Status { @@ -120,18 +126,6 @@ message DeleteProductResponse { Status status =2; } -message GetAmzProductLatestInfoRequest { - string asin = 1; - string country=2; -} - - -message GetAmzProductLatestInfoResponse { - string msg=1; - Status status =2; - AmzProductInactivateDetail amz_product_incative_details = 3; - AmzProductActiveDetail amz_product_ative_details=4; -} enum Field { price =0; @@ -141,26 +135,6 @@ enum Field { top_category_rank=4; } -message GetAmzProductHistoryInfoRequest { - string asin = 1; - string country=2; - string field=3; - string start_date=4; - string end_date=5; -} - - -message AmzProductHistoryInfoResponse { - repeated string datetimes=1; - repeated string values=2; - -} - -message GetAmzProductHistoryInfoResponse { - string msg=1; - Status status =2; - AmzProductHistoryInfoResponse data=3; -} message AppendAmzProductInactiveDetailRequest { repeated AmzProductInactivateDetail details=1; @@ -212,7 +186,7 @@ message AppendProductChangesResponse { message ListProductChangesRequest { - string user=1; + string shop=1; string country=2; string create_date=3; string field=4; @@ -222,12 +196,11 @@ message ListProductChangesRequest { message ProductChange { - string my_asin=1; - string Product_asin=2; - string country=3; - string field =4 ; - string old_value=5; - string new_value=6; + string asin=1; + string country=2; + string field =3; + string old_value=4; + string new_value=5; } @@ -246,3 +219,44 @@ message DeleteProductChangesResponse { string msg=1; Status status =2; } + + + +message ListAmzProductDetailsRequest { + string shop = 1; + string country=2; + string create_date=3; + int32 offset=4; + int32 limit=5; + +} + + +message ListAmzProductDetailsResponse { + string msg=1; + Status status =2; + repeated AmzProductActiveDetail details=3; + +} + + +message GetProductHistoryInfoRequest { + string asin = 1; + string country=2; + string field=3; + string start_date=4; + string end_date=5; +} + + +message HistoryInfoRecord { + string datetime=1; + string value=2; + +} + +message GetProductHistoryInfoResponse { + string msg=1; + Status status =2; + repeated HistoryInfoRecord records=3; +} \ No newline at end of file diff --git a/proto/v1/product.yaml b/proto/v1/product.yaml index 84c6ac4..3334aaa 100644 --- a/proto/v1/product.yaml +++ b/proto/v1/product.yaml @@ -12,8 +12,6 @@ http: - selector: superjcd.productservice.v1.ProductService.DeleteProduct delete: /v1/products - - selector: superjcd.productservice.v1.ProductService.GetAmzProductLatestInfo - get: /v1/products/info/latest - selector: superjcd.productservice.v1.ProductService.AppendAmzProductActiveDetail post: /v1/products/info/history/active - selector: superjcd.productservice.v1.ProductService.AppendAmzProductInactiveDetail diff --git a/service/server.go b/service/server.go index ca2d20f..1f688d4 100644 --- a/service/server.go +++ b/service/server.go @@ -49,12 +49,12 @@ func (s *Server) CreateProduct(ctx context.Context, rq *v1.CreateProductRequest) } func (s *Server) ListProduct(ctx context.Context, rq *v1.ListProductRequest) (*v1.ListProductResponse, error) { - groups, err := s.datastore.Products().List(ctx, rq) + products, err := s.datastore.Products().List(ctx, rq) if err != nil { return &v1.ListProductResponse{Msg: "获取列表失败", Status: v1.Status_failure}, err } - resp := groups.ConvertToListProductResponse("成功获取列表", v1.Status_success) + resp := products.ConvertToListProductResponse("成功获取列表", v1.Status_success) return &resp, nil } @@ -79,16 +79,6 @@ func (s *Server) DeleteProduct(ctx context.Context, rq *v1.DeleteProductRequest) return &v1.DeleteProductResponse{Msg: "删除成功", Status: v1.Status_success}, nil } -func (s *Server) GetAmzProductLatestInfo(ctx context.Context, rq *v1.GetAmzProductLatestInfoRequest) (*v1.GetAmzProductLatestInfoResponse, error) { - if info, err := s.datastore.ProductDetails().GetlatestInfo(ctx, rq); err != nil { - return &v1.GetAmzProductLatestInfoResponse{Msg: "删除失败", Status: v1.Status_failure}, err - } else { - resp := info.ConvertToGetLatestInfoResponse("成功获取列表", v1.Status_success) - - return &resp, nil - } -} - func (s *Server) AppendAmzProductActiveDetail(ctx context.Context, rq *v1.AppendAmzProductActiveDetailRequest) (*v1.AppendAmzProductActiveDetailResponse, error) { if err := s.datastore.ProductDetails().AppendActiveDetail(ctx, rq); err != nil { return &v1.AppendAmzProductActiveDetailResponse{Msg: "追加Active details 失败", Status: v1.Status_failure}, err @@ -96,9 +86,88 @@ func (s *Server) AppendAmzProductActiveDetail(ctx context.Context, rq *v1.Append return &v1.AppendAmzProductActiveDetailResponse{Msg: "追加Active details成功", Status: v1.Status_success}, nil } +func (s *Server) ListProductAmzDetals(ctx context.Context, rq *v1.ListAmzProductDetailsRequest) (*v1.ListAmzProductDetailsResponse, error) { + details, err := s.datastore.ProductDetails().ListActiveDetails(ctx, rq) + + if err != nil { + return &v1.ListAmzProductDetailsResponse{Msg: "get product details failed", Status: v1.Status_failure}, err + } + + resp := details.ConvertToListProductdetails("get product details successfully", v1.Status_success) + + return &resp, nil +} + func (s *Server) AppendAmzProductInactiveDetail(ctx context.Context, rq *v1.AppendAmzProductInactiveDetailRequest) (*v1.AppendAmzProductInactiveDetailResponse, error) { if err := s.datastore.ProductDetails().AppendInactiveDetail(ctx, rq); err != nil { - return &v1.AppendAmzProductInactiveDetailResponse{Msg: "追加Inactive details 失败", Status: v1.Status_failure}, err + return &v1.AppendAmzProductInactiveDetailResponse{Msg: "append Inactive details failed", Status: v1.Status_failure}, err } - return &v1.AppendAmzProductInactiveDetailResponse{Msg: "追加Inactive details成功", Status: v1.Status_success}, nil + return &v1.AppendAmzProductInactiveDetailResponse{Msg: "append Inactive details success", Status: v1.Status_success}, nil +} + +func (s *Server) AppendProductChanges(ctx context.Context, rq *v1.AppendProductChangesRequest) (*v1.AppendProductChangesResponse, error) { + if err := s.datastore.ProductChanges().Append(ctx, rq); err != nil { + return &v1.AppendProductChangesResponse{Msg: "append product changes failed", Status: v1.Status_failure}, err + } + return &v1.AppendProductChangesResponse{Msg: "append product changes success", Status: v1.Status_success}, nil +} + +func (s *Server) ListProductChanges(ctx context.Context, rq *v1.ListProductChangesRequest) (*v1.ListProductChangesResponse, error) { + productChanges, err := s.datastore.ProductChanges().List(ctx, rq) + if err != nil { + return &v1.ListProductChangesResponse{Msg: "get product changes list failed", Status: v1.Status_failure}, err + } + + resp := productChanges.ConvertToListProductChangeResponse("get product changes list success", v1.Status_success) + + return &resp, nil +} + +func (s *Server) DeleteProductChanges(ctx context.Context, rq *v1.DeleteProductChangesRequest) (*v1.DeleteProductChangesResponse, error) { + if err := s.datastore.ProductChanges().Delete(ctx, rq); err != nil { + return &v1.DeleteProductChangesResponse{Msg: "delete product changes failed", Status: v1.Status_failure}, err + } + return &v1.DeleteProductChangesResponse{Msg: "delete product changes success", Status: v1.Status_success}, nil +} + +func (s *Server) AppendInactiveProductChanges(ctx context.Context, rq *v1.AppendProductChangesRequest) (*v1.AppendProductChangesResponse, error) { + if err := s.datastore.InactiveProductChanges().Append(ctx, rq); err != nil { + return &v1.AppendProductChangesResponse{Msg: "append product changes failed", Status: v1.Status_failure}, err + } + return &v1.AppendProductChangesResponse{Msg: "append product changes success", Status: v1.Status_success}, nil +} + +func (s *Server) ListInactiveProductChanges(ctx context.Context, rq *v1.ListProductChangesRequest) (*v1.ListProductChangesResponse, error) { + productChanges, err := s.datastore.InactiveProductChanges().List(ctx, rq) + if err != nil { + return &v1.ListProductChangesResponse{Msg: "get product changes list failed", Status: v1.Status_failure}, err + } + + resp := productChanges.ConvertToListInactiveProductChangeResponse("get product changes list success", v1.Status_success) + + return &resp, nil +} + +func (s *Server) DeleteInactiveProductChanges(ctx context.Context, rq *v1.DeleteProductChangesRequest) (*v1.DeleteProductChangesResponse, error) { + if err := s.datastore.InactiveProductChanges().Delete(ctx, rq); err != nil { + return &v1.DeleteProductChangesResponse{Msg: "delete product changes failed", Status: v1.Status_failure}, err + } + return &v1.DeleteProductChangesResponse{Msg: "delete product changes success", Status: v1.Status_success}, nil +} + +// GetProductHistoryInfo +func (s *Server) GetProductHistoryInfo(ctx context.Context, rq *v1.GetProductHistoryInfoRequest) (*v1.GetProductHistoryInfoResponse, error) { + records := make([]*v1.HistoryInfoRecord, 0, 16) + + items, err := s.datastore.ProductDetails().GetProductHistoryInfo(ctx, rq) + + if err != nil { + return &v1.GetProductHistoryInfoResponse{Msg: "get product history info failed", Status: v1.Status_failure}, err + } + + for _, item := range items { + records = append(records, &v1.HistoryInfoRecord{Datetime: item.Datetime, Value: item.Value}) + } + + return &v1.GetProductHistoryInfoResponse{Msg: "get product history info successfully", Status: v1.Status_success, Records: records}, nil } diff --git a/service/store/models.go b/service/store/models.go index ae25a75..2901b5b 100644 --- a/service/store/models.go +++ b/service/store/models.go @@ -38,7 +38,7 @@ func (pl *ProductList) ConvertToListProductResponse(msg string, status v1.Status } // timestamp uint64, 可以通过create_at转化过来 -type AmzProdutInactiveDetail struct { +type AmzProductInactiveDetail struct { gorm.Model Asin string `json:"asin" gorm:"column:asin;index:idx_inactive_product_details,priority:1"` Country string `json:"country" gorm:"column:country;index:idx_inactive_product_details,priority:2"` @@ -47,7 +47,7 @@ type AmzProdutInactiveDetail struct { CreateDate string `json:"create_date" gorm:"column:create_date;idx_inactive_product_details,priority:3"` } -type AmzProdutActiveDetail struct { +type AmzProductActiveDetail struct { gorm.Model Asin string `json:"asin" gorm:"column:asin;index:idx_product_details,priority:1"` Country string `json:"country" gorm:"column:country;index:idx_product_details,priority:2"` @@ -69,70 +69,118 @@ type AmzProdutActiveDetail struct { CreateDate string `json:"create_date" gorm:"column:create_date;index:idx_product_details,priority:3"` } -type ProductLatestInfo struct { - InactiveDetails *AmzProdutInactiveDetail - ActiveDetales *AmzProdutActiveDetail +type ProductDetails struct { + TotalCount int64 `json:"totalCount"` + Items []*AmzProductActiveDetail `json:"items"` } -func (p *ProductLatestInfo) ConvertToGetLatestInfoResponse(msg string, status v1.Status) v1.GetAmzProductLatestInfoResponse { - return v1.GetAmzProductLatestInfoResponse{ - Msg: msg, - Status: status, - AmzProductIncativeDetails: &v1.AmzProductInactivateDetail{ - Asin: p.InactiveDetails.Asin, - Country: p.InactiveDetails.Country, - Title: p.InactiveDetails.Title, - BulletPoints: p.InactiveDetails.BulletPoints, - }, - AmzProductAtiveDetails: &v1.AmzProductActiveDetail{ - Asin: p.InactiveDetails.Asin, - Country: p.InactiveDetails.Country, - Price: p.ActiveDetales.Price, - Currency: p.ActiveDetales.Currency, - Star: p.ActiveDetales.Star, - Ratings: p.ActiveDetales.Ratings, - Image: p.ActiveDetales.Image, - ParentAsin: p.ActiveDetales.ParentAsin, - CategoryInfo: p.ActiveDetales.CategoryInfo, - TopCategoryName: p.ActiveDetales.TopCategoryName, - TopCategoryRank: p.ActiveDetales.TopCategoryRank, - Color: p.ActiveDetales.Color, - Weight: p.ActiveDetales.Weight, - WeightUnit: p.ActiveDetales.WeightUnit, - Dimensions: p.ActiveDetales.Dimensions, - DimensionsUnit: p.ActiveDetales.DimensionsUnit, - CreateDate: p.ActiveDetales.CreateDate, - }, +func (p *ProductDetails) ConvertToListProductdetails(msg string, status v1.Status) v1.ListAmzProductDetailsResponse { + details := make([]*v1.AmzProductActiveDetail, 0, 16) + + for _, item := range p.Items { + details = append(details, &v1.AmzProductActiveDetail{ + Asin: item.Asin, + Country: item.Country, + Price: item.Price, + Currency: item.Currency, + Star: item.Star, + Ratings: item.Ratings, + Image: item.Image, + ParentAsin: item.ParentAsin, + CategoryInfo: item.CategoryInfo, + TopCategoryName: item.TopCategoryName, + TopCategoryRank: item.TopCategoryRank, + Color: item.Color, + Weight: item.Weight, + WeightUnit: item.WeightUnit, + Dimensions: item.Dimensions, + DimensionsUnit: item.DimensionsUnit, + CreateDate: item.CreateDate, + }) } + + return v1.ListAmzProductDetailsResponse{Msg: msg, Status: status, Details: details} + } -type ProductHistoryInfos struct { - TotalCount int64 `json:"totalCount"` - Field string `json:"field"` - Datetimes []string `json:"datetimes"` - Values []string `json:"values"` +type ProductHistoryInfoRecord struct { + Datetime string `json:"datetime"` + Value string `json:"value"` +} + +type ProductChange struct { + gorm.Model + Asin string `json:"asin" gorm:"column:asin"` + Country string `json:"country" gorm:"column:country"` + Field string `json:"field" gorm:"column:field"` + OldValue string `json:"old_value" gorm:"column:old_value"` + NewValue string `json:"new_value" gorm:"column:new_value"` + CreateDate string `json:"create_date" gorm:"column:create_date"` } -func (ph *ProductHistoryInfos) ConvertToListProductResponse(msg string, status v1.Status) v1.GetAmzProductHistoryInfoResponse { - return v1.GetAmzProductHistoryInfoResponse{ - Msg: msg, - Status: status, - Data: &v1.AmzProductHistoryInfoResponse{ - Datetimes: ph.Datetimes, - Values: ph.Values, - }, +type ProductChangeList struct { + TotalCount int `json:"totalCount"` + Items []ProductChange `json:"items"` +} + +func (pcl *ProductChangeList) ConvertToListProductChangeResponse(msg string, status v1.Status) v1.ListProductChangesResponse { + pcs := make([]*v1.ProductChange, 0, 8) + + for _, pc := range pcl.Items { + pcs = append(pcs, &v1.ProductChange{ + Country: pc.Country, + Asin: pc.Asin, + Field: pc.Field, + OldValue: pc.OldValue, + NewValue: pc.NewValue, + }) + } + return v1.ListProductChangesResponse{ + Msg: msg, + Status: status, + ProductChanges: pcs, } } -func MigrateDatabase(db *gorm.DB) error { - if err := db.AutoMigrate(Product{}); err != nil { - return err +// 创建一张和ProductChange相同结构的表 +type InactiveProductChange struct { + gorm.Model + Asin string `json:"asin" gorm:"column:asin"` + Country string `json:"country" gorm:"column:country"` + Field string `json:"field" gorm:"column:field"` + OldValue string `json:"old_value" gorm:"column:old_value"` + NewValue string `json:"new_value" gorm:"column:new_value"` + CreateDate string `json:"create_date" gorm:"column:create_date"` +} + +type InactiveProductChangeList struct { + TotalCount int `json:"totalCount"` + Items []InactiveProductChange `json:"items"` +} + +func (rcl *InactiveProductChangeList) ConvertToListInactiveProductChangeResponse(msg string, status v1.Status) v1.ListProductChangesResponse { + pcs := make([]*v1.ProductChange, 0, 8) + + for _, pc := range rcl.Items { + pcs = append(pcs, &v1.ProductChange{ + Country: pc.Country, + Asin: pc.Asin, + Field: pc.Field, + OldValue: pc.OldValue, + NewValue: pc.NewValue, + }) } - if err := db.AutoMigrate(AmzProdutActiveDetail{}); err != nil { - return err + return v1.ListProductChangesResponse{ + Msg: msg, + Status: status, + ProductChanges: pcs, } - if err := db.AutoMigrate(AmzProdutInactiveDetail{}); err != nil { +} + +func MigrateDatabase(db *gorm.DB) error { + if err := db.AutoMigrate(Product{}, ProductChange{}, InactiveProductChange{}, AmzProductActiveDetail{}, AmzProductInactiveDetail{}); err != nil { return err } + return nil } diff --git a/service/store/sql/fake.db b/service/store/sql/fake.db new file mode 100644 index 0000000000000000000000000000000000000000..feb7fa201494e7ac5e92c4dc72a8e676c808aa66 GIT binary patch literal 57344 zcmeI*&2QUe90zbaN$VzUY9dsuNmO{ENQ=5wcCx;rB3cMi>AJ4%Dp6I)_7XR>n%c&3 zww7BuBqXj}xO3xA;Wo~kxWNe_qzP#U9>*{BOPyuX7;5*m^5T~#kDurBdmiV_$+NqC zSF=_A(6CMvo3B!DQ8Z0`%<~jQmB@9RT>Ys?W^(=lxu-+(X|pA2_V5qqfyJRb#a73E z9d8w-v0p}iD*Q9@=g2nm!|+!_Ka)+EAOHaf{C@)7kBSUeuhCsa(;Mok);N`vldmPy zG8&z_Eor(^x3x#A)KG0jYqiOJOSRR8q}ctEjeoLJTYXUD*YAB=`+}EWB3GH;y2s1? z@|JJO7ln|^-KjB#tC0$91QiGh?bpI9e7{_a$r7h!Gf)wgwx-Ls<+{<)ZR<=fpHGeU ziuq*2Rvxz0ensiGZOkj?gVnXWwHG+?w+Otx*Vp zNER{n*Z~R?YjA$JUGMTY!y^p0x=Me`C7NHfEa^7+^rjchLVm3c&$P6<-=O4r$Ffwt zeipPjqhlJnztpxB%b&LtThp7QaR%K(J5icJMy5jYv870ZCk?l0SZCyzcxd?9*oG<9 z{SCTu5@ZnBU@7`>Xis&cWdsFztZL08()Zk60(VJ;b0wX zmSMPqm2f*v9Ovpsir!Si$NID+BgvMVmNfLt;kM?qgt3lw{=qQAt*p>bzU;N!v`3|_ zXQHh(E!pdBvxl16B1dL7C z$uP!JB%&AF9uHa}$8girwD)WmOB`DqiiRk*_3B4P&obPHlXSNf4@|g+d9`lmQbQ3= z?e-x5F){qT%rN)~%yxH~&6!X%xvZ z>y^I>aZ2O$o%WGo`ty-vwfC~iO?Jua4ClRhhW(6UepOb~zo1Rwwb2tWV=5P$## zAOHafTu}iwcVmKfKTB{vS;!P~+(f?j?%(+YzJ9-2KmY;|fB*y_009U< z00I!WQUcr%SGq~Y`y*rf?d@KCsE~QbS?`Yf7g~?;|E^SUQCJ8-00Izz00bZa0SG_< z0uX?}O9@2A|D)OOD00CB0SG_<0uX=z1Rwwb2tWV=5P-mcE@0CI_g4n*l`sEc0XftE z&U`ifRR5)L0`CNXb@Ry3RbHGE`KDns_zGV?QWY~eFQE7RKh6G4kqagWKmY;|fB*y_ z009U<00Izz00gd)z-W#u`M(5k{{Nq5pHt+52?7v+00bZa0SG_<0uX=z1Rwx`YbcP- HQu%)YlzprJ literal 0 HcmV?d00001 diff --git a/service/store/sql/inactive_product_changes.go b/service/store/sql/inactive_product_changes.go new file mode 100644 index 0000000..a2937f6 --- /dev/null +++ b/service/store/sql/inactive_product_changes.go @@ -0,0 +1,120 @@ +package sql + +import ( + "context" + "fmt" + + v1 "github.com/superjcd/productservice/genproto/v1" + "github.com/superjcd/productservice/service/store" + "gorm.io/gorm" +) + +type inactive_product_changes struct { + db *gorm.DB +} + +// AmzProdutActiveDetai +var _ store.InactiveProductChangeStore = (*inactive_product_changes)(nil) + +func (pc *inactive_product_changes) Append(ctx context.Context, rq *v1.AppendProductChangesRequest) error { + inactiveProductChanges := make([]store.InactiveProductChange, 0, 512) + sql := fmt.Sprintf(` + SELECT + t1.country country, + t1.asin asin, + '%s' as field, + t1.price as old_value, + t2.price as new_value, + '%s' as create_date + FROM + ( + Select + country, + asin, + %s + FROM amz_product_inactive_details + WHERE create_date = '%s' + and %s != '' + )t1 LEFT JOIN + ( + Select + country, + asin, + %s + FROM amz_product_inactive_details + WHERE create_date = '%s' + and %s != '' + )t2 + on t1.asin = t2.asin + and t1.country = t2.country + where t1.price != t2.price + `, rq.Field, rq.NewDate, rq.Field, rq.OldDate, rq.Field, rq.Field, rq.NewDate, rq.Field) + + d := pc.db.Raw(sql).Scan(&inactiveProductChanges) + + if d.Error != nil { + return d.Error + } + + if len(inactiveProductChanges) > 0 { + return pc.db.Create(&inactiveProductChanges).Error + } + + return nil +} + +func (pc *inactive_product_changes) List(ctx context.Context, rq *v1.ListProductChangesRequest) (*store.InactiveProductChangeList, error) { + productChanges := make([]store.InactiveProductChange, 0, 32) + sql := ` + SELECT + t1.asin, + t1.country, + t1.field, + t1.old_value, + t1.new_value, + t1.create_date + FROM ( + SELECT + asin, + country, + field, + old_value, + new_value, + create_date + FROM inactive_product_changes + WHERE country = '%s' + AND create_date = '%s' + AND field = '%s' + ) t1 LEFT JOIN ( + SELECT + asin, + country + FROM + products + WHERE shop = '%s' + AND country = '%s' + ) t2 on t1.country = t2.country + AND t1.asin = t2.asin + ` + sql = fmt.Sprintf(sql, rq.Country, rq.CreateDate, rq.Field, rq.Shop, rq.Country) + + d := pc.db.Raw(sql).Scan(&productChanges) + + if d.Error != nil { + return nil, d.Error + } + + return &store.InactiveProductChangeList{ + TotalCount: len(productChanges), + Items: productChanges, + }, nil + +} + +func (pc *inactive_product_changes) Delete(ctx context.Context, rq *v1.DeleteProductChangesRequest) error { + if rq.MinCreateDate != "" { + return pc.db.Unscoped().Where("create_date < ?", rq.MinCreateDate).Delete(&store.ProductChange{}).Error + } + + return fmt.Errorf("min_create_date should not be empty") +} diff --git a/service/store/sql/product_changes.go b/service/store/sql/product_changes.go new file mode 100644 index 0000000..d9c9f9b --- /dev/null +++ b/service/store/sql/product_changes.go @@ -0,0 +1,119 @@ +package sql + +import ( + "context" + "fmt" + + v1 "github.com/superjcd/productservice/genproto/v1" + "github.com/superjcd/productservice/service/store" + "gorm.io/gorm" +) + +type product_changes struct { + db *gorm.DB +} + +// AmzProdutActiveDetai +var _ store.ProductChangeStore = (*product_changes)(nil) + +func (pc *product_changes) Append(ctx context.Context, rq *v1.AppendProductChangesRequest) error { + productChanges := make([]store.ProductChange, 0, 512) + sql := fmt.Sprintf(` + SELECT + t1.country country, + t1.asin asin, + '%s' as field, + t1.price as old_value, + t2.price as new_value, + '%s' as create_date + FROM + ( + Select + country, + asin, + %s + FROM amz_product_active_details + WHERE create_date = '%s' + and %s != '' + )t1 LEFT JOIN + ( + Select + country, + asin, + %s + FROM amz_product_active_details + WHERE create_date = '%s' + and %s != '' + )t2 + on t1.asin = t2.asin + and t1.country = t2.country + where t1.price != t2.price + `, rq.Field, rq.NewDate, rq.Field, rq.OldDate, rq.Field, rq.Field, rq.NewDate, rq.Field) + + d := pc.db.Raw(sql).Scan(&productChanges) + + if d.Error != nil { + return d.Error + } + if len(productChanges) > 0 { + return pc.db.Create(&productChanges).Error + } + + return nil +} + +func (pc *product_changes) List(ctx context.Context, rq *v1.ListProductChangesRequest) (*store.ProductChangeList, error) { + productChanges := make([]store.ProductChange, 0, 32) + sql := ` + SELECT + t1.asin, + t1.country, + t1.field, + t1.old_value, + t1.new_value, + t1.create_date + FROM ( + SELECT + asin, + country, + field, + old_value, + new_value, + create_date + FROM product_changes + WHERE country = '%s' + AND create_date = '%s' + AND field = '%s' + ) t1 LEFT JOIN ( + SELECT + asin, + country + FROM + products + WHERE shop = '%s' + AND country = '%s' + ) t2 on t1.country = t2.country + AND t1.asin = t2.asin + ` + sql = fmt.Sprintf(sql, rq.Country, rq.CreateDate, rq.Field, rq.Shop, rq.Country) + + d := pc.db.Raw(sql).Scan(&productChanges) + + if d.Error != nil { + return nil, d.Error + } + + return &store.ProductChangeList{ + TotalCount: len(productChanges), + Items: productChanges, + }, nil + +} + +func (pc *product_changes) Delete(ctx context.Context, rq *v1.DeleteProductChangesRequest) error { + if rq.MinCreateDate != "" { + return pc.db.Unscoped().Where("create_date < ?", rq.MinCreateDate).Delete(&store.ProductChange{}).Error + } + + return fmt.Errorf("min_create_date should not be empty") +} diff --git a/service/store/sql/product_details.go b/service/store/sql/product_details.go index dc2d8cf..5243236 100644 --- a/service/store/sql/product_details.go +++ b/service/store/sql/product_details.go @@ -15,36 +15,11 @@ type product_details struct { var _ store.ProductDetailsStore = (*product_details)(nil) -func (p *product_details) GetlatestInfo(ctx context.Context, rq *v1.GetAmzProductLatestInfoRequest) (*store.ProductLatestInfo, error) { - inactive_details := store.AmzProdutInactiveDetail{} - active_details := store.AmzProdutActiveDetail{} - - q1 := p.db.Where("asin = ? and country = ?", rq.Asin, rq.Country). - Last(&inactive_details) - - if q1.Error != nil { - return nil, q1.Error - } - - q2 := p.db.Where("asin = ? and country = ?", rq.Asin, rq.Country). - Last(&active_details) - - if q2.Error != nil { - return nil, q2.Error - } - - return &store.ProductLatestInfo{ - InactiveDetails: &inactive_details, - ActiveDetales: &active_details, - }, nil - -} - func (p *product_details) AppendActiveDetail(ctx context.Context, rq *v1.AppendAmzProductActiveDetailRequest) error { - activeInfos := make([]store.AmzProdutActiveDetail, 0, 16) + activeInfos := make([]store.AmzProductActiveDetail, 0, 16) for _, d := range rq.Details { - activeInfo := store.AmzProdutActiveDetail{ + activeInfo := store.AmzProductActiveDetail{ Asin: d.Asin, Country: d.Country, Price: d.Price, @@ -70,11 +45,40 @@ func (p *product_details) AppendActiveDetail(ctx context.Context, rq *v1.AppendA return p.db.Create(&activeInfos).Error } +func (p *product_details) ListActiveDetails(ctx context.Context, rq *v1.ListAmzProductDetailsRequest) (*store.ProductDetails, error) { + result := &store.ProductDetails{} // 店铺国家时间 + + sql := fmt.Sprintf(` + SELECT + t1.* + FROM + ( + SELECT + * + FROM + amz_product_active_details + WHERE + create_date = '%s' + )t1 LEFT JOIN ( + SELECT + asin, + country + FROM + products + WHERE shop = '%s' + and country = '%s' + ) t2 ON t1.asin = t2.asin + AND t1.country = t2.country`, rq.CreateDate, rq.Shop, rq.Country) + + d := p.db.Raw(sql).Offset(int(rq.Offset)).Limit(int(rq.Limit)).Scan(&result.Items).Offset(-1).Limit(-1).Count(&result.TotalCount) + return result, d.Error +} + func (p *product_details) AppendInactiveDetail(ctx context.Context, rq *v1.AppendAmzProductInactiveDetailRequest) error { - inactiveInfos := make([]store.AmzProdutInactiveDetail, 0, 16) + inactiveInfos := make([]store.AmzProductInactiveDetail, 0, 16) for _, d := range rq.Details { - inactiveInfo := store.AmzProdutInactiveDetail{ + inactiveInfo := store.AmzProductInactiveDetail{ Asin: d.Asin, Country: d.Country, Title: d.Title, @@ -90,7 +94,7 @@ func (p *product_details) AppendInactiveDetail(ctx context.Context, rq *v1.Appen func (p *product_details) DeleteActiveDetail(ctx context.Context, rq *v1.DeleteAmzProductActiveDetailRequest) error { if rq.MinCreateDate != "" { - return p.db.Where("create_date < ?", rq.MinCreateDate).Delete(&store.AmzProdutActiveDetail{}).Error + return p.db.Where("create_date < ?", rq.MinCreateDate).Delete(&store.AmzProductActiveDetail{}).Error } return fmt.Errorf("min_create_date不能为空") @@ -98,7 +102,30 @@ func (p *product_details) DeleteActiveDetail(ctx context.Context, rq *v1.DeleteA func (p *product_details) DeleteInactiveDetail(ctx context.Context, rq *v1.DeleteAmzProductInactiveDetailRequest) error { if rq.MinCreateDate != "" { - return p.db.Where("create_date < ?", rq.MinCreateDate).Delete(&store.AmzProdutInactiveDetail{}).Error + return p.db.Unscoped().Where("create_date < ?", rq.MinCreateDate).Delete(&store.AmzProductInactiveDetail{}).Error } return fmt.Errorf("min_create_date不能为空") } + +func (p *product_details) GetProductHistoryInfo(ctx context.Context, rq *v1.GetProductHistoryInfoRequest) ([]store.ProductHistoryInfoRecord, error) { + records := make([]store.ProductHistoryInfoRecord, 0, 16) + + sql := fmt.Sprintf(` + SELECT + create_date as datetime, + %s as value + FROM + amz_product_active_details + WHERE + asin='%s' + AND country='%s' + AND create_date BETWEEN '%s' AND '%s' + `, rq.Field, rq.Asin, rq.Country, rq.StartDate, rq.EndDate) + + d := p.db.Raw(sql).Scan(records) + + if d.Error != nil { + return nil, d.Error + } + return records, nil +} diff --git a/service/store/sql/products.go b/service/store/sql/products.go index 77f015a..4f1f225 100644 --- a/service/store/sql/products.go +++ b/service/store/sql/products.go @@ -81,5 +81,5 @@ func (p *products) Update(ctx context.Context, rq *v1.UpdateProductRequest) erro } func (p *products) Delete(ctx context.Context, rq *v1.DeleteProductRequest) error { - return p.db.Where("asin = ? and sku = ? ", rq.Asin, rq.Sku).Delete(&store.Product{}).Error + return p.db.Unscoped().Where("asin = ? and sku = ? ", rq.Asin, rq.Sku).Delete(&store.Product{}).Error } diff --git a/service/store/sql/sql.go b/service/store/sql/sql.go index 7891c26..536b16d 100644 --- a/service/store/sql/sql.go +++ b/service/store/sql/sql.go @@ -20,6 +20,14 @@ func (ds *datastore) ProductDetails() store.ProductDetailsStore { return &product_details{db: ds.db} } +func (ds *datastore) ProductChanges() store.ProductChangeStore { + return &product_changes{db: ds.db} +} + +func (ds *datastore) InactiveProductChanges() store.InactiveProductChangeStore { + return &inactive_product_changes{db: ds.db} +} + var ( sqlFactory store.Factory once sync.Once diff --git a/service/store/sql/store_test.go b/service/store/sql/store_test.go index 25386aa..7bbb3e2 100644 --- a/service/store/sql/store_test.go +++ b/service/store/sql/store_test.go @@ -78,7 +78,7 @@ func (suite *FakeStoreTestSuite) TestListProducts() { assert.Equal(suite.T(), 1, len(productList.Items)) } -func (suite *FakeStoreTestSuite) TestUpdateroduct() { +func (suite *FakeStoreTestSuite) TestUpdateProduct() { product := &v1.UpdateProductRequest{ Sku: "1001", Shop: "elppa", @@ -143,6 +143,7 @@ func (suite *FakeStoreTestSuite) TestAppendeDetail() { Country: "US", Title: "Iphone 15", BulletPoints: "1 good 2 cheap", + CreateDate: "2022-01-01", }, }, } @@ -150,15 +151,6 @@ func (suite *FakeStoreTestSuite) TestAppendeDetail() { err2 := suite.FakeFactory.ProductDetails().AppendInactiveDetail(context.Background(), rq2) assert.Nil(suite.T(), err2) - // 获取最新数据 - rq3 := &v1.GetAmzProductLatestInfoRequest{ - Asin: "B1001", - Country: "US", - } - info, err3 := suite.FakeFactory.ProductDetails().GetlatestInfo(context.Background(), rq3) - assert.Nil(suite.T(), err3) - assert.Equal(suite.T(), "100", info.ActiveDetales.Price) - // 导入更新的数据 rq4 := &v1.AppendAmzProductActiveDetailRequest{ Details: []*v1.AmzProductActiveDetail{ @@ -166,7 +158,7 @@ func (suite *FakeStoreTestSuite) TestAppendeDetail() { Asin: "B1001", Country: "US", Price: "110", - CreateDate: "2022-01-01", // 用了同一天的数据 + CreateDate: "2022-01-02", }, }, } @@ -174,15 +166,44 @@ func (suite *FakeStoreTestSuite) TestAppendeDetail() { err4 := suite.FakeFactory.ProductDetails().AppendActiveDetail(context.Background(), rq4) assert.Nil(suite.T(), err4) - // 获取最新数据 - rq5 := &v1.GetAmzProductLatestInfoRequest{ - Asin: "B1001", - Country: "US", +} + +func (suite *FakeStoreTestSuite) TestXListProductDetails() { + rq := &v1.ListAmzProductDetailsRequest{ + Shop: "elppa", + Country: "US", + CreateDate: "2022-01-02", + Offset: 0, + Limit: 10, + } + + _, err := suite.FakeFactory.ProductDetails().ListActiveDetails(context.Background(), rq) + assert.Nil(suite.T(), err) +} + +func (suite *FakeStoreTestSuite) TestYAppendProductChanges() { + rq := &v1.AppendProductChangesRequest{ + OldDate: "2022-01-01", + NewDate: "2022-01-02", + Field: "price", + } + + err := suite.FakeFactory.ProductChanges().Append(context.Background(), rq) + assert.Nil(suite.T(), err) +} + +func (suite *FakeStoreTestSuite) TestYListProductChanges() { + rq := &v1.ListProductChangesRequest{ + Shop: "elppa", + Country: "US", + CreateDate: "2022-01-02", + Field: "price", + Offset: 0, + Limit: 10, } - info2, err5 := suite.FakeFactory.ProductDetails().GetlatestInfo(context.Background(), rq5) - assert.Nil(suite.T(), err5) - assert.Equal(suite.T(), "110", info2.ActiveDetales.Price) - assert.Equal(suite.T(), "Iphone 15", info2.InactiveDetails.Title) + list, err := suite.FakeFactory.ProductChanges().List(context.Background(), rq) + assert.Nil(suite.T(), err) + assert.Equal(suite.T(), 1, list.TotalCount) } @@ -202,6 +223,18 @@ func (suite *FakeStoreTestSuite) TestZDeleteInactiveDetail() { assert.Nil(suite.T(), err) } +// func (suite *FakeStoreTestSuite) TestGetProductHistoryInfo() { +// rq := &v1.GetProductHistoryInfoRequest{ +// Asin: "B1001", +// Country: "US", +// Field: "price", +// StartDate: "2020-01-01", +// EndDate: "2023-01-01", +// } +// _, err := suite.FakeFactory.ProductDetails().GetProductHistoryInfo(context.Background(), rq) +// assert.Nil(suite.T(), err) +// } + func TestFakeStoreSuite(t *testing.T) { suite.Run(t, new(FakeStoreTestSuite)) } diff --git a/service/store/store.go b/service/store/store.go index afde637..17478f5 100644 --- a/service/store/store.go +++ b/service/store/store.go @@ -9,6 +9,8 @@ import ( type Factory interface { Products() ProductStore ProductDetails() ProductDetailsStore + ProductChanges() ProductChangeStore + InactiveProductChanges() InactiveProductChangeStore Close() error } @@ -20,9 +22,22 @@ type ProductStore interface { } type ProductDetailsStore interface { - GetlatestInfo(ctx context.Context, _ *v1.GetAmzProductLatestInfoRequest) (*ProductLatestInfo, error) AppendActiveDetail(ctx context.Context, _ *v1.AppendAmzProductActiveDetailRequest) error + ListActiveDetails(ctx context.Context, _ *v1.ListAmzProductDetailsRequest) (*ProductDetails, error) DeleteActiveDetail(ctx context.Context, _ *v1.DeleteAmzProductActiveDetailRequest) error AppendInactiveDetail(ctx context.Context, _ *v1.AppendAmzProductInactiveDetailRequest) error DeleteInactiveDetail(ctx context.Context, _ *v1.DeleteAmzProductInactiveDetailRequest) error + GetProductHistoryInfo(ctx context.Context, _ *v1.GetProductHistoryInfoRequest) ([]ProductHistoryInfoRecord, error) +} + +type ProductChangeStore interface { + Append(ctx context.Context, _ *v1.AppendProductChangesRequest) error + List(ctx context.Context, _ *v1.ListProductChangesRequest) (*ProductChangeList, error) + Delete(ctx context.Context, _ *v1.DeleteProductChangesRequest) error +} + +type InactiveProductChangeStore interface { + Append(ctx context.Context, _ *v1.AppendProductChangesRequest) error + List(ctx context.Context, _ *v1.ListProductChangesRequest) (*InactiveProductChangeList, error) + Delete(ctx context.Context, _ *v1.DeleteProductChangesRequest) error }