diff --git a/internal/api/api.go b/internal/api/api.go index 127c1714..178c700c 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -38,6 +38,7 @@ func API() *gin.Engine { admin.PUT(`/tickers/:tickerID`, PutTickerHandler) admin.PUT(`/tickers/:tickerID/twitter`, PutTickerTwitterHandler) admin.DELETE(`/tickers/:tickerID`, DeleteTickerHandler) + admin.PUT(`/tickers/:tickerID/reset`, ResetTickerHandler) admin.GET(`/tickers/:tickerID/messages`, GetMessagesHandler) admin.GET(`/tickers/:tickerID/messages/:messageID`, GetMessageHandler) diff --git a/internal/api/tickers.go b/internal/api/tickers.go index f03d54ed..21fd9d2f 100644 --- a/internal/api/tickers.go +++ b/internal/api/tickers.go @@ -240,6 +240,43 @@ func DeleteTickerHandler(c *gin.Context) { }) } +func ResetTickerHandler(c *gin.Context) { + if !IsAdmin(c) { + c.JSON(http.StatusForbidden, NewJSONErrorResponse(ErrorCodeInsufficientPermissions, ErrorInsufficientPermissions)) + return + } + + var ticker Ticker + tickerID, err := strconv.Atoi(c.Param("tickerID")) + if err != nil { + c.JSON(http.StatusBadRequest, NewJSONErrorResponse(ErrorCodeDefault, err.Error())) + return + } + + err = DB.One("ID", tickerID, &ticker) + if err != nil { + c.JSON(http.StatusNotFound, NewJSONErrorResponse(ErrorCodeNotFound, err.Error())) + return + } + + //Delete all messages for ticker + DB.Select(q.Eq("Ticker", tickerID)).Delete(new(Message)) + + ticker.Active = false + ticker.Twitter.Secret = "" + ticker.Twitter.Token = "" + ticker.Twitter.Active = false + ticker.Twitter.User = twitter.User{} + + err = DB.Save(&ticker) + if err != nil { + c.JSON(http.StatusNotFound, NewJSONErrorResponse(ErrorCodeDefault, err.Error())) + return + } + + c.JSON(http.StatusOK, NewJSONSuccessResponse("ticker", NewTickerResponse(&ticker))) +} + func contains(s []int, e int) bool { for _, a := range s { if a == e { diff --git a/internal/api/tickers_test.go b/internal/api/tickers_test.go index ab95b4d9..052e33e8 100644 --- a/internal/api/tickers_test.go +++ b/internal/api/tickers_test.go @@ -243,6 +243,76 @@ func TestDeleteTickerHandler(t *testing.T) { }) } +func TestResetTickerHandler(t *testing.T) { + r := setup() + + ticker := model.Ticker{ + ID: 1, + Active: true, + Twitter: model.Twitter{ + Token: "token", + Secret: "secret", + Active: true, + }, + } + + storage.DB.Save(&ticker) + + message := model.NewMessage() + message.Text = "Text" + message.Ticker = 1 + + storage.DB.Save(message) + + r.PUT("/v1/admin/tickers/2/reset"). + SetHeader(map[string]string{"Authorization": "Bearer " + AdminToken}). + Run(api.API(), func(r gofight.HTTPResponse, rq gofight.HTTPRequest) { + assert.Equal(t, 404, r.Code) + }) + + r.PUT("/v1/admin/tickers/1/reset"). + SetHeader(map[string]string{"Authorization": "Bearer " + UserToken}). + Run(api.API(), func(r gofight.HTTPResponse, rq gofight.HTTPRequest) { + assert.Equal(t, 403, r.Code) + assert.Equal(t, `{"data":{},"status":"error","error":{"code":1003,"message":"insufficient permissions"}}`, strings.TrimSpace(r.Body.String())) + }) + + r.PUT("/v1/admin/tickers/1/reset"). + SetHeader(map[string]string{"Authorization": "Bearer " + AdminToken}). + Run(api.API(), func(r gofight.HTTPResponse, rq gofight.HTTPRequest) { + assert.Equal(t, 200, r.Code) + + type jsonResp struct { + Data map[string]model.Ticker `json:"data"` + Status string `json:"status"` + Error interface{} `json:"error"` + } + + var jres jsonResp + + err := json.Unmarshal(r.Body.Bytes(), &jres) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, model.ResponseSuccess, jres.Status) + assert.Equal(t, nil, jres.Error) + assert.Equal(t, 1, len(jres.Data)) + + ticker := jres.Data["ticker"] + + assert.Equal(t, 1, ticker.ID) + assert.Equal(t, false, ticker.Active) + + cnt, err := storage.DB.Count(model.NewMessage()) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, 0, cnt) + }) +} + func setup() *gofight.RequestConfig { gin.SetMode(gin.TestMode)