aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGalen Guyer <galen@galenguyer.com>2022-04-25 19:31:40 -0400
committerGalen Guyer <galen@galenguyer.com>2022-04-25 19:31:40 -0400
commitdefd715b7de572edcd61a23ba693fdb7ff3a7e2f (patch)
tree9cb4082cbb6aab94f758516a2e83a733328d5149
parent0c4683edc39489bb27e5df6b202f6691f892cdf2 (diff)
list closed polls that you voted in or created
-rw-r--r--database/poll.go60
-rw-r--r--main.go61
-rw-r--r--templates/index.tmpl22
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()
diff --git a/main.go b/main.go
index 6895634..7efc1c4 100644
--- a/main.go
+++ b/main.go
@@ -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>