Skip to content

Commit

Permalink
🐛 Updates Users for Tickers
Browse files Browse the repository at this point in the history
  • Loading branch information
0x46616c6b committed Oct 24, 2023
1 parent 4ea7c4d commit 709c676
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 30 deletions.
10 changes: 2 additions & 8 deletions internal/api/tickers.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ func (h *handler) PutTickerUsers(c *gin.Context) {
}

var body struct {
Users []int `json:"users" binding:"required"`
Users []storage.User `json:"users" binding:"required"`
}

err = c.Bind(&body)
Expand All @@ -110,13 +110,7 @@ func (h *handler) PutTickerUsers(c *gin.Context) {
return
}

newUsers, err := h.storage.FindUsersByIDs(body.Users)
if err != nil {
c.JSON(http.StatusInternalServerError, response.ErrorResponse(response.CodeDefault, response.StorageError))
return
}

ticker.Users = append(ticker.Users, newUsers...)
ticker.Users = body.Users

err = h.storage.SaveTicker(&ticker)
if err != nil {
Expand Down
24 changes: 2 additions & 22 deletions internal/api/tickers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,30 +284,10 @@ func TestPutTickerUsersStorageError(t *testing.T) {
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Set("ticker", storage.Ticker{})
body := `{"users":[1,2,3]}`
body := `{"users":[{"id":1},{"id":2},{"id":3}]}`
c.Request = httptest.NewRequest(http.MethodPut, "/v1/admin/tickers/1/user", strings.NewReader(body))
c.Request.Header.Add("Content-Type", "application/json")
s := &storage.MockStorage{}
s.On("FindUsersByIDs", mock.Anything).Return(nil, errors.New("storage error"))
h := handler{
storage: s,
config: config.NewConfig(),
}

h.PutTickerUsers(c)

assert.Equal(t, http.StatusInternalServerError, w.Code)
}

func TestPutTickerUsersStorageError2(t *testing.T) {
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Set("ticker", storage.Ticker{})
body := `{"users":[1,2,3]}`
c.Request = httptest.NewRequest(http.MethodPut, "/v1/admin/tickers/1/user", strings.NewReader(body))
c.Request.Header.Add("Content-Type", "application/json")
s := &storage.MockStorage{}
s.On("FindUsersByIDs", mock.Anything).Return([]storage.User{}, nil)
s.On("FindUsersByTicker", mock.Anything).Return([]storage.User{}, nil)
s.On("SaveTicker", mock.Anything).Return(errors.New("storage error"))
h := handler{
Expand All @@ -324,7 +304,7 @@ func TestPutTickerUsers(t *testing.T) {
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Set("ticker", storage.Ticker{})
body := `{"users":[1,2,3]}`
body := `{"users":[{"id":1},{"id":2},{"id":3}]}`
c.Request = httptest.NewRequest(http.MethodPut, "/v1/admin/tickers/1/user", strings.NewReader(body))
c.Request.Header.Add("Content-Type", "application/json")
s := &storage.MockStorage{}
Expand Down
6 changes: 6 additions & 0 deletions internal/storage/sql_storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,12 @@ func (s *SqlStorage) SaveTicker(ticker *Ticker) error {
return s.DB.Create(ticker).Error
}

// Replace all Users associations
err := s.DB.Model(ticker).Association("Users").Replace(ticker.Users)
if err != nil {
log.WithError(err).WithField("ticker_id", ticker.ID).Error("failed to replace ticker users")
}

Check warning on line 143 in internal/storage/sql_storage.go

View check run for this annotation

Codecov / codecov/patch

internal/storage/sql_storage.go#L142-L143

Added lines #L142 - L143 were not covered by tests

return s.DB.Session(&gorm.Session{FullSaveAssociations: true}).Updates(ticker).Error
}

Expand Down
38 changes: 38 additions & 0 deletions internal/storage/sql_storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,44 @@ var _ = Describe("SqlStorage", func() {
Expect(err).ToNot(HaveOccurred())
Expect(count).To(Equal(int64(1)))
})

It("persists the ticker with users", func() {
user, err := NewUser("user@systemli.org", "password")
Expect(err).ToNot(HaveOccurred())
err = store.SaveUser(&user)
Expect(err).ToNot(HaveOccurred())

ticker := NewTicker()
ticker.Users = append(ticker.Users, user)

err = store.SaveTicker(&ticker)
Expect(err).ToNot(HaveOccurred())

ticker, err = store.FindTickerByID(ticker.ID, WithPreload())
Expect(err).ToNot(HaveOccurred())
Expect(ticker.Users).To(HaveLen(1))
})

It("removes users from ticker", func() {
user, err := NewUser("user@systemli.org", "password")
Expect(err).ToNot(HaveOccurred())
err = store.SaveUser(&user)
Expect(err).ToNot(HaveOccurred())

ticker := NewTicker()
ticker.Users = append(ticker.Users, user)

err = store.SaveTicker(&ticker)
Expect(err).ToNot(HaveOccurred())

ticker.Users = []User{}
err = store.SaveTicker(&ticker)
Expect(err).ToNot(HaveOccurred())

ticker, err = store.FindTickerByID(ticker.ID, WithPreload())
Expect(err).ToNot(HaveOccurred())
Expect(ticker.Users).To(BeEmpty())
})
})

Describe("DeleteTicker", func() {
Expand Down

0 comments on commit 709c676

Please sign in to comment.