Files
2026-07-15 22:42:31 +08:00

118 lines
3.4 KiB
Go

package grpcserver
import (
"context"
"strings"
"github.com/XingfenD/yoresee_doc/internal/service/auth_service"
"github.com/XingfenD/yoresee_doc/internal/service/setting_service"
"github.com/XingfenD/yoresee_doc/internal/status"
pb "github.com/XingfenD/yoresee_doc/pkg/gen/yoresee_doc/v1"
)
type SettingServiceServer struct {
pb.UnimplementedSettingServiceServer
}
func NewSettingServiceServer() *SettingServiceServer {
return &SettingServiceServer{}
}
func (s *SettingServiceServer) requireAdmin(ctx context.Context) error {
userExternalID, ok := ctx.Value("user_external_id").(string)
if !ok || userExternalID == "" {
return status.StatusTokenInvalid
}
isAdmin, err := auth_service.AuthSvc.IsAdmin(userExternalID)
if err != nil {
return err
}
if !isAdmin {
return status.StatusPermissionDenied
}
return nil
}
func (s *SettingServiceServer) GetSettings(ctx context.Context, req *pb.GetSettingsRequest) (*pb.GetSettingsResponse, error) {
if req == nil {
return &pb.GetSettingsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
}
if err := s.requireAdmin(ctx); err != nil {
return &pb.GetSettingsResponse{Base: baseResponseFromErr(err)}, nil
}
scene := strings.TrimSpace(req.Scene)
groups, err := setting_service.SettingSvc.GetSettings(ctx, scene)
if err != nil {
return &pb.GetSettingsResponse{Base: baseResponseFromErr(err)}, nil
}
respGroups := make([]*pb.SettingGroup, 0, len(groups))
for _, group := range groups {
items := make([]*pb.SettingItem, 0, len(group.Items))
for _, item := range group.Items {
options := make([]*pb.SettingOption, 0, len(item.UI.Options))
for _, opt := range item.UI.Options {
options = append(options, &pb.SettingOption{
Label: opt.Label,
LabelKey: opt.LabelKey,
Value: opt.Value,
})
}
items = append(items, &pb.SettingItem{
Key: item.Key,
Label: item.Label,
LabelKey: item.LabelKey,
Description: item.Description,
DescriptionKey: item.DescriptionKey,
Type: item.Type,
Ui: &pb.SettingUI{
Component: item.UI.Component,
Options: options,
Placeholder: item.UI.Placeholder,
PlaceholderKey: item.UI.PlaceholderKey,
},
Value: item.Value,
DefaultValue: item.DefaultValue,
Required: item.Required,
Readonly: item.Readonly,
})
}
respGroups = append(respGroups, &pb.SettingGroup{
Key: group.Key,
Title: group.Title,
TitleKey: group.TitleKey,
Items: items,
})
}
return &pb.GetSettingsResponse{
Base: baseResponseFromErr(nil),
Groups: respGroups,
}, nil
}
func (s *SettingServiceServer) UpdateSettings(ctx context.Context, req *pb.UpdateSettingsRequest) (*pb.UpdateSettingsResponse, error) {
if req == nil {
return &pb.UpdateSettingsResponse{Base: baseResponseFromStatus(status.StatusParamError)}, nil
}
if err := s.requireAdmin(ctx); err != nil {
return &pb.UpdateSettingsResponse{Base: baseResponseFromErr(err)}, nil
}
updates := make([]setting_service.SettingUpdate, 0, len(req.Updates))
for _, update := range req.Updates {
if update == nil {
continue
}
updates = append(updates, setting_service.SettingUpdate{
Key: update.Key,
Value: update.Value,
})
}
if err := setting_service.SettingSvc.UpdateSettings(ctx, updates); err != nil {
return &pb.UpdateSettingsResponse{Base: baseResponseFromErr(err)}, nil
}
return &pb.UpdateSettingsResponse{Base: baseResponseFromErr(nil)}, nil
}