Skip to content

Commit

Permalink
feature: add API to return list of voters (#654)
Browse files Browse the repository at this point in the history
  • Loading branch information
goenning committed Nov 26, 2018
1 parent aff5787 commit 179960f
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 0 deletions.
1 change: 1 addition & 0 deletions app/cmd/routes.go
Expand Up @@ -175,6 +175,7 @@ func routes(r *web.Engine) *web.Engine {

api.Get("/api/v1/users", apiv1.ListUsers())
api.Put("/api/v1/posts/:number", apiv1.UpdatePost())
api.Get("/api/v1/posts/:number/voters", apiv1.ListVoters())
api.Post("/api/v1/invitations/send", apiv1.SendInvites())
api.Post("/api/v1/invitations/sample", apiv1.SendSampleInvite())
api.Put("/api/v1/posts/:number/status", apiv1.SetResponse())
Expand Down
22 changes: 22 additions & 0 deletions app/handlers/apiv1/post.go
Expand Up @@ -264,6 +264,28 @@ func Unsubscribe() web.HandlerFunc {
}
}

// ListVoters returns a list of all users that voted on given post
func ListVoters() web.HandlerFunc {
return func(c web.Context) error {
number, err := c.ParamAsInt("number")
if err != nil {
return c.NotFound()
}

post, err := c.Services().Posts.GetByNumber(number)
if err != nil {
return c.Failure(err)
}

users, err := c.Services().Posts.ListVoters(post)
if err != nil {
return c.Failure(err)
}

return c.Ok(users)
}
}

func addOrRemove(c web.Context, addOrRemove func(post *models.Post, user *models.User) error) error {
number, err := c.ParamAsInt("number")
if err != nil {
Expand Down
5 changes: 5 additions & 0 deletions app/storage/inmemory/post.go
Expand Up @@ -234,6 +234,11 @@ func (s *PostStorage) VotedBy() ([]int, error) {
return s.postsVotedBy[s.user.ID], nil
}

// ListVoters returns a list of all users that voted on given post
func (s *PostStorage) ListVoters(post *models.Post) ([]*models.User, error) {
return make([]*models.User, 0), nil
}

// AddSubscriber adds user to the post list of subscribers
func (s *PostStorage) AddSubscriber(post *models.Post, user *models.User) error {
s.postSubscribers[post.ID] = append(s.postSubscribers[post.ID], user)
Expand Down
23 changes: 23 additions & 0 deletions app/storage/postgres/post.go
Expand Up @@ -711,3 +711,26 @@ func (s *PostStorage) VotedBy() ([]int, error) {
}
return posts, nil
}

// ListVoters returns a list of all users that voted on given post
func (s *PostStorage) ListVoters(post *models.Post) ([]*models.User, error) {
var users []*dbUser
err := s.trx.Select(&users, `
SELECT u.id, u.name, u.email, u.tenant_id, u.role, u.status
FROM post_votes pv
INNER JOIN users u
ON u.id = pv.user_id
AND u.tenant_id = pv.tenant_id
WHERE pv.post_id = $1
AND pv.tenant_id = $2
ORDER BY pv.created_at`, post.ID, s.tenant.ID)
if err != nil {
return nil, errors.Wrap(err, "failed to get voters of post")
}

var result = make([]*models.User, len(users))
for i, user := range users {
result[i] = user.toModel()
}
return result, nil
}
17 changes: 17 additions & 0 deletions app/storage/postgres/post_test.go
Expand Up @@ -526,3 +526,20 @@ func TestPostStorage_IsReferenced(t *testing.T) {
Expect(referenced).IsTrue()
Expect(err).IsNil()
}

func TestPostStorage_ListVotersOfPost(t *testing.T) {
SetupDatabaseTest(t)
defer TeardownDatabaseTest()

posts.SetCurrentTenant(demoTenant)
posts.SetCurrentUser(jonSnow)
post1, _ := posts.Add("My new post", "with this description")
posts.AddVote(post1, jonSnow)
posts.AddVote(post1, aryaStark)

users, err := posts.ListVoters(post1)
Expect(err).IsNil()
Expect(users).HasLen(2)
Expect(users[0].Name).Equals("Jon Snow")
Expect(users[1].Name).Equals("Arya Stark")
}
1 change: 1 addition & 0 deletions app/storage/storage.go
Expand Up @@ -37,6 +37,7 @@ type Post interface {
MarkAsDuplicate(post *models.Post, original *models.Post) error
IsReferenced(post *models.Post) (bool, error)
VotedBy() ([]int, error)
ListVoters(post *models.Post) ([]*models.User, error)
}

// User is used for user operations
Expand Down

0 comments on commit 179960f

Please sign in to comment.