Files
warmbly/internal/api/handler/view_preferences.go
T

87 lines
2.4 KiB
Go

package handler
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/warmbly/warmbly/internal/api/middleware"
"github.com/warmbly/warmbly/internal/errx"
"github.com/warmbly/warmbly/internal/models"
)
// viewActor resolves the member and workspace a saved layout belongs to.
func viewActor(c *gin.Context) (uuid.UUID, uuid.UUID, bool) {
uid, err := middleware.GetUserUUID(c)
if err != nil {
errx.Handle(c, errx.ErrUser)
return uuid.Nil, uuid.Nil, false
}
orgID := middleware.GetOrganizationID(c)
if orgID == nil {
errx.Handle(c, errx.New(errx.BadRequest, "no organization selected"))
return uuid.Nil, uuid.Nil, false
}
return uid, *orgID, true
}
// GetViewPreferences returns the caller's saved layout for one dashboard list
// in the current workspace, or the empty layout when none is saved.
// GET /me/views/:view
func (h *Handler) GetViewPreferences(c *gin.Context) {
uid, orgID, ok := viewActor(c)
if !ok {
return
}
prefs, xerr := h.ViewPreferencesService.Get(c.Request.Context(), uid, orgID, c.Param("view"))
if xerr != nil {
errx.Handle(c, xerr)
return
}
c.JSON(http.StatusOK, gin.H{"preferences": prefs})
}
// A field left out keeps its saved value; "columns": [] is the default layout
// and "sort": {"by": ""} the default sort.
type updateViewPreferencesRequest struct {
Columns *[]string `json:"columns"`
Sort *models.ViewSort `json:"sort"`
}
// UpdateViewPreferences writes the caller's saved layout for one list: the
// columns, the sort, or both.
// PUT /me/views/:view
func (h *Handler) UpdateViewPreferences(c *gin.Context) {
uid, orgID, ok := viewActor(c)
if !ok {
return
}
var req updateViewPreferencesRequest
if err := c.ShouldBindJSON(&req); err != nil {
errx.Handle(c, errx.ErrInvalid)
return
}
upd := models.ViewPreferencesUpdate{Columns: req.Columns, Sort: req.Sort}
saved, xerr := h.ViewPreferencesService.Put(c.Request.Context(), uid, orgID, c.Param("view"), upd)
if xerr != nil {
errx.Handle(c, xerr)
return
}
c.JSON(http.StatusOK, gin.H{"preferences": saved})
}
// ResetViewPreferences forgets the caller's saved layout for one list.
// DELETE /me/views/:view
func (h *Handler) ResetViewPreferences(c *gin.Context) {
uid, orgID, ok := viewActor(c)
if !ok {
return
}
if xerr := h.ViewPreferencesService.Reset(c.Request.Context(), uid, orgID, c.Param("view")); xerr != nil {
errx.Handle(c, xerr)
return
}
c.Status(http.StatusNoContent)
}