Skip to content

Commit

Permalink
add endpoint to reset an ticker
Browse files Browse the repository at this point in the history
  • Loading branch information
0x46616c6b committed Dec 7, 2018
1 parent 61af4b2 commit 12b44ab
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 0 deletions.
1 change: 1 addition & 0 deletions internal/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
37 changes: 37 additions & 0 deletions internal/api/tickers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
70 changes: 70 additions & 0 deletions internal/api/tickers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit 12b44ab

Please sign in to comment.