tavern/web/handler_dashboard.go

89 lines
1.8 KiB
Go

package web
import (
"math"
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/gofrs/uuid"
"github.com/ngerakines/tavern/errors"
)
func (h handler) dashboard(c *gin.Context) {
session := sessions.Default(c)
ctx := c.Request.Context()
trans, transOK := c.Get("trans")
if !transOK {
panic("trans not found in context")
}
data := gin.H{
"flashes": getFlashes(session),
"Trans": trans,
}
user, err := h.storage.GetUserBySession(ctx, session)
if err != nil {
if errors.Is(err, errors.UserSessionNotFoundError{}) {
if err = appendFlashError(session, "Not Authenticated"); err != nil {
h.hardFail(c, errors.NewCannotSaveSessionError(err))
return
}
c.Redirect(http.StatusFound, "/")
return
}
h.hardFail(c, err)
return
}
data["user"] = user
page := intParam(c, "page", 1)
limit := intParam(c, "limit", 100)
total, err := h.storage.RowCount(ctx, `SELECT COUNT(*) FROM user_feed WHERE user_id = $1`, user.ID)
if err != nil {
h.hardFail(c, err)
return
}
uf, err := h.storage.PaginateUserFeed(ctx, user.ID, limit, (page-1)*limit)
if err != nil {
h.hardFail(c, err)
return
}
pageCount := math.Ceil(float64(total) / float64(limit))
data["page_count"] = int(pageCount)
data["page"] = page
data["limit"] = limit
var activityIDs []uuid.UUID
for _, ufi := range uf {
activityIDs = append(activityIDs, ufi.ActivityID)
}
activities, err := h.storage.GetActivitiesByIDs(ctx, activityIDs)
if err != nil {
h.hardFail(c, err)
return
}
data["activities"] = activities
var pages []int
for i := page - 3; i <= page+3; i++ {
if i > 0 && i <= int(pageCount) {
pages = append(pages, i)
}
}
data["pages"] = pages
if err = session.Save(); err != nil {
h.hardFail(c, err)
return
}
c.HTML(http.StatusOK, "dashboard", data)
}