From 933d3ba0d110b641d3f940b7d2ac6992ecabd2dc Mon Sep 17 00:00:00 2001 From: Alexander Trost Date: Tue, 21 May 2024 18:02:16 +0200 Subject: [PATCH] feat: continue work on messenger Signed-off-by: Alexander Trost --- gen/go/proto/resources/messenger/events.pb.go | 239 ++++++++ .../resources/messenger/events.pb.validate.go | 247 ++++++++ .../resources/notifications/events.pb.go | 95 +-- .../notifications/events.pb.validate.go | 41 ++ gen/go/proto/services/messenger/access.go | 18 +- gen/go/proto/services/messenger/events.go | 26 +- gen/go/proto/services/messenger/message.go | 43 ++ .../proto/services/messenger/messenger.pb.go | 539 +++++++++++------- .../messenger/messenger.pb.validate.go | 233 ++++++++ .../services/messenger/messenger_grpc.pb.go | 39 ++ .../proto/services/messenger/service_perms.go | 1 + gen/go/proto/services/messenger/thread.go | 76 ++- gen/go/proto/services/messenger/user.go | 32 ++ .../proto/services/notificator/notificator.go | 5 +- gen/grpc-api.md | 73 ++- gen/ts/perms.ts | 1 + gen/ts/resources/messenger/events.ts | 129 +++++ gen/ts/resources/notifications/events.ts | 23 +- gen/ts/services/messenger/messenger.client.ts | 29 +- gen/ts/services/messenger/messenger.ts | 112 ++++ proto/resources/messenger/events.proto | 17 + proto/resources/notifications/events.proto | 4 + proto/services/messenger/messenger.proto | 10 + src/components/messenger/MessengerThread.vue | 115 ++-- src/components/messenger/helpers.ts | 26 + .../notification/NotificationProvider.vue | 1 + src/lang/en.json | 19 + src/pages/messenger.vue | 75 +-- src/store/messenger.ts | 43 ++ src/store/notificator.ts | 5 + 30 files changed, 1991 insertions(+), 325 deletions(-) create mode 100644 gen/go/proto/resources/messenger/events.pb.go create mode 100644 gen/go/proto/resources/messenger/events.pb.validate.go create mode 100644 gen/ts/resources/messenger/events.ts create mode 100644 proto/resources/messenger/events.proto create mode 100644 src/components/messenger/helpers.ts diff --git a/gen/go/proto/resources/messenger/events.pb.go b/gen/go/proto/resources/messenger/events.pb.go new file mode 100644 index 000000000..196f36768 --- /dev/null +++ b/gen/go/proto/resources/messenger/events.pb.go @@ -0,0 +1,239 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v4.24.4 +// source: resources/messenger/events.proto + +package messenger + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + 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 MessengerEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Data: + // + // *MessengerEvent_ThreadUpdate + // *MessengerEvent_ThreadDelete + // *MessengerEvent_MessageUpdate + // *MessengerEvent_MessageDelete + Data isMessengerEvent_Data `protobuf_oneof:"data"` +} + +func (x *MessengerEvent) Reset() { + *x = MessengerEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_resources_messenger_events_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessengerEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessengerEvent) ProtoMessage() {} + +func (x *MessengerEvent) ProtoReflect() protoreflect.Message { + mi := &file_resources_messenger_events_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 MessengerEvent.ProtoReflect.Descriptor instead. +func (*MessengerEvent) Descriptor() ([]byte, []int) { + return file_resources_messenger_events_proto_rawDescGZIP(), []int{0} +} + +func (m *MessengerEvent) GetData() isMessengerEvent_Data { + if m != nil { + return m.Data + } + return nil +} + +func (x *MessengerEvent) GetThreadUpdate() *Thread { + if x, ok := x.GetData().(*MessengerEvent_ThreadUpdate); ok { + return x.ThreadUpdate + } + return nil +} + +func (x *MessengerEvent) GetThreadDelete() uint64 { + if x, ok := x.GetData().(*MessengerEvent_ThreadDelete); ok { + return x.ThreadDelete + } + return 0 +} + +func (x *MessengerEvent) GetMessageUpdate() *Message { + if x, ok := x.GetData().(*MessengerEvent_MessageUpdate); ok { + return x.MessageUpdate + } + return nil +} + +func (x *MessengerEvent) GetMessageDelete() uint64 { + if x, ok := x.GetData().(*MessengerEvent_MessageDelete); ok { + return x.MessageDelete + } + return 0 +} + +type isMessengerEvent_Data interface { + isMessengerEvent_Data() +} + +type MessengerEvent_ThreadUpdate struct { + ThreadUpdate *Thread `protobuf:"bytes,1,opt,name=thread_update,json=threadUpdate,proto3,oneof"` +} + +type MessengerEvent_ThreadDelete struct { + ThreadDelete uint64 `protobuf:"varint,2,opt,name=thread_delete,json=threadDelete,proto3,oneof"` +} + +type MessengerEvent_MessageUpdate struct { + MessageUpdate *Message `protobuf:"bytes,3,opt,name=message_update,json=messageUpdate,proto3,oneof"` +} + +type MessengerEvent_MessageDelete struct { + MessageDelete uint64 `protobuf:"varint,4,opt,name=message_delete,json=messageDelete,proto3,oneof"` +} + +func (*MessengerEvent_ThreadUpdate) isMessengerEvent_Data() {} + +func (*MessengerEvent_ThreadDelete) isMessengerEvent_Data() {} + +func (*MessengerEvent_MessageUpdate) isMessengerEvent_Data() {} + +func (*MessengerEvent_MessageDelete) isMessengerEvent_Data() {} + +var File_resources_messenger_events_proto protoreflect.FileDescriptor + +var file_resources_messenger_events_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, + 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x1a, 0x21, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2f, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfb, 0x01, 0x0a, + 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x42, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x48, 0x00, + 0x52, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x45, + 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, + 0x01, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x4b, 0x5a, 0x49, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x74, + 0x2d, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x65, 0x6e, + 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x3b, 0x6d, 0x65, + 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_resources_messenger_events_proto_rawDescOnce sync.Once + file_resources_messenger_events_proto_rawDescData = file_resources_messenger_events_proto_rawDesc +) + +func file_resources_messenger_events_proto_rawDescGZIP() []byte { + file_resources_messenger_events_proto_rawDescOnce.Do(func() { + file_resources_messenger_events_proto_rawDescData = protoimpl.X.CompressGZIP(file_resources_messenger_events_proto_rawDescData) + }) + return file_resources_messenger_events_proto_rawDescData +} + +var file_resources_messenger_events_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_resources_messenger_events_proto_goTypes = []interface{}{ + (*MessengerEvent)(nil), // 0: resources.messenger.MessengerEvent + (*Thread)(nil), // 1: resources.messenger.Thread + (*Message)(nil), // 2: resources.messenger.Message +} +var file_resources_messenger_events_proto_depIdxs = []int32{ + 1, // 0: resources.messenger.MessengerEvent.thread_update:type_name -> resources.messenger.Thread + 2, // 1: resources.messenger.MessengerEvent.message_update:type_name -> resources.messenger.Message + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_resources_messenger_events_proto_init() } +func file_resources_messenger_events_proto_init() { + if File_resources_messenger_events_proto != nil { + return + } + file_resources_messenger_message_proto_init() + file_resources_messenger_thread_proto_init() + if !protoimpl.UnsafeEnabled { + file_resources_messenger_events_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessengerEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_resources_messenger_events_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*MessengerEvent_ThreadUpdate)(nil), + (*MessengerEvent_ThreadDelete)(nil), + (*MessengerEvent_MessageUpdate)(nil), + (*MessengerEvent_MessageDelete)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_resources_messenger_events_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_resources_messenger_events_proto_goTypes, + DependencyIndexes: file_resources_messenger_events_proto_depIdxs, + MessageInfos: file_resources_messenger_events_proto_msgTypes, + }.Build() + File_resources_messenger_events_proto = out.File + file_resources_messenger_events_proto_rawDesc = nil + file_resources_messenger_events_proto_goTypes = nil + file_resources_messenger_events_proto_depIdxs = nil +} diff --git a/gen/go/proto/resources/messenger/events.pb.validate.go b/gen/go/proto/resources/messenger/events.pb.validate.go new file mode 100644 index 000000000..a291e5a89 --- /dev/null +++ b/gen/go/proto/resources/messenger/events.pb.validate.go @@ -0,0 +1,247 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: resources/messenger/events.proto + +package messenger + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on MessengerEvent with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *MessengerEvent) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MessengerEvent with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in MessengerEventMultiError, +// or nil if none found. +func (m *MessengerEvent) ValidateAll() error { + return m.validate(true) +} + +func (m *MessengerEvent) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + switch v := m.Data.(type) { + case *MessengerEvent_ThreadUpdate: + if v == nil { + err := MessengerEventValidationError{ + field: "Data", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetThreadUpdate()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MessengerEventValidationError{ + field: "ThreadUpdate", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MessengerEventValidationError{ + field: "ThreadUpdate", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetThreadUpdate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MessengerEventValidationError{ + field: "ThreadUpdate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *MessengerEvent_ThreadDelete: + if v == nil { + err := MessengerEventValidationError{ + field: "Data", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + // no validation rules for ThreadDelete + case *MessengerEvent_MessageUpdate: + if v == nil { + err := MessengerEventValidationError{ + field: "Data", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMessageUpdate()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MessengerEventValidationError{ + field: "MessageUpdate", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MessengerEventValidationError{ + field: "MessageUpdate", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMessageUpdate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MessengerEventValidationError{ + field: "MessageUpdate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *MessengerEvent_MessageDelete: + if v == nil { + err := MessengerEventValidationError{ + field: "Data", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + // no validation rules for MessageDelete + default: + _ = v // ensures v is used + } + + if len(errors) > 0 { + return MessengerEventMultiError(errors) + } + + return nil +} + +// MessengerEventMultiError is an error wrapping multiple validation errors +// returned by MessengerEvent.ValidateAll() if the designated constraints +// aren't met. +type MessengerEventMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MessengerEventMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m MessengerEventMultiError) AllErrors() []error { return m } + +// MessengerEventValidationError is the validation error returned by +// MessengerEvent.Validate if the designated constraints aren't met. +type MessengerEventValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MessengerEventValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MessengerEventValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MessengerEventValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MessengerEventValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MessengerEventValidationError) ErrorName() string { return "MessengerEventValidationError" } + +// Error satisfies the builtin error interface +func (e MessengerEventValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMessengerEvent.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MessengerEventValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MessengerEventValidationError{} diff --git a/gen/go/proto/resources/notifications/events.pb.go b/gen/go/proto/resources/notifications/events.pb.go index 696bb30a1..9aae68e8b 100644 --- a/gen/go/proto/resources/notifications/events.pb.go +++ b/gen/go/proto/resources/notifications/events.pb.go @@ -7,6 +7,7 @@ package notifications import ( + messenger "github.com/fivenet-app/fivenet/gen/go/proto/resources/messenger" users "github.com/fivenet-app/fivenet/gen/go/proto/resources/users" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -30,6 +31,7 @@ type UserEvent struct { // // *UserEvent_RefreshToken // *UserEvent_Notification + // *UserEvent_Messenger Data isUserEvent_Data `protobuf_oneof:"data"` } @@ -86,6 +88,13 @@ func (x *UserEvent) GetNotification() *Notification { return nil } +func (x *UserEvent) GetMessenger() *messenger.MessengerEvent { + if x, ok := x.GetData().(*UserEvent_Messenger); ok { + return x.Messenger + } + return nil +} + type isUserEvent_Data interface { isUserEvent_Data() } @@ -95,13 +104,21 @@ type UserEvent_RefreshToken struct { } type UserEvent_Notification struct { + // Notifications Notification *Notification `protobuf:"bytes,2,opt,name=notification,proto3,oneof"` } +type UserEvent_Messenger struct { + // Messenger + Messenger *messenger.MessengerEvent `protobuf:"bytes,3,opt,name=messenger,proto3,oneof"` +} + func (*UserEvent_RefreshToken) isUserEvent_Data() {} func (*UserEvent_Notification) isUserEvent_Data() {} +func (*UserEvent_Messenger) isUserEvent_Data() {} + type JobEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -216,29 +233,36 @@ var file_resources_notifications_events_proto_rawDesc = []byte{ 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x6a, 0x6f, - 0x62, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x87, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, - 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4b, 0x0a, - 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x08, 0x4a, 0x6f, 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x38, - 0x0a, 0x09, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x48, 0x00, 0x52, 0x08, - 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, - 0x53, 0x5a, 0x51, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x69, - 0x76, 0x65, 0x6e, 0x65, 0x74, 0x2d, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, - 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, + 0x72, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x01, 0x0a, 0x09, 0x55, + 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x4b, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x09, + 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, + 0x72, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x08, 0x4a, 0x6f, 0x62, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, + 0x6f, 0x70, 0x73, 0x48, 0x00, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x42, + 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x53, 0x5a, 0x51, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x2d, 0x61, 0x70, 0x70, + 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -255,20 +279,22 @@ func file_resources_notifications_events_proto_rawDescGZIP() []byte { var file_resources_notifications_events_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_resources_notifications_events_proto_goTypes = []interface{}{ - (*UserEvent)(nil), // 0: resources.notifications.UserEvent - (*JobEvent)(nil), // 1: resources.notifications.JobEvent - (*SystemEvent)(nil), // 2: resources.notifications.SystemEvent - (*Notification)(nil), // 3: resources.notifications.Notification - (*users.JobProps)(nil), // 4: resources.users.JobProps + (*UserEvent)(nil), // 0: resources.notifications.UserEvent + (*JobEvent)(nil), // 1: resources.notifications.JobEvent + (*SystemEvent)(nil), // 2: resources.notifications.SystemEvent + (*Notification)(nil), // 3: resources.notifications.Notification + (*messenger.MessengerEvent)(nil), // 4: resources.messenger.MessengerEvent + (*users.JobProps)(nil), // 5: resources.users.JobProps } var file_resources_notifications_events_proto_depIdxs = []int32{ 3, // 0: resources.notifications.UserEvent.notification:type_name -> resources.notifications.Notification - 4, // 1: resources.notifications.JobEvent.job_props:type_name -> resources.users.JobProps - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 4, // 1: resources.notifications.UserEvent.messenger:type_name -> resources.messenger.MessengerEvent + 5, // 2: resources.notifications.JobEvent.job_props:type_name -> resources.users.JobProps + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_resources_notifications_events_proto_init() } @@ -318,6 +344,7 @@ func file_resources_notifications_events_proto_init() { file_resources_notifications_events_proto_msgTypes[0].OneofWrappers = []interface{}{ (*UserEvent_RefreshToken)(nil), (*UserEvent_Notification)(nil), + (*UserEvent_Messenger)(nil), } file_resources_notifications_events_proto_msgTypes[1].OneofWrappers = []interface{}{ (*JobEvent_JobProps)(nil), diff --git a/gen/go/proto/resources/notifications/events.pb.validate.go b/gen/go/proto/resources/notifications/events.pb.validate.go index 085a99674..14171ea53 100644 --- a/gen/go/proto/resources/notifications/events.pb.validate.go +++ b/gen/go/proto/resources/notifications/events.pb.validate.go @@ -111,6 +111,47 @@ func (m *UserEvent) validate(all bool) error { } } + case *UserEvent_Messenger: + if v == nil { + err := UserEventValidationError{ + field: "Data", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMessenger()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, UserEventValidationError{ + field: "Messenger", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, UserEventValidationError{ + field: "Messenger", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMessenger()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return UserEventValidationError{ + field: "Messenger", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: _ = v // ensures v is used } diff --git a/gen/go/proto/services/messenger/access.go b/gen/go/proto/services/messenger/access.go index ae277b653..26ed89783 100644 --- a/gen/go/proto/services/messenger/access.go +++ b/gen/go/proto/services/messenger/access.go @@ -83,7 +83,7 @@ func (s *Server) getThreadAccess(ctx context.Context, threadId uint64) (*messeng }, nil } -func (s *Server) handleThreadAccessChanges(ctx context.Context, tx qrm.DB, mode messenger.AccessLevelUpdateMode, threadId uint64, access *messenger.ThreadAccess) error { +func (s *Server) handleThreadAccessChanges(ctx context.Context, tx qrm.DB, mode messenger.AccessLevelUpdateMode, threadId uint64, access *messenger.ThreadAccess) (*messenger.ThreadAccess, error) { switch mode { case messenger.AccessLevelUpdateMode_ACCESS_LEVEL_UPDATE_MODE_UNSPECIFIED: fallthrough @@ -91,35 +91,37 @@ func (s *Server) handleThreadAccessChanges(ctx context.Context, tx qrm.DB, mode // Get existing job and user accesses from database current, err := s.getThreadAccess(ctx, threadId) if err != nil { - return err + return nil, err } toCreate, toUpdate, toDelete := s.compareThreadAccess(current, access) if err := s.createThreadAccess(ctx, tx, threadId, toCreate); err != nil { - return err + return nil, err } if err := s.updateThreadAccess(ctx, tx, threadId, toUpdate); err != nil { - return err + return nil, err } if err := s.deleteThreadAccess(ctx, tx, threadId, toDelete); err != nil { - return err + return nil, err } + return toDelete, nil + case messenger.AccessLevelUpdateMode_ACCESS_LEVEL_UPDATE_MODE_DELETE: if err := s.deleteThreadAccess(ctx, tx, threadId, access); err != nil { - return err + return nil, err } case messenger.AccessLevelUpdateMode_ACCESS_LEVEL_UPDATE_MODE_CLEAR: if err := s.clearThreadAccess(ctx, tx, threadId); err != nil { - return err + return nil, err } } - return nil + return nil, nil } func (s *Server) compareThreadAccess(current, in *messenger.ThreadAccess) (toCreate *messenger.ThreadAccess, toUpdate *messenger.ThreadAccess, toDelete *messenger.ThreadAccess) { diff --git a/gen/go/proto/services/messenger/events.go b/gen/go/proto/services/messenger/events.go index 820f5315c..da7ee615f 100644 --- a/gen/go/proto/services/messenger/events.go +++ b/gen/go/proto/services/messenger/events.go @@ -1,3 +1,27 @@ package messenger -// TODO +import ( + "context" + "fmt" + + "github.com/fivenet-app/fivenet/gen/go/proto/resources/messenger" + "github.com/fivenet-app/fivenet/gen/go/proto/resources/notifications" + "github.com/fivenet-app/fivenet/pkg/notifi" + "github.com/fivenet-app/fivenet/pkg/utils" +) + +func (s *Server) sendUpdate(ctx context.Context, event *messenger.MessengerEvent, users []int32) error { + users = utils.RemoveSliceDuplicates(users) + + for _, userId := range users { + if _, err := s.js.PublishAsyncProto(ctx, fmt.Sprintf("%s.%s.%d", notifi.BaseSubject, notifi.UserTopic, userId), ¬ifications.UserEvent{ + Data: ¬ifications.UserEvent_Messenger{ + Messenger: event, + }, + }); err != nil { + return err + } + } + + return nil +} diff --git a/gen/go/proto/services/messenger/message.go b/gen/go/proto/services/messenger/message.go index 32b8f3b6a..69a222bcd 100644 --- a/gen/go/proto/services/messenger/message.go +++ b/gen/go/proto/services/messenger/message.go @@ -190,6 +190,31 @@ func (s *Server) PostMessage(ctx context.Context, req *PostMessageRequest) (*Pos auditEntry.State = int16(rector.EventType_EVENT_TYPE_CREATED) + thread, err := s.getThread(ctx, message.ThreadId, userInfo, true) + if err != nil { + return nil, errorsmessenger.ErrFailedQuery + } + + if thread != nil && thread.Access != nil && len(thread.Access.Users) > 0 { + userIds := []int32{userInfo.UserId} + if thread.CreatorId != nil { + userIds = append(userIds, *thread.CreatorId) + } + for _, ua := range thread.Access.Users { + userIds = append(userIds, ua.UserId) + } + + s.sendUpdate(ctx, &messenger.MessengerEvent{ + Data: &messenger.MessengerEvent_MessageUpdate{ + MessageUpdate: message, + }, + }, userIds) + + if err := s.setUnreadState(ctx, message.ThreadId, userIds); err != nil { + return nil, errswrap.NewError(err, errorsmessenger.ErrFailedQuery) + } + } + return &PostMessageResponse{ Message: message, }, nil @@ -231,6 +256,24 @@ func (s *Server) DeleteMessage(ctx context.Context, req *DeleteMessageRequest) ( return nil, errswrap.NewError(err, errorsmessenger.ErrFailedQuery) } + thread, err := s.getThread(ctx, req.ThreadId, userInfo, true) + if err != nil { + return nil, errorsmessenger.ErrFailedQuery + } + + if thread != nil && thread.Access != nil && len(thread.Access.Users) > 0 { + userIds := []int32{userInfo.UserId} + for _, ua := range thread.Access.Users { + userIds = append(userIds, ua.UserId) + } + + s.sendUpdate(ctx, &messenger.MessengerEvent{ + Data: &messenger.MessengerEvent_MessageDelete{ + MessageDelete: req.MessageId, + }, + }, userIds) + } + auditEntry.State = int16(rector.EventType_EVENT_TYPE_DELETED) return &DeleteMessageResponse{}, nil diff --git a/gen/go/proto/services/messenger/messenger.pb.go b/gen/go/proto/services/messenger/messenger.pb.go index 6bafcfda2..a35cd7905 100644 --- a/gen/go/proto/services/messenger/messenger.pb.go +++ b/gen/go/proto/services/messenger/messenger.pb.go @@ -134,6 +134,100 @@ func (x *ListThreadsResponse) GetThreads() []*messenger.Thread { return nil } +type GetThreadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ThreadId uint64 `protobuf:"varint,1,opt,name=thread_id,json=threadId,proto3" json:"thread_id,omitempty"` +} + +func (x *GetThreadRequest) Reset() { + *x = GetThreadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_services_messenger_messenger_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetThreadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetThreadRequest) ProtoMessage() {} + +func (x *GetThreadRequest) ProtoReflect() protoreflect.Message { + mi := &file_services_messenger_messenger_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 GetThreadRequest.ProtoReflect.Descriptor instead. +func (*GetThreadRequest) Descriptor() ([]byte, []int) { + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{2} +} + +func (x *GetThreadRequest) GetThreadId() uint64 { + if x != nil { + return x.ThreadId + } + return 0 +} + +type GetThreadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Thread *messenger.Thread `protobuf:"bytes,1,opt,name=thread,proto3" json:"thread,omitempty"` +} + +func (x *GetThreadResponse) Reset() { + *x = GetThreadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_services_messenger_messenger_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetThreadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetThreadResponse) ProtoMessage() {} + +func (x *GetThreadResponse) ProtoReflect() protoreflect.Message { + mi := &file_services_messenger_messenger_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 GetThreadResponse.ProtoReflect.Descriptor instead. +func (*GetThreadResponse) Descriptor() ([]byte, []int) { + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{3} +} + +func (x *GetThreadResponse) GetThread() *messenger.Thread { + if x != nil { + return x.Thread + } + return nil +} + type CreateOrUpdateThreadRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -145,7 +239,7 @@ type CreateOrUpdateThreadRequest struct { func (x *CreateOrUpdateThreadRequest) Reset() { *x = CreateOrUpdateThreadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[2] + mi := &file_services_messenger_messenger_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -158,7 +252,7 @@ func (x *CreateOrUpdateThreadRequest) String() string { func (*CreateOrUpdateThreadRequest) ProtoMessage() {} func (x *CreateOrUpdateThreadRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[2] + mi := &file_services_messenger_messenger_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -171,7 +265,7 @@ func (x *CreateOrUpdateThreadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateOrUpdateThreadRequest.ProtoReflect.Descriptor instead. func (*CreateOrUpdateThreadRequest) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{2} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{4} } func (x *CreateOrUpdateThreadRequest) GetThread() *messenger.Thread { @@ -192,7 +286,7 @@ type CreateOrUpdateThreadResponse struct { func (x *CreateOrUpdateThreadResponse) Reset() { *x = CreateOrUpdateThreadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[3] + mi := &file_services_messenger_messenger_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -205,7 +299,7 @@ func (x *CreateOrUpdateThreadResponse) String() string { func (*CreateOrUpdateThreadResponse) ProtoMessage() {} func (x *CreateOrUpdateThreadResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[3] + mi := &file_services_messenger_messenger_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -218,7 +312,7 @@ func (x *CreateOrUpdateThreadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateOrUpdateThreadResponse.ProtoReflect.Descriptor instead. func (*CreateOrUpdateThreadResponse) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{3} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{5} } func (x *CreateOrUpdateThreadResponse) GetThread() *messenger.Thread { @@ -239,7 +333,7 @@ type DeleteThreadRequest struct { func (x *DeleteThreadRequest) Reset() { *x = DeleteThreadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[4] + mi := &file_services_messenger_messenger_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -252,7 +346,7 @@ func (x *DeleteThreadRequest) String() string { func (*DeleteThreadRequest) ProtoMessage() {} func (x *DeleteThreadRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[4] + mi := &file_services_messenger_messenger_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -265,7 +359,7 @@ func (x *DeleteThreadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteThreadRequest.ProtoReflect.Descriptor instead. func (*DeleteThreadRequest) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{4} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{6} } func (x *DeleteThreadRequest) GetThreadId() uint64 { @@ -284,7 +378,7 @@ type DeleteThreadResponse struct { func (x *DeleteThreadResponse) Reset() { *x = DeleteThreadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[5] + mi := &file_services_messenger_messenger_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -297,7 +391,7 @@ func (x *DeleteThreadResponse) String() string { func (*DeleteThreadResponse) ProtoMessage() {} func (x *DeleteThreadResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[5] + mi := &file_services_messenger_messenger_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -310,7 +404,7 @@ func (x *DeleteThreadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteThreadResponse.ProtoReflect.Descriptor instead. func (*DeleteThreadResponse) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{5} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{7} } type SetThreadUserStateRequest struct { @@ -324,7 +418,7 @@ type SetThreadUserStateRequest struct { func (x *SetThreadUserStateRequest) Reset() { *x = SetThreadUserStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[6] + mi := &file_services_messenger_messenger_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -337,7 +431,7 @@ func (x *SetThreadUserStateRequest) String() string { func (*SetThreadUserStateRequest) ProtoMessage() {} func (x *SetThreadUserStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[6] + mi := &file_services_messenger_messenger_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -350,7 +444,7 @@ func (x *SetThreadUserStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetThreadUserStateRequest.ProtoReflect.Descriptor instead. func (*SetThreadUserStateRequest) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{6} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{8} } func (x *SetThreadUserStateRequest) GetState() *messenger.ThreadUserState { @@ -369,7 +463,7 @@ type SetThreadUserStateResponse struct { func (x *SetThreadUserStateResponse) Reset() { *x = SetThreadUserStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[7] + mi := &file_services_messenger_messenger_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -382,7 +476,7 @@ func (x *SetThreadUserStateResponse) String() string { func (*SetThreadUserStateResponse) ProtoMessage() {} func (x *SetThreadUserStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[7] + mi := &file_services_messenger_messenger_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -395,7 +489,7 @@ func (x *SetThreadUserStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetThreadUserStateResponse.ProtoReflect.Descriptor instead. func (*SetThreadUserStateResponse) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{7} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{9} } type GetThreadMessagesRequest struct { @@ -410,7 +504,7 @@ type GetThreadMessagesRequest struct { func (x *GetThreadMessagesRequest) Reset() { *x = GetThreadMessagesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[8] + mi := &file_services_messenger_messenger_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -423,7 +517,7 @@ func (x *GetThreadMessagesRequest) String() string { func (*GetThreadMessagesRequest) ProtoMessage() {} func (x *GetThreadMessagesRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[8] + mi := &file_services_messenger_messenger_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -436,7 +530,7 @@ func (x *GetThreadMessagesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThreadMessagesRequest.ProtoReflect.Descriptor instead. func (*GetThreadMessagesRequest) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{8} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{10} } func (x *GetThreadMessagesRequest) GetThreadId() uint64 { @@ -464,7 +558,7 @@ type GetThreadMessagesResponse struct { func (x *GetThreadMessagesResponse) Reset() { *x = GetThreadMessagesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[9] + mi := &file_services_messenger_messenger_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -477,7 +571,7 @@ func (x *GetThreadMessagesResponse) String() string { func (*GetThreadMessagesResponse) ProtoMessage() {} func (x *GetThreadMessagesResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[9] + mi := &file_services_messenger_messenger_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -490,7 +584,7 @@ func (x *GetThreadMessagesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThreadMessagesResponse.ProtoReflect.Descriptor instead. func (*GetThreadMessagesResponse) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{9} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{11} } func (x *GetThreadMessagesResponse) GetMessages() []*messenger.Message { @@ -511,7 +605,7 @@ type PostMessageRequest struct { func (x *PostMessageRequest) Reset() { *x = PostMessageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[10] + mi := &file_services_messenger_messenger_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -524,7 +618,7 @@ func (x *PostMessageRequest) String() string { func (*PostMessageRequest) ProtoMessage() {} func (x *PostMessageRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[10] + mi := &file_services_messenger_messenger_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -537,7 +631,7 @@ func (x *PostMessageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PostMessageRequest.ProtoReflect.Descriptor instead. func (*PostMessageRequest) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{10} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{12} } func (x *PostMessageRequest) GetMessage() *messenger.Message { @@ -558,7 +652,7 @@ type PostMessageResponse struct { func (x *PostMessageResponse) Reset() { *x = PostMessageResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[11] + mi := &file_services_messenger_messenger_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -571,7 +665,7 @@ func (x *PostMessageResponse) String() string { func (*PostMessageResponse) ProtoMessage() {} func (x *PostMessageResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[11] + mi := &file_services_messenger_messenger_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -584,7 +678,7 @@ func (x *PostMessageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PostMessageResponse.ProtoReflect.Descriptor instead. func (*PostMessageResponse) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{11} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{13} } func (x *PostMessageResponse) GetMessage() *messenger.Message { @@ -606,7 +700,7 @@ type DeleteMessageRequest struct { func (x *DeleteMessageRequest) Reset() { *x = DeleteMessageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[12] + mi := &file_services_messenger_messenger_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -619,7 +713,7 @@ func (x *DeleteMessageRequest) String() string { func (*DeleteMessageRequest) ProtoMessage() {} func (x *DeleteMessageRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[12] + mi := &file_services_messenger_messenger_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -632,7 +726,7 @@ func (x *DeleteMessageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMessageRequest.ProtoReflect.Descriptor instead. func (*DeleteMessageRequest) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{12} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{14} } func (x *DeleteMessageRequest) GetThreadId() uint64 { @@ -658,7 +752,7 @@ type DeleteMessageResponse struct { func (x *DeleteMessageResponse) Reset() { *x = DeleteMessageResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_messenger_messenger_proto_msgTypes[13] + mi := &file_services_messenger_messenger_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -671,7 +765,7 @@ func (x *DeleteMessageResponse) String() string { func (*DeleteMessageResponse) ProtoMessage() {} func (x *DeleteMessageResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_messenger_messenger_proto_msgTypes[13] + mi := &file_services_messenger_messenger_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -684,7 +778,7 @@ func (x *DeleteMessageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMessageResponse.ProtoReflect.Descriptor instead. func (*DeleteMessageResponse) Descriptor() ([]byte, []int) { - return file_services_messenger_messenger_proto_rawDescGZIP(), []int{13} + return file_services_messenger_messenger_proto_rawDescGZIP(), []int{15} } var File_services_messenger_messenger_proto protoreflect.FileDescriptor @@ -726,114 +820,128 @@ var file_services_messenger_messenger_proto_rawDesc = []byte{ 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x07, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x73, 0x22, 0x5c, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3d, 0x0a, 0x06, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x22, - 0x53, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x33, 0x0a, 0x06, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x73, 0x22, 0x33, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x22, 0x48, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, + 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x06, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x22, 0x5c, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3d, 0x0a, 0x06, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x06, 0x74, 0x68, - 0x72, 0x65, 0x61, 0x64, 0x22, 0x36, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, - 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, - 0x30, 0x01, 0x52, 0x08, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x22, 0x16, 0x0a, 0x14, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x61, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, - 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x65, 0x74, 0x54, 0x68, - 0x72, 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x71, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x49, 0x64, 0x12, 0x34, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, - 0x56, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x22, 0x53, + 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x06, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, + 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x06, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x22, 0x36, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, + 0x01, 0x52, 0x08, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x61, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x71, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x49, + 0x64, 0x12, 0x34, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x13, 0x50, 0x6f, 0x73, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x5a, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xfd, 0x05, 0x0a, 0x10, - 0x4d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x5e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, - 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, - 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x79, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x12, 0x2f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0c, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x12, 0x27, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x56, + 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x13, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, + 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x5a, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x12, 0x21, + 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, + 0x64, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd7, 0x06, 0x0a, 0x10, 0x4d, + 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x5e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x26, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, + 0x67, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x58, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x12, 0x24, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, + 0x72, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x14, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x12, 0x2f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, + 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x27, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, - 0x0a, 0x12, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, + 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, + 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, - 0x72, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x4a, 0x5a, 0x48, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, - 0x74, 0x2d, 0x61, 0x70, 0x70, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x65, - 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x3b, 0x6d, 0x65, - 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x12, 0x2c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, + 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, + 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, + 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, + 0x65, 0x72, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, + 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, + 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x2d, 0x61, 0x70, 0x70, 0x2f, 0x66, + 0x69, 0x76, 0x65, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x73, + 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x3b, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -848,60 +956,65 @@ func file_services_messenger_messenger_proto_rawDescGZIP() []byte { return file_services_messenger_messenger_proto_rawDescData } -var file_services_messenger_messenger_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_services_messenger_messenger_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_services_messenger_messenger_proto_goTypes = []interface{}{ (*ListThreadsRequest)(nil), // 0: services.messenger.ListThreadsRequest (*ListThreadsResponse)(nil), // 1: services.messenger.ListThreadsResponse - (*CreateOrUpdateThreadRequest)(nil), // 2: services.messenger.CreateOrUpdateThreadRequest - (*CreateOrUpdateThreadResponse)(nil), // 3: services.messenger.CreateOrUpdateThreadResponse - (*DeleteThreadRequest)(nil), // 4: services.messenger.DeleteThreadRequest - (*DeleteThreadResponse)(nil), // 5: services.messenger.DeleteThreadResponse - (*SetThreadUserStateRequest)(nil), // 6: services.messenger.SetThreadUserStateRequest - (*SetThreadUserStateResponse)(nil), // 7: services.messenger.SetThreadUserStateResponse - (*GetThreadMessagesRequest)(nil), // 8: services.messenger.GetThreadMessagesRequest - (*GetThreadMessagesResponse)(nil), // 9: services.messenger.GetThreadMessagesResponse - (*PostMessageRequest)(nil), // 10: services.messenger.PostMessageRequest - (*PostMessageResponse)(nil), // 11: services.messenger.PostMessageResponse - (*DeleteMessageRequest)(nil), // 12: services.messenger.DeleteMessageRequest - (*DeleteMessageResponse)(nil), // 13: services.messenger.DeleteMessageResponse - (*database.PaginationRequest)(nil), // 14: resources.common.database.PaginationRequest - (*timestamp.Timestamp)(nil), // 15: resources.timestamp.Timestamp - (*database.PaginationResponse)(nil), // 16: resources.common.database.PaginationResponse - (*messenger.Thread)(nil), // 17: resources.messenger.Thread - (*messenger.ThreadUserState)(nil), // 18: resources.messenger.ThreadUserState - (*messenger.Message)(nil), // 19: resources.messenger.Message + (*GetThreadRequest)(nil), // 2: services.messenger.GetThreadRequest + (*GetThreadResponse)(nil), // 3: services.messenger.GetThreadResponse + (*CreateOrUpdateThreadRequest)(nil), // 4: services.messenger.CreateOrUpdateThreadRequest + (*CreateOrUpdateThreadResponse)(nil), // 5: services.messenger.CreateOrUpdateThreadResponse + (*DeleteThreadRequest)(nil), // 6: services.messenger.DeleteThreadRequest + (*DeleteThreadResponse)(nil), // 7: services.messenger.DeleteThreadResponse + (*SetThreadUserStateRequest)(nil), // 8: services.messenger.SetThreadUserStateRequest + (*SetThreadUserStateResponse)(nil), // 9: services.messenger.SetThreadUserStateResponse + (*GetThreadMessagesRequest)(nil), // 10: services.messenger.GetThreadMessagesRequest + (*GetThreadMessagesResponse)(nil), // 11: services.messenger.GetThreadMessagesResponse + (*PostMessageRequest)(nil), // 12: services.messenger.PostMessageRequest + (*PostMessageResponse)(nil), // 13: services.messenger.PostMessageResponse + (*DeleteMessageRequest)(nil), // 14: services.messenger.DeleteMessageRequest + (*DeleteMessageResponse)(nil), // 15: services.messenger.DeleteMessageResponse + (*database.PaginationRequest)(nil), // 16: resources.common.database.PaginationRequest + (*timestamp.Timestamp)(nil), // 17: resources.timestamp.Timestamp + (*database.PaginationResponse)(nil), // 18: resources.common.database.PaginationResponse + (*messenger.Thread)(nil), // 19: resources.messenger.Thread + (*messenger.ThreadUserState)(nil), // 20: resources.messenger.ThreadUserState + (*messenger.Message)(nil), // 21: resources.messenger.Message } var file_services_messenger_messenger_proto_depIdxs = []int32{ - 14, // 0: services.messenger.ListThreadsRequest.pagination:type_name -> resources.common.database.PaginationRequest - 15, // 1: services.messenger.ListThreadsRequest.after:type_name -> resources.timestamp.Timestamp - 16, // 2: services.messenger.ListThreadsResponse.pagination:type_name -> resources.common.database.PaginationResponse - 17, // 3: services.messenger.ListThreadsResponse.threads:type_name -> resources.messenger.Thread - 17, // 4: services.messenger.CreateOrUpdateThreadRequest.thread:type_name -> resources.messenger.Thread - 17, // 5: services.messenger.CreateOrUpdateThreadResponse.thread:type_name -> resources.messenger.Thread - 18, // 6: services.messenger.SetThreadUserStateRequest.state:type_name -> resources.messenger.ThreadUserState - 15, // 7: services.messenger.GetThreadMessagesRequest.after:type_name -> resources.timestamp.Timestamp - 19, // 8: services.messenger.GetThreadMessagesResponse.messages:type_name -> resources.messenger.Message - 19, // 9: services.messenger.PostMessageRequest.message:type_name -> resources.messenger.Message - 19, // 10: services.messenger.PostMessageResponse.message:type_name -> resources.messenger.Message - 0, // 11: services.messenger.MessengerService.ListThreads:input_type -> services.messenger.ListThreadsRequest - 2, // 12: services.messenger.MessengerService.CreateOrUpdateThread:input_type -> services.messenger.CreateOrUpdateThreadRequest - 4, // 13: services.messenger.MessengerService.DeleteThread:input_type -> services.messenger.DeleteThreadRequest - 6, // 14: services.messenger.MessengerService.SetThreadUserState:input_type -> services.messenger.SetThreadUserStateRequest - 8, // 15: services.messenger.MessengerService.GetThreadMessages:input_type -> services.messenger.GetThreadMessagesRequest - 10, // 16: services.messenger.MessengerService.PostMessage:input_type -> services.messenger.PostMessageRequest - 12, // 17: services.messenger.MessengerService.DeleteMessage:input_type -> services.messenger.DeleteMessageRequest - 1, // 18: services.messenger.MessengerService.ListThreads:output_type -> services.messenger.ListThreadsResponse - 3, // 19: services.messenger.MessengerService.CreateOrUpdateThread:output_type -> services.messenger.CreateOrUpdateThreadResponse - 5, // 20: services.messenger.MessengerService.DeleteThread:output_type -> services.messenger.DeleteThreadResponse - 7, // 21: services.messenger.MessengerService.SetThreadUserState:output_type -> services.messenger.SetThreadUserStateResponse - 9, // 22: services.messenger.MessengerService.GetThreadMessages:output_type -> services.messenger.GetThreadMessagesResponse - 11, // 23: services.messenger.MessengerService.PostMessage:output_type -> services.messenger.PostMessageResponse - 13, // 24: services.messenger.MessengerService.DeleteMessage:output_type -> services.messenger.DeleteMessageResponse - 18, // [18:25] is the sub-list for method output_type - 11, // [11:18] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 16, // 0: services.messenger.ListThreadsRequest.pagination:type_name -> resources.common.database.PaginationRequest + 17, // 1: services.messenger.ListThreadsRequest.after:type_name -> resources.timestamp.Timestamp + 18, // 2: services.messenger.ListThreadsResponse.pagination:type_name -> resources.common.database.PaginationResponse + 19, // 3: services.messenger.ListThreadsResponse.threads:type_name -> resources.messenger.Thread + 19, // 4: services.messenger.GetThreadResponse.thread:type_name -> resources.messenger.Thread + 19, // 5: services.messenger.CreateOrUpdateThreadRequest.thread:type_name -> resources.messenger.Thread + 19, // 6: services.messenger.CreateOrUpdateThreadResponse.thread:type_name -> resources.messenger.Thread + 20, // 7: services.messenger.SetThreadUserStateRequest.state:type_name -> resources.messenger.ThreadUserState + 17, // 8: services.messenger.GetThreadMessagesRequest.after:type_name -> resources.timestamp.Timestamp + 21, // 9: services.messenger.GetThreadMessagesResponse.messages:type_name -> resources.messenger.Message + 21, // 10: services.messenger.PostMessageRequest.message:type_name -> resources.messenger.Message + 21, // 11: services.messenger.PostMessageResponse.message:type_name -> resources.messenger.Message + 0, // 12: services.messenger.MessengerService.ListThreads:input_type -> services.messenger.ListThreadsRequest + 2, // 13: services.messenger.MessengerService.GetThread:input_type -> services.messenger.GetThreadRequest + 4, // 14: services.messenger.MessengerService.CreateOrUpdateThread:input_type -> services.messenger.CreateOrUpdateThreadRequest + 6, // 15: services.messenger.MessengerService.DeleteThread:input_type -> services.messenger.DeleteThreadRequest + 8, // 16: services.messenger.MessengerService.SetThreadUserState:input_type -> services.messenger.SetThreadUserStateRequest + 10, // 17: services.messenger.MessengerService.GetThreadMessages:input_type -> services.messenger.GetThreadMessagesRequest + 12, // 18: services.messenger.MessengerService.PostMessage:input_type -> services.messenger.PostMessageRequest + 14, // 19: services.messenger.MessengerService.DeleteMessage:input_type -> services.messenger.DeleteMessageRequest + 1, // 20: services.messenger.MessengerService.ListThreads:output_type -> services.messenger.ListThreadsResponse + 3, // 21: services.messenger.MessengerService.GetThread:output_type -> services.messenger.GetThreadResponse + 5, // 22: services.messenger.MessengerService.CreateOrUpdateThread:output_type -> services.messenger.CreateOrUpdateThreadResponse + 7, // 23: services.messenger.MessengerService.DeleteThread:output_type -> services.messenger.DeleteThreadResponse + 9, // 24: services.messenger.MessengerService.SetThreadUserState:output_type -> services.messenger.SetThreadUserStateResponse + 11, // 25: services.messenger.MessengerService.GetThreadMessages:output_type -> services.messenger.GetThreadMessagesResponse + 13, // 26: services.messenger.MessengerService.PostMessage:output_type -> services.messenger.PostMessageResponse + 15, // 27: services.messenger.MessengerService.DeleteMessage:output_type -> services.messenger.DeleteMessageResponse + 20, // [20:28] is the sub-list for method output_type + 12, // [12:20] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_services_messenger_messenger_proto_init() } @@ -935,7 +1048,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateOrUpdateThreadRequest); i { + switch v := v.(*GetThreadRequest); i { case 0: return &v.state case 1: @@ -947,7 +1060,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateOrUpdateThreadResponse); i { + switch v := v.(*GetThreadResponse); i { case 0: return &v.state case 1: @@ -959,7 +1072,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteThreadRequest); i { + switch v := v.(*CreateOrUpdateThreadRequest); i { case 0: return &v.state case 1: @@ -971,7 +1084,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteThreadResponse); i { + switch v := v.(*CreateOrUpdateThreadResponse); i { case 0: return &v.state case 1: @@ -983,7 +1096,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetThreadUserStateRequest); i { + switch v := v.(*DeleteThreadRequest); i { case 0: return &v.state case 1: @@ -995,7 +1108,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetThreadUserStateResponse); i { + switch v := v.(*DeleteThreadResponse); i { case 0: return &v.state case 1: @@ -1007,7 +1120,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetThreadMessagesRequest); i { + switch v := v.(*SetThreadUserStateRequest); i { case 0: return &v.state case 1: @@ -1019,7 +1132,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetThreadMessagesResponse); i { + switch v := v.(*SetThreadUserStateResponse); i { case 0: return &v.state case 1: @@ -1031,7 +1144,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostMessageRequest); i { + switch v := v.(*GetThreadMessagesRequest); i { case 0: return &v.state case 1: @@ -1043,7 +1156,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostMessageResponse); i { + switch v := v.(*GetThreadMessagesResponse); i { case 0: return &v.state case 1: @@ -1055,7 +1168,7 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMessageRequest); i { + switch v := v.(*PostMessageRequest); i { case 0: return &v.state case 1: @@ -1067,6 +1180,30 @@ func file_services_messenger_messenger_proto_init() { } } file_services_messenger_messenger_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PostMessageResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_services_messenger_messenger_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteMessageRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_services_messenger_messenger_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteMessageResponse); i { case 0: return &v.state @@ -1086,7 +1223,7 @@ func file_services_messenger_messenger_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_services_messenger_messenger_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/proto/services/messenger/messenger.pb.validate.go b/gen/go/proto/services/messenger/messenger.pb.validate.go index 224c93048..a4398efa3 100644 --- a/gen/go/proto/services/messenger/messenger.pb.validate.go +++ b/gen/go/proto/services/messenger/messenger.pb.validate.go @@ -386,6 +386,239 @@ var _ interface { ErrorName() string } = ListThreadsResponseValidationError{} +// Validate checks the field values on GetThreadRequest with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *GetThreadRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GetThreadRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// GetThreadRequestMultiError, or nil if none found. +func (m *GetThreadRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *GetThreadRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for ThreadId + + if len(errors) > 0 { + return GetThreadRequestMultiError(errors) + } + + return nil +} + +// GetThreadRequestMultiError is an error wrapping multiple validation errors +// returned by GetThreadRequest.ValidateAll() if the designated constraints +// aren't met. +type GetThreadRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GetThreadRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m GetThreadRequestMultiError) AllErrors() []error { return m } + +// GetThreadRequestValidationError is the validation error returned by +// GetThreadRequest.Validate if the designated constraints aren't met. +type GetThreadRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GetThreadRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GetThreadRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GetThreadRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GetThreadRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GetThreadRequestValidationError) ErrorName() string { return "GetThreadRequestValidationError" } + +// Error satisfies the builtin error interface +func (e GetThreadRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sGetThreadRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GetThreadRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GetThreadRequestValidationError{} + +// Validate checks the field values on GetThreadResponse with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *GetThreadResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GetThreadResponse with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// GetThreadResponseMultiError, or nil if none found. +func (m *GetThreadResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *GetThreadResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetThread()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GetThreadResponseValidationError{ + field: "Thread", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GetThreadResponseValidationError{ + field: "Thread", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetThread()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GetThreadResponseValidationError{ + field: "Thread", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return GetThreadResponseMultiError(errors) + } + + return nil +} + +// GetThreadResponseMultiError is an error wrapping multiple validation errors +// returned by GetThreadResponse.ValidateAll() if the designated constraints +// aren't met. +type GetThreadResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GetThreadResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m GetThreadResponseMultiError) AllErrors() []error { return m } + +// GetThreadResponseValidationError is the validation error returned by +// GetThreadResponse.Validate if the designated constraints aren't met. +type GetThreadResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GetThreadResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GetThreadResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GetThreadResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GetThreadResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GetThreadResponseValidationError) ErrorName() string { + return "GetThreadResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e GetThreadResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sGetThreadResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GetThreadResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GetThreadResponseValidationError{} + // Validate checks the field values on CreateOrUpdateThreadRequest with the // rules defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. diff --git a/gen/go/proto/services/messenger/messenger_grpc.pb.go b/gen/go/proto/services/messenger/messenger_grpc.pb.go index e2b5a5300..41b4d0811 100644 --- a/gen/go/proto/services/messenger/messenger_grpc.pb.go +++ b/gen/go/proto/services/messenger/messenger_grpc.pb.go @@ -20,6 +20,7 @@ const _ = grpc.SupportPackageIsVersion7 const ( MessengerService_ListThreads_FullMethodName = "/services.messenger.MessengerService/ListThreads" + MessengerService_GetThread_FullMethodName = "/services.messenger.MessengerService/GetThread" MessengerService_CreateOrUpdateThread_FullMethodName = "/services.messenger.MessengerService/CreateOrUpdateThread" MessengerService_DeleteThread_FullMethodName = "/services.messenger.MessengerService/DeleteThread" MessengerService_SetThreadUserState_FullMethodName = "/services.messenger.MessengerService/SetThreadUserState" @@ -34,6 +35,8 @@ const ( type MessengerServiceClient interface { // @perm ListThreads(ctx context.Context, in *ListThreadsRequest, opts ...grpc.CallOption) (*ListThreadsResponse, error) + // @perm: Name=ListThreads + GetThread(ctx context.Context, in *GetThreadRequest, opts ...grpc.CallOption) (*GetThreadResponse, error) // @perm CreateOrUpdateThread(ctx context.Context, in *CreateOrUpdateThreadRequest, opts ...grpc.CallOption) (*CreateOrUpdateThreadResponse, error) // @perm @@ -65,6 +68,15 @@ func (c *messengerServiceClient) ListThreads(ctx context.Context, in *ListThread return out, nil } +func (c *messengerServiceClient) GetThread(ctx context.Context, in *GetThreadRequest, opts ...grpc.CallOption) (*GetThreadResponse, error) { + out := new(GetThreadResponse) + err := c.cc.Invoke(ctx, MessengerService_GetThread_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *messengerServiceClient) CreateOrUpdateThread(ctx context.Context, in *CreateOrUpdateThreadRequest, opts ...grpc.CallOption) (*CreateOrUpdateThreadResponse, error) { out := new(CreateOrUpdateThreadResponse) err := c.cc.Invoke(ctx, MessengerService_CreateOrUpdateThread_FullMethodName, in, out, opts...) @@ -125,6 +137,8 @@ func (c *messengerServiceClient) DeleteMessage(ctx context.Context, in *DeleteMe type MessengerServiceServer interface { // @perm ListThreads(context.Context, *ListThreadsRequest) (*ListThreadsResponse, error) + // @perm: Name=ListThreads + GetThread(context.Context, *GetThreadRequest) (*GetThreadResponse, error) // @perm CreateOrUpdateThread(context.Context, *CreateOrUpdateThreadRequest) (*CreateOrUpdateThreadResponse, error) // @perm @@ -147,6 +161,9 @@ type UnimplementedMessengerServiceServer struct { func (UnimplementedMessengerServiceServer) ListThreads(context.Context, *ListThreadsRequest) (*ListThreadsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListThreads not implemented") } +func (UnimplementedMessengerServiceServer) GetThread(context.Context, *GetThreadRequest) (*GetThreadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetThread not implemented") +} func (UnimplementedMessengerServiceServer) CreateOrUpdateThread(context.Context, *CreateOrUpdateThreadRequest) (*CreateOrUpdateThreadResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateOrUpdateThread not implemented") } @@ -196,6 +213,24 @@ func _MessengerService_ListThreads_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _MessengerService_GetThread_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetThreadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MessengerServiceServer).GetThread(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MessengerService_GetThread_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MessengerServiceServer).GetThread(ctx, req.(*GetThreadRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _MessengerService_CreateOrUpdateThread_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateOrUpdateThreadRequest) if err := dec(in); err != nil { @@ -315,6 +350,10 @@ var MessengerService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListThreads", Handler: _MessengerService_ListThreads_Handler, }, + { + MethodName: "GetThread", + Handler: _MessengerService_GetThread_Handler, + }, { MethodName: "CreateOrUpdateThread", Handler: _MessengerService_CreateOrUpdateThread_Handler, diff --git a/gen/go/proto/services/messenger/service_perms.go b/gen/go/proto/services/messenger/service_perms.go index be339c4b8..34f898b57 100644 --- a/gen/go/proto/services/messenger/service_perms.go +++ b/gen/go/proto/services/messenger/service_perms.go @@ -12,6 +12,7 @@ var PermsRemap = map[string]string{ // Service: MessengerService "MessengerService/DeleteMessage": "SuperUser", + "MessengerService/GetThread": "MessengerService/ListThreads", "MessengerService/GetThreadMessages": "MessengerService/ListThreads", "MessengerService/SetThreadUserState": "MessengerService/ListThreads", } diff --git a/gen/go/proto/services/messenger/thread.go b/gen/go/proto/services/messenger/thread.go index 65ca1a8e7..0c1652d51 100644 --- a/gen/go/proto/services/messenger/thread.go +++ b/gen/go/proto/services/messenger/thread.go @@ -241,6 +241,29 @@ func (s *Server) getThread(ctx context.Context, threadId uint64, userInfo *useri return &thread, nil } +func (s *Server) GetThread(ctx context.Context, req *GetThreadRequest) (*GetThreadResponse, error) { + userInfo := auth.MustGetUserInfoFromContext(ctx) + + check, err := s.checkIfUserHasAccessToThread(ctx, req.ThreadId, userInfo, messenger.AccessLevel_ACCESS_LEVEL_ADMIN) + if err != nil { + return nil, errswrap.NewError(err, errorsmessenger.ErrFailedQuery) + } + if !check && !userInfo.SuperUser { + if !userInfo.SuperUser { + return nil, errorsmessenger.ErrFailedQuery + } + } + + thread, err := s.getThread(ctx, req.ThreadId, userInfo, true) + if err != nil { + return nil, errswrap.NewError(err, errorsmessenger.ErrFailedQuery) + } + + return &GetThreadResponse{ + Thread: thread, + }, nil +} + func (s *Server) CreateOrUpdateThread(ctx context.Context, req *CreateOrUpdateThreadRequest) (*CreateOrUpdateThreadResponse, error) { trace.SpanFromContext(ctx).SetAttributes(attribute.Int64("fivenet.messenger.thread.id", int64(req.Thread.Id))) @@ -322,7 +345,8 @@ func (s *Server) CreateOrUpdateThread(ctx context.Context, req *CreateOrUpdateTh auditEntry.State = int16(rector.EventType_EVENT_TYPE_UPDATED) } - if err := s.handleThreadAccessChanges(ctx, tx, messenger.AccessLevelUpdateMode_ACCESS_LEVEL_UPDATE_MODE_UPDATE, req.Thread.Id, req.Thread.Access); err != nil { + accessToDelete, err := s.handleThreadAccessChanges(ctx, tx, messenger.AccessLevelUpdateMode_ACCESS_LEVEL_UPDATE_MODE_UPDATE, req.Thread.Id, req.Thread.Access) + if err != nil { return nil, errswrap.NewError(err, errorsmessenger.ErrFailedQuery) } @@ -336,6 +360,35 @@ func (s *Server) CreateOrUpdateThread(ctx context.Context, req *CreateOrUpdateTh return nil, errorsmessenger.ErrFailedQuery } + if accessToDelete != nil && len(accessToDelete.Users) > 0 { + userIds := []int32{} + for _, ua := range accessToDelete.Users { + userIds = append(userIds, ua.UserId) + } + + s.sendUpdate(ctx, &messenger.MessengerEvent{ + Data: &messenger.MessengerEvent_ThreadDelete{ + ThreadDelete: thread.Id, + }, + }, userIds) + } + + if len(thread.Access.Users) > 0 { + userIds := []int32{userInfo.UserId} + if thread != nil && thread.CreatorId != nil { + userIds = append(userIds, *thread.CreatorId) + } + for _, ua := range thread.Access.Users { + userIds = append(userIds, ua.UserId) + } + + s.sendUpdate(ctx, &messenger.MessengerEvent{ + Data: &messenger.MessengerEvent_ThreadUpdate{ + ThreadUpdate: thread, + }, + }, userIds) + } + return &CreateOrUpdateThreadResponse{ Thread: thread, }, nil @@ -365,6 +418,11 @@ func (s *Server) DeleteThread(ctx context.Context, req *DeleteThreadRequest) (*D } } + thread, err := s.getThread(ctx, req.ThreadId, userInfo, true) + if err != nil { + return nil, errorsmessenger.ErrFailedQuery + } + stmt := tThreads. DELETE(). WHERE(tThreads.ID.EQ(jet.Uint64(req.ThreadId))). @@ -374,6 +432,22 @@ func (s *Server) DeleteThread(ctx context.Context, req *DeleteThreadRequest) (*D return nil, errswrap.NewError(err, errorsmessenger.ErrFailedQuery) } + if thread != nil && thread.Access != nil && len(thread.Access.Users) > 0 { + userIds := []int32{userInfo.UserId} + if thread.CreatorId != nil { + userIds = append(userIds, *thread.CreatorId) + } + for _, ua := range thread.Access.Users { + userIds = append(userIds, ua.UserId) + } + + s.sendUpdate(ctx, &messenger.MessengerEvent{ + Data: &messenger.MessengerEvent_ThreadDelete{ + ThreadDelete: req.ThreadId, + }, + }, userIds) + } + auditEntry.State = int16(rector.EventType_EVENT_TYPE_DELETED) return &DeleteThreadResponse{}, nil diff --git a/gen/go/proto/services/messenger/user.go b/gen/go/proto/services/messenger/user.go index f0f153d8b..d7417109b 100644 --- a/gen/go/proto/services/messenger/user.go +++ b/gen/go/proto/services/messenger/user.go @@ -57,3 +57,35 @@ func (s *Server) SetThreadUserState(ctx context.Context, req *SetThreadUserState return &SetThreadUserStateResponse{}, nil } + +func (s *Server) setUnreadState(ctx context.Context, threadId uint64, userIds []int32) error { + if len(userIds) == 0 { + return nil + } + + tThreadsUserState := table.FivenetMsgsThreadsUserState + stmt := tThreadsUserState. + INSERT( + tThreadsUserState.ThreadID, + tThreadsUserState.UserID, + tThreadsUserState.Unread, + ) + + for _, userId := range userIds { + stmt = stmt.VALUES( + threadId, + userId, + true, + ) + } + + stmt = stmt.ON_DUPLICATE_KEY_UPDATE( + tThreadsUserState.Unread.SET(jet.RawBool("VALUES(`unread`)")), + ) + + if _, err := stmt.ExecContext(ctx, s.db); err != nil { + return err + } + + return nil +} diff --git a/gen/go/proto/services/notificator/notificator.go b/gen/go/proto/services/notificator/notificator.go index dbb36e5a9..d4cdce7e8 100644 --- a/gen/go/proto/services/notificator/notificator.go +++ b/gen/go/proto/services/notificator/notificator.go @@ -341,7 +341,10 @@ func (s *Server) Stream(req *StreamRequest, srv NotificatorService_StreamServer) return errswrap.NewError(err, ErrFailedStream) } - notsCount++ + switch dest.Data.(type) { + case *notifications.UserEvent_Notification: + notsCount++ + } resp := &StreamResponse{ NotificationCount: notsCount, Data: &StreamResponse_UserEvent{ diff --git a/gen/grpc-api.md b/gen/grpc-api.md index 094fd8cbc..acbfdb2ac 100644 --- a/gen/grpc-api.md +++ b/gen/grpc-api.md @@ -281,6 +281,9 @@ - [resources/messenger/user.proto](#resources_messenger_user-proto) - [UserStatus](#resources-messenger-UserStatus) +- [resources/messenger/events.proto](#resources_messenger_events-proto) + - [MessengerEvent](#resources-messenger-MessengerEvent) + - [services/auth/auth.proto](#services_auth_auth-proto) - [ChangePasswordRequest](#services-auth-ChangePasswordRequest) - [ChangePasswordResponse](#services-auth-ChangePasswordResponse) @@ -649,6 +652,8 @@ - [DeleteThreadResponse](#services-messenger-DeleteThreadResponse) - [GetThreadMessagesRequest](#services-messenger-GetThreadMessagesRequest) - [GetThreadMessagesResponse](#services-messenger-GetThreadMessagesResponse) + - [GetThreadRequest](#services-messenger-GetThreadRequest) + - [GetThreadResponse](#services-messenger-GetThreadResponse) - [ListThreadsRequest](#services-messenger-ListThreadsRequest) - [ListThreadsResponse](#services-messenger-ListThreadsResponse) - [PostMessageRequest](#services-messenger-PostMessageRequest) @@ -2770,7 +2775,8 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | refresh_token | [bool](#bool) | | | -| notification | [Notification](#resources-notifications-Notification) | | | +| notification | [Notification](#resources-notifications-Notification) | | Notifications | +| messenger | [resources.messenger.MessengerEvent](#resources-messenger-MessengerEvent) | | Messenger | @@ -4717,6 +4723,40 @@ TODO allow links to internal + +

Top

+ +## resources/messenger/events.proto + + + + + +### MessengerEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| thread_update | [Thread](#resources-messenger-Thread) | | | +| thread_delete | [uint64](#uint64) | | | +| message_update | [Message](#resources-messenger-Message) | | | +| message_delete | [uint64](#uint64) | | | + + + + + + + + + + + + + + +

Top

@@ -9735,6 +9775,36 @@ Results ==================================================================== + + +### GetThreadRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| thread_id | [uint64](#uint64) | | | + + + + + + + + +### GetThreadResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| thread | [resources.messenger.Thread](#resources-messenger-Thread) | | | + + + + + + ### ListThreadsRequest @@ -9836,6 +9906,7 @@ Results ==================================================================== | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| | ListThreads | [ListThreadsRequest](#services-messenger-ListThreadsRequest) | [ListThreadsResponse](#services-messenger-ListThreadsResponse) | @perm | +| GetThread | [GetThreadRequest](#services-messenger-GetThreadRequest) | [GetThreadResponse](#services-messenger-GetThreadResponse) | @perm: Name=ListThreads | | CreateOrUpdateThread | [CreateOrUpdateThreadRequest](#services-messenger-CreateOrUpdateThreadRequest) | [CreateOrUpdateThreadResponse](#services-messenger-CreateOrUpdateThreadResponse) | @perm | | DeleteThread | [DeleteThreadRequest](#services-messenger-DeleteThreadRequest) | [DeleteThreadResponse](#services-messenger-DeleteThreadResponse) | @perm | | SetThreadUserState | [SetThreadUserStateRequest](#services-messenger-SetThreadUserStateRequest) | [SetThreadUserStateResponse](#services-messenger-SetThreadUserStateResponse) | @perm: Name=ListThreads | diff --git a/gen/ts/perms.ts b/gen/ts/perms.ts index 992e71dbc..13840579e 100644 --- a/gen/ts/perms.ts +++ b/gen/ts/perms.ts @@ -24,6 +24,7 @@ // source: resources/livemap/livemap.proto // source: resources/livemap/tracker.proto // source: resources/messenger/access.proto +// source: resources/messenger/events.proto // source: resources/messenger/message.proto // source: resources/messenger/thread.proto // source: resources/messenger/user.proto diff --git a/gen/ts/resources/messenger/events.ts b/gen/ts/resources/messenger/events.ts new file mode 100644 index 000000000..bedf962b7 --- /dev/null +++ b/gen/ts/resources/messenger/events.ts @@ -0,0 +1,129 @@ +// @generated by protobuf-ts 2.9.4 with parameter optimize_speed,long_type_number,force_server_none +// @generated from protobuf file "resources/messenger/events.proto" (package "resources.messenger", syntax proto3) +// tslint:disable +import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; +import type { IBinaryWriter } from "@protobuf-ts/runtime"; +import { WireType } from "@protobuf-ts/runtime"; +import type { BinaryReadOptions } from "@protobuf-ts/runtime"; +import type { IBinaryReader } from "@protobuf-ts/runtime"; +import { UnknownFieldHandler } from "@protobuf-ts/runtime"; +import type { PartialMessage } from "@protobuf-ts/runtime"; +import { reflectionMergePartial } from "@protobuf-ts/runtime"; +import { MessageType } from "@protobuf-ts/runtime"; +import { Message } from "./message"; +import { Thread } from "./thread"; +/** + * @generated from protobuf message resources.messenger.MessengerEvent + */ +export interface MessengerEvent { + /** + * @generated from protobuf oneof: data + */ + data: { + oneofKind: "threadUpdate"; + /** + * @generated from protobuf field: resources.messenger.Thread thread_update = 1; + */ + threadUpdate: Thread; + } | { + oneofKind: "threadDelete"; + /** + * @generated from protobuf field: uint64 thread_delete = 2 [jstype = JS_STRING]; + */ + threadDelete: string; + } | { + oneofKind: "messageUpdate"; + /** + * @generated from protobuf field: resources.messenger.Message message_update = 3; + */ + messageUpdate: Message; + } | { + oneofKind: "messageDelete"; + /** + * @generated from protobuf field: uint64 message_delete = 4 [jstype = JS_STRING]; + */ + messageDelete: string; + } | { + oneofKind: undefined; + }; +} +// @generated message type with reflection information, may provide speed optimized methods +class MessengerEvent$Type extends MessageType { + constructor() { + super("resources.messenger.MessengerEvent", [ + { no: 1, name: "thread_update", kind: "message", oneof: "data", T: () => Thread }, + { no: 2, name: "thread_delete", kind: "scalar", oneof: "data", T: 4 /*ScalarType.UINT64*/ }, + { no: 3, name: "message_update", kind: "message", oneof: "data", T: () => Message }, + { no: 4, name: "message_delete", kind: "scalar", oneof: "data", T: 4 /*ScalarType.UINT64*/ } + ]); + } + create(value?: PartialMessage): MessengerEvent { + const message = globalThis.Object.create((this.messagePrototype!)); + message.data = { oneofKind: undefined }; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MessengerEvent): MessengerEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* resources.messenger.Thread thread_update */ 1: + message.data = { + oneofKind: "threadUpdate", + threadUpdate: Thread.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).threadUpdate) + }; + break; + case /* uint64 thread_delete = 2 [jstype = JS_STRING];*/ 2: + message.data = { + oneofKind: "threadDelete", + threadDelete: reader.uint64().toString() + }; + break; + case /* resources.messenger.Message message_update */ 3: + message.data = { + oneofKind: "messageUpdate", + messageUpdate: Message.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).messageUpdate) + }; + break; + case /* uint64 message_delete = 4 [jstype = JS_STRING];*/ 4: + message.data = { + oneofKind: "messageDelete", + messageDelete: reader.uint64().toString() + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MessengerEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* resources.messenger.Thread thread_update = 1; */ + if (message.data.oneofKind === "threadUpdate") + Thread.internalBinaryWrite(message.data.threadUpdate, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint64 thread_delete = 2 [jstype = JS_STRING]; */ + if (message.data.oneofKind === "threadDelete") + writer.tag(2, WireType.Varint).uint64(message.data.threadDelete); + /* resources.messenger.Message message_update = 3; */ + if (message.data.oneofKind === "messageUpdate") + Message.internalBinaryWrite(message.data.messageUpdate, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* uint64 message_delete = 4 [jstype = JS_STRING]; */ + if (message.data.oneofKind === "messageDelete") + writer.tag(4, WireType.Varint).uint64(message.data.messageDelete); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message resources.messenger.MessengerEvent + */ +export const MessengerEvent = new MessengerEvent$Type(); diff --git a/gen/ts/resources/notifications/events.ts b/gen/ts/resources/notifications/events.ts index 8b81c5b6b..086cc40d7 100644 --- a/gen/ts/resources/notifications/events.ts +++ b/gen/ts/resources/notifications/events.ts @@ -11,6 +11,7 @@ import type { PartialMessage } from "@protobuf-ts/runtime"; import { reflectionMergePartial } from "@protobuf-ts/runtime"; import { MessageType } from "@protobuf-ts/runtime"; import { JobProps } from "../users/jobs"; +import { MessengerEvent } from "../messenger/events"; import { Notification } from "./notifications"; /** * @generated from protobuf message resources.notifications.UserEvent @@ -28,9 +29,19 @@ export interface UserEvent { } | { oneofKind: "notification"; /** + * Notifications + * * @generated from protobuf field: resources.notifications.Notification notification = 2; */ notification: Notification; + } | { + oneofKind: "messenger"; + /** + * Messenger + * + * @generated from protobuf field: resources.messenger.MessengerEvent messenger = 3; + */ + messenger: MessengerEvent; } | { oneofKind: undefined; }; @@ -62,7 +73,8 @@ class UserEvent$Type extends MessageType { constructor() { super("resources.notifications.UserEvent", [ { no: 1, name: "refresh_token", kind: "scalar", oneof: "data", T: 8 /*ScalarType.BOOL*/ }, - { no: 2, name: "notification", kind: "message", oneof: "data", T: () => Notification } + { no: 2, name: "notification", kind: "message", oneof: "data", T: () => Notification }, + { no: 3, name: "messenger", kind: "message", oneof: "data", T: () => MessengerEvent } ]); } create(value?: PartialMessage): UserEvent { @@ -89,6 +101,12 @@ class UserEvent$Type extends MessageType { notification: Notification.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).notification) }; break; + case /* resources.messenger.MessengerEvent messenger */ 3: + message.data = { + oneofKind: "messenger", + messenger: MessengerEvent.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).messenger) + }; + break; default: let u = options.readUnknownField; if (u === "throw") @@ -107,6 +125,9 @@ class UserEvent$Type extends MessageType { /* resources.notifications.Notification notification = 2; */ if (message.data.oneofKind === "notification") Notification.internalBinaryWrite(message.data.notification, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* resources.messenger.MessengerEvent messenger = 3; */ + if (message.data.oneofKind === "messenger") + MessengerEvent.internalBinaryWrite(message.data.messenger, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); diff --git a/gen/ts/services/messenger/messenger.client.ts b/gen/ts/services/messenger/messenger.client.ts index e6cab90a2..cf85ceca4 100644 --- a/gen/ts/services/messenger/messenger.client.ts +++ b/gen/ts/services/messenger/messenger.client.ts @@ -16,6 +16,8 @@ import type { DeleteThreadResponse } from "./messenger"; import type { DeleteThreadRequest } from "./messenger"; import type { CreateOrUpdateThreadResponse } from "./messenger"; import type { CreateOrUpdateThreadRequest } from "./messenger"; +import type { GetThreadResponse } from "./messenger"; +import type { GetThreadRequest } from "./messenger"; import { stackIntercept } from "@protobuf-ts/runtime-rpc"; import type { ListThreadsResponse } from "./messenger"; import type { ListThreadsRequest } from "./messenger"; @@ -31,6 +33,12 @@ export interface IMessengerServiceClient { * @generated from protobuf rpc: ListThreads(services.messenger.ListThreadsRequest) returns (services.messenger.ListThreadsResponse); */ listThreads(input: ListThreadsRequest, options?: RpcOptions): UnaryCall; + /** + * @perm: Name=ListThreads + * + * @generated from protobuf rpc: GetThread(services.messenger.GetThreadRequest) returns (services.messenger.GetThreadResponse); + */ + getThread(input: GetThreadRequest, options?: RpcOptions): UnaryCall; /** * @perm * @@ -86,13 +94,22 @@ export class MessengerServiceClient implements IMessengerServiceClient, ServiceI const method = this.methods[0], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } + /** + * @perm: Name=ListThreads + * + * @generated from protobuf rpc: GetThread(services.messenger.GetThreadRequest) returns (services.messenger.GetThreadResponse); + */ + getThread(input: GetThreadRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[1], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } /** * @perm * * @generated from protobuf rpc: CreateOrUpdateThread(services.messenger.CreateOrUpdateThreadRequest) returns (services.messenger.CreateOrUpdateThreadResponse); */ createOrUpdateThread(input: CreateOrUpdateThreadRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[1], opt = this._transport.mergeOptions(options); + const method = this.methods[2], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } /** @@ -101,7 +118,7 @@ export class MessengerServiceClient implements IMessengerServiceClient, ServiceI * @generated from protobuf rpc: DeleteThread(services.messenger.DeleteThreadRequest) returns (services.messenger.DeleteThreadResponse); */ deleteThread(input: DeleteThreadRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[2], opt = this._transport.mergeOptions(options); + const method = this.methods[3], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } /** @@ -110,7 +127,7 @@ export class MessengerServiceClient implements IMessengerServiceClient, ServiceI * @generated from protobuf rpc: SetThreadUserState(services.messenger.SetThreadUserStateRequest) returns (services.messenger.SetThreadUserStateResponse); */ setThreadUserState(input: SetThreadUserStateRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[3], opt = this._transport.mergeOptions(options); + const method = this.methods[4], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } /** @@ -119,7 +136,7 @@ export class MessengerServiceClient implements IMessengerServiceClient, ServiceI * @generated from protobuf rpc: GetThreadMessages(services.messenger.GetThreadMessagesRequest) returns (services.messenger.GetThreadMessagesResponse); */ getThreadMessages(input: GetThreadMessagesRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[4], opt = this._transport.mergeOptions(options); + const method = this.methods[5], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } /** @@ -128,7 +145,7 @@ export class MessengerServiceClient implements IMessengerServiceClient, ServiceI * @generated from protobuf rpc: PostMessage(services.messenger.PostMessageRequest) returns (services.messenger.PostMessageResponse); */ postMessage(input: PostMessageRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[5], opt = this._transport.mergeOptions(options); + const method = this.methods[6], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } /** @@ -137,7 +154,7 @@ export class MessengerServiceClient implements IMessengerServiceClient, ServiceI * @generated from protobuf rpc: DeleteMessage(services.messenger.DeleteMessageRequest) returns (services.messenger.DeleteMessageResponse); */ deleteMessage(input: DeleteMessageRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[6], opt = this._transport.mergeOptions(options); + const method = this.methods[7], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } } diff --git a/gen/ts/services/messenger/messenger.ts b/gen/ts/services/messenger/messenger.ts index c819f8061..c5b4b97a8 100644 --- a/gen/ts/services/messenger/messenger.ts +++ b/gen/ts/services/messenger/messenger.ts @@ -43,6 +43,24 @@ export interface ListThreadsResponse { */ threads: Thread[]; } +/** + * @generated from protobuf message services.messenger.GetThreadRequest + */ +export interface GetThreadRequest { + /** + * @generated from protobuf field: uint64 thread_id = 1 [jstype = JS_STRING]; + */ + threadId: string; +} +/** + * @generated from protobuf message services.messenger.GetThreadResponse + */ +export interface GetThreadResponse { + /** + * @generated from protobuf field: resources.messenger.Thread thread = 1; + */ + thread?: Thread; +} /** * @generated from protobuf message services.messenger.CreateOrUpdateThreadRequest */ @@ -257,6 +275,99 @@ class ListThreadsResponse$Type extends MessageType { */ export const ListThreadsResponse = new ListThreadsResponse$Type(); // @generated message type with reflection information, may provide speed optimized methods +class GetThreadRequest$Type extends MessageType { + constructor() { + super("services.messenger.GetThreadRequest", [ + { no: 1, name: "thread_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ } + ]); + } + create(value?: PartialMessage): GetThreadRequest { + const message = globalThis.Object.create((this.messagePrototype!)); + message.threadId = "0"; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetThreadRequest): GetThreadRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 thread_id = 1 [jstype = JS_STRING];*/ 1: + message.threadId = reader.uint64().toString(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: GetThreadRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 thread_id = 1 [jstype = JS_STRING]; */ + if (message.threadId !== "0") + writer.tag(1, WireType.Varint).uint64(message.threadId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message services.messenger.GetThreadRequest + */ +export const GetThreadRequest = new GetThreadRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetThreadResponse$Type extends MessageType { + constructor() { + super("services.messenger.GetThreadResponse", [ + { no: 1, name: "thread", kind: "message", T: () => Thread } + ]); + } + create(value?: PartialMessage): GetThreadResponse { + const message = globalThis.Object.create((this.messagePrototype!)); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetThreadResponse): GetThreadResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* resources.messenger.Thread thread */ 1: + message.thread = Thread.internalBinaryRead(reader, reader.uint32(), options, message.thread); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: GetThreadResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* resources.messenger.Thread thread = 1; */ + if (message.thread) + Thread.internalBinaryWrite(message.thread, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message services.messenger.GetThreadResponse + */ +export const GetThreadResponse = new GetThreadResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods class CreateOrUpdateThreadRequest$Type extends MessageType { constructor() { super("services.messenger.CreateOrUpdateThreadRequest", [ @@ -769,6 +880,7 @@ export const DeleteMessageResponse = new DeleteMessageResponse$Type(); */ export const MessengerService = new ServiceType("services.messenger.MessengerService", [ { name: "ListThreads", options: {}, I: ListThreadsRequest, O: ListThreadsResponse }, + { name: "GetThread", options: {}, I: GetThreadRequest, O: GetThreadResponse }, { name: "CreateOrUpdateThread", options: {}, I: CreateOrUpdateThreadRequest, O: CreateOrUpdateThreadResponse }, { name: "DeleteThread", options: {}, I: DeleteThreadRequest, O: DeleteThreadResponse }, { name: "SetThreadUserState", options: {}, I: SetThreadUserStateRequest, O: SetThreadUserStateResponse }, diff --git a/proto/resources/messenger/events.proto b/proto/resources/messenger/events.proto new file mode 100644 index 000000000..7cac83301 --- /dev/null +++ b/proto/resources/messenger/events.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +package resources.messenger; + +import "resources/messenger/message.proto"; +import "resources/messenger/thread.proto"; + +option go_package = "github.com/fivenet-app/fivenet/gen/go/proto/resources/messenger;messenger"; + +message MessengerEvent { + oneof data { + Thread thread_update = 1; + uint64 thread_delete = 2 [jstype = JS_STRING]; + Message message_update = 3; + uint64 message_delete = 4 [jstype = JS_STRING]; + } +} diff --git a/proto/resources/notifications/events.proto b/proto/resources/notifications/events.proto index f3becd727..7f966fa39 100644 --- a/proto/resources/notifications/events.proto +++ b/proto/resources/notifications/events.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package resources.notifications; import "resources/notifications/notifications.proto"; +import "resources/messenger/events.proto"; import "resources/users/jobs.proto"; option go_package = "github.com/fivenet-app/fivenet/gen/go/proto/resources/notifications;notifications"; @@ -10,7 +11,10 @@ option go_package = "github.com/fivenet-app/fivenet/gen/go/proto/resources/notif message UserEvent { oneof data { bool refresh_token = 1; + // Notifications resources.notifications.Notification notification = 2; + // Messenger + resources.messenger.MessengerEvent messenger = 3; } } diff --git a/proto/services/messenger/messenger.proto b/proto/services/messenger/messenger.proto index ff8a201f9..c488ca1c6 100644 --- a/proto/services/messenger/messenger.proto +++ b/proto/services/messenger/messenger.proto @@ -20,6 +20,14 @@ message ListThreadsResponse { repeated resources.messenger.Thread threads = 2; } +message GetThreadRequest { + uint64 thread_id = 1 [jstype = JS_STRING]; +} + +message GetThreadResponse { + resources.messenger.Thread thread = 1; +} + message CreateOrUpdateThreadRequest { resources.messenger.Thread thread = 1 [(validate.rules).message.required = true]; } @@ -69,6 +77,8 @@ message DeleteMessageResponse {} service MessengerService { // @perm rpc ListThreads(ListThreadsRequest) returns (ListThreadsResponse); + // @perm: Name=ListThreads + rpc GetThread(GetThreadRequest) returns (GetThreadResponse); // @perm rpc CreateOrUpdateThread(CreateOrUpdateThreadRequest) returns (CreateOrUpdateThreadResponse); // @perm diff --git a/src/components/messenger/MessengerThread.vue b/src/components/messenger/MessengerThread.vue index a18ed6a98..2aad25d8a 100644 --- a/src/components/messenger/MessengerThread.vue +++ b/src/components/messenger/MessengerThread.vue @@ -1,16 +1,17 @@