messages: Implements /messages API
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"sort"
|
||||
|
||||
"code.severnaya.net/kordophone-mock/v2/data"
|
||||
"code.severnaya.net/kordophone-mock/v2/model"
|
||||
)
|
||||
@@ -16,6 +18,7 @@ type Server struct {
|
||||
version string
|
||||
conversations []model.Conversation
|
||||
authTokens []model.AuthToken
|
||||
messageStore map[string][]model.Message
|
||||
}
|
||||
|
||||
type AuthError struct {
|
||||
@@ -26,10 +29,20 @@ func (e *AuthError) Error() string {
|
||||
return e.message
|
||||
}
|
||||
|
||||
type DatabaseError struct {
|
||||
message string
|
||||
}
|
||||
|
||||
func (e *DatabaseError) Error() string {
|
||||
return e.message
|
||||
}
|
||||
|
||||
func NewServer() *Server {
|
||||
return &Server{
|
||||
version: VERSION,
|
||||
conversations: []model.Conversation{},
|
||||
authTokens: []model.AuthToken{},
|
||||
messageStore: make(map[string][]model.Message),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +54,22 @@ func (s *Server) Conversations() []model.Conversation {
|
||||
return s.conversations
|
||||
}
|
||||
|
||||
func (s *Server) ConversationForGUID(guid string) (*model.Conversation, error) {
|
||||
var conversation *model.Conversation = nil
|
||||
for _, c := range s.conversations {
|
||||
if c.Guid == guid {
|
||||
conversation = &c
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if conversation != nil {
|
||||
return conversation, nil
|
||||
}
|
||||
|
||||
return nil, &DatabaseError{message: "Conversation not found"}
|
||||
}
|
||||
|
||||
func (s *Server) AddConversation(c model.Conversation) {
|
||||
s.conversations = append(s.conversations, c)
|
||||
}
|
||||
@@ -50,6 +79,21 @@ func (s *Server) PopulateWithTestData() {
|
||||
cs := make([]model.Conversation, numConversations)
|
||||
for i := 0; i < numConversations; i++ {
|
||||
cs[i] = data.GenerateRandomConversation()
|
||||
|
||||
// Generate messages
|
||||
convo := &cs[i]
|
||||
var lastMessage model.Message
|
||||
for i := 0; i < 100; i++ {
|
||||
message := data.GenerateRandomMessage(convo.Participants)
|
||||
s.AppendMessageToConversation(convo, message)
|
||||
|
||||
if lastMessage.Date.Before(message.Date) {
|
||||
lastMessage = message
|
||||
}
|
||||
}
|
||||
|
||||
// Update last message preview
|
||||
convo.LastMessagePreview = lastMessage.Text
|
||||
}
|
||||
|
||||
s.conversations = cs
|
||||
@@ -75,6 +119,19 @@ func (s *Server) CheckBearerToken(token string) bool {
|
||||
return s.authenticateToken(token)
|
||||
}
|
||||
|
||||
func (s *Server) MessagesForConversation(conversation model.Conversation) []model.Message {
|
||||
messages := s.messageStore[conversation.Guid]
|
||||
sort.Slice(messages, func(i int, j int) bool {
|
||||
return messages[i].Date.Before(messages[j].Date)
|
||||
})
|
||||
|
||||
return messages
|
||||
}
|
||||
|
||||
func (s *Server) AppendMessageToConversation(conversation *model.Conversation, message model.Message) {
|
||||
s.messageStore[conversation.Guid] = append(s.messageStore[conversation.Guid], message)
|
||||
}
|
||||
|
||||
// Private
|
||||
|
||||
func (s *Server) registerAuthToken(token *model.AuthToken) {
|
||||
|
||||
Reference in New Issue
Block a user