mirror of
https://github.com/warmbly/warmbly.git
synced 2026-10-03 16:02:02 +00:00
90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"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,
|
|
// "sort": {"by": ""} the default sort, and "layout": null the default layout
|
|
// of a view that has one.
|
|
type updateViewPreferencesRequest struct {
|
|
Columns *[]string `json:"columns"`
|
|
Sort *models.ViewSort `json:"sort"`
|
|
Layout json.RawMessage `json:"layout"`
|
|
}
|
|
|
|
// 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.InvalidBody(err))
|
|
return
|
|
}
|
|
upd := models.ViewPreferencesUpdate{Columns: req.Columns, Sort: req.Sort, Layout: req.Layout}
|
|
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)
|
|
}
|