diff --git a/himu/assets/js/app.js b/himu/assets/js/app.js index 9bd3ef5..f5978be 100644 --- a/himu/assets/js/app.js +++ b/himu/assets/js/app.js @@ -115,7 +115,7 @@ const index = this.messages.findIndex(m => { return m.id === updatedMessage.id }) - Vue.set(this.messages, index, updatedMessage) + Vue.set(this.messages, index, response.result) }) }, clearMessage() { diff --git a/himu/controller/message.go b/himu/controller/message.go index 0e54c5f..3f0cf8b 100644 --- a/himu/controller/message.go +++ b/himu/controller/message.go @@ -98,8 +98,42 @@ func (m *Message) Create(c *gin.Context) { // UpdateByID は... func (m *Message) UpdateByID(c *gin.Context) { // Mission 1-1. メッセージを編集しよう - // ... - c.JSON(http.StatusCreated, gin.H{}) + + msg, err := model.MessageByID(m.DB, c.Param("id")) + switch { + case err == sql.ErrNoRows: + resp := httputil.NewErrorResponse(err) + c.JSON(http.StatusNotFound, resp) + return + case err != nil: + resp := httputil.NewErrorResponse(err) + c.JSON(http.StatusInternalServerError, resp) + return + } + + var requestMessage model.Message + if c.Request.ContentLength == 0 { + resp := httputil.NewErrorResponse(errors.New("body is missing")) + c.JSON(http.StatusBadRequest, resp) + return + } + if err := c.BindJSON(&requestMessage); err != nil { + resp := httputil.NewErrorResponse(err) + c.JSON(http.StatusInternalServerError, resp) + return + } + + updatedMessage, err := model.UpdateMessageBody(m.DB, msg, requestMessage.Body) + if err != nil { + resp := httputil.NewErrorResponse(err) + c.JSON(http.StatusInternalServerError, resp) + return + } + + c.JSON(http.StatusOK, gin.H{ + "result": updatedMessage, + "error": nil, + }) } // DeleteByID は... diff --git a/himu/model/message.go b/himu/model/message.go index 3c73f19..54194d0 100644 --- a/himu/model/message.go +++ b/himu/model/message.go @@ -71,7 +71,16 @@ func (m *Message) Insert(db *sql.DB) (*Message, error) { } // Mission 1-1. メッセージを編集しよう -// ... +func UpdateMessageBody(db *sql.DB, msg *Message, newBody string) (*Message, error) { + if _, err := db.Exec(`update message set body = ? where id = ?`, newBody, msg.ID); err != nil { + return nil, err + } + return &Message{ + ID: msg.ID, + Body: newBody, + Username: msg.Username, + }, nil +} // Mission 1-2. メッセージを削除しよう // ... diff --git a/himu/server_test.go b/himu/server_test.go index 8e495e3..9f12994 100644 --- a/himu/server_test.go +++ b/himu/server_test.go @@ -181,6 +181,27 @@ func TestHelloWorldBotが反応する(t *testing.T) { } } -func TestAPIが指定したIDのメッセージを更新する(t *testing.T) {} +func TestAPIが指定したIDのメッセージを更新する(t *testing.T) { + req, err := http.NewRequest(http.MethodPut, tsURL+"/api/messages/1", bytes.NewBuffer([]byte(`{"body":"testmessage"}`))) + if err != nil { + panic(err) + } + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatalf("failed to send request: %s", err) + } + defer res.Body.Close() + + b, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatalf("failed to read http response, %s", err) + } + + expected := `{"error":null,"result":{"id":1,"body":"testmessage","username":"sampleuser"}}` + actual := strings.TrimRight(string(b), "\n") + if actual != expected { + t.Fatalf("response body expected %s, but %s", expected, string(b)) + } +} func TestAPIが指定したIDのメッセージを削除する(t *testing.T) {}