quickshare/src/handlers/settings/handlers.go

119 lines
2.6 KiB
Go

package settings
import (
"errors"
"github.com/gin-gonic/gin"
"github.com/ihexxa/gocfg"
"github.com/ihexxa/quickshare/src/db/sitestore"
"github.com/ihexxa/quickshare/src/depidx"
q "github.com/ihexxa/quickshare/src/handlers"
)
type SettingsSvc struct {
cfg gocfg.ICfg
deps *depidx.Deps
}
func NewSettingsSvc(cfg gocfg.ICfg, deps *depidx.Deps) (*SettingsSvc, error) {
return &SettingsSvc{
cfg: cfg,
deps: deps,
}, nil
}
func (h *SettingsSvc) Health(c *gin.Context) {
// TODO: currently it checks nothing
c.JSON(q.Resp(200))
}
type ClientCfgMsg struct {
SiteName string `json:"siteName"`
SiteDesc string `json:"siteDesc"`
Bg *sitestore.BgConfig `json:"bg"`
CaptchaEnabled bool `json:"captchaEnabled"`
}
func (h *SettingsSvc) GetClientCfg(c *gin.Context) {
// TODO: add cache
siteCfg, err := h.deps.SiteStore().GetCfg()
if err != nil {
c.JSON(q.ErrResp(c, 500, err))
return
}
c.JSON(200, &ClientCfgMsg{
SiteName: siteCfg.ClientCfg.SiteName,
SiteDesc: siteCfg.ClientCfg.SiteDesc,
Bg: siteCfg.ClientCfg.Bg,
CaptchaEnabled: h.cfg.BoolOr("Users.CaptchaEnabled", true),
})
}
func (h *SettingsSvc) SetClientCfg(c *gin.Context) {
var err error
req := &ClientCfgMsg{}
if err = c.ShouldBindJSON(&req); err != nil {
c.JSON(q.ErrResp(c, 400, err))
return
}
clientCfg := &sitestore.ClientConfig{
SiteName: req.SiteName,
SiteDesc: req.SiteDesc,
Bg: req.Bg,
// TODO: captchaEnabled is not persisted in db
}
if err = validateClientCfg(clientCfg); err != nil {
c.JSON(q.ErrResp(c, 400, err))
return
}
err = h.deps.SiteStore().SetClientCfg(clientCfg)
if err != nil {
c.JSON(q.ErrResp(c, 500, err))
return
}
c.JSON(q.Resp(200))
}
func validateClientCfg(cfg *sitestore.ClientConfig) error {
if cfg.SiteName == "" {
return errors.New("site name is empty")
}
return nil
}
type ClientErrorReport struct {
Report string `json:"report"`
Version string `json:"version"`
}
type ClientErrorReports struct {
Reports []*ClientErrorReport `json:"reports"`
}
func (h *SettingsSvc) ReportErrors(c *gin.Context) {
var err error
req := &ClientErrorReports{}
if err = c.ShouldBindJSON(&req); err != nil {
c.JSON(q.ErrResp(c, 400, err))
return
}
for _, report := range req.Reports {
h.deps.Log().Errorf("version:%s,error:%s", report.Version, report.Report)
}
c.JSON(q.Resp(200))
}
type WorkerQueueLenResp struct {
QueueLen int `json:"queueLen"`
}
func (h *SettingsSvc) WorkerQueueLen(c *gin.Context) {
c.JSON(200, &WorkerQueueLenResp{
QueueLen: h.deps.Workers().QueueLen(),
})
}