option.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package controller
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "strings"
  7. "github.com/QuantumNous/new-api/common"
  8. "github.com/QuantumNous/new-api/model"
  9. "github.com/QuantumNous/new-api/setting"
  10. "github.com/QuantumNous/new-api/setting/console_setting"
  11. "github.com/QuantumNous/new-api/setting/operation_setting"
  12. "github.com/QuantumNous/new-api/setting/ratio_setting"
  13. "github.com/QuantumNous/new-api/setting/system_setting"
  14. "github.com/gin-gonic/gin"
  15. )
  16. func GetOptions(c *gin.Context) {
  17. var options []*model.Option
  18. common.OptionMapRWMutex.Lock()
  19. for k, v := range common.OptionMap {
  20. if strings.HasSuffix(k, "Token") ||
  21. strings.HasSuffix(k, "Secret") ||
  22. strings.HasSuffix(k, "Key") ||
  23. strings.HasSuffix(k, "secret") ||
  24. strings.HasSuffix(k, "api_key") {
  25. continue
  26. }
  27. options = append(options, &model.Option{
  28. Key: k,
  29. Value: common.Interface2String(v),
  30. })
  31. }
  32. common.OptionMapRWMutex.Unlock()
  33. c.JSON(http.StatusOK, gin.H{
  34. "success": true,
  35. "message": "",
  36. "data": options,
  37. })
  38. return
  39. }
  40. type OptionUpdateRequest struct {
  41. Key string `json:"key"`
  42. Value any `json:"value"`
  43. }
  44. func UpdateOption(c *gin.Context) {
  45. var option OptionUpdateRequest
  46. err := json.NewDecoder(c.Request.Body).Decode(&option)
  47. if err != nil {
  48. c.JSON(http.StatusBadRequest, gin.H{
  49. "success": false,
  50. "message": "无效的参数",
  51. })
  52. return
  53. }
  54. switch option.Value.(type) {
  55. case bool:
  56. option.Value = common.Interface2String(option.Value.(bool))
  57. case float64:
  58. option.Value = common.Interface2String(option.Value.(float64))
  59. case int:
  60. option.Value = common.Interface2String(option.Value.(int))
  61. default:
  62. option.Value = fmt.Sprintf("%v", option.Value)
  63. }
  64. switch option.Key {
  65. case "GitHubOAuthEnabled":
  66. if option.Value == "true" && common.GitHubClientId == "" {
  67. c.JSON(http.StatusOK, gin.H{
  68. "success": false,
  69. "message": "无法启用 GitHub OAuth,请先填入 GitHub Client Id 以及 GitHub Client Secret!",
  70. })
  71. return
  72. }
  73. case "discord.enabled":
  74. if option.Value == "true" && system_setting.GetDiscordSettings().ClientId == "" {
  75. c.JSON(http.StatusOK, gin.H{
  76. "success": false,
  77. "message": "无法启用 Discord OAuth,请先填入 Discord Client Id 以及 Discord Client Secret!",
  78. })
  79. return
  80. }
  81. case "oidc.enabled":
  82. if option.Value == "true" && system_setting.GetOIDCSettings().ClientId == "" {
  83. c.JSON(http.StatusOK, gin.H{
  84. "success": false,
  85. "message": "无法启用 OIDC 登录,请先填入 OIDC Client Id 以及 OIDC Client Secret!",
  86. })
  87. return
  88. }
  89. case "LinuxDOOAuthEnabled":
  90. if option.Value == "true" && common.LinuxDOClientId == "" {
  91. c.JSON(http.StatusOK, gin.H{
  92. "success": false,
  93. "message": "无法启用 LinuxDO OAuth,请先填入 LinuxDO Client Id 以及 LinuxDO Client Secret!",
  94. })
  95. return
  96. }
  97. case "EmailDomainRestrictionEnabled":
  98. if option.Value == "true" && len(common.EmailDomainWhitelist) == 0 {
  99. c.JSON(http.StatusOK, gin.H{
  100. "success": false,
  101. "message": "无法启用邮箱域名限制,请先填入限制的邮箱域名!",
  102. })
  103. return
  104. }
  105. case "WeChatAuthEnabled":
  106. if option.Value == "true" && common.WeChatServerAddress == "" {
  107. c.JSON(http.StatusOK, gin.H{
  108. "success": false,
  109. "message": "无法启用微信登录,请先填入微信登录相关配置信息!",
  110. })
  111. return
  112. }
  113. case "TurnstileCheckEnabled":
  114. if option.Value == "true" && common.TurnstileSiteKey == "" {
  115. c.JSON(http.StatusOK, gin.H{
  116. "success": false,
  117. "message": "无法启用 Turnstile 校验,请先填入 Turnstile 校验相关配置信息!",
  118. })
  119. return
  120. }
  121. case "TelegramOAuthEnabled":
  122. if option.Value == "true" && common.TelegramBotToken == "" {
  123. c.JSON(http.StatusOK, gin.H{
  124. "success": false,
  125. "message": "无法启用 Telegram OAuth,请先填入 Telegram Bot Token!",
  126. })
  127. return
  128. }
  129. case "GroupRatio":
  130. err = ratio_setting.CheckGroupRatio(option.Value.(string))
  131. if err != nil {
  132. c.JSON(http.StatusOK, gin.H{
  133. "success": false,
  134. "message": err.Error(),
  135. })
  136. return
  137. }
  138. case "ImageRatio":
  139. err = ratio_setting.UpdateImageRatioByJSONString(option.Value.(string))
  140. if err != nil {
  141. c.JSON(http.StatusOK, gin.H{
  142. "success": false,
  143. "message": "图片倍率设置失败: " + err.Error(),
  144. })
  145. return
  146. }
  147. case "AudioRatio":
  148. err = ratio_setting.UpdateAudioRatioByJSONString(option.Value.(string))
  149. if err != nil {
  150. c.JSON(http.StatusOK, gin.H{
  151. "success": false,
  152. "message": "音频倍率设置失败: " + err.Error(),
  153. })
  154. return
  155. }
  156. case "AudioCompletionRatio":
  157. err = ratio_setting.UpdateAudioCompletionRatioByJSONString(option.Value.(string))
  158. if err != nil {
  159. c.JSON(http.StatusOK, gin.H{
  160. "success": false,
  161. "message": "音频补全倍率设置失败: " + err.Error(),
  162. })
  163. return
  164. }
  165. case "CreateCacheRatio":
  166. err = ratio_setting.UpdateCreateCacheRatioByJSONString(option.Value.(string))
  167. if err != nil {
  168. c.JSON(http.StatusOK, gin.H{
  169. "success": false,
  170. "message": "缓存创建倍率设置失败: " + err.Error(),
  171. })
  172. return
  173. }
  174. case "ModelRequestRateLimitGroup":
  175. err = setting.CheckModelRequestRateLimitGroup(option.Value.(string))
  176. if err != nil {
  177. c.JSON(http.StatusOK, gin.H{
  178. "success": false,
  179. "message": err.Error(),
  180. })
  181. return
  182. }
  183. case "AutomaticDisableStatusCodes":
  184. _, err = operation_setting.ParseHTTPStatusCodeRanges(option.Value.(string))
  185. if err != nil {
  186. c.JSON(http.StatusOK, gin.H{
  187. "success": false,
  188. "message": err.Error(),
  189. })
  190. return
  191. }
  192. case "AutomaticRetryStatusCodes":
  193. _, err = operation_setting.ParseHTTPStatusCodeRanges(option.Value.(string))
  194. if err != nil {
  195. c.JSON(http.StatusOK, gin.H{
  196. "success": false,
  197. "message": err.Error(),
  198. })
  199. return
  200. }
  201. case "console_setting.api_info":
  202. err = console_setting.ValidateConsoleSettings(option.Value.(string), "ApiInfo")
  203. if err != nil {
  204. c.JSON(http.StatusOK, gin.H{
  205. "success": false,
  206. "message": err.Error(),
  207. })
  208. return
  209. }
  210. case "console_setting.announcements":
  211. err = console_setting.ValidateConsoleSettings(option.Value.(string), "Announcements")
  212. if err != nil {
  213. c.JSON(http.StatusOK, gin.H{
  214. "success": false,
  215. "message": err.Error(),
  216. })
  217. return
  218. }
  219. case "console_setting.faq":
  220. err = console_setting.ValidateConsoleSettings(option.Value.(string), "FAQ")
  221. if err != nil {
  222. c.JSON(http.StatusOK, gin.H{
  223. "success": false,
  224. "message": err.Error(),
  225. })
  226. return
  227. }
  228. case "console_setting.uptime_kuma_groups":
  229. err = console_setting.ValidateConsoleSettings(option.Value.(string), "UptimeKumaGroups")
  230. if err != nil {
  231. c.JSON(http.StatusOK, gin.H{
  232. "success": false,
  233. "message": err.Error(),
  234. })
  235. return
  236. }
  237. }
  238. err = model.UpdateOption(option.Key, option.Value.(string))
  239. if err != nil {
  240. common.ApiError(c, err)
  241. return
  242. }
  243. c.JSON(http.StatusOK, gin.H{
  244. "success": true,
  245. "message": "",
  246. })
  247. return
  248. }