diff options
author | Galen Guyer <galen@galenguyer.com> | 2022-04-25 19:31:40 -0400 |
---|---|---|
committer | Galen Guyer <galen@galenguyer.com> | 2022-04-25 19:31:40 -0400 |
commit | defd715b7de572edcd61a23ba693fdb7ff3a7e2f (patch) | |
tree | 9cb4082cbb6aab94f758516a2e83a733328d5149 | |
parent | 0c4683edc39489bb27e5df6b202f6691f892cdf2 (diff) |
list closed polls that you voted in or created
-rw-r--r-- | database/poll.go | 60 | ||||
-rw-r--r-- | main.go | 61 | ||||
-rw-r--r-- | templates/index.tmpl | 22 |
3 files changed, 133 insertions, 10 deletions
diff --git a/database/poll.go b/database/poll.go index ad5b997..a0b8378 100644 --- a/database/poll.go +++ b/database/poll.go @@ -79,6 +79,66 @@ func GetOpenPolls() ([]*Poll, error) { return polls, nil } +func GetClosedOwnedPolls(userId string) ([]*Poll, error) { + ctx, cancel := context.WithTimeout(context.TODO(), 10*time.Second) + defer cancel() + + cursor, err := Client.Database("vote").Collection("polls").Find(ctx, map[string]interface{}{"createdBy": userId, "open": false}) + if err != nil { + return nil, err + } + + var polls []*Poll + cursor.All(ctx, &polls) + + return polls, nil +} + +func GetClosedVotedPolls(userId string) ([]*Poll, error) { + ctx, cancel := context.WithTimeout(context.TODO(), 10*time.Second) + defer cancel() + + cursor, err := Client.Database("vote").Collection("votes").Aggregate(ctx, mongo.Pipeline{ + {{ + "$match", bson.D{ + {"userId", userId}, + }, + }}, + {{ + "$lookup", bson.D{ + {"from", "polls"}, + {"localField", "pollId"}, + {"foreignField", "_id"}, + {"as", "polls"}, + }, + }}, + {{ + "$unwind", bson.D{ + {"path", "$polls"}, + {"preserveNullAndEmptyArrays", false}, + }, + }}, + {{ + "$replaceRoot", bson.D{ + {"newRoot", "$polls"}, + }, + }}, + {{ + "$match", bson.D{ + {"open", false}, + }, + }}, + }) + if err != nil { + return nil, err + } + + var polls []*Poll + cursor.All(ctx, &polls) + + return polls, nil +} + func (poll *Poll) GetResult() (map[string]int, error) { ctx, cancel := context.WithTimeout(context.TODO(), 10*time.Second) defer cancel() @@ -3,6 +3,7 @@ package main import ( "net/http" "os" + "sort" "time" csh_auth "github.com/computersciencehouse/csh-auth" @@ -49,11 +50,32 @@ func main() { c.JSON(500, gin.H{"error": err.Error()}) return } + sort.Slice(polls, func(i, j int) bool { + return polls[i].Id > polls[j].Id + }) + + closedPolls, err := database.GetClosedVotedPolls(claims.UserInfo.Username) + if err != nil { + c.JSON(500, gin.H{"error": err.Error()}) + return + } + ownedPolls, err := database.GetClosedOwnedPolls(claims.UserInfo.Username) + if err != nil { + c.JSON(500, gin.H{"error": err.Error()}) + return + } + closedPolls = append(closedPolls, ownedPolls...) + + sort.Slice(closedPolls, func(i, j int) bool { + return closedPolls[i].Id > closedPolls[j].Id + }) + closedPolls = uniquePolls(closedPolls) c.HTML(200, "index.tmpl", gin.H{ - "Polls": polls, - "Username": claims.UserInfo.Username, - "FullName": claims.UserInfo.FullName, + "Polls": polls, + "ClosedPolls": closedPolls, + "Username": claims.UserInfo.Username, + "FullName": claims.UserInfo.FullName, }) })) @@ -109,7 +131,7 @@ func main() { } if !poll.Open { - c.Redirect(302, "/result/"+poll.Id) + c.Redirect(302, "/results/"+poll.Id) return } @@ -119,7 +141,7 @@ func main() { return } if hasVoted { - c.Redirect(302, "/result/"+poll.Id) + c.Redirect(302, "/results/"+poll.Id) return } @@ -147,8 +169,8 @@ func main() { c.JSON(500, gin.H{"error": err.Error()}) return } - if hasVoted { - c.Redirect(302, "/result/"+poll.Id) + if hasVoted || !poll.Open { + c.Redirect(302, "/results/"+poll.Id) return } @@ -166,10 +188,10 @@ func main() { } database.CastVote(vote) - c.Redirect(302, "/result/"+poll.Id) + c.Redirect(302, "/results/"+poll.Id) })) - r.GET("/result/:id", csh.AuthWrapper(func(c *gin.Context) { + r.GET("/results/:id", csh.AuthWrapper(func(c *gin.Context) { cl, _ := c.Get("cshauth") claims := cl.(csh_auth.CSHClaims) @@ -219,7 +241,7 @@ func main() { return } - c.Redirect(302, "/result/"+poll.Id) + c.Redirect(302, "/results/"+poll.Id) })) r.Run() @@ -245,3 +267,22 @@ func canVote(groups []string) bool { return active && !spring_coop } } + +func uniquePolls(polls []*database.Poll) []*database.Poll { + var unique []*database.Poll + for _, poll := range polls { + if !containsPoll(unique, poll) { + unique = append(unique, poll) + } + } + return unique +} + +func containsPoll(polls []*database.Poll, poll *database.Poll) bool { + for _, p := range polls { + if p.Id == poll.Id { + return true + } + } + return false +} diff --git a/templates/index.tmpl b/templates/index.tmpl index e1c7b5a..37ab0b5 100644 --- a/templates/index.tmpl +++ b/templates/index.tmpl @@ -57,6 +57,28 @@ }} </ul> </div> + <br /> + <h3>Closed Polls</h3> + <br /> + <div> + <ul class="list-group"> + {{ range $i, $poll := .ClosedPolls }} + <li> + <a + class="list-group-item list-group-item-action" + href="/results/{{ $poll.Id }}" + > + <span style="font-size: 1.1rem">{{ + $poll.ShortDescription + }}</span> + + <span><i>(created by {{ $poll.CreatedBy }})</i></span> + </a> + </li> + {{ + end + }} + </ul> </div> </body> </html> |