feat: add UpdateTopic (display_name only, slug immutable, no delete in MVP)

This commit is contained in:
l-ai dev 2026-08-08 20:00:45 +03:00
parent c833ff147a
commit 85c7a9610c
3 changed files with 168 additions and 55 deletions

View File

@ -543,6 +543,58 @@ func (x *CreateTopicRequest) GetDisplayName() string {
return "" return ""
} }
type UpdateTopicRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // UUID
DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // new display name (required, full replace)
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UpdateTopicRequest) Reset() {
*x = UpdateTopicRequest{}
mi := &file_chat_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UpdateTopicRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UpdateTopicRequest) ProtoMessage() {}
func (x *UpdateTopicRequest) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[6]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UpdateTopicRequest.ProtoReflect.Descriptor instead.
func (*UpdateTopicRequest) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{6}
}
func (x *UpdateTopicRequest) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *UpdateTopicRequest) GetDisplayName() string {
if x != nil {
return x.DisplayName
}
return ""
}
type PostMessageRequest struct { type PostMessageRequest struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
TopicId string `protobuf:"bytes,1,opt,name=topic_id,json=topicId,proto3" json:"topic_id,omitempty"` TopicId string `protobuf:"bytes,1,opt,name=topic_id,json=topicId,proto3" json:"topic_id,omitempty"`
@ -560,7 +612,7 @@ type PostMessageRequest struct {
func (x *PostMessageRequest) Reset() { func (x *PostMessageRequest) Reset() {
*x = PostMessageRequest{} *x = PostMessageRequest{}
mi := &file_chat_proto_msgTypes[6] mi := &file_chat_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -572,7 +624,7 @@ func (x *PostMessageRequest) String() string {
func (*PostMessageRequest) ProtoMessage() {} func (*PostMessageRequest) ProtoMessage() {}
func (x *PostMessageRequest) ProtoReflect() protoreflect.Message { func (x *PostMessageRequest) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[6] mi := &file_chat_proto_msgTypes[7]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -585,7 +637,7 @@ func (x *PostMessageRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use PostMessageRequest.ProtoReflect.Descriptor instead. // Deprecated: Use PostMessageRequest.ProtoReflect.Descriptor instead.
func (*PostMessageRequest) Descriptor() ([]byte, []int) { func (*PostMessageRequest) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{6} return file_chat_proto_rawDescGZIP(), []int{7}
} }
func (x *PostMessageRequest) GetTopicId() string { func (x *PostMessageRequest) GetTopicId() string {
@ -647,7 +699,7 @@ type PostMessageResponse struct {
func (x *PostMessageResponse) Reset() { func (x *PostMessageResponse) Reset() {
*x = PostMessageResponse{} *x = PostMessageResponse{}
mi := &file_chat_proto_msgTypes[7] mi := &file_chat_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -659,7 +711,7 @@ func (x *PostMessageResponse) String() string {
func (*PostMessageResponse) ProtoMessage() {} func (*PostMessageResponse) ProtoMessage() {}
func (x *PostMessageResponse) ProtoReflect() protoreflect.Message { func (x *PostMessageResponse) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[7] mi := &file_chat_proto_msgTypes[8]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -672,7 +724,7 @@ func (x *PostMessageResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use PostMessageResponse.ProtoReflect.Descriptor instead. // Deprecated: Use PostMessageResponse.ProtoReflect.Descriptor instead.
func (*PostMessageResponse) Descriptor() ([]byte, []int) { func (*PostMessageResponse) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{7} return file_chat_proto_rawDescGZIP(), []int{8}
} }
func (x *PostMessageResponse) GetMessage() *Message { func (x *PostMessageResponse) GetMessage() *Message {
@ -698,7 +750,7 @@ type GetMessageRequest struct {
func (x *GetMessageRequest) Reset() { func (x *GetMessageRequest) Reset() {
*x = GetMessageRequest{} *x = GetMessageRequest{}
mi := &file_chat_proto_msgTypes[8] mi := &file_chat_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -710,7 +762,7 @@ func (x *GetMessageRequest) String() string {
func (*GetMessageRequest) ProtoMessage() {} func (*GetMessageRequest) ProtoMessage() {}
func (x *GetMessageRequest) ProtoReflect() protoreflect.Message { func (x *GetMessageRequest) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[8] mi := &file_chat_proto_msgTypes[9]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -723,7 +775,7 @@ func (x *GetMessageRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetMessageRequest.ProtoReflect.Descriptor instead. // Deprecated: Use GetMessageRequest.ProtoReflect.Descriptor instead.
func (*GetMessageRequest) Descriptor() ([]byte, []int) { func (*GetMessageRequest) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{8} return file_chat_proto_rawDescGZIP(), []int{9}
} }
func (x *GetMessageRequest) GetMessageId() string { func (x *GetMessageRequest) GetMessageId() string {
@ -750,7 +802,7 @@ type HistoryRequest struct {
func (x *HistoryRequest) Reset() { func (x *HistoryRequest) Reset() {
*x = HistoryRequest{} *x = HistoryRequest{}
mi := &file_chat_proto_msgTypes[9] mi := &file_chat_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -762,7 +814,7 @@ func (x *HistoryRequest) String() string {
func (*HistoryRequest) ProtoMessage() {} func (*HistoryRequest) ProtoMessage() {}
func (x *HistoryRequest) ProtoReflect() protoreflect.Message { func (x *HistoryRequest) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[9] mi := &file_chat_proto_msgTypes[10]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -775,7 +827,7 @@ func (x *HistoryRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. // Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead.
func (*HistoryRequest) Descriptor() ([]byte, []int) { func (*HistoryRequest) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{9} return file_chat_proto_rawDescGZIP(), []int{10}
} }
func (x *HistoryRequest) GetTopicId() string { func (x *HistoryRequest) GetTopicId() string {
@ -817,7 +869,7 @@ type HistoryResponse struct {
func (x *HistoryResponse) Reset() { func (x *HistoryResponse) Reset() {
*x = HistoryResponse{} *x = HistoryResponse{}
mi := &file_chat_proto_msgTypes[10] mi := &file_chat_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -829,7 +881,7 @@ func (x *HistoryResponse) String() string {
func (*HistoryResponse) ProtoMessage() {} func (*HistoryResponse) ProtoMessage() {}
func (x *HistoryResponse) ProtoReflect() protoreflect.Message { func (x *HistoryResponse) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[10] mi := &file_chat_proto_msgTypes[11]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -842,7 +894,7 @@ func (x *HistoryResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use HistoryResponse.ProtoReflect.Descriptor instead. // Deprecated: Use HistoryResponse.ProtoReflect.Descriptor instead.
func (*HistoryResponse) Descriptor() ([]byte, []int) { func (*HistoryResponse) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{10} return file_chat_proto_rawDescGZIP(), []int{11}
} }
func (x *HistoryResponse) GetMessages() []*Message { func (x *HistoryResponse) GetMessages() []*Message {
@ -869,7 +921,7 @@ type SubscribeRequest struct {
func (x *SubscribeRequest) Reset() { func (x *SubscribeRequest) Reset() {
*x = SubscribeRequest{} *x = SubscribeRequest{}
mi := &file_chat_proto_msgTypes[11] mi := &file_chat_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -881,7 +933,7 @@ func (x *SubscribeRequest) String() string {
func (*SubscribeRequest) ProtoMessage() {} func (*SubscribeRequest) ProtoMessage() {}
func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { func (x *SubscribeRequest) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[11] mi := &file_chat_proto_msgTypes[12]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -894,7 +946,7 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead.
func (*SubscribeRequest) Descriptor() ([]byte, []int) { func (*SubscribeRequest) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{11} return file_chat_proto_rawDescGZIP(), []int{12}
} }
func (x *SubscribeRequest) GetConsumerId() string { func (x *SubscribeRequest) GetConsumerId() string {
@ -922,7 +974,7 @@ type AcknowledgeRequest struct {
func (x *AcknowledgeRequest) Reset() { func (x *AcknowledgeRequest) Reset() {
*x = AcknowledgeRequest{} *x = AcknowledgeRequest{}
mi := &file_chat_proto_msgTypes[12] mi := &file_chat_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -934,7 +986,7 @@ func (x *AcknowledgeRequest) String() string {
func (*AcknowledgeRequest) ProtoMessage() {} func (*AcknowledgeRequest) ProtoMessage() {}
func (x *AcknowledgeRequest) ProtoReflect() protoreflect.Message { func (x *AcknowledgeRequest) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[12] mi := &file_chat_proto_msgTypes[13]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -947,7 +999,7 @@ func (x *AcknowledgeRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use AcknowledgeRequest.ProtoReflect.Descriptor instead. // Deprecated: Use AcknowledgeRequest.ProtoReflect.Descriptor instead.
func (*AcknowledgeRequest) Descriptor() ([]byte, []int) { func (*AcknowledgeRequest) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{12} return file_chat_proto_rawDescGZIP(), []int{13}
} }
func (x *AcknowledgeRequest) GetConsumerId() string { func (x *AcknowledgeRequest) GetConsumerId() string {
@ -980,7 +1032,7 @@ type AcknowledgeResponse struct {
func (x *AcknowledgeResponse) Reset() { func (x *AcknowledgeResponse) Reset() {
*x = AcknowledgeResponse{} *x = AcknowledgeResponse{}
mi := &file_chat_proto_msgTypes[13] mi := &file_chat_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -992,7 +1044,7 @@ func (x *AcknowledgeResponse) String() string {
func (*AcknowledgeResponse) ProtoMessage() {} func (*AcknowledgeResponse) ProtoMessage() {}
func (x *AcknowledgeResponse) ProtoReflect() protoreflect.Message { func (x *AcknowledgeResponse) ProtoReflect() protoreflect.Message {
mi := &file_chat_proto_msgTypes[13] mi := &file_chat_proto_msgTypes[14]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -1005,7 +1057,7 @@ func (x *AcknowledgeResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use AcknowledgeResponse.ProtoReflect.Descriptor instead. // Deprecated: Use AcknowledgeResponse.ProtoReflect.Descriptor instead.
func (*AcknowledgeResponse) Descriptor() ([]byte, []int) { func (*AcknowledgeResponse) Descriptor() ([]byte, []int) {
return file_chat_proto_rawDescGZIP(), []int{13} return file_chat_proto_rawDescGZIP(), []int{14}
} }
func (x *AcknowledgeResponse) GetLastAckSequence() int64 { func (x *AcknowledgeResponse) GetLastAckSequence() int64 {
@ -1054,6 +1106,9 @@ const file_chat_proto_rawDesc = "" +
"\bselector\"K\n" + "\bselector\"K\n" +
"\x12CreateTopicRequest\x12\x12\n" + "\x12CreateTopicRequest\x12\x12\n" +
"\x04slug\x18\x01 \x01(\tR\x04slug\x12!\n" + "\x04slug\x18\x01 \x01(\tR\x04slug\x12!\n" +
"\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\"G\n" +
"\x12UpdateTopicRequest\x12\x0e\n" +
"\x02id\x18\x01 \x01(\tR\x02id\x12!\n" +
"\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\"\xbb\x02\n" + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\"\xbb\x02\n" +
"\x12PostMessageRequest\x12\x19\n" + "\x12PostMessageRequest\x12\x19\n" +
"\btopic_id\x18\x01 \x01(\tR\atopicId\x12\x1b\n" + "\btopic_id\x18\x01 \x01(\tR\atopicId\x12\x1b\n" +
@ -1104,12 +1159,13 @@ const file_chat_proto_rawDesc = "" +
"\x12MESSAGE_SOURCE_WEB\x10\x01\x12\x1b\n" + "\x12MESSAGE_SOURCE_WEB\x10\x01\x12\x1b\n" +
"\x17MESSAGE_SOURCE_TELEGRAM\x10\x02\x12\x18\n" + "\x17MESSAGE_SOURCE_TELEGRAM\x10\x02\x12\x18\n" +
"\x14MESSAGE_SOURCE_AGENT\x10\x03\x12\x19\n" + "\x14MESSAGE_SOURCE_AGENT\x10\x03\x12\x19\n" +
"\x15MESSAGE_SOURCE_SYSTEM\x10\x042\xe0\x03\n" + "\x15MESSAGE_SOURCE_SYSTEM\x10\x042\x96\x04\n" +
"\vChatService\x12?\n" + "\vChatService\x12?\n" +
"\n" + "\n" +
"ListTopics\x12\x17.chat.ListTopicsRequest\x1a\x18.chat.ListTopicsResponse\x12.\n" + "ListTopics\x12\x17.chat.ListTopicsRequest\x1a\x18.chat.ListTopicsResponse\x12.\n" +
"\bGetTopic\x12\x15.chat.GetTopicRequest\x1a\v.chat.Topic\x124\n" + "\bGetTopic\x12\x15.chat.GetTopicRequest\x1a\v.chat.Topic\x124\n" +
"\vCreateTopic\x12\x18.chat.CreateTopicRequest\x1a\v.chat.Topic\x12B\n" + "\vCreateTopic\x12\x18.chat.CreateTopicRequest\x1a\v.chat.Topic\x124\n" +
"\vUpdateTopic\x12\x18.chat.UpdateTopicRequest\x1a\v.chat.Topic\x12B\n" +
"\vPostMessage\x12\x18.chat.PostMessageRequest\x1a\x19.chat.PostMessageResponse\x124\n" + "\vPostMessage\x12\x18.chat.PostMessageRequest\x1a\x19.chat.PostMessageResponse\x124\n" +
"\n" + "\n" +
"GetMessage\x12\x17.chat.GetMessageRequest\x1a\r.chat.Message\x126\n" + "GetMessage\x12\x17.chat.GetMessageRequest\x1a\r.chat.Message\x126\n" +
@ -1130,7 +1186,7 @@ func file_chat_proto_rawDescGZIP() []byte {
} }
var file_chat_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_chat_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
var file_chat_proto_goTypes = []any{ var file_chat_proto_goTypes = []any{
(AuthorType)(0), // 0: chat.AuthorType (AuthorType)(0), // 0: chat.AuthorType
(MessageSource)(0), // 1: chat.MessageSource (MessageSource)(0), // 1: chat.MessageSource
@ -1140,21 +1196,22 @@ var file_chat_proto_goTypes = []any{
(*ListTopicsResponse)(nil), // 5: chat.ListTopicsResponse (*ListTopicsResponse)(nil), // 5: chat.ListTopicsResponse
(*GetTopicRequest)(nil), // 6: chat.GetTopicRequest (*GetTopicRequest)(nil), // 6: chat.GetTopicRequest
(*CreateTopicRequest)(nil), // 7: chat.CreateTopicRequest (*CreateTopicRequest)(nil), // 7: chat.CreateTopicRequest
(*PostMessageRequest)(nil), // 8: chat.PostMessageRequest (*UpdateTopicRequest)(nil), // 8: chat.UpdateTopicRequest
(*PostMessageResponse)(nil), // 9: chat.PostMessageResponse (*PostMessageRequest)(nil), // 9: chat.PostMessageRequest
(*GetMessageRequest)(nil), // 10: chat.GetMessageRequest (*PostMessageResponse)(nil), // 10: chat.PostMessageResponse
(*HistoryRequest)(nil), // 11: chat.HistoryRequest (*GetMessageRequest)(nil), // 11: chat.GetMessageRequest
(*HistoryResponse)(nil), // 12: chat.HistoryResponse (*HistoryRequest)(nil), // 12: chat.HistoryRequest
(*SubscribeRequest)(nil), // 13: chat.SubscribeRequest (*HistoryResponse)(nil), // 13: chat.HistoryResponse
(*AcknowledgeRequest)(nil), // 14: chat.AcknowledgeRequest (*SubscribeRequest)(nil), // 14: chat.SubscribeRequest
(*AcknowledgeResponse)(nil), // 15: chat.AcknowledgeResponse (*AcknowledgeRequest)(nil), // 15: chat.AcknowledgeRequest
(*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp (*AcknowledgeResponse)(nil), // 16: chat.AcknowledgeResponse
(*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp
} }
var file_chat_proto_depIdxs = []int32{ var file_chat_proto_depIdxs = []int32{
16, // 0: chat.Topic.created_at:type_name -> google.protobuf.Timestamp 17, // 0: chat.Topic.created_at:type_name -> google.protobuf.Timestamp
0, // 1: chat.Message.author_type:type_name -> chat.AuthorType 0, // 1: chat.Message.author_type:type_name -> chat.AuthorType
1, // 2: chat.Message.source:type_name -> chat.MessageSource 1, // 2: chat.Message.source:type_name -> chat.MessageSource
16, // 3: chat.Message.created_at:type_name -> google.protobuf.Timestamp 17, // 3: chat.Message.created_at:type_name -> google.protobuf.Timestamp
2, // 4: chat.ListTopicsResponse.topics:type_name -> chat.Topic 2, // 4: chat.ListTopicsResponse.topics:type_name -> chat.Topic
0, // 5: chat.PostMessageRequest.author_type:type_name -> chat.AuthorType 0, // 5: chat.PostMessageRequest.author_type:type_name -> chat.AuthorType
1, // 6: chat.PostMessageRequest.source:type_name -> chat.MessageSource 1, // 6: chat.PostMessageRequest.source:type_name -> chat.MessageSource
@ -1163,21 +1220,23 @@ var file_chat_proto_depIdxs = []int32{
4, // 9: chat.ChatService.ListTopics:input_type -> chat.ListTopicsRequest 4, // 9: chat.ChatService.ListTopics:input_type -> chat.ListTopicsRequest
6, // 10: chat.ChatService.GetTopic:input_type -> chat.GetTopicRequest 6, // 10: chat.ChatService.GetTopic:input_type -> chat.GetTopicRequest
7, // 11: chat.ChatService.CreateTopic:input_type -> chat.CreateTopicRequest 7, // 11: chat.ChatService.CreateTopic:input_type -> chat.CreateTopicRequest
8, // 12: chat.ChatService.PostMessage:input_type -> chat.PostMessageRequest 8, // 12: chat.ChatService.UpdateTopic:input_type -> chat.UpdateTopicRequest
10, // 13: chat.ChatService.GetMessage:input_type -> chat.GetMessageRequest 9, // 13: chat.ChatService.PostMessage:input_type -> chat.PostMessageRequest
11, // 14: chat.ChatService.History:input_type -> chat.HistoryRequest 11, // 14: chat.ChatService.GetMessage:input_type -> chat.GetMessageRequest
13, // 15: chat.ChatService.Subscribe:input_type -> chat.SubscribeRequest 12, // 15: chat.ChatService.History:input_type -> chat.HistoryRequest
14, // 16: chat.ChatService.Acknowledge:input_type -> chat.AcknowledgeRequest 14, // 16: chat.ChatService.Subscribe:input_type -> chat.SubscribeRequest
5, // 17: chat.ChatService.ListTopics:output_type -> chat.ListTopicsResponse 15, // 17: chat.ChatService.Acknowledge:input_type -> chat.AcknowledgeRequest
2, // 18: chat.ChatService.GetTopic:output_type -> chat.Topic 5, // 18: chat.ChatService.ListTopics:output_type -> chat.ListTopicsResponse
2, // 19: chat.ChatService.CreateTopic:output_type -> chat.Topic 2, // 19: chat.ChatService.GetTopic:output_type -> chat.Topic
9, // 20: chat.ChatService.PostMessage:output_type -> chat.PostMessageResponse 2, // 20: chat.ChatService.CreateTopic:output_type -> chat.Topic
3, // 21: chat.ChatService.GetMessage:output_type -> chat.Message 2, // 21: chat.ChatService.UpdateTopic:output_type -> chat.Topic
12, // 22: chat.ChatService.History:output_type -> chat.HistoryResponse 10, // 22: chat.ChatService.PostMessage:output_type -> chat.PostMessageResponse
3, // 23: chat.ChatService.Subscribe:output_type -> chat.Message 3, // 23: chat.ChatService.GetMessage:output_type -> chat.Message
15, // 24: chat.ChatService.Acknowledge:output_type -> chat.AcknowledgeResponse 13, // 24: chat.ChatService.History:output_type -> chat.HistoryResponse
17, // [17:25] is the sub-list for method output_type 3, // 25: chat.ChatService.Subscribe:output_type -> chat.Message
9, // [9:17] is the sub-list for method input_type 16, // 26: chat.ChatService.Acknowledge:output_type -> chat.AcknowledgeResponse
18, // [18:27] is the sub-list for method output_type
9, // [9:18] is the sub-list for method input_type
9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension type_name
9, // [9:9] is the sub-list for extension extendee 9, // [9:9] is the sub-list for extension extendee
0, // [0:9] is the sub-list for field type_name 0, // [0:9] is the sub-list for field type_name
@ -1193,14 +1252,14 @@ func file_chat_proto_init() {
(*GetTopicRequest_Id)(nil), (*GetTopicRequest_Id)(nil),
(*GetTopicRequest_Slug)(nil), (*GetTopicRequest_Slug)(nil),
} }
file_chat_proto_msgTypes[6].OneofWrappers = []any{} file_chat_proto_msgTypes[7].OneofWrappers = []any{}
type x struct{} type x struct{}
out := protoimpl.TypeBuilder{ out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{ File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_chat_proto_rawDesc), len(file_chat_proto_rawDesc)), RawDescriptor: unsafe.Slice(unsafe.StringData(file_chat_proto_rawDesc), len(file_chat_proto_rawDesc)),
NumEnums: 2, NumEnums: 2,
NumMessages: 14, NumMessages: 15,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },

View File

@ -19,6 +19,11 @@ service ChatService {
// CreateTopic creates a new topic. Slug must be unique. // CreateTopic creates a new topic. Slug must be unique.
rpc CreateTopic(CreateTopicRequest) returns (Topic); rpc CreateTopic(CreateTopicRequest) returns (Topic);
// UpdateTopic renames a topic (display_name). The slug is a stable
// identifier and cannot be changed. Topics are persistent in the MVP:
// there is no delete API.
rpc UpdateTopic(UpdateTopicRequest) returns (Topic);
// PostMessage appends a message to a topic. Repeated calls with the same // PostMessage appends a message to a topic. Repeated calls with the same
// (author_id, idempotency_key) must not create a second message; the // (author_id, idempotency_key) must not create a second message; the
// original message is returned with duplicated=true instead. // original message is returned with duplicated=true instead.
@ -102,6 +107,11 @@ message CreateTopicRequest {
string display_name = 2; string display_name = 2;
} }
message UpdateTopicRequest {
string id = 1; // UUID
string display_name = 2; // new display name (required, full replace)
}
message PostMessageRequest { message PostMessageRequest {
string topic_id = 1; string topic_id = 1;
string author_id = 2; string author_id = 2;

View File

@ -22,6 +22,7 @@ const (
ChatService_ListTopics_FullMethodName = "/chat.ChatService/ListTopics" ChatService_ListTopics_FullMethodName = "/chat.ChatService/ListTopics"
ChatService_GetTopic_FullMethodName = "/chat.ChatService/GetTopic" ChatService_GetTopic_FullMethodName = "/chat.ChatService/GetTopic"
ChatService_CreateTopic_FullMethodName = "/chat.ChatService/CreateTopic" ChatService_CreateTopic_FullMethodName = "/chat.ChatService/CreateTopic"
ChatService_UpdateTopic_FullMethodName = "/chat.ChatService/UpdateTopic"
ChatService_PostMessage_FullMethodName = "/chat.ChatService/PostMessage" ChatService_PostMessage_FullMethodName = "/chat.ChatService/PostMessage"
ChatService_GetMessage_FullMethodName = "/chat.ChatService/GetMessage" ChatService_GetMessage_FullMethodName = "/chat.ChatService/GetMessage"
ChatService_History_FullMethodName = "/chat.ChatService/History" ChatService_History_FullMethodName = "/chat.ChatService/History"
@ -43,6 +44,10 @@ type ChatServiceClient interface {
GetTopic(ctx context.Context, in *GetTopicRequest, opts ...grpc.CallOption) (*Topic, error) GetTopic(ctx context.Context, in *GetTopicRequest, opts ...grpc.CallOption) (*Topic, error)
// CreateTopic creates a new topic. Slug must be unique. // CreateTopic creates a new topic. Slug must be unique.
CreateTopic(ctx context.Context, in *CreateTopicRequest, opts ...grpc.CallOption) (*Topic, error) CreateTopic(ctx context.Context, in *CreateTopicRequest, opts ...grpc.CallOption) (*Topic, error)
// UpdateTopic renames a topic (display_name). The slug is a stable
// identifier and cannot be changed. Topics are persistent in the MVP:
// there is no delete API.
UpdateTopic(ctx context.Context, in *UpdateTopicRequest, opts ...grpc.CallOption) (*Topic, error)
// PostMessage appends a message to a topic. Repeated calls with the same // PostMessage appends a message to a topic. Repeated calls with the same
// (author_id, idempotency_key) must not create a second message; the // (author_id, idempotency_key) must not create a second message; the
// original message is returned with duplicated=true instead. // original message is returned with duplicated=true instead.
@ -100,6 +105,16 @@ func (c *chatServiceClient) CreateTopic(ctx context.Context, in *CreateTopicRequ
return out, nil return out, nil
} }
func (c *chatServiceClient) UpdateTopic(ctx context.Context, in *UpdateTopicRequest, opts ...grpc.CallOption) (*Topic, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(Topic)
err := c.cc.Invoke(ctx, ChatService_UpdateTopic_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *chatServiceClient) PostMessage(ctx context.Context, in *PostMessageRequest, opts ...grpc.CallOption) (*PostMessageResponse, error) { func (c *chatServiceClient) PostMessage(ctx context.Context, in *PostMessageRequest, opts ...grpc.CallOption) (*PostMessageResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(PostMessageResponse) out := new(PostMessageResponse)
@ -173,6 +188,10 @@ type ChatServiceServer interface {
GetTopic(context.Context, *GetTopicRequest) (*Topic, error) GetTopic(context.Context, *GetTopicRequest) (*Topic, error)
// CreateTopic creates a new topic. Slug must be unique. // CreateTopic creates a new topic. Slug must be unique.
CreateTopic(context.Context, *CreateTopicRequest) (*Topic, error) CreateTopic(context.Context, *CreateTopicRequest) (*Topic, error)
// UpdateTopic renames a topic (display_name). The slug is a stable
// identifier and cannot be changed. Topics are persistent in the MVP:
// there is no delete API.
UpdateTopic(context.Context, *UpdateTopicRequest) (*Topic, error)
// PostMessage appends a message to a topic. Repeated calls with the same // PostMessage appends a message to a topic. Repeated calls with the same
// (author_id, idempotency_key) must not create a second message; the // (author_id, idempotency_key) must not create a second message; the
// original message is returned with duplicated=true instead. // original message is returned with duplicated=true instead.
@ -209,6 +228,9 @@ func (UnimplementedChatServiceServer) GetTopic(context.Context, *GetTopicRequest
func (UnimplementedChatServiceServer) CreateTopic(context.Context, *CreateTopicRequest) (*Topic, error) { func (UnimplementedChatServiceServer) CreateTopic(context.Context, *CreateTopicRequest) (*Topic, error) {
return nil, status.Error(codes.Unimplemented, "method CreateTopic not implemented") return nil, status.Error(codes.Unimplemented, "method CreateTopic not implemented")
} }
func (UnimplementedChatServiceServer) UpdateTopic(context.Context, *UpdateTopicRequest) (*Topic, error) {
return nil, status.Error(codes.Unimplemented, "method UpdateTopic not implemented")
}
func (UnimplementedChatServiceServer) PostMessage(context.Context, *PostMessageRequest) (*PostMessageResponse, error) { func (UnimplementedChatServiceServer) PostMessage(context.Context, *PostMessageRequest) (*PostMessageResponse, error) {
return nil, status.Error(codes.Unimplemented, "method PostMessage not implemented") return nil, status.Error(codes.Unimplemented, "method PostMessage not implemented")
} }
@ -299,6 +321,24 @@ func _ChatService_CreateTopic_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _ChatService_UpdateTopic_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateTopicRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ChatServiceServer).UpdateTopic(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: ChatService_UpdateTopic_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ChatServiceServer).UpdateTopic(ctx, req.(*UpdateTopicRequest))
}
return interceptor(ctx, in, info, handler)
}
func _ChatService_PostMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _ChatService_PostMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(PostMessageRequest) in := new(PostMessageRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -401,6 +441,10 @@ var ChatService_ServiceDesc = grpc.ServiceDesc{
MethodName: "CreateTopic", MethodName: "CreateTopic",
Handler: _ChatService_CreateTopic_Handler, Handler: _ChatService_CreateTopic_Handler,
}, },
{
MethodName: "UpdateTopic",
Handler: _ChatService_UpdateTopic_Handler,
},
{ {
MethodName: "PostMessage", MethodName: "PostMessage",
Handler: _ChatService_PostMessage_Handler, Handler: _ChatService_PostMessage_Handler,