Refactor client message handling and storage
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is failing
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	continuous-integration/drone/push Build is failing
				
			This commit is contained in:
		@@ -3,8 +3,9 @@ package client
 | 
				
			|||||||
import "forge.redroom.link/yves/meowlib"
 | 
					import "forge.redroom.link/yves/meowlib"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type InternalUserMessage struct {
 | 
					type InternalUserMessage struct {
 | 
				
			||||||
	message *meowlib.UserMessage
 | 
						Message *meowlib.UserMessage
 | 
				
			||||||
	dbid    int64
 | 
						Dbfile  string
 | 
				
			||||||
 | 
						Dbid    int64
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ProcessOutboundTextMessage(peer *Peer, text string, srv *Server) ([]byte, error) {
 | 
					func ProcessOutboundTextMessage(peer *Peer, text string, srv *Server) ([]byte, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -73,8 +73,56 @@ func StoreMessage(peer *Peer, usermessage *meowlib.UserMessage, password string)
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get last messages from a peer
 | 
					// Get new messages from a peer
 | 
				
			||||||
func GetLastMessages(peer *Peer, inAppMsgCount int, lastDbId int, wantMore int, password string) ([]InternalUserMessage, error) {
 | 
					func GetNewMessages(peer *Peer, lastDbId int, password string) ([]InternalUserMessage, error) {
 | 
				
			||||||
 | 
						var messages []InternalUserMessage
 | 
				
			||||||
 | 
						fileidx := len(peer.DbIds) - 1
 | 
				
			||||||
 | 
						// There fileidx should provide the db that we need (unless wantMore overlaps the next DB)
 | 
				
			||||||
 | 
						db, _ := sql.Open("sqlite3", filepath.Join(GetConfig().StoragePath, peer.DbIds[fileidx]+GetConfig().DbSuffix)) // Open the created SQLite File
 | 
				
			||||||
 | 
						defer db.Close()
 | 
				
			||||||
 | 
						//  if it's first app query, it won't hold a lastIndex, so let's start from end
 | 
				
			||||||
 | 
						if lastDbId == 0 {
 | 
				
			||||||
 | 
							lastDbId = math.MaxInt64
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						stm, err := db.Prepare("SELECT id, m FROM message WHERE id > ? ORDER BY id DESC")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer stm.Close()
 | 
				
			||||||
 | 
						rows, err := stm.Query(lastDbId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer rows.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for rows.Next() {
 | 
				
			||||||
 | 
							var ium InternalUserMessage
 | 
				
			||||||
 | 
							var um meowlib.UserMessage
 | 
				
			||||||
 | 
							var id int64
 | 
				
			||||||
 | 
							var m []byte
 | 
				
			||||||
 | 
							err = rows.Scan(&id, &m)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							decdata, err := meowlib.SymDecrypt(password, m)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							err = proto.Unmarshal(decdata, &um)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ium.Dbid = id
 | 
				
			||||||
 | 
							ium.Dbfile = peer.DbIds[fileidx]
 | 
				
			||||||
 | 
							ium.Message = &um
 | 
				
			||||||
 | 
							messages = append(messages, ium)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// TODO DB overlap
 | 
				
			||||||
 | 
						return messages, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get old messages from a peer
 | 
				
			||||||
 | 
					func GetMessagesHistory(peer *Peer, inAppMsgCount int, lastDbId int, wantMore int, password string) ([]InternalUserMessage, error) {
 | 
				
			||||||
	var messages []InternalUserMessage
 | 
						var messages []InternalUserMessage
 | 
				
			||||||
	fileidx := len(peer.DbIds) - 1
 | 
						fileidx := len(peer.DbIds) - 1
 | 
				
			||||||
	// initialize count with last db message count
 | 
						// initialize count with last db message count
 | 
				
			||||||
@@ -129,8 +177,9 @@ func GetLastMessages(peer *Peer, inAppMsgCount int, lastDbId int, wantMore int,
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ium.dbid = id
 | 
							ium.Dbid = id
 | 
				
			||||||
		ium.message = &um
 | 
							ium.Dbfile = peer.DbIds[fileidx]
 | 
				
			||||||
 | 
							ium.Message = &um
 | 
				
			||||||
		messages = append(messages, ium)
 | 
							messages = append(messages, ium)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// TODO DB overlap
 | 
						// TODO DB overlap
 | 
				
			||||||
@@ -18,13 +18,13 @@ func TestStoreMessage(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatal(err)
 | 
							log.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	messages, err := GetLastMessages(&id.Peers[0], 0, 0, 10, GetConfig().memoryPassword)
 | 
						messages, err := GetMessagesHistory(&id.Peers[0], 0, 0, 10, GetConfig().memoryPassword)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatal(err)
 | 
							log.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Checks
 | 
						// Checks
 | 
				
			||||||
	assert.Equal(t, len(messages), 1, "not 1 message")
 | 
						assert.Equal(t, len(messages), 1, "not 1 message")
 | 
				
			||||||
	assert.Equal(t, messages[0].message.Data, um.Data, "not 1 message")
 | 
						assert.Equal(t, messages[0].Message.Data, um.Data, "not 1 message")
 | 
				
			||||||
	// Cleanup
 | 
						// Cleanup
 | 
				
			||||||
	if exists("test.id") {
 | 
						if exists("test.id") {
 | 
				
			||||||
		os.Remove("test.id")
 | 
							os.Remove("test.id")
 | 
				
			||||||
@@ -50,7 +50,7 @@ func TestManyStoreMessage(t *testing.T) {
 | 
				
			|||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	messages, err := GetLastMessages(&id.Peers[0], 0, 0, 10, GetConfig().memoryPassword)
 | 
						messages, err := GetMessagesHistory(&id.Peers[0], 0, 0, 10, GetConfig().memoryPassword)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatal(err)
 | 
							log.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -273,19 +273,31 @@ func (p *Peer) SetDbPassword(password string) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *Peer) GetDbPassword() string {
 | 
					func (p *Peer) GetDbPassword() string {
 | 
				
			||||||
 | 
						if p.dbPassword == "" {
 | 
				
			||||||
 | 
							return GetConfig().memoryPassword
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return p.dbPassword
 | 
						return p.dbPassword
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *Peer) StoreMessage(msg []byte) {
 | 
					func (p *Peer) StoreMessage(msg *meowlib.UserMessage) error {
 | 
				
			||||||
 | 
						return StoreMessage(p, msg, p.GetDbPassword())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p *Peer) UpdateMessage(msg InternalUserMessage) error {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p *Peer) LoadLastMessages(alreadyLoadedCount int, oldestMessageId int, qty int) ([]InternalUserMessage, error) {
 | 
				
			||||||
 | 
						return GetMessagesHistory(p, alreadyLoadedCount, oldestMessageId, 1, p.GetDbPassword())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *Peer) LoadMessage(uid string) {
 | 
					func (p *Peer) LoadNewMessages(lastMessageId int) ([]InternalUserMessage, error) {
 | 
				
			||||||
 | 
						return GetNewMessages(p, lastMessageId, p.GetDbPassword())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *Peer) LoadLastMessages(qty int) {
 | 
					func (p *Peer) LoadMessage(uid string) (*InternalUserMessage, error) {
 | 
				
			||||||
 | 
						return nil, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *Peer) GetLastMessageUuid(msg []byte) {
 | 
					func (p *Peer) GetLastMessageUuid(msg []byte) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user