diff --git a/api/api.go b/api/api.go index 87916dc..afc25f3 100644 --- a/api/api.go +++ b/api/api.go @@ -41,6 +41,7 @@ func Start() { r.Route("/{messageID}", func(r chi.Router) { r.Use(MessageCtx) // Load message r.Get("/", GetMessage) + r.Delete("/", DeleteMessage) }) r.Post("/new", NewMessage) }) diff --git a/api/db.go b/api/db.go index fc52000..3539ef4 100644 --- a/api/db.go +++ b/api/db.go @@ -97,3 +97,7 @@ func dbAddMessage(message *Message) error { } return db.AddMessage(dbMessage) } + +func dbDeleteMessage(id string) error { + return db.DeleteMessage(id) +} diff --git a/api/message.go b/api/message.go index ef37adf..bb2de02 100644 --- a/api/message.go +++ b/api/message.go @@ -48,6 +48,23 @@ func GetMessage(w http.ResponseWriter, r *http.Request) { } +func DeleteMessage(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodDelete { + http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) + return + } + message, ok := r.Context().Value(messageKey{}).(*Message) + if !ok || message == nil { + render.Render(w, r, ErrNotFound) + return + } + dbDeleteMessage(message.ID) + if err := render.Render(w, r, NewMessageResponse(message)); err != nil { + render.Render(w, r, ErrRender(err)) + return + } +} + func ListMessages(w http.ResponseWriter, r *http.Request) { dbMessages, err := dbGetAllMessages() if err != nil { diff --git a/db/fake_db.go b/db/fake_db.go index e17411e..247e20b 100644 --- a/db/fake_db.go +++ b/db/fake_db.go @@ -93,3 +93,36 @@ func AddMessage(message map[string]interface{}) error { messages = append(messages, message) return WriteDB("messages", messages) } + +func DeleteMessage(messageID string) error { + currentData := ExecDB("messages") + if currentData == nil { + return fmt.Errorf("error reading messages database") + } + + messages, ok := currentData["messages"].([]interface{}) + if !ok { + return fmt.Errorf("messages data is in an unexpected format") + } + + var updatedMessages []interface{} + found := false + + for _, value := range messages { + if item, ok := value.(map[string]interface{}); ok { + if id, exists := item["ID"]; exists { + if idStr, ok := id.(string); ok && idStr == messageID { + found = true + continue + } + } + } + updatedMessages = append(updatedMessages, value) + } + + if !found { + return fmt.Errorf("message with ID %s not found", messageID) + } + + return WriteDB("messages", updatedMessages) +}