diff --git a/proto/messages.pb.go b/proto/messages.pb.go index 9042144..abddc03 100644 --- a/proto/messages.pb.go +++ b/proto/messages.pb.go @@ -294,6 +294,7 @@ type UpdateMessageStatusRequest struct { state protoimpl.MessageState `protogen:"open.v1"` MessageId int32 `protobuf:"varint,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + UserId int32 `protobuf:"varint,3,opt,name=userId,proto3" json:"userId,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -342,6 +343,13 @@ func (x *UpdateMessageStatusRequest) GetStatus() string { return "" } +func (x *UpdateMessageStatusRequest) GetUserId() int32 { + if x != nil { + return x.UserId + } + return 0 +} + type StreamMessagesRequest struct { state protoimpl.MessageState `protogen:"open.v1"` UserId int32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` @@ -758,11 +766,12 @@ const file_messages_proto_rawDesc = "" + "\x05limit\x18\x02 \x01(\x05R\x05limit\x12\x16\n" + "\x06offset\x18\x03 \x01(\x05R\x06offset\".\n" + "\x13GetUserChatsRequest\x12\x17\n" + - "\auser_id\x18\x01 \x01(\x05R\x06userId\"S\n" + + "\auser_id\x18\x01 \x01(\x05R\x06userId\"k\n" + "\x1aUpdateMessageStatusRequest\x12\x1d\n" + "\n" + "message_id\x18\x01 \x01(\x05R\tmessageId\x12\x16\n" + - "\x06status\x18\x02 \x01(\tR\x06status\"0\n" + + "\x06status\x18\x02 \x01(\tR\x06status\x12\x16\n" + + "\x06userId\x18\x03 \x01(\x05R\x06userId\"0\n" + "\x15StreamMessagesRequest\x12\x17\n" + "\auser_id\x18\x01 \x01(\x05R\x06userId\"\xdd\x01\n" + "\aMessage\x12\x0e\n" + diff --git a/proto/messages.proto b/proto/messages.proto index 0a824d0..7ddf475 100644 --- a/proto/messages.proto +++ b/proto/messages.proto @@ -45,6 +45,7 @@ message GetUserChatsRequest { message UpdateMessageStatusRequest { int32 message_id = 1; string status = 2; + int32 userId = 3; } message StreamMessagesRequest { diff --git a/server.go b/server.go index 481560e..fea0274 100644 --- a/server.go +++ b/server.go @@ -390,35 +390,34 @@ func (s *server) GetUserChats(ctx context.Context, req *proto.GetUserChatsReques } func (s *server) UpdateMessageStatus(ctx context.Context, req *proto.UpdateMessageStatusRequest) (*proto.MessageResponse, error) { - s.logRequest("UpdateMessageStatus", req) - defer func(start time.Time) { - s.logger.Printf("UpdateMessageStatus execution time: %v", time.Since(start)) - }(time.Now()) - - s.logger.Printf("Updating message status: message_id=%d, status=%s", req.MessageId, req.Status) - var message proto.Message - var createdAt time.Time - - err := s.db.QueryRow(ctx, ` - UPDATE messages - SET status = $1 - WHERE id = $2 - RETURNING id, chat_id, sender_id, receiver_id, content, status, created_at - `, req.Status, req.MessageId).Scan( - &message.Id, &message.ChatId, &message.SenderId, &message.ReceiverId, &message.Content, &message.Status, &createdAt, - ) - if err != nil { - s.logger.Printf("Failed to update message status: %v", err) - return nil, err + // Если MessageId = 0, обновляем все сообщения для пользователя + if req.MessageId == 0 { + _, err := s.db.Exec(ctx, ` + UPDATE messages + SET status = $1 + WHERE receiver_id = $2 AND status = 'SENT' + `, req.Status, req.UserId) + if err != nil { + return nil, fmt.Errorf("failed to bulk update status: %w", err) + } + return &proto.MessageResponse{}, nil } - message.CreatedAt = timestamppb.New(createdAt) - - s.logger.Printf("Successfully updated message status: message_id=%d, new_status=%s", - message.Id, message.Status) - resp := &proto.MessageResponse{Message: &message} - s.logResponse("UpdateMessageStatus", resp, nil) - return resp, nil + // Обычное обновление одного сообщения + var msg proto.Message + err := s.db.QueryRow(ctx, ` + UPDATE messages + SET status = $1 + WHERE id = $2 + RETURNING id, chat_id, sender_id, receiver_id, content, status, created_at + `, req.Status, req.MessageId).Scan( + &msg.Id, &msg.ChatId, &msg.SenderId, &msg.ReceiverId, + &msg.Content, &msg.Status, &msg.CreatedAt, + ) + if err != nil { + return nil, fmt.Errorf("failed to update status: %w", err) + } + return &proto.MessageResponse{Message: &msg}, nil } func (s *server) StreamMessages(req *proto.StreamMessagesRequest, stream proto.MessageService_StreamMessagesServer) error {