From c906b04098677251a17ccdede22ce1476f1cd758 Mon Sep 17 00:00:00 2001 From: himu62 Date: Fri, 1 Jun 2018 11:39:46 +0900 Subject: [PATCH 1/4] add update method --- himu/model/message.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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. メッセージを削除しよう // ... From 94f7a1c91dbcbf3f47b7f6a61d02d56202af87b0 Mon Sep 17 00:00:00 2001 From: himu62 Date: Fri, 1 Jun 2018 11:42:34 +0900 Subject: [PATCH 2/4] implement update controller --- himu/controller/message.go | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) 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 は... From c3b2e5adda0d2f7c0359f939390d086c7d82c07b Mon Sep 17 00:00:00 2001 From: himu62 Date: Fri, 1 Jun 2018 11:51:07 +0900 Subject: [PATCH 3/4] show username when message editing succeed --- himu/assets/js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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() { From 4c2fd8ced0210ec20b6a360296fb3705b84b1886 Mon Sep 17 00:00:00 2001 From: himu62 Date: Fri, 1 Jun 2018 12:15:34 +0900 Subject: [PATCH 4/4] add update endpoint test --- himu/server_test.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) 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) {}