diff --git a/cart-grain.go b/cart-grain.go index d89e351..a482871 100644 --- a/cart-grain.go +++ b/cart-grain.go @@ -43,10 +43,10 @@ type CartGrain struct { lastItemId int lastDeliveryId int storageMessages []Message - Id CartId `json:"id"` - Items []*CartItem `json:"items"` - TotalPrice int64 `json:"totalPrice"` - Deliveries []string `json:"deliveries,omitempty"` + Id CartId `json:"id"` + Items []*CartItem `json:"items"` + TotalPrice int64 `json:"totalPrice"` + Deliveries []CartDelivery `json:"deliveries,omitempty"` } type Grain interface { @@ -162,13 +162,60 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) ([]byte, erro }) c.TotalPrice += msg.Price * int64(msg.Quantity) } + } + case ChangeQuantityType: + msg, ok := message.Content.(*messages.ChangeQuantity) + if !ok { + err = fmt.Errorf("expected RemoveItem") + } else { + for i, item := range c.Items { + if item.Id == int(msg.Id) { + if item.Quantity <= int(msg.Quantity) { + c.Items = append(c.Items[:i], c.Items[i+1:]...) + } else { + item.Quantity -= int(msg.Quantity) + } + c.TotalPrice -= item.Price * int64(msg.Quantity) + + break + } + } } case RemoveItemType: - //msg, ok := message.Content.(*messages.RemoveItem) + msg, ok := message.Content.(*messages.RemoveItem) + if !ok { + err = fmt.Errorf("expected RemoveItem") + } else { + for i, item := range c.Items { + if item.Id == int(msg.Id) { + c.TotalPrice -= item.Price * int64(item.Quantity) + c.Items = append(c.Items[:i], c.Items[i+1:]...) + break + } + } + } case AddDeliveryType: - c.lastDeliveryId++ - //msg, ok := message.Content.(*messages.AddDelivery) + msg, ok := message.Content.(*messages.SetDelivery) + if !ok { + err = fmt.Errorf("expected SetDelivery") + } else { + c.lastDeliveryId++ + items := make([]int, 0) + for _, id := range msg.Items { + for _, item := range c.Items { + if item.Id == int(id) { + items = append(items, int(item.Id)) + break + } + } + } + c.Deliveries = append(c.Deliveries, CartDelivery{ + Provider: msg.Provider, + Price: 49, + Items: items, + }) + } case RemoveDeliveryType: default: err = fmt.Errorf("unknown message type %d", message.Type) diff --git a/main.go b/main.go index daeb50c..e3823d0 100644 --- a/main.go +++ b/main.go @@ -38,7 +38,7 @@ func spawn(id CartId) (*CartGrain, error) { ret := &CartGrain{ lastItemId: 0, lastDeliveryId: 0, - Deliveries: []string{}, + Deliveries: []CartDelivery{}, Id: id, Items: []*CartItem{}, storageMessages: []Message{}, diff --git a/message-handler.go b/message-handler.go new file mode 100644 index 0000000..92f672f --- /dev/null +++ b/message-handler.go @@ -0,0 +1,221 @@ +package main + +import ( + "fmt" + "io" + + messages "git.tornberg.me/go-cart-actor/proto" + "google.golang.org/protobuf/proto" +) + +var Handlers = map[uint16]MessageHandler{ + AddRequestType: &AddRequestHandler{}, + AddItemType: &AddItemHandler{}, + ChangeQuantityType: &ChangeQuantityHandler{}, + SetDeliveryType: &SetDeliveryHandler{}, + RemoveItemType: &RemoveItemHandler{}, + RemoveDeliveryType: &RemoveDeliveryHandler{}, +} + +func GetMessageHandler(t uint16) (MessageHandler, error) { + h, ok := Handlers[t] + if !ok { + return nil, fmt.Errorf("no handler for type %d", t) + } + return h, nil +} + +type MessageHandler interface { + Write(*Message, io.Writer) error + Read(data []byte) (interface{}, error) + Is(*Message) bool +} +type TypedMessageHandler struct { + Type uint16 +} + +type AddRequestHandler struct { + TypedMessageHandler +} + +func (h *AddRequestHandler) Write(m *Message, w io.Writer) error { + messageBytes, err := proto.Marshal(m.Content.(*messages.AddRequest)) + if err != nil { + return err + } + w.Write(messageBytes) + return nil +} + +func (h *AddRequestHandler) Read(data []byte) (interface{}, error) { + msg := &messages.AddRequest{} + + err := proto.Unmarshal(data, msg) + if err != nil { + return nil, err + } + return msg, nil +} + +func (h *AddRequestHandler) Is(m *Message) bool { + if m.Type != AddRequestType { + return false + } + _, ok := m.Content.(*messages.AddRequest) + return ok +} + +type AddItemHandler struct { + TypedMessageHandler +} + +func (h *AddItemHandler) Write(m *Message, w io.Writer) error { + messageBytes, err := proto.Marshal(m.Content.(*messages.AddItem)) + if err != nil { + return err + } + w.Write(messageBytes) + return nil +} + +func (h *AddItemHandler) Read(data []byte) (interface{}, error) { + msg := &messages.AddItem{} + + err := proto.Unmarshal(data, msg) + if err != nil { + return nil, err + } + return msg, nil +} + +func (h *AddItemHandler) Is(m *Message) bool { + if m.Type != AddItemType { + return false + } + _, ok := m.Content.(*messages.AddItem) + return ok +} + +type ChangeQuantityHandler struct { + TypedMessageHandler +} + +func (h *ChangeQuantityHandler) Write(m *Message, w io.Writer) error { + messageBytes, err := proto.Marshal(m.Content.(*messages.ChangeQuantity)) + if err != nil { + return err + } + w.Write(messageBytes) + return nil +} + +func (h *ChangeQuantityHandler) Read(data []byte) (interface{}, error) { + msg := &messages.ChangeQuantity{} + + err := proto.Unmarshal(data, msg) + if err != nil { + return nil, err + } + return msg, nil +} + +func (h *ChangeQuantityHandler) Is(m *Message) bool { + if m.Type != ChangeQuantityType { + return false + } + _, ok := m.Content.(*messages.ChangeQuantity) + return ok +} + +type SetDeliveryHandler struct { + TypedMessageHandler +} + +func (h *SetDeliveryHandler) Write(m *Message, w io.Writer) error { + messageBytes, err := proto.Marshal(m.Content.(*messages.SetDelivery)) + if err != nil { + return err + } + w.Write(messageBytes) + return nil +} + +func (h *SetDeliveryHandler) Read(data []byte) (interface{}, error) { + msg := &messages.SetDelivery{} + + err := proto.Unmarshal(data, msg) + if err != nil { + return nil, err + } + return msg, nil +} + +func (h *SetDeliveryHandler) Is(m *Message) bool { + if m.Type != ChangeQuantityType { + return false + } + _, ok := m.Content.(*messages.SetDelivery) + return ok +} + +type RemoveItemHandler struct { + TypedMessageHandler +} + +func (h *RemoveItemHandler) Write(m *Message, w io.Writer) error { + messageBytes, err := proto.Marshal(m.Content.(*messages.RemoveItem)) + if err != nil { + return err + } + w.Write(messageBytes) + return nil +} + +func (h *RemoveItemHandler) Read(data []byte) (interface{}, error) { + msg := &messages.RemoveItem{} + + err := proto.Unmarshal(data, msg) + if err != nil { + return nil, err + } + return msg, nil +} + +func (h *RemoveItemHandler) Is(m *Message) bool { + if m.Type != AddItemType { + return false + } + _, ok := m.Content.(*messages.RemoveItem) + return ok +} + +type RemoveDeliveryHandler struct { + TypedMessageHandler +} + +func (h *RemoveDeliveryHandler) Write(m *Message, w io.Writer) error { + messageBytes, err := proto.Marshal(m.Content.(*messages.RemoveDelivery)) + if err != nil { + return err + } + w.Write(messageBytes) + return nil +} + +func (h *RemoveDeliveryHandler) Read(data []byte) (interface{}, error) { + msg := &messages.RemoveDelivery{} + + err := proto.Unmarshal(data, msg) + if err != nil { + return nil, err + } + return msg, nil +} + +func (h *RemoveDeliveryHandler) Is(m *Message) bool { + if m.Type != AddItemType { + return false + } + _, ok := m.Content.(*messages.RemoveDelivery) + return ok +} diff --git a/message-handler_test.go b/message-handler_test.go new file mode 100644 index 0000000..601806a --- /dev/null +++ b/message-handler_test.go @@ -0,0 +1,90 @@ +package main + +import ( + "bytes" + "testing" + + messages "git.tornberg.me/go-cart-actor/proto" +) + +func TestAddRequest(t *testing.T) { + h, err := GetMessageHandler(AddRequestType) + if err != nil { + t.Errorf("Error getting message handler: %v\n", err) + } + if h == nil { + t.Errorf("Expected message handler, got nil\n") + } + message := Message{ + Type: AddRequestType, + Content: &messages.AddRequest{ + Quantity: 2, + Sku: "123", + }, + } + var b bytes.Buffer + err = h.Write(&message, &b) + if err != nil { + t.Errorf("Error writing message: %v\n", err) + } + result, err := h.Read(b.Bytes()) + if err != nil { + t.Errorf("Error reading message: %v\n", err) + } + if result == nil { + t.Errorf("Expected result, got nil\n") + } + r, ok := result.(*messages.AddRequest) + if !ok { + t.Errorf("Expected AddRequest, got %T\n", result) + } + if r.Quantity != 2 { + t.Errorf("Expected quantity 2, got %d\n", r.Quantity) + } + if r.Sku != "123" { + t.Errorf("Expected sku '123', got %s\n", r.Sku) + } +} + +func TestItemRequest(t *testing.T) { + h, err := GetMessageHandler(AddItemType) + if err != nil { + t.Errorf("Error getting message handler: %v\n", err) + } + if h == nil { + t.Errorf("Expected message handler, got nil\n") + } + message := Message{ + Type: AddItemType, + Content: &messages.AddItem{ + Quantity: 2, + Sku: "123", + Price: 100, + Name: "Test item", + Image: "test.jpg", + }, + } + var b bytes.Buffer + err = h.Write(&message, &b) + if err != nil { + t.Errorf("Error writing message: %v\n", err) + } + result, err := h.Read(b.Bytes()) + if err != nil { + t.Errorf("Error reading message: %v\n", err) + } + if result == nil { + t.Errorf("Expected result, got nil\n") + } + var r *messages.AddItem + ok := h.Is(&message) + if !ok { + t.Errorf("Expected AddRequest, got %T\n", result) + } + if r.Quantity != 2 { + t.Errorf("Expected quantity 2, got %d\n", r.Quantity) + } + if r.Sku != "123" { + t.Errorf("Expected sku '123', got %s\n", r.Sku) + } +} diff --git a/message-types.go b/message-types.go index 201bbb5..6253949 100644 --- a/message-types.go +++ b/message-types.go @@ -6,4 +6,6 @@ const ( AddDeliveryType = 3 RemoveItemType = 4 RemoveDeliveryType = 5 + ChangeQuantityType = 6 + SetDeliveryType = 7 ) diff --git a/message.go b/message.go index c143f11..b8a8d00 100644 --- a/message.go +++ b/message.go @@ -3,12 +3,8 @@ package main import ( "bytes" "encoding/binary" - "fmt" "io" "time" - - messages "git.tornberg.me/go-cart-actor/proto" - "google.golang.org/protobuf/proto" ) type StorableMessage interface { @@ -43,21 +39,12 @@ func GetData(fn func(w io.Writer) error) ([]byte, error) { } func (m Message) Write(w io.Writer) error { - data, err := GetData(func(wr io.Writer) error { - if m.Type == AddRequestType { - messageBytes, err := proto.Marshal(m.Content.(*messages.AddRequest)) - if err != nil { - return err - } - wr.Write(messageBytes) - } else if m.Type == AddItemType { - messageBytes, err := proto.Marshal(m.Content.(*messages.AddItem)) - if err != nil { - return err - } - wr.Write(messageBytes) - } - return nil + h, err := GetMessageHandler(m.Type) + if err != nil { + return err + } + data, err := GetData(func(w io.Writer) error { + return h.Write(&m, w) }) if err != nil { return err @@ -79,8 +66,12 @@ func (m Message) Write(w io.Writer) error { } func ReadMessage(reader io.Reader, m *Message) error { + h, err := GetMessageHandler(m.Type) + if err != nil { + return err + } header := StorableMessageHeader{} - err := binary.Read(reader, binary.LittleEndian, &header) + err = binary.Read(reader, binary.LittleEndian, &header) if err != nil { return err } @@ -89,21 +80,13 @@ func ReadMessage(reader io.Reader, m *Message) error { if err != nil { return err } - switch header.Type { - case AddRequestType: - msg := &messages.AddRequest{} - err = proto.Unmarshal(messageBytes, msg) - m.Content = msg - case AddItemType: - msg := &messages.AddItem{} - err = proto.Unmarshal(messageBytes, msg) - m.Content = msg - default: - return fmt.Errorf("unknown message type") - } + + content, err := h.Read(messageBytes) if err != nil { return err } + m.Content = content + m.Type = header.Type m.TimeStamp = &header.TimeStamp diff --git a/packet-queue.go b/packet-queue.go index 2faad1d..109cb1b 100644 --- a/packet-queue.go +++ b/packet-queue.go @@ -55,7 +55,7 @@ func NewPacketQueue(connection net.Conn) *PacketQueue { l = append(l, packet) } } - + packetQueue.Set(float64(len(queue.Packets))) queue.Packets = append(l, PacketWithData{ MessageType: packet.MessageType, Added: ts, @@ -63,7 +63,6 @@ func NewPacketQueue(connection net.Conn) *PacketQueue { }) queue.mu.Unlock() packetsReceived.Inc() - packetQueue.Set(float64(len(queue.Packets))) } }() return queue diff --git a/pool-server.go b/pool-server.go index 3ac54d1..aaa29b9 100644 --- a/pool-server.go +++ b/pool-server.go @@ -1,7 +1,10 @@ package main import ( + "encoding/json" + "fmt" "net/http" + "strconv" messages "git.tornberg.me/go-cart-actor/proto" ) @@ -18,21 +21,16 @@ func NewPoolServer(pool GrainPool, pod_name string) *PoolServer { } } -func (s *PoolServer) HandleGet(w http.ResponseWriter, r *http.Request) { +func (s *PoolServer) HandleGet(w http.ResponseWriter, r *http.Request) error { id := r.PathValue("id") data, err := s.pool.Get(ToCartId(id)) if err != nil { - w.WriteHeader(http.StatusNotFound) - w.Write([]byte(err.Error())) - return + return err } - w.Header().Set("Content-Type", "application/json") - w.Header().Set("X-Pod-Name", s.pod_name) - w.WriteHeader(http.StatusOK) - w.Write(data) + return s.WriteResult(w, data) } -func (s *PoolServer) HandleAddSku(w http.ResponseWriter, r *http.Request) { +func (s *PoolServer) HandleAddSku(w http.ResponseWriter, r *http.Request) error { id := r.PathValue("id") sku := r.PathValue("sku") data, err := s.pool.Process(ToCartId(id), Message{ @@ -40,19 +38,79 @@ func (s *PoolServer) HandleAddSku(w http.ResponseWriter, r *http.Request) { Content: &messages.AddRequest{Sku: sku}, }) if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(err.Error())) - return + return err } + return s.WriteResult(w, data) +} + +func ErrorHandler(fn func(w http.ResponseWriter, r *http.Request) error) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + err := fn(w, r) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(err.Error())) + } + } +} + +func (s *PoolServer) WriteResult(w http.ResponseWriter, data []byte) error { w.Header().Set("Content-Type", "application/json") w.Header().Set("X-Pod-Name", s.pod_name) w.WriteHeader(http.StatusOK) - w.Write(data) + _, err := w.Write(data) + return err +} + +func (s *PoolServer) HandleDeleteItem(w http.ResponseWriter, r *http.Request) error { + id := r.PathValue("id") + itemIdString := r.PathValue("itemId") + itemId, err := strconv.Atoi(itemIdString) + if err != nil { + return err + } + data, err := s.pool.Process(ToCartId(id), Message{ + Type: RemoveItemType, + Content: &messages.RemoveItem{Id: int64(itemId)}, + }) + if err != nil { + return err + } + return s.WriteResult(w, data) +} + +type SetDelivery struct { + Provider string `json:"provider"` + Items []int64 `json:"items"` +} + +func (s *PoolServer) HandleSetDelivery(w http.ResponseWriter, r *http.Request) error { + id := r.PathValue("id") + var delivery *SetDelivery + err := json.NewDecoder(r.Body).Decode(delivery) + if err != nil { + return err + } + if delivery == nil { + return fmt.Errorf("no delivery data") + } + data, err := s.pool.Process(ToCartId(id), Message{ + Type: SetDeliveryType, + Content: &messages.SetDelivery{ + Provider: delivery.Provider, + Items: delivery.Items, + }, + }) + if err != nil { + return err + } + return s.WriteResult(w, data) } func (s *PoolServer) Serve() *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("GET /{id}", s.HandleGet) - mux.HandleFunc("GET /{id}/add/{sku}", s.HandleAddSku) + mux.HandleFunc("GET /{id}", ErrorHandler(s.HandleGet)) + mux.HandleFunc("GET /{id}/add/{sku}", ErrorHandler(s.HandleAddSku)) + mux.HandleFunc("DELETE /{id}/{itemId}", ErrorHandler(s.HandleDeleteItem)) + mux.HandleFunc("POST /{id}/delivery", ErrorHandler(s.HandleSetDelivery)) return mux } diff --git a/proto/messages.pb.go b/proto/messages.pb.go index 83a6f4f..49ff5a8 100644 --- a/proto/messages.pb.go +++ b/proto/messages.pb.go @@ -1,8 +1,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.1 -// protoc v5.28.2 -// source: proto/messages.proto +// protoc v5.28.3 +// source: messages.proto package messages @@ -25,12 +25,13 @@ type AddRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Sku string `protobuf:"bytes,2,opt,name=Sku,proto3" json:"Sku,omitempty"` + Quantity int32 `protobuf:"varint,1,opt,name=Quantity,proto3" json:"Quantity,omitempty"` + Sku string `protobuf:"bytes,2,opt,name=Sku,proto3" json:"Sku,omitempty"` } func (x *AddRequest) Reset() { *x = AddRequest{} - mi := &file_proto_messages_proto_msgTypes[0] + mi := &file_messages_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -42,7 +43,7 @@ func (x *AddRequest) String() string { func (*AddRequest) ProtoMessage() {} func (x *AddRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_messages_proto_msgTypes[0] + mi := &file_messages_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -55,7 +56,14 @@ func (x *AddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRequest.ProtoReflect.Descriptor instead. func (*AddRequest) Descriptor() ([]byte, []int) { - return file_proto_messages_proto_rawDescGZIP(), []int{0} + return file_messages_proto_rawDescGZIP(), []int{0} +} + +func (x *AddRequest) GetQuantity() int32 { + if x != nil { + return x.Quantity + } + return 0 } func (x *AddRequest) GetSku() string { @@ -79,7 +87,7 @@ type AddItem struct { func (x *AddItem) Reset() { *x = AddItem{} - mi := &file_proto_messages_proto_msgTypes[1] + mi := &file_messages_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -91,7 +99,7 @@ func (x *AddItem) String() string { func (*AddItem) ProtoMessage() {} func (x *AddItem) ProtoReflect() protoreflect.Message { - mi := &file_proto_messages_proto_msgTypes[1] + mi := &file_messages_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -104,7 +112,7 @@ func (x *AddItem) ProtoReflect() protoreflect.Message { // Deprecated: Use AddItem.ProtoReflect.Descriptor instead. func (*AddItem) Descriptor() ([]byte, []int) { - return file_proto_messages_proto_rawDescGZIP(), []int{1} + return file_messages_proto_rawDescGZIP(), []int{1} } func (x *AddItem) GetQuantity() int32 { @@ -142,42 +150,256 @@ func (x *AddItem) GetImage() string { return "" } -var File_proto_messages_proto protoreflect.FileDescriptor +type RemoveItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_proto_messages_proto_rawDesc = []byte{ - 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x22, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x53, 0x6b, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x53, 0x6b, 0x75, - 0x22, 0x77, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x53, 0x6b, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x53, 0x6b, 0x75, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x3b, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + Id int64 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` +} + +func (x *RemoveItem) Reset() { + *x = RemoveItem{} + mi := &file_messages_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveItem) ProtoMessage() {} + +func (x *RemoveItem) ProtoReflect() protoreflect.Message { + mi := &file_messages_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveItem.ProtoReflect.Descriptor instead. +func (*RemoveItem) Descriptor() ([]byte, []int) { + return file_messages_proto_rawDescGZIP(), []int{2} +} + +func (x *RemoveItem) GetId() int64 { + if x != nil { + return x.Id + } + return 0 +} + +type ChangeQuantity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int64 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` + Quantity int32 `protobuf:"varint,2,opt,name=Quantity,proto3" json:"Quantity,omitempty"` +} + +func (x *ChangeQuantity) Reset() { + *x = ChangeQuantity{} + mi := &file_messages_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ChangeQuantity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeQuantity) ProtoMessage() {} + +func (x *ChangeQuantity) ProtoReflect() protoreflect.Message { + mi := &file_messages_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeQuantity.ProtoReflect.Descriptor instead. +func (*ChangeQuantity) Descriptor() ([]byte, []int) { + return file_messages_proto_rawDescGZIP(), []int{3} +} + +func (x *ChangeQuantity) GetId() int64 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *ChangeQuantity) GetQuantity() int32 { + if x != nil { + return x.Quantity + } + return 0 +} + +type SetDelivery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Provider string `protobuf:"bytes,1,opt,name=Provider,proto3" json:"Provider,omitempty"` + Items []int64 `protobuf:"varint,2,rep,packed,name=Items,proto3" json:"Items,omitempty"` +} + +func (x *SetDelivery) Reset() { + *x = SetDelivery{} + mi := &file_messages_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetDelivery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetDelivery) ProtoMessage() {} + +func (x *SetDelivery) ProtoReflect() protoreflect.Message { + mi := &file_messages_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetDelivery.ProtoReflect.Descriptor instead. +func (*SetDelivery) Descriptor() ([]byte, []int) { + return file_messages_proto_rawDescGZIP(), []int{4} +} + +func (x *SetDelivery) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *SetDelivery) GetItems() []int64 { + if x != nil { + return x.Items + } + return nil +} + +type RemoveDelivery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int64 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` +} + +func (x *RemoveDelivery) Reset() { + *x = RemoveDelivery{} + mi := &file_messages_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveDelivery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveDelivery) ProtoMessage() {} + +func (x *RemoveDelivery) ProtoReflect() protoreflect.Message { + mi := &file_messages_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveDelivery.ProtoReflect.Descriptor instead. +func (*RemoveDelivery) Descriptor() ([]byte, []int) { + return file_messages_proto_rawDescGZIP(), []int{5} +} + +func (x *RemoveDelivery) GetId() int64 { + if x != nil { + return x.Id + } + return 0 +} + +var File_messages_proto protoreflect.FileDescriptor + +var file_messages_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x0a, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x6b, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x53, 0x6b, 0x75, 0x22, 0x77, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x49, 0x74, 0x65, + 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x6b, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x53, 0x6b, 0x75, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, + 0x1c, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x22, 0x3c, 0x0a, + 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3f, 0x0a, 0x0b, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x20, 0x0a, 0x0e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x42, 0x0c, + 0x5a, 0x0a, 0x2e, 0x3b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_messages_proto_rawDescOnce sync.Once - file_proto_messages_proto_rawDescData = file_proto_messages_proto_rawDesc + file_messages_proto_rawDescOnce sync.Once + file_messages_proto_rawDescData = file_messages_proto_rawDesc ) -func file_proto_messages_proto_rawDescGZIP() []byte { - file_proto_messages_proto_rawDescOnce.Do(func() { - file_proto_messages_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_messages_proto_rawDescData) +func file_messages_proto_rawDescGZIP() []byte { + file_messages_proto_rawDescOnce.Do(func() { + file_messages_proto_rawDescData = protoimpl.X.CompressGZIP(file_messages_proto_rawDescData) }) - return file_proto_messages_proto_rawDescData + return file_messages_proto_rawDescData } -var file_proto_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_proto_messages_proto_goTypes = []any{ - (*AddRequest)(nil), // 0: messages.AddRequest - (*AddItem)(nil), // 1: messages.AddItem +var file_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_messages_proto_goTypes = []any{ + (*AddRequest)(nil), // 0: messages.AddRequest + (*AddItem)(nil), // 1: messages.AddItem + (*RemoveItem)(nil), // 2: messages.RemoveItem + (*ChangeQuantity)(nil), // 3: messages.ChangeQuantity + (*SetDelivery)(nil), // 4: messages.SetDelivery + (*RemoveDelivery)(nil), // 5: messages.RemoveDelivery } -var file_proto_messages_proto_depIdxs = []int32{ +var file_messages_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name @@ -185,27 +407,27 @@ var file_proto_messages_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for field type_name } -func init() { file_proto_messages_proto_init() } -func file_proto_messages_proto_init() { - if File_proto_messages_proto != nil { +func init() { file_messages_proto_init() } +func file_messages_proto_init() { + if File_messages_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_messages_proto_rawDesc, + RawDescriptor: file_messages_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_messages_proto_goTypes, - DependencyIndexes: file_proto_messages_proto_depIdxs, - MessageInfos: file_proto_messages_proto_msgTypes, + GoTypes: file_messages_proto_goTypes, + DependencyIndexes: file_messages_proto_depIdxs, + MessageInfos: file_messages_proto_msgTypes, }.Build() - File_proto_messages_proto = out.File - file_proto_messages_proto_rawDesc = nil - file_proto_messages_proto_goTypes = nil - file_proto_messages_proto_depIdxs = nil + File_messages_proto = out.File + file_messages_proto_rawDesc = nil + file_messages_proto_goTypes = nil + file_messages_proto_depIdxs = nil } diff --git a/proto/messages.proto b/proto/messages.proto index ffe2489..76ca6ca 100644 --- a/proto/messages.proto +++ b/proto/messages.proto @@ -3,6 +3,7 @@ package messages; option go_package = ".;messages"; message AddRequest { + int32 Quantity = 1; string Sku = 2; } @@ -14,12 +15,13 @@ message AddItem { string Image = 6; } -message RemoteItem { +message RemoveItem { int64 Id = 1; } message ChangeQuantity { - int32 Quantity = 1; + int64 Id = 1; + int32 Quantity = 2; } message SetDelivery { diff --git a/proto/service.proto b/proto/service.proto deleted file mode 100644 index e69de29..0000000