Skip to content

Commit

Permalink
vingo: add leaderboard position change
Browse files Browse the repository at this point in the history
  • Loading branch information
hannes-dev committed Jul 17, 2024
1 parent 1864bdc commit 2ac3951
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
21 changes: 12 additions & 9 deletions vingo/database/scans.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ type Present struct {
}

type LeaderboardItem struct {
Position int `json:"position"`
Username string `json:"username"`
TotalDays int `json:"totalDays"`
Position int `json:"position"`
UserId int `json:"userId"`
Username string `json:"username"`
TotalDays int `json:"totalDays"`
PositionChange int `json:"poistionChange"`
}

func CreateScan(card_serial string) error {
Expand Down Expand Up @@ -69,15 +71,16 @@ func GetPresenceHistory(user_id int) ([]Present, error) {
return presences, nil
}

func TotalDaysPerUser() ([]LeaderboardItem, error) {
func TotalDaysPerUser(before_time time.Time) ([]LeaderboardItem, error) {
rows, err := db.Query(`
SELECT count, username, RANK() OVER (ORDER BY count desc) AS position
FROM (SELECT COUNT(DISTINCT ((scan_time - INTERVAL '4 hours') AT TIME ZONE 'Europe/Brussels')::date), username
SELECT user_id, count, username, RANK() OVER (ORDER BY count desc) AS position
FROM (SELECT COUNT(DISTINCT ((scan_time - INTERVAL '4 hours') AT TIME ZONE 'Europe/Brussels')::date), username, users.id as user_id
FROM scans
LEFT JOIN cards ON card_serial = serial
LEFT JOIN users ON user_id = users.id
GROUP BY username);
`)
WHERE scan_time < $1
GROUP BY username, users.id);
`, before_time)

if err != nil {
return nil, err
Expand All @@ -86,7 +89,7 @@ func TotalDaysPerUser() ([]LeaderboardItem, error) {
leaderboard := []LeaderboardItem{}
for rows.Next() {
var item LeaderboardItem
_ = rows.Scan(&item.TotalDays, &item.Username, &item.Position)
_ = rows.Scan(&item.UserId, &item.TotalDays, &item.Username, &item.Position)

leaderboard = append(leaderboard, item)
}
Expand Down
19 changes: 17 additions & 2 deletions vingo/handlers/leaderboard.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,33 @@
package handlers

import (
"time"
"vingo/database"

"github.com/gofiber/fiber/v2"
)

func Leaderboard(c *fiber.Ctx) error {
users, err := database.TotalDaysPerUser()
users, err := database.TotalDaysPerUser(time.Now())
if err != nil {
logger.Println("Error getting leaderboard:", err)
return c.Status(500).SendString("Error getting leaderboard")
}

logger.Println(users)
users_last_week, err := database.TotalDaysPerUser(time.Now().AddDate(0, 0, -7))
if err != nil {
logger.Println("Error getting leaderboard:", err)
return c.Status(500).SendString("Error getting leaderboard")
}

for i, user := range users {
for _, user_last_week := range users_last_week {
if user.UserId == user_last_week.UserId {
users[i].PositionChange = user_last_week.Position - user.Position
break
}
}
}

return c.JSON(users)
}

0 comments on commit 2ac3951

Please sign in to comment.