99 lines
2.9 KiB
Go
99 lines
2.9 KiB
Go
package auth
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"infinite-canvas/backend/internal/model"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
const registrationSettingKey = "registration"
|
|
|
|
type RegistrationSettingRequest struct {
|
|
Enabled bool `json:"enabled"`
|
|
}
|
|
|
|
type PublicRegistrationSetting struct {
|
|
Enabled bool `json:"enabled"`
|
|
UpdatedBy string `json:"updatedBy"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type registrationSettingValue struct {
|
|
Enabled bool `json:"enabled"`
|
|
}
|
|
|
|
func (s *Service) AdminRegistrationSetting(actor *model.User) (*PublicRegistrationSetting, error) {
|
|
if err := s.host.RequireAdmin(actor); err != nil {
|
|
return nil, err
|
|
}
|
|
setting, value, err := s.readRegistrationSetting()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return publicRegistrationSetting(setting, value), nil
|
|
}
|
|
|
|
func (s *Service) UpdateRegistrationSetting(actor *model.User, req RegistrationSettingRequest) (*PublicRegistrationSetting, error) {
|
|
if err := s.host.RequireAdmin(actor); err != nil {
|
|
return nil, err
|
|
}
|
|
encoded, err := json.Marshal(registrationSettingValue{Enabled: req.Enabled})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
current, _, err := s.readRegistrationSetting()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
setting := model.SystemSetting{Key: registrationSettingKey, ValueJSON: string(encoded), UpdatedBy: actor.ID}
|
|
if current != nil {
|
|
setting.CreatedAt = current.CreatedAt
|
|
}
|
|
if err := s.repo.SaveSystemSetting(&setting); err != nil {
|
|
return nil, err
|
|
}
|
|
return publicRegistrationSetting(&setting, registrationSettingValue{Enabled: req.Enabled}), nil
|
|
}
|
|
|
|
func (s *Service) RegistrationEnabled() (bool, error) {
|
|
_, value, err := s.readRegistrationSetting()
|
|
return value.Enabled, err
|
|
}
|
|
|
|
func (s *Service) readRegistrationSetting() (*model.SystemSetting, registrationSettingValue, error) {
|
|
setting, err := s.repo.SystemSetting(registrationSettingKey)
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, registrationSettingValue{Enabled: registrationEnabledFromEnvironment()}, nil
|
|
}
|
|
if err != nil {
|
|
return nil, registrationSettingValue{}, err
|
|
}
|
|
value := registrationSettingValue{}
|
|
if strings.TrimSpace(setting.ValueJSON) == "" || json.Unmarshal([]byte(setting.ValueJSON), &value) != nil {
|
|
return nil, registrationSettingValue{}, errors.New("用户注册配置格式无效")
|
|
}
|
|
return setting, value, nil
|
|
}
|
|
|
|
func publicRegistrationSetting(setting *model.SystemSetting, value registrationSettingValue) *PublicRegistrationSetting {
|
|
result := &PublicRegistrationSetting{Enabled: value.Enabled}
|
|
if setting != nil {
|
|
result.UpdatedBy = setting.UpdatedBy
|
|
result.CreatedAt = setting.CreatedAt
|
|
result.UpdatedAt = setting.UpdatedAt
|
|
}
|
|
return result
|
|
}
|
|
|
|
func registrationEnabledFromEnvironment() bool {
|
|
value := strings.ToLower(strings.TrimSpace(os.Getenv("CANVAS_REGISTRATION_ENABLED")))
|
|
return value == "1" || value == "true" || value == "yes"
|
|
}
|