diff --git a/api/db.go b/api/db.go index aeb0e81..a127971 100644 --- a/api/db.go +++ b/api/db.go @@ -41,11 +41,21 @@ func dbGetMessage(id string) (*Message, error) { if err != nil { return nil, fmt.Errorf("failed to parse timestamp: %v", err) } + editedStr, ok := message["Edited"].(string) + var edited time.Time + if ok && editedStr != "" { + var err error + edited, err = time.Parse(time.RFC3339, editedStr) + if err != nil { + return nil, fmt.Errorf("failed to parse edited timestamp: %v", err) + } + } return &Message{ ID: message["ID"].(string), UserID: int64(message["UserID"].(float64)), Body: message["Body"].(string), Timestamp: timestamp, + Edited: edited, }, nil } } @@ -67,11 +77,21 @@ func dbGetAllMessages() ([]*Message, error) { if err != nil { return nil, fmt.Errorf("failed to parse timestamp: %v", err) } + editedStr, ok := message["Edited"].(string) + var edited time.Time + if ok && editedStr != "" { + var err error + edited, err = time.Parse(time.RFC3339, editedStr) + if err != nil { + return nil, fmt.Errorf("failed to parse edited timestamp: %v", err) + } + } result = append(result, &Message{ ID: message["ID"].(string), UserID: int64(message["UserID"].(float64)), Body: message["Body"].(string), Timestamp: timestamp, + Edited: edited, }) } if len(result) == 0 { @@ -111,11 +131,19 @@ func dbAddMessage(message *Message) error { return fmt.Errorf("messages data is in an unexpected format") } + var edited interface{} + if message.Edited.IsZero() { + edited = nil // Set to nil if Edited is the zero value + } else { + edited = message.Edited.Format(time.RFC3339) + } + dbMessage := map[string]interface{}{ "ID": message.ID, "UserID": message.UserID, // JSON numbers are float64 "Body": message.Body, - "Timestamp": message.Timestamp, + "Timestamp": message.Timestamp.Format(time.RFC3339), + "Edited": edited, } messages = append(messages, dbMessage) diff --git a/api/message.go b/api/message.go index 4daf216..b6b0448 100644 --- a/api/message.go +++ b/api/message.go @@ -66,6 +66,7 @@ func EditMessage(w http.ResponseWriter, r *http.Request) { } message.Body = body dbDeleteMessage(message.ID) + message.Edited = time.Now() err = dbAddMessage(message) if err != nil { } @@ -125,6 +126,7 @@ func NewMessage(w http.ResponseWriter, r *http.Request) { UserID: userID, Body: body, Timestamp: time.Now(), + Edited: time.Time{}, } err = dbAddMessage(&msg) @@ -143,6 +145,7 @@ type Message struct { UserID int64 `json:"user_id"` Body string `json:"body"` Timestamp time.Time `json:"timestamp"` + Edited time.Time `json:"edited"` } type MessageRequest struct { @@ -167,15 +170,23 @@ func (m MessageResponse) MarshalJSON() ([]byte, error) { UserID int64 `json:"user_id"` Body string `json:"body"` Timestamp string `json:"timestamp"` + Edited *string `json:"edited,omitempty"` // Use a pointer to allow null values User *UserPayload `json:"user,omitempty"` Elapsed int64 `json:"elapsed"` } + var edited *string + if !m.Message.Edited.IsZero() { // Check if Edited is not the zero value + editedStr := m.Message.Edited.Format(time.RFC3339) + edited = &editedStr + } + ordered := OrderedMessageResponse{ ID: m.Message.ID, UserID: m.Message.UserID, Body: m.Message.Body, Timestamp: m.Message.Timestamp.Format(time.RFC3339), + Edited: edited, // Null if Edited is zero User: m.User, Elapsed: m.Elapsed, }