mirror of
https://github.com/status-im/status-go.git
synced 2025-02-16 16:56:53 +00:00
Add mark as read endpoint (#1863)
This commit is contained in:
parent
7a64fbf5f7
commit
5cc60de80b
@ -1658,21 +1658,6 @@ func (m *Messenger) syncContact(ctx context.Context, contact *Contact) error {
|
|||||||
return m.saveChat(chat)
|
return m.saveChat(chat)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendRaw takes encoded data, encrypts it and sends through the wire.
|
|
||||||
// DEPRECATED
|
|
||||||
func (m *Messenger) SendRaw(ctx context.Context, chat Chat, data []byte) ([]byte, error) {
|
|
||||||
publicKey, err := chat.PublicKey()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if publicKey != nil {
|
|
||||||
return m.processor.SendPrivateRaw(ctx, publicKey, data, protobuf.ApplicationMetadataMessage_UNKNOWN)
|
|
||||||
} else if chat.Name != "" {
|
|
||||||
return m.processor.SendPublicRaw(ctx, chat.Name, data, protobuf.ApplicationMetadataMessage_UNKNOWN)
|
|
||||||
}
|
|
||||||
return nil, errors.New("chat is neither public nor private")
|
|
||||||
}
|
|
||||||
|
|
||||||
// RetrieveAll retrieves messages from all filters, processes them and returns a
|
// RetrieveAll retrieves messages from all filters, processes them and returns a
|
||||||
// MessengerResponse to the client
|
// MessengerResponse to the client
|
||||||
func (m *Messenger) RetrieveAll() (*MessengerResponse, error) {
|
func (m *Messenger) RetrieveAll() (*MessengerResponse, error) {
|
||||||
@ -1980,17 +1965,14 @@ func (m *Messenger) RequestHistoricMessages(
|
|||||||
return m.transport.SendMessagesRequest(ctx, peer, from, to, cursor)
|
return m.transport.SendMessagesRequest(ctx, peer, from, to, cursor)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED
|
|
||||||
func (m *Messenger) LoadFilters(filters []*transport.Filter) ([]*transport.Filter, error) {
|
func (m *Messenger) LoadFilters(filters []*transport.Filter) ([]*transport.Filter, error) {
|
||||||
return m.transport.LoadFilters(filters)
|
return m.transport.LoadFilters(filters)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED
|
|
||||||
func (m *Messenger) RemoveFilters(filters []*transport.Filter) error {
|
func (m *Messenger) RemoveFilters(filters []*transport.Filter) error {
|
||||||
return m.transport.RemoveFilters(filters)
|
return m.transport.RemoveFilters(filters)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED
|
|
||||||
func (m *Messenger) ConfirmMessagesProcessed(messageIDs [][]byte) error {
|
func (m *Messenger) ConfirmMessagesProcessed(messageIDs [][]byte) error {
|
||||||
for _, id := range messageIDs {
|
for _, id := range messageIDs {
|
||||||
if err := m.encryptor.ConfirmMessageProcessed(id); err != nil {
|
if err := m.encryptor.ConfirmMessageProcessed(id); err != nil {
|
||||||
@ -2000,37 +1982,30 @@ func (m *Messenger) ConfirmMessagesProcessed(messageIDs [][]byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
|
||||||
func (m *Messenger) MessageByID(id string) (*Message, error) {
|
func (m *Messenger) MessageByID(id string) (*Message, error) {
|
||||||
return m.persistence.MessageByID(id)
|
return m.persistence.MessageByID(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
|
||||||
func (m *Messenger) MessagesExist(ids []string) (map[string]bool, error) {
|
func (m *Messenger) MessagesExist(ids []string) (map[string]bool, error) {
|
||||||
return m.persistence.MessagesExist(ids)
|
return m.persistence.MessagesExist(ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
|
||||||
func (m *Messenger) MessageByChatID(chatID, cursor string, limit int) ([]*Message, string, error) {
|
func (m *Messenger) MessageByChatID(chatID, cursor string, limit int) ([]*Message, string, error) {
|
||||||
return m.persistence.MessageByChatID(chatID, cursor, limit)
|
return m.persistence.MessageByChatID(chatID, cursor, limit)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
|
||||||
func (m *Messenger) SaveMessages(messages []*Message) error {
|
func (m *Messenger) SaveMessages(messages []*Message) error {
|
||||||
return m.persistence.SaveMessagesLegacy(messages)
|
return m.persistence.SaveMessagesLegacy(messages)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
|
||||||
func (m *Messenger) DeleteMessage(id string) error {
|
func (m *Messenger) DeleteMessage(id string) error {
|
||||||
return m.persistence.DeleteMessage(id)
|
return m.persistence.DeleteMessage(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
|
||||||
func (m *Messenger) DeleteMessagesByChatID(id string) error {
|
func (m *Messenger) DeleteMessagesByChatID(id string) error {
|
||||||
return m.persistence.DeleteMessagesByChatID(id)
|
return m.persistence.DeleteMessagesByChatID(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
|
||||||
func (m *Messenger) MarkMessagesSeen(chatID string, ids []string) error {
|
func (m *Messenger) MarkMessagesSeen(chatID string, ids []string) error {
|
||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
defer m.mutex.Unlock()
|
defer m.mutex.Unlock()
|
||||||
@ -2047,7 +2022,24 @@ func (m *Messenger) MarkMessagesSeen(chatID string, ids []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: required by status-react.
|
func (m *Messenger) MarkAllRead(chatID string) error {
|
||||||
|
m.mutex.Lock()
|
||||||
|
defer m.mutex.Unlock()
|
||||||
|
chat, ok := m.allChats[chatID]
|
||||||
|
if !ok {
|
||||||
|
return errors.New("chat not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := m.persistence.MarkAllRead(chatID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
chat.UnviewedMessagesCount = 0
|
||||||
|
m.allChats[chat.ID] = chat
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Messenger) UpdateMessageOutgoingStatus(id, newOutgoingStatus string) error {
|
func (m *Messenger) UpdateMessageOutgoingStatus(id, newOutgoingStatus string) error {
|
||||||
return m.persistence.UpdateMessageOutgoingStatus(id, newOutgoingStatus)
|
return m.persistence.UpdateMessageOutgoingStatus(id, newOutgoingStatus)
|
||||||
}
|
}
|
||||||
|
@ -327,6 +327,29 @@ func (s *MessengerSuite) TestMarkMessagesSeen() {
|
|||||||
s.Require().Equal(uint(1), chats[0].UnviewedMessagesCount)
|
s.Require().Equal(uint(1), chats[0].UnviewedMessagesCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *MessengerSuite) TestMarkAllRead() {
|
||||||
|
chat := CreatePublicChat("test-chat", s.m.transport)
|
||||||
|
chat.UnviewedMessagesCount = 2
|
||||||
|
err := s.m.SaveChat(&chat)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
inputMessage1 := buildTestMessage(chat)
|
||||||
|
inputMessage1.ID = "1"
|
||||||
|
inputMessage1.Seen = false
|
||||||
|
inputMessage2 := buildTestMessage(chat)
|
||||||
|
inputMessage2.ID = "2"
|
||||||
|
inputMessage2.Seen = false
|
||||||
|
|
||||||
|
err = s.m.SaveMessages([]*Message{inputMessage1, inputMessage2})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
err = s.m.MarkAllRead(chat.ID)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
chats := s.m.Chats()
|
||||||
|
s.Require().Len(chats, 1)
|
||||||
|
s.Require().Equal(uint(0), chats[0].UnviewedMessagesCount)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestSendPublic() {
|
func (s *MessengerSuite) TestSendPublic() {
|
||||||
chat := CreatePublicChat("test-chat", s.m.transport)
|
chat := CreatePublicChat("test-chat", s.m.transport)
|
||||||
chat.LastClockValue = uint64(100000000000000)
|
chat.LastClockValue = uint64(100000000000000)
|
||||||
|
@ -434,6 +434,28 @@ func (db sqlitePersistence) DeleteMessagesByChatID(id string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db sqlitePersistence) MarkAllRead(chatID string) error {
|
||||||
|
tx, err := db.db.BeginTx(context.Background(), &sql.TxOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err == nil {
|
||||||
|
err = tx.Commit()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// don't shadow original error
|
||||||
|
_ = tx.Rollback()
|
||||||
|
}()
|
||||||
|
|
||||||
|
_, err = tx.Exec(`UPDATE user_messages SET seen = 1 WHERE local_chat_id = ?`, chatID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = tx.Exec(`UPDATE chats SET unviewed_message_count = 0 WHERE id = ?`, chatID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (db sqlitePersistence) MarkMessagesSeen(chatID string, ids []string) error {
|
func (db sqlitePersistence) MarkMessagesSeen(chatID string, ids []string) error {
|
||||||
tx, err := db.db.BeginTx(context.Background(), &sql.TxOptions{})
|
tx, err := db.db.BeginTx(context.Background(), &sql.TxOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -194,30 +194,6 @@ func (api *PublicAPI) ConfirmMessagesProcessedByID(messageConfirmations []*Metad
|
|||||||
return api.service.ConfirmMessagesProcessed(encryptionIDs)
|
return api.service.ConfirmMessagesProcessed(encryptionIDs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendPublicMessage sends a public chat message to the underlying transport.
|
|
||||||
// Message's payload is a transit encoded message.
|
|
||||||
// It's important to call PublicAPI.afterSend() so that the client receives a signal
|
|
||||||
// with confirmation that the message left the device.
|
|
||||||
func (api *PublicAPI) SendPublicMessage(ctx context.Context, msg SendPublicMessageRPC) (types.HexBytes, error) {
|
|
||||||
chat := protocol.Chat{
|
|
||||||
Name: msg.Chat,
|
|
||||||
}
|
|
||||||
return api.service.messenger.SendRaw(ctx, chat, msg.Payload)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendDirectMessage sends a 1:1 chat message to the underlying transport
|
|
||||||
// Message's payload is a transit encoded message.
|
|
||||||
// It's important to call PublicAPI.afterSend() so that the client receives a signal
|
|
||||||
// with confirmation that the message left the device.
|
|
||||||
func (api *PublicAPI) SendDirectMessage(ctx context.Context, msg SendDirectMessageRPC) (types.HexBytes, error) {
|
|
||||||
chat := protocol.Chat{
|
|
||||||
ChatType: protocol.ChatTypeOneToOne,
|
|
||||||
ID: types.EncodeHex(msg.PubKey),
|
|
||||||
}
|
|
||||||
|
|
||||||
return api.service.messenger.SendRaw(ctx, chat, msg.Payload)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (api *PublicAPI) Join(chat protocol.Chat) error {
|
func (api *PublicAPI) Join(chat protocol.Chat) error {
|
||||||
return api.service.messenger.Join(chat)
|
return api.service.messenger.Join(chat)
|
||||||
}
|
}
|
||||||
@ -337,6 +313,10 @@ func (api *PublicAPI) MarkMessagesSeen(chatID string, ids []string) error {
|
|||||||
return api.service.messenger.MarkMessagesSeen(chatID, ids)
|
return api.service.messenger.MarkMessagesSeen(chatID, ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (api *PublicAPI) MarkAllRead(chatID string) error {
|
||||||
|
return api.service.messenger.MarkAllRead(chatID)
|
||||||
|
}
|
||||||
|
|
||||||
func (api *PublicAPI) UpdateMessageOutgoingStatus(id, newOutgoingStatus string) error {
|
func (api *PublicAPI) UpdateMessageOutgoingStatus(id, newOutgoingStatus string) error {
|
||||||
return api.service.messenger.UpdateMessageOutgoingStatus(id, newOutgoingStatus)
|
return api.service.messenger.UpdateMessageOutgoingStatus(id, newOutgoingStatus)
|
||||||
}
|
}
|
||||||
|
@ -265,30 +265,6 @@ func (api *NimbusPublicAPI) Post(ctx context.Context, newMessage types.NewMessag
|
|||||||
return api.publicAPI.Post(ctx, newMessage)
|
return api.publicAPI.Post(ctx, newMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendPublicMessage sends a public chat message to the underlying transport.
|
|
||||||
// Message's payload is a transit encoded message.
|
|
||||||
// It's important to call NimbusPublicAPI.afterSend() so that the client receives a signal
|
|
||||||
// with confirmation that the message left the device.
|
|
||||||
func (api *NimbusPublicAPI) SendPublicMessage(ctx context.Context, msg SendPublicMessageRPC) (types.HexBytes, error) {
|
|
||||||
chat := protocol.Chat{
|
|
||||||
Name: msg.Chat,
|
|
||||||
}
|
|
||||||
return api.service.messenger.SendRaw(ctx, chat, msg.Payload)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendDirectMessage sends a 1:1 chat message to the underlying transport
|
|
||||||
// Message's payload is a transit encoded message.
|
|
||||||
// It's important to call NimbusPublicAPI.afterSend() so that the client receives a signal
|
|
||||||
// with confirmation that the message left the device.
|
|
||||||
func (api *NimbusPublicAPI) SendDirectMessage(ctx context.Context, msg SendDirectMessageRPC) (types.HexBytes, error) {
|
|
||||||
chat := protocol.Chat{
|
|
||||||
ChatType: protocol.ChatTypeOneToOne,
|
|
||||||
ID: types.EncodeHex(msg.PubKey),
|
|
||||||
}
|
|
||||||
|
|
||||||
return api.service.messenger.SendRaw(ctx, chat, msg.Payload)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (api *NimbusPublicAPI) Join(chat protocol.Chat) error {
|
func (api *NimbusPublicAPI) Join(chat protocol.Chat) error {
|
||||||
return api.service.messenger.Join(chat)
|
return api.service.messenger.Join(chat)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user