diff --git a/api/message.go b/api/message.go index 3225c3d9..0d5aebdd 100644 --- a/api/message.go +++ b/api/message.go @@ -45,6 +45,14 @@ type pagingParams struct { Since uint `form:"since" binding:"min=0"` } +// Using custom struct instead of MessageExternal so priority can be a string. +type createMessageRequest struct { + Message string `form:"message" query:"message" json:"message" binding:"required"` + Title string `form:"title" query:"title" json:"title"` + Priority json.Number `form:"priority" query:"priority" json:"priority"` + Extras map[string]interface{} `form:"-" query:"-" json:"extras,omitempty"` +} + // GetMessages returns all messages from a user. // swagger:operation GET /message message getMessages // @@ -362,8 +370,24 @@ func (a *MessageAPI) DeleteMessage(ctx *gin.Context) { // schema: // $ref: "#/definitions/Error" func (a *MessageAPI) CreateMessage(ctx *gin.Context) { - message := model.MessageExternal{} - if err := ctx.Bind(&message); err == nil { + request := createMessageRequest{} + if err := ctx.Bind(&request); err == nil { + message := model.MessageExternal{ + Message: request.Message, + Title: request.Title, + Extras: request.Extras, + } + + // Priority is a json.Number type to handle strings as well as numbers + if request.Priority != "" { + priorityInt64, err := request.Priority.Int64() + if success := successOrAbort(ctx, 400, err); !success { + return + } + priorityInt := int(priorityInt64) + message.Priority = &priorityInt + } + application, err := a.DB.GetApplicationByToken(auth.GetTokenID(ctx)) if success := successOrAbort(ctx, 500, err); !success { return diff --git a/api/message_test.go b/api/message_test.go index 358732e2..1fd0f6c6 100644 --- a/api/message_test.go +++ b/api/message_test.go @@ -338,6 +338,29 @@ func (s *MessageSuite) Test_CreateMessage_onJson_allParams() { assert.Equal(s.T(), expected, s.notifiedMessage) } +func (s *MessageSuite) Test_CreateMessage_onJson_withStringPriority() { + auth.RegisterAuthentication(s.ctx, nil, 4, "app-token") + s.db.User(4).AppWithToken(8, "app-token") + + t, _ := time.Parse("2006/01/02", "2017/01/02") + + timeNow = func() time.Time { return t } + defer func() { timeNow = time.Now }() + + s.ctx.Request = httptest.NewRequest("POST", "/message", strings.NewReader(`{"title": "mytitle", "message": "mymessage", "priority": "2"}`)) + s.ctx.Request.Header.Set("Content-Type", "application/json") + + s.a.CreateMessage(s.ctx) + + msgs, err := s.db.GetMessagesByApplication(8) + assert.NoError(s.T(), err) + expected := &model.MessageExternal{ID: 1, ApplicationID: 8, Title: "mytitle", Message: "mymessage", Priority: intPtr(2), Date: t} + assert.Len(s.T(), msgs, 1) + assert.Equal(s.T(), expected, toExternalMessage(msgs[0])) + assert.Equal(s.T(), 200, s.recorder.Code) + assert.Equal(s.T(), expected, s.notifiedMessage) +} + func (s *MessageSuite) Test_CreateMessage_WithDefaultPriority() { t, _ := time.Parse("2006/01/02", "2017/01/02")