Alexey Kim hai 1 ano
pai
achega
e89ead3ac0
Modificáronse 5 ficheiros con 737 adicións e 0 borrados
  1. 16 0
      v2/Makefile
  2. 5 0
      v2/go.mod
  3. 4 0
      v2/go.sum
  4. 652 0
      v2/ticket.pb.go
  5. 60 0
      v2/ticket.proto

+ 16 - 0
v2/Makefile

@@ -0,0 +1,16 @@
+.DEFAULT_GOAL := all
+.DELETE_ON_ERROR:
+.SUFFIXES:
+
+.PHONY: all
+all: gen deps
+
+.PHONY: gen
+gen:
+	-@echo "-> $@"
+	protoc -I=. --go_out=paths=source_relative:. ticket.proto
+
+.PHONY: deps
+deps:
+	-@echo "-> $@"
+	go mod tidy

+ 5 - 0
v2/go.mod

@@ -0,0 +1,5 @@
+module git.beejay.kim/Gshopper/ticket/v2
+
+go 1.20
+
+require google.golang.org/protobuf v1.32.0

+ 4 - 0
v2/go.sum

@@ -0,0 +1,4 @@
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=

+ 652 - 0
v2/ticket.pb.go

@@ -0,0 +1,652 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.32.0
+// 	protoc        v4.25.1
+// source: ticket.proto
+
+package v2
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	structpb "google.golang.org/protobuf/types/known/structpb"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Flag int32
+
+const (
+	// Deprecated: Marked as deprecated in ticket.proto.
+	Flag_unknown  Flag = 0
+	Flag_SENT     Flag = 1
+	Flag_MODIFIED Flag = 2
+)
+
+// Enum value maps for Flag.
+var (
+	Flag_name = map[int32]string{
+		0: "unknown",
+		1: "SENT",
+		2: "MODIFIED",
+	}
+	Flag_value = map[string]int32{
+		"unknown":  0,
+		"SENT":     1,
+		"MODIFIED": 2,
+	}
+)
+
+func (x Flag) Enum() *Flag {
+	p := new(Flag)
+	*p = x
+	return p
+}
+
+func (x Flag) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Flag) Descriptor() protoreflect.EnumDescriptor {
+	return file_ticket_proto_enumTypes[0].Descriptor()
+}
+
+func (Flag) Type() protoreflect.EnumType {
+	return &file_ticket_proto_enumTypes[0]
+}
+
+func (x Flag) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Flag.Descriptor instead.
+func (Flag) EnumDescriptor() ([]byte, []int) {
+	return file_ticket_proto_rawDescGZIP(), []int{0}
+}
+
+type Message_Type int32
+
+const (
+	// Deprecated: Marked as deprecated in ticket.proto.
+	Message_unknown            Message_Type = 0
+	Message_TEXT               Message_Type = 1
+	Message_EMAIL              Message_Type = 2
+	Message_ASSISTANT_CALLBACK Message_Type = 3
+)
+
+// Enum value maps for Message_Type.
+var (
+	Message_Type_name = map[int32]string{
+		0: "unknown",
+		1: "TEXT",
+		2: "EMAIL",
+		3: "ASSISTANT_CALLBACK",
+	}
+	Message_Type_value = map[string]int32{
+		"unknown":            0,
+		"TEXT":               1,
+		"EMAIL":              2,
+		"ASSISTANT_CALLBACK": 3,
+	}
+)
+
+func (x Message_Type) Enum() *Message_Type {
+	p := new(Message_Type)
+	*p = x
+	return p
+}
+
+func (x Message_Type) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Message_Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_ticket_proto_enumTypes[1].Descriptor()
+}
+
+func (Message_Type) Type() protoreflect.EnumType {
+	return &file_ticket_proto_enumTypes[1]
+}
+
+func (x Message_Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Message_Type.Descriptor instead.
+func (Message_Type) EnumDescriptor() ([]byte, []int) {
+	return file_ticket_proto_rawDescGZIP(), []int{2, 0}
+}
+
+type EmailAddress struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	Name    string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *EmailAddress) Reset() {
+	*x = EmailAddress{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ticket_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EmailAddress) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EmailAddress) ProtoMessage() {}
+
+func (x *EmailAddress) ProtoReflect() protoreflect.Message {
+	mi := &file_ticket_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EmailAddress.ProtoReflect.Descriptor instead.
+func (*EmailAddress) Descriptor() ([]byte, []int) {
+	return file_ticket_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *EmailAddress) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+func (x *EmailAddress) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type AssistantCallback struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	To      *EmailAddress `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"`
+	Subject string        `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"`
+	Body    string        `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"`
+}
+
+func (x *AssistantCallback) Reset() {
+	*x = AssistantCallback{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ticket_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AssistantCallback) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AssistantCallback) ProtoMessage() {}
+
+func (x *AssistantCallback) ProtoReflect() protoreflect.Message {
+	mi := &file_ticket_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AssistantCallback.ProtoReflect.Descriptor instead.
+func (*AssistantCallback) Descriptor() ([]byte, []int) {
+	return file_ticket_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *AssistantCallback) GetTo() *EmailAddress {
+	if x != nil {
+		return x.To
+	}
+	return nil
+}
+
+func (x *AssistantCallback) GetSubject() string {
+	if x != nil {
+		return x.Subject
+	}
+	return ""
+}
+
+func (x *AssistantCallback) GetBody() string {
+	if x != nil {
+		return x.Body
+	}
+	return ""
+}
+
+type Message struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	MessageId string                     `protobuf:"bytes,1,opt,name=message_id,proto3" json:"message_id,omitempty"`
+	TicketId  string                     `protobuf:"bytes,2,opt,name=ticket_id,proto3" json:"ticket_id,omitempty"`
+	Role      string                     `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"`
+	Type      Message_Type               `protobuf:"varint,4,opt,name=type,proto3,enum=ticket.Message_Type" json:"type,omitempty"`
+	Content   string                     `protobuf:"bytes,5,opt,name=content,proto3" json:"content,omitempty"`
+	Date      *timestamppb.Timestamp     `protobuf:"bytes,6,opt,name=date,proto3" json:"date,omitempty"`
+	Raw       []byte                     `protobuf:"bytes,7,opt,name=raw,proto3" json:"raw,omitempty"`
+	Flags     []byte                     `protobuf:"bytes,8,opt,name=flags,proto3" json:"flags,omitempty"`
+	Headers   map[string]string          `protobuf:"bytes,10,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	Meta      map[string]*structpb.Value `protobuf:"bytes,11,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *Message) Reset() {
+	*x = Message{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ticket_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Message) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Message) ProtoMessage() {}
+
+func (x *Message) ProtoReflect() protoreflect.Message {
+	mi := &file_ticket_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Message.ProtoReflect.Descriptor instead.
+func (*Message) Descriptor() ([]byte, []int) {
+	return file_ticket_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *Message) GetMessageId() string {
+	if x != nil {
+		return x.MessageId
+	}
+	return ""
+}
+
+func (x *Message) GetTicketId() string {
+	if x != nil {
+		return x.TicketId
+	}
+	return ""
+}
+
+func (x *Message) GetRole() string {
+	if x != nil {
+		return x.Role
+	}
+	return ""
+}
+
+func (x *Message) GetType() Message_Type {
+	if x != nil {
+		return x.Type
+	}
+	return Message_unknown
+}
+
+func (x *Message) GetContent() string {
+	if x != nil {
+		return x.Content
+	}
+	return ""
+}
+
+func (x *Message) GetDate() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Date
+	}
+	return nil
+}
+
+func (x *Message) GetRaw() []byte {
+	if x != nil {
+		return x.Raw
+	}
+	return nil
+}
+
+func (x *Message) GetFlags() []byte {
+	if x != nil {
+		return x.Flags
+	}
+	return nil
+}
+
+func (x *Message) GetHeaders() map[string]string {
+	if x != nil {
+		return x.Headers
+	}
+	return nil
+}
+
+func (x *Message) GetMeta() map[string]*structpb.Value {
+	if x != nil {
+		return x.Meta
+	}
+	return nil
+}
+
+type Ticket struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	TicketId string                     `protobuf:"bytes,1,opt,name=ticket_id,proto3" json:"ticket_id,omitempty"`
+	To       string                     `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"`
+	From     *EmailAddress              `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"`
+	Flags    []byte                     `protobuf:"bytes,4,opt,name=flags,proto3" json:"flags,omitempty"`
+	Messages []*Message                 `protobuf:"bytes,10,rep,name=messages,proto3" json:"messages,omitempty"`
+	Meta     map[string]*structpb.Value `protobuf:"bytes,11,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *Ticket) Reset() {
+	*x = Ticket{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ticket_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Ticket) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Ticket) ProtoMessage() {}
+
+func (x *Ticket) ProtoReflect() protoreflect.Message {
+	mi := &file_ticket_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Ticket.ProtoReflect.Descriptor instead.
+func (*Ticket) Descriptor() ([]byte, []int) {
+	return file_ticket_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *Ticket) GetTicketId() string {
+	if x != nil {
+		return x.TicketId
+	}
+	return ""
+}
+
+func (x *Ticket) GetTo() string {
+	if x != nil {
+		return x.To
+	}
+	return ""
+}
+
+func (x *Ticket) GetFrom() *EmailAddress {
+	if x != nil {
+		return x.From
+	}
+	return nil
+}
+
+func (x *Ticket) GetFlags() []byte {
+	if x != nil {
+		return x.Flags
+	}
+	return nil
+}
+
+func (x *Ticket) GetMessages() []*Message {
+	if x != nil {
+		return x.Messages
+	}
+	return nil
+}
+
+func (x *Ticket) GetMeta() map[string]*structpb.Value {
+	if x != nil {
+		return x.Meta
+	}
+	return nil
+}
+
+var File_ticket_proto protoreflect.FileDescriptor
+
+var file_ticket_proto_rawDesc = []byte{
+	0x0a, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06,
+	0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3c, 0x0a, 0x0c, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x22, 0x67, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74,
+	0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6d,
+	0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x18,
+	0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xb1, 0x04, 0x0a,
+	0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b,
+	0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x63,
+	0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79,
+	0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65,
+	0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04,
+	0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2e,
+	0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x10,
+	0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x61, 0x77,
+	0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52,
+	0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
+	0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74,
+	0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d,
+	0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74,
+	0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65,
+	0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x1a, 0x3a, 0x0a,
+	0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,
+	0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
+	0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4f, 0x0a, 0x09, 0x4d, 0x65, 0x74,
+	0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x04, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x0f, 0x0a, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x1a,
+	0x02, 0x08, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a,
+	0x05, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x53, 0x53, 0x49,
+	0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x03,
+	0x22, 0xa2, 0x02, 0x0a, 0x06, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x28, 0x0a, 0x04, 0x66, 0x72, 0x6f,
+	0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74,
+	0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x04, 0x66,
+	0x72, 0x6f, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0c, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x69,
+	0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0b,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x54, 0x69,
+	0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04,
+	0x6d, 0x65, 0x74, 0x61, 0x1a, 0x4f, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72,
+	0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x2f, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x0f, 0x0a,
+	0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x08,
+	0x0a, 0x04, 0x53, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x4f, 0x44, 0x49,
+	0x46, 0x49, 0x45, 0x44, 0x10, 0x02, 0x42, 0x29, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x73,
+	0x68, 0x6f, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x72, 0x6d, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65,
+	0x74, 0x2e, 0x76, 0x32, 0x42, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x04, 0x2e, 0x2f, 0x76,
+	0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_ticket_proto_rawDescOnce sync.Once
+	file_ticket_proto_rawDescData = file_ticket_proto_rawDesc
+)
+
+func file_ticket_proto_rawDescGZIP() []byte {
+	file_ticket_proto_rawDescOnce.Do(func() {
+		file_ticket_proto_rawDescData = protoimpl.X.CompressGZIP(file_ticket_proto_rawDescData)
+	})
+	return file_ticket_proto_rawDescData
+}
+
+var file_ticket_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_ticket_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_ticket_proto_goTypes = []interface{}{
+	(Flag)(0),                     // 0: ticket.Flag
+	(Message_Type)(0),             // 1: ticket.Message.Type
+	(*EmailAddress)(nil),          // 2: ticket.EmailAddress
+	(*AssistantCallback)(nil),     // 3: ticket.AssistantCallback
+	(*Message)(nil),               // 4: ticket.Message
+	(*Ticket)(nil),                // 5: ticket.Ticket
+	nil,                           // 6: ticket.Message.HeadersEntry
+	nil,                           // 7: ticket.Message.MetaEntry
+	nil,                           // 8: ticket.Ticket.MetaEntry
+	(*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp
+	(*structpb.Value)(nil),        // 10: google.protobuf.Value
+}
+var file_ticket_proto_depIdxs = []int32{
+	2,  // 0: ticket.AssistantCallback.to:type_name -> ticket.EmailAddress
+	1,  // 1: ticket.Message.type:type_name -> ticket.Message.Type
+	9,  // 2: ticket.Message.date:type_name -> google.protobuf.Timestamp
+	6,  // 3: ticket.Message.headers:type_name -> ticket.Message.HeadersEntry
+	7,  // 4: ticket.Message.meta:type_name -> ticket.Message.MetaEntry
+	2,  // 5: ticket.Ticket.from:type_name -> ticket.EmailAddress
+	4,  // 6: ticket.Ticket.messages:type_name -> ticket.Message
+	8,  // 7: ticket.Ticket.meta:type_name -> ticket.Ticket.MetaEntry
+	10, // 8: ticket.Message.MetaEntry.value:type_name -> google.protobuf.Value
+	10, // 9: ticket.Ticket.MetaEntry.value:type_name -> google.protobuf.Value
+	10, // [10:10] is the sub-list for method output_type
+	10, // [10:10] is the sub-list for method input_type
+	10, // [10:10] is the sub-list for extension type_name
+	10, // [10:10] is the sub-list for extension extendee
+	0,  // [0:10] is the sub-list for field type_name
+}
+
+func init() { file_ticket_proto_init() }
+func file_ticket_proto_init() {
+	if File_ticket_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_ticket_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EmailAddress); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ticket_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AssistantCallback); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ticket_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ticket_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Ticket); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_ticket_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   7,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_ticket_proto_goTypes,
+		DependencyIndexes: file_ticket_proto_depIdxs,
+		EnumInfos:         file_ticket_proto_enumTypes,
+		MessageInfos:      file_ticket_proto_msgTypes,
+	}.Build()
+	File_ticket_proto = out.File
+	file_ticket_proto_rawDesc = nil
+	file_ticket_proto_goTypes = nil
+	file_ticket_proto_depIdxs = nil
+}

+ 60 - 0
v2/ticket.proto

@@ -0,0 +1,60 @@
+syntax = "proto3";
+package ticket;
+
+// golang
+option go_package = "./v2";
+
+// java
+option java_package = "com.gshopper.crm.ticket.v2";
+option java_outer_classname = "proto";
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/struct.proto";
+
+message EmailAddress {
+  string address = 1 [json_name = "address"];
+  string name = 2 [json_name = "name"];
+}
+
+message AssistantCallback {
+  EmailAddress to = 1 [json_name = "to"];
+  string subject = 2 [json_name = "subject"];
+  string body = 3 [json_name = "body"];
+}
+
+enum Flag {
+  unknown = 0 [deprecated = true];
+  SENT = 1;
+  MODIFIED = 2;
+}
+
+message Message {
+  enum Type {
+    unknown = 0 [deprecated = true];
+    TEXT = 1;
+    EMAIL = 2;
+    ASSISTANT_CALLBACK = 3;
+  }
+
+  string message_id = 1 [json_name = "message_id"];
+  string ticket_id = 2 [json_name = "ticket_id"];
+  string role = 3 [json_name = "role"];
+  Type type = 4 [json_name = "type"];
+  string content = 5 [json_name = "content"];
+  google.protobuf.Timestamp date = 6 [json_name = "date"];
+  bytes raw = 7 [json_name = "raw"];
+  bytes flags = 8 [json_name = "flags"];
+
+  map<string, string> headers = 10 [json_name = "headers"];
+  map<string, google.protobuf.Value> meta = 11 [json_name = "meta"];
+}
+
+message Ticket {
+  string ticket_id = 1 [json_name = "ticket_id"];
+  string to = 2 [json_name = "to"];
+  EmailAddress from = 3 [json_name = "from"];
+  bytes flags = 4 [json_name = "flags"];
+
+  repeated Message messages = 10 [json_name = "messages"];
+  map<string, google.protobuf.Value> meta = 11 [json_name = "meta"];
+}