This is an automated email from the ASF dual-hosted git repository.

kumfo pushed a commit to branch feat/1.8.0/menu
in repository https://gitbox.apache.org/repos/asf/answer.git


The following commit(s) were added to refs/heads/feat/1.8.0/menu by this push:
     new 0d7979e9 feat(siteinfo): add users settings endpoint and update 
interface settings structure
0d7979e9 is described below

commit 0d7979e901983ae14e97a2404f3e7a83bc51a812
Author: kumfo <[email protected]>
AuthorDate: Wed Jan 21 09:39:37 2026 +0800

    feat(siteinfo): add users settings endpoint and update interface settings 
structure
---
 docs/docs.go                                       | 127 ++++++++++++++++++---
 docs/swagger.json                                  | 127 ++++++++++++++++++---
 docs/swagger.yaml                                  |  81 +++++++++++--
 internal/base/constant/site_type.go                |  18 ++-
 internal/controller/siteinfo_controller.go         |   5 +
 internal/controller_admin/siteinfo_controller.go   |  33 +++++-
 internal/migrations/v30.go                         |  96 ++++++++++++++++
 internal/router/answer_api_router.go               |   4 +
 internal/schema/siteinfo_schema.go                 |  58 ++++++----
 internal/service/siteinfo/siteinfo_service.go      |  21 +++-
 .../service/siteinfo_common/siteinfo_service.go    |  20 +++-
 11 files changed, 516 insertions(+), 74 deletions(-)

diff --git a/docs/docs.go b/docs/docs.go
index 73d85436..b030c3d3 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1167,7 +1167,7 @@ const docTemplate = `{
                                     "type": "object",
                                     "properties": {
                                         "data": {
-                                            "$ref": 
"#/definitions/schema.SiteInterfaceResp"
+                                            "$ref": 
"#/definitions/schema.SiteInterfaceSettingsResp"
                                         }
                                     }
                                 }
@@ -1708,6 +1708,77 @@ const docTemplate = `{
                 }
             }
         },
+        "/answer/admin/api/siteinfo/users-settings": {
+            "get": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "description": "get site interface",
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "admin"
+                ],
+                "summary": "get site interface",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/handler.RespBody"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": 
"#/definitions/schema.SiteUsersSettingsResp"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            },
+            "put": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "description": "update site info users settings",
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "admin"
+                ],
+                "summary": "update site info users settings",
+                "parameters": [
+                    {
+                        "description": "general",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/schema.SiteUsersSettingsReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/handler.RespBody"
+                        }
+                    }
+                }
+            }
+        },
         "/answer/admin/api/theme/options": {
             "get": {
                 "security": [
@@ -10843,7 +10914,7 @@ const docTemplate = `{
                     "$ref": "#/definitions/schema.SiteGeneralResp"
                 },
                 "interface": {
-                    "$ref": "#/definitions/schema.SiteInterfaceResp"
+                    "$ref": "#/definitions/schema.SiteInterfaceSettingsResp"
                 },
                 "login": {
                     "$ref": "#/definitions/schema.SiteLoginResp"
@@ -10872,6 +10943,9 @@ const docTemplate = `{
                 "theme": {
                     "$ref": "#/definitions/schema.SiteThemeResp"
                 },
+                "users_settings": {
+                    "$ref": "#/definitions/schema.SiteUsersSettingsResp"
+                },
                 "version": {
                     "type": "string"
                 }
@@ -10905,24 +10979,13 @@ const docTemplate = `{
                 }
             }
         },
-        "schema.SiteInterfaceResp": {
+        "schema.SiteInterfaceSettingsResp": {
             "type": "object",
             "required": [
-                "default_avatar",
                 "language",
                 "time_zone"
             ],
             "properties": {
-                "default_avatar": {
-                    "type": "string",
-                    "enum": [
-                        "system",
-                        "gravatar"
-                    ]
-                },
-                "gravatar_base_url": {
-                    "type": "string"
-                },
                 "language": {
                     "type": "string",
                     "maxLength": 128
@@ -11271,6 +11334,42 @@ const docTemplate = `{
                 }
             }
         },
+        "schema.SiteUsersSettingsReq": {
+            "type": "object",
+            "required": [
+                "default_avatar"
+            ],
+            "properties": {
+                "default_avatar": {
+                    "type": "string",
+                    "enum": [
+                        "system",
+                        "gravatar"
+                    ]
+                },
+                "gravatar_base_url": {
+                    "type": "string"
+                }
+            }
+        },
+        "schema.SiteUsersSettingsResp": {
+            "type": "object",
+            "required": [
+                "default_avatar"
+            ],
+            "properties": {
+                "default_avatar": {
+                    "type": "string",
+                    "enum": [
+                        "system",
+                        "gravatar"
+                    ]
+                },
+                "gravatar_base_url": {
+                    "type": "string"
+                }
+            }
+        },
         "schema.SiteWriteTag": {
             "type": "object",
             "required": [
diff --git a/docs/swagger.json b/docs/swagger.json
index 6dbecc50..879302fa 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1159,7 +1159,7 @@
                                     "type": "object",
                                     "properties": {
                                         "data": {
-                                            "$ref": 
"#/definitions/schema.SiteInterfaceResp"
+                                            "$ref": 
"#/definitions/schema.SiteInterfaceSettingsResp"
                                         }
                                     }
                                 }
@@ -1700,6 +1700,77 @@
                 }
             }
         },
+        "/answer/admin/api/siteinfo/users-settings": {
+            "get": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "description": "get site interface",
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "admin"
+                ],
+                "summary": "get site interface",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/handler.RespBody"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": 
"#/definitions/schema.SiteUsersSettingsResp"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            },
+            "put": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "description": "update site info users settings",
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "admin"
+                ],
+                "summary": "update site info users settings",
+                "parameters": [
+                    {
+                        "description": "general",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/schema.SiteUsersSettingsReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/handler.RespBody"
+                        }
+                    }
+                }
+            }
+        },
         "/answer/admin/api/theme/options": {
             "get": {
                 "security": [
@@ -10835,7 +10906,7 @@
                     "$ref": "#/definitions/schema.SiteGeneralResp"
                 },
                 "interface": {
-                    "$ref": "#/definitions/schema.SiteInterfaceResp"
+                    "$ref": "#/definitions/schema.SiteInterfaceSettingsResp"
                 },
                 "login": {
                     "$ref": "#/definitions/schema.SiteLoginResp"
@@ -10864,6 +10935,9 @@
                 "theme": {
                     "$ref": "#/definitions/schema.SiteThemeResp"
                 },
+                "users_settings": {
+                    "$ref": "#/definitions/schema.SiteUsersSettingsResp"
+                },
                 "version": {
                     "type": "string"
                 }
@@ -10897,24 +10971,13 @@
                 }
             }
         },
-        "schema.SiteInterfaceResp": {
+        "schema.SiteInterfaceSettingsResp": {
             "type": "object",
             "required": [
-                "default_avatar",
                 "language",
                 "time_zone"
             ],
             "properties": {
-                "default_avatar": {
-                    "type": "string",
-                    "enum": [
-                        "system",
-                        "gravatar"
-                    ]
-                },
-                "gravatar_base_url": {
-                    "type": "string"
-                },
                 "language": {
                     "type": "string",
                     "maxLength": 128
@@ -11263,6 +11326,42 @@
                 }
             }
         },
+        "schema.SiteUsersSettingsReq": {
+            "type": "object",
+            "required": [
+                "default_avatar"
+            ],
+            "properties": {
+                "default_avatar": {
+                    "type": "string",
+                    "enum": [
+                        "system",
+                        "gravatar"
+                    ]
+                },
+                "gravatar_base_url": {
+                    "type": "string"
+                }
+            }
+        },
+        "schema.SiteUsersSettingsResp": {
+            "type": "object",
+            "required": [
+                "default_avatar"
+            ],
+            "properties": {
+                "default_avatar": {
+                    "type": "string",
+                    "enum": [
+                        "system",
+                        "gravatar"
+                    ]
+                },
+                "gravatar_base_url": {
+                    "type": "string"
+                }
+            }
+        },
         "schema.SiteWriteTag": {
             "type": "object",
             "required": [
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index f4107cd6..ce16da75 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -2212,7 +2212,7 @@ definitions:
       general:
         $ref: '#/definitions/schema.SiteGeneralResp'
       interface:
-        $ref: '#/definitions/schema.SiteInterfaceResp'
+        $ref: '#/definitions/schema.SiteInterfaceSettingsResp'
       login:
         $ref: '#/definitions/schema.SiteLoginResp'
       revision:
@@ -2231,6 +2231,8 @@ definitions:
         $ref: '#/definitions/schema.SiteUsersResp'
       theme:
         $ref: '#/definitions/schema.SiteThemeResp'
+      users_settings:
+        $ref: '#/definitions/schema.SiteUsersSettingsResp'
       version:
         type: string
     type: object
@@ -2254,15 +2256,8 @@ definitions:
     - language
     - time_zone
     type: object
-  schema.SiteInterfaceResp:
+  schema.SiteInterfaceSettingsResp:
     properties:
-      default_avatar:
-        enum:
-        - system
-        - gravatar
-        type: string
-      gravatar_base_url:
-        type: string
       language:
         maxLength: 128
         type: string
@@ -2270,7 +2265,6 @@ definitions:
         maxLength: 128
         type: string
     required:
-    - default_avatar
     - language
     - time_zone
     type: object
@@ -2502,6 +2496,30 @@ definitions:
     required:
     - default_avatar
     type: object
+  schema.SiteUsersSettingsReq:
+    properties:
+      default_avatar:
+        enum:
+        - system
+        - gravatar
+        type: string
+      gravatar_base_url:
+        type: string
+    required:
+    - default_avatar
+    type: object
+  schema.SiteUsersSettingsResp:
+    properties:
+      default_avatar:
+        enum:
+        - system
+        - gravatar
+        type: string
+      gravatar_base_url:
+        type: string
+    required:
+    - default_avatar
+    type: object
   schema.SiteWriteTag:
     properties:
       display_name:
@@ -3878,7 +3896,7 @@ paths:
             - $ref: '#/definitions/handler.RespBody'
             - properties:
                 data:
-                  $ref: '#/definitions/schema.SiteInterfaceResp'
+                  $ref: '#/definitions/schema.SiteInterfaceSettingsResp'
               type: object
       security:
       - ApiKeyAuth: []
@@ -4193,6 +4211,47 @@ paths:
       summary: update site info config about users
       tags:
       - admin
+  /answer/admin/api/siteinfo/users-settings:
+    get:
+      description: get site interface
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/handler.RespBody'
+            - properties:
+                data:
+                  $ref: '#/definitions/schema.SiteUsersSettingsResp'
+              type: object
+      security:
+      - ApiKeyAuth: []
+      summary: get site interface
+      tags:
+      - admin
+    put:
+      description: update site info users settings
+      parameters:
+      - description: general
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/schema.SiteUsersSettingsReq'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/handler.RespBody'
+      security:
+      - ApiKeyAuth: []
+      summary: update site info users settings
+      tags:
+      - admin
   /answer/admin/api/theme/options:
     get:
       description: Get theme options
diff --git a/internal/base/constant/site_type.go 
b/internal/base/constant/site_type.go
index 6106b190..9bb4e10a 100644
--- a/internal/base/constant/site_type.go
+++ b/internal/base/constant/site_type.go
@@ -20,9 +20,11 @@
 package constant
 
 const (
-       SiteTypeGeneral       = "general"
-       SiteTypeInterface     = "interface"
-       SiteTypeBranding      = "branding"
+       SiteTypeGeneral = "general"
+       // Deprecated: split SiteTypeInterfaceSettings and 
SiteTypeUsersSettings for better clarity
+       SiteTypeInterface = "interface"
+       SiteTypeBranding  = "branding"
+       // Deprecated: use SiteTypeAdvanced, SiteTypeQuestions, and 
SiteTypeTags instead
        SiteTypeWrite         = "write"
        SiteTypeLegal         = "legal"
        SiteTypeSeo           = "seo"
@@ -31,7 +33,11 @@ const (
        SiteTypeTheme         = "theme"
        SiteTypePrivileges    = "privileges"
        SiteTypeUsers         = "users"
-       SiteTypeAdvanced      = "advanced"
-       SiteTypeQuestions     = "questions"
-       SiteTypeTags          = "tags"
+
+       SiteTypeAdvanced  = "advanced"
+       SiteTypeQuestions = "questions"
+       SiteTypeTags      = "tags"
+
+       SiteTypeUsersSettings     = "users_settings"
+       SiteTypeInterfaceSettings = "interface_settings"
 )
diff --git a/internal/controller/siteinfo_controller.go 
b/internal/controller/siteinfo_controller.go
index 8035275a..503bfeb6 100644
--- a/internal/controller/siteinfo_controller.go
+++ b/internal/controller/siteinfo_controller.go
@@ -60,6 +60,11 @@ func (sc *SiteInfoController) GetSiteInfo(ctx *gin.Context) {
                log.Error(err)
        }
 
+       resp.UsersSettings, err = sc.siteInfoService.GetSiteUsersSettings(ctx)
+       if err != nil {
+               log.Error(err)
+       }
+
        resp.Branding, err = sc.siteInfoService.GetSiteBranding(ctx)
        if err != nil {
                log.Error(err)
diff --git a/internal/controller_admin/siteinfo_controller.go 
b/internal/controller_admin/siteinfo_controller.go
index bbab9794..056b01ae 100644
--- a/internal/controller_admin/siteinfo_controller.go
+++ b/internal/controller_admin/siteinfo_controller.go
@@ -62,13 +62,26 @@ func (sc *SiteInfoController) GetGeneral(ctx *gin.Context) {
 // @Security ApiKeyAuth
 // @Tags admin
 // @Produce json
-// @Success 200 {object} handler.RespBody{data=schema.SiteInterfaceResp}
+// @Success 200 {object} 
handler.RespBody{data=schema.SiteInterfaceSettingsResp}
 // @Router /answer/admin/api/siteinfo/interface [get]
 func (sc *SiteInfoController) GetInterface(ctx *gin.Context) {
        resp, err := sc.siteInfoService.GetSiteInterface(ctx)
        handler.HandleResponse(ctx, err, resp)
 }
 
+// GetUsersSettings get site interface
+// @Summary get site interface
+// @Description get site interface
+// @Security ApiKeyAuth
+// @Tags admin
+// @Produce json
+// @Success 200 {object} handler.RespBody{data=schema.SiteUsersSettingsResp}
+// @Router /answer/admin/api/siteinfo/users-settings [get]
+func (sc *SiteInfoController) GetUsersSettings(ctx *gin.Context) {
+       resp, err := sc.siteInfoService.GetSiteUsersSettings(ctx)
+       handler.HandleResponse(ctx, err, resp)
+}
+
 // GetSiteBranding get site interface
 // @Summary get site interface
 // @Description get site interface
@@ -287,6 +300,24 @@ func (sc *SiteInfoController) UpdateInterface(ctx 
*gin.Context) {
        handler.HandleResponse(ctx, err, nil)
 }
 
+// UpdateUsersSettings update users settings
+// @Summary update site info users settings
+// @Description update site info users settings
+// @Security ApiKeyAuth
+// @Tags admin
+// @Produce json
+// @Param data body schema.SiteUsersSettingsReq true "general"
+// @Success 200 {object} handler.RespBody{}
+// @Router /answer/admin/api/siteinfo/users-settings [put]
+func (sc *SiteInfoController) UpdateUsersSettings(ctx *gin.Context) {
+       req := schema.SiteUsersSettingsReq{}
+       if handler.BindAndCheck(ctx, &req) {
+               return
+       }
+       err := sc.siteInfoService.SaveSiteUsersSettings(ctx, req)
+       handler.HandleResponse(ctx, err, nil)
+}
+
 // UpdateBranding update site branding
 // @Summary update site info branding
 // @Description update site info branding
diff --git a/internal/migrations/v30.go b/internal/migrations/v30.go
index 5d5d5223..4d0f1130 100644
--- a/internal/migrations/v30.go
+++ b/internal/migrations/v30.go
@@ -171,3 +171,99 @@ func splitWriteMenu(ctx context.Context, x *xorm.Engine) 
error {
 
        return nil
 }
+
+func splitInterfaceMenu(ctx context.Context, x *xorm.Engine) error {
+       var (
+               siteInfo          = &entity.SiteInfo{}
+               siteInfoInterface = &entity.SiteInfo{}
+               siteInfoUsers     = &entity.SiteInfo{}
+       )
+       type SiteInterface struct {
+               Language        string `validate:"required,gt=1,lte=128" 
form:"language" json:"language"`
+               TimeZone        string `validate:"required,gt=1,lte=128" 
form:"time_zone" json:"time_zone"`
+               DefaultAvatar   string `validate:"required,oneof=system 
gravatar" json:"default_avatar"`
+               GravatarBaseURL string `validate:"omitempty" 
json:"gravatar_base_url"`
+       }
+
+       exist, err := x.Context(ctx).Where(builder.Eq{"type": 
constant.SiteTypeInterface}).Get(siteInfo)
+       if err != nil {
+               err = 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
+               return err
+       }
+       if !exist {
+               return nil
+       }
+       oldSiteInterface := &SiteInterface{}
+       if err := json.Unmarshal([]byte(siteInfo.Content), oldSiteInterface); 
err != nil {
+               return err
+       }
+       siteUser := &schema.SiteUsersSettingsResp{
+               DefaultAvatar:   oldSiteInterface.DefaultAvatar,
+               GravatarBaseURL: oldSiteInterface.GravatarBaseURL,
+       }
+       siteInterface := &schema.SiteInterfaceResp{
+               Language: oldSiteInterface.Language,
+               TimeZone: oldSiteInterface.TimeZone,
+       }
+
+       // save settings
+       // save user settings
+       existsUsers, err := x.Context(ctx).Where(builder.Eq{"type": 
constant.SiteTypeUsersSettings}).Get(siteInfoUsers)
+       if err != nil {
+               return err
+       }
+       userContent, err := json.Marshal(siteUser)
+       if err != nil {
+               return err
+       }
+       if existsUsers {
+               _, err = 
x.Context(ctx).ID(siteInfoUsers.ID).Update(&entity.SiteInfo{
+                       Type:    constant.SiteTypeUsersSettings,
+                       Content: string(userContent),
+                       Status:  1,
+               })
+               if err != nil {
+                       return err
+               }
+       } else {
+               _, err = x.Context(ctx).Insert(&entity.SiteInfo{
+                       Type:    constant.SiteTypeUsersSettings,
+                       Content: string(userContent),
+                       Status:  1,
+               })
+               if err != nil {
+                       return err
+               }
+       }
+
+       // save interface settings
+       existsInterface, err := x.Context(ctx).Where(builder.Eq{"type": 
constant.SiteTypeInterfaceSettings}).Get(siteInfoInterface)
+       if err != nil {
+               return err
+       }
+       interfaceContent, err := json.Marshal(siteInterface)
+       if err != nil {
+               return err
+       }
+       if existsInterface {
+               _, err = 
x.Context(ctx).ID(siteInfoInterface.ID).Update(&entity.SiteInfo{
+                       Type:    constant.SiteTypeInterfaceSettings,
+                       Content: string(interfaceContent),
+                       Status:  1,
+               })
+               if err != nil {
+                       return err
+               }
+       } else {
+               _, err = x.Context(ctx).Insert(&entity.SiteInfo{
+                       Type:    constant.SiteTypeInterfaceSettings,
+                       Content: string(interfaceContent),
+                       Status:  1,
+               })
+               if err != nil {
+                       return err
+               }
+       }
+
+       return nil
+}
diff --git a/internal/router/answer_api_router.go 
b/internal/router/answer_api_router.go
index d717bc9d..c776b44f 100644
--- a/internal/router/answer_api_router.go
+++ b/internal/router/answer_api_router.go
@@ -343,8 +343,12 @@ func (a *AnswerAPIRouter) RegisterAnswerAdminAPIRouter(r 
*gin.RouterGroup) {
        // siteinfo
        r.GET("/siteinfo/general", a.adminSiteInfoController.GetGeneral)
        r.PUT("/siteinfo/general", a.adminSiteInfoController.UpdateGeneral)
+
        r.GET("/siteinfo/interface", a.adminSiteInfoController.GetInterface)
        r.PUT("/siteinfo/interface", a.adminSiteInfoController.UpdateInterface)
+       r.GET("/siteinfo/users-settings", 
a.adminSiteInfoController.GetUsersSettings)
+       r.PUT("/siteinfo/users-settings", 
a.adminSiteInfoController.UpdateUsersSettings)
+
        r.GET("/siteinfo/branding", a.adminSiteInfoController.GetSiteBranding)
        r.PUT("/siteinfo/branding", a.adminSiteInfoController.UpdateBranding)
 
diff --git a/internal/schema/siteinfo_schema.go 
b/internal/schema/siteinfo_schema.go
index daf49146..a060558a 100644
--- a/internal/schema/siteinfo_schema.go
+++ b/internal/schema/siteinfo_schema.go
@@ -65,6 +65,21 @@ type SiteInterfaceReq struct {
        GravatarBaseURL string `validate:"omitempty" json:"gravatar_base_url"`
 }
 
+// SiteInterfaceSettingsReq site interface settings request
+type SiteInterfaceSettingsReq struct {
+       Language string `validate:"required,gt=1,lte=128" json:"language"`
+       TimeZone string `validate:"required,gt=1,lte=128" json:"time_zone"`
+}
+
+type SiteInterfaceSettingsResp SiteInterfaceSettingsReq
+
+type SiteUsersSettingsReq struct {
+       DefaultAvatar   string `validate:"required,oneof=system gravatar" 
json:"default_avatar"`
+       GravatarBaseURL string `validate:"omitempty" json:"gravatar_base_url"`
+}
+
+type SiteUsersSettingsResp SiteUsersSettingsReq
+
 // SiteBrandingReq site branding request
 type SiteBrandingReq struct {
        Logo       string `validate:"omitempty,gt=0,lte=512" form:"logo" 
json:"logo"`
@@ -279,27 +294,30 @@ type SiteSeoResp SiteSeoReq
 
 // SiteInfoResp get site info response
 type SiteInfoResp struct {
-       General       *SiteGeneralResp       `json:"general"`
-       Interface     *SiteInterfaceResp     `json:"interface"`
-       Branding      *SiteBrandingResp      `json:"branding"`
-       Login         *SiteLoginResp         `json:"login"`
-       Theme         *SiteThemeResp         `json:"theme"`
-       CustomCssHtml *SiteCustomCssHTMLResp `json:"custom_css_html"`
-       SiteSeo       *SiteSeoResp           `json:"site_seo"`
-       SiteUsers     *SiteUsersResp         `json:"site_users"`
-       Advanced      *SiteAdvancedResp      `json:"site_advanced"`
-       Questions     *SiteQuestionsResp     `json:"site_questions"`
-       Tags          *SiteTagsResp          `json:"site_tags"`
-       Legal         *SiteLegalSimpleResp   `json:"site_legal"`
-       Version       string                 `json:"version"`
-       Revision      string                 `json:"revision"`
-}
+       General       *SiteGeneralResp           `json:"general"`
+       Interface     *SiteInterfaceSettingsResp `json:"interface"`
+       UsersSettings *SiteUsersSettingsResp     `json:"users_settings"`
+       Branding      *SiteBrandingResp          `json:"branding"`
+       Login         *SiteLoginResp             `json:"login"`
+       Theme         *SiteThemeResp             `json:"theme"`
+       CustomCssHtml *SiteCustomCssHTMLResp     `json:"custom_css_html"`
+       SiteSeo       *SiteSeoResp               `json:"site_seo"`
+       SiteUsers     *SiteUsersResp             `json:"site_users"`
+       Advanced      *SiteAdvancedResp          `json:"site_advanced"`
+       Questions     *SiteQuestionsResp         `json:"site_questions"`
+       Tags          *SiteTagsResp              `json:"site_tags"`
+       Legal         *SiteLegalSimpleResp       `json:"site_legal"`
+       Version       string                     `json:"version"`
+       Revision      string                     `json:"revision"`
+}
+
+// todo: 检查模板使用
 type TemplateSiteInfoResp struct {
-       General       *SiteGeneralResp       `json:"general"`
-       Interface     *SiteInterfaceResp     `json:"interface"`
-       Branding      *SiteBrandingResp      `json:"branding"`
-       SiteSeo       *SiteSeoResp           `json:"site_seo"`
-       CustomCssHtml *SiteCustomCssHTMLResp `json:"custom_css_html"`
+       General       *SiteGeneralResp           `json:"general"`
+       Interface     *SiteInterfaceSettingsResp `json:"interface"`
+       Branding      *SiteBrandingResp          `json:"branding"`
+       SiteSeo       *SiteSeoResp               `json:"site_seo"`
+       CustomCssHtml *SiteCustomCssHTMLResp     `json:"custom_css_html"`
        Title         string
        Year          string
        Canonical     string
diff --git a/internal/service/siteinfo/siteinfo_service.go 
b/internal/service/siteinfo/siteinfo_service.go
index b633ed42..956511ce 100644
--- a/internal/service/siteinfo/siteinfo_service.go
+++ b/internal/service/siteinfo/siteinfo_service.go
@@ -89,10 +89,15 @@ func (s *SiteInfoService) GetSiteGeneral(ctx 
context.Context) (resp *schema.Site
 }
 
 // GetSiteInterface get site info interface
-func (s *SiteInfoService) GetSiteInterface(ctx context.Context) (resp 
*schema.SiteInterfaceResp, err error) {
+func (s *SiteInfoService) GetSiteInterface(ctx context.Context) (resp 
*schema.SiteInterfaceSettingsResp, err error) {
        return s.siteInfoCommonService.GetSiteInterface(ctx)
 }
 
+// GetSiteUsersSettings get site info users settings
+func (s *SiteInfoService) GetSiteUsersSettings(ctx context.Context) (resp 
*schema.SiteUsersSettingsResp, err error) {
+       return s.siteInfoCommonService.GetSiteUsersSettings(ctx)
+}
+
 // GetSiteBranding get site info branding
 func (s *SiteInfoService) GetSiteBranding(ctx context.Context) (resp 
*schema.SiteBrandingResp, err error) {
        return s.siteInfoCommonService.GetSiteBranding(ctx)
@@ -172,10 +177,20 @@ func (s *SiteInfoService) SaveSiteInterface(ctx 
context.Context, req schema.Site
 
        content, _ := json.Marshal(req)
        data := entity.SiteInfo{
-               Type:    constant.SiteTypeInterface,
+               Type:    constant.SiteTypeInterfaceSettings,
+               Content: string(content),
+       }
+       return s.siteInfoRepo.SaveByType(ctx, 
constant.SiteTypeInterfaceSettings, &data)
+}
+
+// SaveSiteUsersSettings save site users settings
+func (s *SiteInfoService) SaveSiteUsersSettings(ctx context.Context, req 
schema.SiteUsersSettingsReq) (err error) {
+       content, _ := json.Marshal(req)
+       data := entity.SiteInfo{
+               Type:    constant.SiteTypeInterfaceSettings,
                Content: string(content),
        }
-       return s.siteInfoRepo.SaveByType(ctx, constant.SiteTypeInterface, &data)
+       return s.siteInfoRepo.SaveByType(ctx, constant.SiteTypeUsersSettings, 
&data)
 }
 
 // SaveSiteBranding save site branding information
diff --git a/internal/service/siteinfo_common/siteinfo_service.go 
b/internal/service/siteinfo_common/siteinfo_service.go
index 87bc7ee1..dde0114b 100644
--- a/internal/service/siteinfo_common/siteinfo_service.go
+++ b/internal/service/siteinfo_common/siteinfo_service.go
@@ -45,7 +45,8 @@ type siteInfoCommonService struct {
 
 type SiteInfoCommonService interface {
        GetSiteGeneral(ctx context.Context) (resp *schema.SiteGeneralResp, err 
error)
-       GetSiteInterface(ctx context.Context) (resp *schema.SiteInterfaceResp, 
err error)
+       GetSiteInterface(ctx context.Context) (resp 
*schema.SiteInterfaceSettingsResp, err error)
+       GetSiteUsersSettings(ctx context.Context) (resp 
*schema.SiteUsersSettingsResp, err error)
        GetSiteBranding(ctx context.Context) (resp *schema.SiteBrandingResp, 
err error)
        GetSiteUsers(ctx context.Context) (resp *schema.SiteUsersResp, err 
error)
        FormatAvatar(ctx context.Context, originalAvatarData, email string, 
userStatus int) *schema.AvatarInfo
@@ -81,9 +82,18 @@ func (s *siteInfoCommonService) GetSiteGeneral(ctx 
context.Context) (resp *schem
 }
 
 // GetSiteInterface get site info interface
-func (s *siteInfoCommonService) GetSiteInterface(ctx context.Context) (resp 
*schema.SiteInterfaceResp, err error) {
-       resp = &schema.SiteInterfaceResp{}
-       if err = s.GetSiteInfoByType(ctx, constant.SiteTypeInterface, resp); 
err != nil {
+func (s *siteInfoCommonService) GetSiteInterface(ctx context.Context) (resp 
*schema.SiteInterfaceSettingsResp, err error) {
+       resp = &schema.SiteInterfaceSettingsResp{}
+       if err = s.GetSiteInfoByType(ctx, constant.SiteTypeInterfaceSettings, 
resp); err != nil {
+               return nil, err
+       }
+       return resp, nil
+}
+
+// GetSiteUsersSettings get site info interface
+func (s *siteInfoCommonService) GetSiteUsersSettings(ctx context.Context) 
(resp *schema.SiteUsersSettingsResp, err error) {
+       resp = &schema.SiteUsersSettingsResp{}
+       if err = s.GetSiteInfoByType(ctx, constant.SiteTypeUsersSettings, 
resp); err != nil {
                return nil, err
        }
        return resp, nil
@@ -126,7 +136,7 @@ func (s *siteInfoCommonService) FormatListAvatar(ctx 
context.Context, userList [
 
 func (s *siteInfoCommonService) getAvatarDefaultConfig(ctx context.Context) 
(string, string) {
        gravatarBaseURL, defaultAvatar := constant.DefaultGravatarBaseURL, 
constant.DefaultAvatar
-       usersConfig, err := s.GetSiteInterface(ctx)
+       usersConfig, err := s.GetSiteUsersSettings(ctx)
        if err != nil {
                log.Error(err)
        }

Reply via email to