98 lines
2.8 KiB
Go
98 lines
2.8 KiB
Go
package settings
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/qianfree/team-api/internal/dao"
|
|
"github.com/qianfree/team-api/internal/logic/common"
|
|
"github.com/qianfree/team-api/internal/service"
|
|
|
|
v1 "github.com/qianfree/team-api/api/settings/v1"
|
|
)
|
|
|
|
type sSettings struct{}
|
|
|
|
func New() *sSettings {
|
|
return &sSettings{}
|
|
}
|
|
|
|
func init() {
|
|
service.RegisterSettings(New())
|
|
}
|
|
|
|
func (s *sSettings) PublicSettingsGet(ctx context.Context, _ *v1.PublicSettingsGetReq) (*v1.PublicSettingsGetRes, error) {
|
|
options, err := common.Config().GetPublicOptions(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
settings := make(map[string]any, len(options))
|
|
for _, opt := range options {
|
|
if def := common.GetSettingDef(opt.Key); def != nil {
|
|
settings[opt.Key] = common.TypedValue(def.Type, opt.Value, def.Default)
|
|
}
|
|
}
|
|
|
|
// Include public settings that may not yet exist in DB (use registry defaults)
|
|
for _, def := range common.Registry {
|
|
if def.IsPublic {
|
|
if _, exists := settings[def.Key]; !exists {
|
|
settings[def.Key] = common.TypedValue(def.Type, "", def.Default)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Inject demo mode from config file (not database — avoids the self-lock bug)
|
|
settings["demo_mode"] = g.Cfg().MustGet(ctx, "demo.enabled").Bool()
|
|
demoMsg := g.Cfg().MustGet(ctx, "demo.message").String()
|
|
if demoMsg == "" {
|
|
demoMsg = "演示环境,数据不可修改"
|
|
}
|
|
settings["demo_message"] = demoMsg
|
|
|
|
return &v1.PublicSettingsGetRes{Settings: settings}, nil
|
|
}
|
|
|
|
func (s *sSettings) PublicAnnouncements(ctx context.Context, req *v1.PublicAnnouncementsReq) (*v1.PublicAnnouncementsRes, error) {
|
|
m := dao.NtfAnnouncements.Ctx(ctx).
|
|
Where("status", "published").
|
|
Where("(effective_at IS NULL OR effective_at <= NOW())").
|
|
Where("(expires_at IS NULL OR expires_at > NOW())")
|
|
|
|
if req.Position != "" {
|
|
m = m.Where("display_position IN (?)", []string{req.Position, "both"})
|
|
}
|
|
|
|
var items []struct {
|
|
Id int64 `json:"id" orm:"id"`
|
|
Title string `json:"title" orm:"title"`
|
|
Type string `json:"type" orm:"type"`
|
|
Content string `json:"content" orm:"content"`
|
|
IsPinned int `json:"is_pinned" orm:"is_pinned"`
|
|
DisplayPosition string `json:"display_position" orm:"display_position"`
|
|
CreatedAt string `json:"created_at" orm:"created_at"`
|
|
}
|
|
err := m.OrderDesc("is_pinned").OrderDesc("created_at").
|
|
Limit(20).
|
|
Scan(&items)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
list := make([]v1.PublicAnnouncementItem, len(items))
|
|
for i, item := range items {
|
|
list[i] = v1.PublicAnnouncementItem{
|
|
Id: item.Id,
|
|
Title: item.Title,
|
|
Type: item.Type,
|
|
Content: item.Content,
|
|
IsPinned: item.IsPinned,
|
|
DisplayPosition: item.DisplayPosition,
|
|
CreatedAt: item.CreatedAt,
|
|
}
|
|
}
|
|
|
|
return &v1.PublicAnnouncementsRes{List: list}, nil
|
|
}
|