Skip to content

Commit f05f1eb

Browse files
committed
feat(menu): update admin menu settings to include questions, tags, and advanced options
1 parent 6b834c7 commit f05f1eb

16 files changed

Lines changed: 485 additions & 79 deletions

File tree

cmd/wire_gen.go

Lines changed: 22 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ require (
3737
github.com/grokify/html-strip-tags-go v0.1.0
3838
github.com/jinzhu/copier v0.4.0
3939
github.com/jinzhu/now v1.1.5
40+
github.com/joho/godotenv v1.5.1
4041
github.com/lib/pq v1.10.9
4142
github.com/microcosm-cc/bluemonday v1.0.27
4243
github.com/mozillazg/go-pinyin v0.20.0
@@ -117,7 +118,6 @@ require (
117118
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
118119
github.com/hashicorp/hcl v1.0.0 // indirect
119120
github.com/inconshreveable/mousetrap v1.1.0 // indirect
120-
github.com/joho/godotenv v1.5.1 // indirect
121121
github.com/josharian/intern v1.0.0 // indirect
122122
github.com/json-iterator/go v1.1.12 // indirect
123123
github.com/klauspost/cpuid/v2 v2.2.8 // indirect

internal/base/constant/site_type.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,7 @@ const (
3131
SiteTypeTheme = "theme"
3232
SiteTypePrivileges = "privileges"
3333
SiteTypeUsers = "users"
34+
SiteTypeAdvanced = "advanced"
35+
SiteTypeQuestions = "questions"
36+
SiteTypeTags = "tags"
3437
)

internal/controller/answer_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ func (ac *AnswerController) AddAnswer(ctx *gin.Context) {
242242
return
243243
}
244244

245-
write, err := ac.siteInfoCommonService.GetSiteWrite(ctx)
245+
write, err := ac.siteInfoCommonService.GetSiteQuestion(ctx)
246246
if err != nil {
247247
handler.HandleResponse(ctx, err, nil)
248248
return

internal/controller/siteinfo_controller.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,15 @@ func (sc *SiteInfoController) GetSiteInfo(ctx *gin.Context) {
8787
if err != nil {
8888
log.Error(err)
8989
}
90-
resp.Write, err = sc.siteInfoService.GetSiteWrite(ctx)
90+
resp.Questions, err = sc.siteInfoService.GetSiteQuestion(ctx)
91+
if err != nil {
92+
log.Error(err)
93+
}
94+
resp.Tags, err = sc.siteInfoService.GetSiteTag(ctx)
95+
if err != nil {
96+
log.Error(err)
97+
}
98+
resp.Advanced, err = sc.siteInfoService.GetSiteAdvanced(ctx)
9199
if err != nil {
92100
log.Error(err)
93101
}

internal/controller_admin/siteinfo_controller.go

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,42 @@ func (sc *SiteInfoController) GetSiteBranding(ctx *gin.Context) {
8282
handler.HandleResponse(ctx, err, resp)
8383
}
8484

85-
// GetSiteWrite get site interface
86-
// @Summary get site interface
87-
// @Description get site interface
85+
// GetSiteTag get site tags setting
86+
// @Summary get site tags setting
87+
// @Description get site tags setting
88+
// @Security ApiKeyAuth
89+
// @Tags admin
90+
// @Produce json
91+
// @Success 200 {object} handler.RespBody{data=schema.SiteTagsResp}
92+
// @Router /answer/admin/api/siteinfo/tag [get]
93+
func (sc *SiteInfoController) GetSiteTag(ctx *gin.Context) {
94+
resp, err := sc.siteInfoService.GetSiteTag(ctx)
95+
handler.HandleResponse(ctx, err, resp)
96+
}
97+
98+
// GetSiteQuestion get site questions setting
99+
// @Summary get site questions setting
100+
// @Description get site questions setting
101+
// @Security ApiKeyAuth
102+
// @Tags admin
103+
// @Produce json
104+
// @Success 200 {object} handler.RespBody{data=schema.SiteQuestionsResp}
105+
// @Router /answer/admin/api/siteinfo/question [get]
106+
func (sc *SiteInfoController) GetSiteQuestion(ctx *gin.Context) {
107+
resp, err := sc.siteInfoService.GetSiteQuestion(ctx)
108+
handler.HandleResponse(ctx, err, resp)
109+
}
110+
111+
// GetSiteAdvanced get site advanced setting
112+
// @Summary get site advanced setting
113+
// @Description get site advanced setting
88114
// @Security ApiKeyAuth
89115
// @Tags admin
90116
// @Produce json
91-
// @Success 200 {object} handler.RespBody{data=schema.SiteWriteResp}
92-
// @Router /answer/admin/api/siteinfo/write [get]
93-
func (sc *SiteInfoController) GetSiteWrite(ctx *gin.Context) {
94-
resp, err := sc.siteInfoService.GetSiteWrite(ctx)
117+
// @Success 200 {object} handler.RespBody{data=schema.SiteAdvancedResp}
118+
// @Router /answer/admin/api/siteinfo/advanced [get]
119+
func (sc *SiteInfoController) GetSiteAdvanced(ctx *gin.Context) {
120+
resp, err := sc.siteInfoService.GetSiteAdvanced(ctx)
95121
handler.HandleResponse(ctx, err, resp)
96122
}
97123

@@ -288,23 +314,61 @@ func (sc *SiteInfoController) UpdateBranding(ctx *gin.Context) {
288314
handler.HandleResponse(ctx, saveErr, nil)
289315
}
290316

291-
// UpdateSiteWrite update site write info
292-
// @Summary update site write info
293-
// @Description update site write info
317+
// UpdateSiteQuestion update site question settings
318+
// @Summary update site question settings
319+
// @Description update site question settings
320+
// @Security ApiKeyAuth
321+
// @Tags admin
322+
// @Produce json
323+
// @Param data body schema.SiteQuestionsReq true "questions settings"
324+
// @Success 200 {object} handler.RespBody{}
325+
// @Router /answer/admin/api/siteinfo/question [put]
326+
func (sc *SiteInfoController) UpdateSiteQuestion(ctx *gin.Context) {
327+
req := &schema.SiteQuestionsReq{}
328+
if handler.BindAndCheck(ctx, req) {
329+
return
330+
}
331+
332+
resp, err := sc.siteInfoService.SaveSiteQuestions(ctx, req)
333+
handler.HandleResponse(ctx, err, resp)
334+
}
335+
336+
// UpdateSiteTag update site tag settings
337+
// @Summary update site tag settings
338+
// @Description update site tag settings
294339
// @Security ApiKeyAuth
295340
// @Tags admin
296341
// @Produce json
297-
// @Param data body schema.SiteWriteReq true "write info"
342+
// @Param data body schema.SiteTagsReq true "tags settings"
298343
// @Success 200 {object} handler.RespBody{}
299-
// @Router /answer/admin/api/siteinfo/write [put]
300-
func (sc *SiteInfoController) UpdateSiteWrite(ctx *gin.Context) {
301-
req := &schema.SiteWriteReq{}
344+
// @Router /answer/admin/api/siteinfo/tag [put]
345+
func (sc *SiteInfoController) UpdateSiteTag(ctx *gin.Context) {
346+
req := &schema.SiteTagsReq{}
302347
if handler.BindAndCheck(ctx, req) {
303348
return
304349
}
305350
req.UserID = middleware.GetLoginUserIDFromContext(ctx)
306351

307-
resp, err := sc.siteInfoService.SaveSiteWrite(ctx, req)
352+
resp, err := sc.siteInfoService.SaveSiteTags(ctx, req)
353+
handler.HandleResponse(ctx, err, resp)
354+
}
355+
356+
// UpdateSiteAdvanced update site advanced info
357+
// @Summary update site advanced info
358+
// @Description update site advanced info
359+
// @Security ApiKeyAuth
360+
// @Tags admin
361+
// @Produce json
362+
// @Param data body schema.SiteAdvancedReq true "advanced settings"
363+
// @Success 200 {object} handler.RespBody{}
364+
// @Router /answer/admin/api/siteinfo/advanced [put]
365+
func (sc *SiteInfoController) UpdateSiteAdvanced(ctx *gin.Context) {
366+
req := &schema.SiteAdvancedReq{}
367+
if handler.BindAndCheck(ctx, req) {
368+
return
369+
}
370+
371+
resp, err := sc.siteInfoService.SaveSiteAdvanced(ctx, req)
308372
handler.HandleResponse(ctx, err, resp)
309373
}
310374

internal/migrations/migrations.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ var migrations = []Migration{
105105
NewMigration("v1.6.0", "move user config to interface", moveUserConfigToInterface, true),
106106
NewMigration("v1.7.0", "add optional tags", addOptionalTags, true),
107107
NewMigration("v1.7.2", "expand avatar column length", expandAvatarColumnLength, false),
108+
NewMigration("v1.8.0", "change admin menu", updateAdminMenuSettings, true),
108109
}
109110

110111
func GetMigrations() []Migration {

internal/migrations/v30.go

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package migrations
21+
22+
import (
23+
"context"
24+
"encoding/json"
25+
26+
"github.com/apache/answer/internal/base/constant"
27+
"github.com/apache/answer/internal/base/reason"
28+
"github.com/apache/answer/internal/entity"
29+
"github.com/apache/answer/internal/schema"
30+
"github.com/segmentfault/pacman/errors"
31+
"xorm.io/builder"
32+
"xorm.io/xorm"
33+
)
34+
35+
func updateAdminMenuSettings(ctx context.Context, x *xorm.Engine) (err error) {
36+
err = splitWriteMenu(ctx, x)
37+
if err != nil {
38+
return
39+
}
40+
return
41+
}
42+
43+
// splitWriteMenu splits the site write settings into advanced, questions, and tags settings
44+
func splitWriteMenu(ctx context.Context, x *xorm.Engine) error {
45+
var (
46+
siteInfo = &entity.SiteInfo{}
47+
siteInfoAdvanced = &entity.SiteInfo{}
48+
siteInfoQuestions = &entity.SiteInfo{}
49+
siteInfoTags = &entity.SiteInfo{}
50+
)
51+
exist, err := x.Context(ctx).Where(builder.Eq{"type": constant.SiteTypeWrite}).Get(siteInfo)
52+
if err != nil {
53+
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
54+
return err
55+
}
56+
if !exist {
57+
return nil
58+
}
59+
siteWrite := &schema.SiteWriteResp{}
60+
if err := json.Unmarshal([]byte(siteInfo.Content), siteWrite); err != nil {
61+
return err
62+
}
63+
// site advanced settings
64+
siteAdvanced := &schema.SiteAdvancedResp{
65+
MaxImageSize: siteWrite.MaxImageSize,
66+
MaxAttachmentSize: siteWrite.MaxAttachmentSize,
67+
MaxImageMegapixel: siteWrite.MaxImageMegapixel,
68+
AuthorizedImageExtensions: siteWrite.AuthorizedImageExtensions,
69+
AuthorizedAttachmentExtensions: siteWrite.AuthorizedAttachmentExtensions,
70+
}
71+
// site questions settings
72+
siteQuestions := &schema.SiteQuestionsResp{
73+
MinimumContent: siteWrite.MinimumContent,
74+
RestrictAnswer: siteWrite.RestrictAnswer,
75+
}
76+
// site tags settings
77+
siteTags := &schema.SiteTagsResp{
78+
ReservedTags: siteWrite.ReservedTags,
79+
RecommendTags: siteWrite.RecommendTags,
80+
MinimumTags: siteWrite.MinimumTags,
81+
RequiredTag: siteWrite.RequiredTag,
82+
}
83+
84+
// save site settings
85+
// save advanced settings
86+
existsAdvanced, err := x.Context(ctx).Where(builder.Eq{"type": constant.SiteTypeWrite}).Get(siteInfoAdvanced)
87+
if err != nil {
88+
return err
89+
}
90+
advancedContent, err := json.Marshal(siteAdvanced)
91+
if err != nil {
92+
return err
93+
}
94+
if existsAdvanced {
95+
_, err = x.Context(ctx).ID(siteInfoAdvanced.ID).Update(&entity.SiteInfo{
96+
Type: constant.SiteTypeAdvanced,
97+
Content: string(advancedContent),
98+
Status: 1,
99+
})
100+
if err != nil {
101+
return err
102+
}
103+
} else {
104+
_, err = x.Context(ctx).Insert(&entity.SiteInfo{
105+
Type: constant.SiteTypeAdvanced,
106+
Content: string(advancedContent),
107+
Status: 1,
108+
})
109+
if err != nil {
110+
return err
111+
}
112+
}
113+
114+
// save questions settings
115+
existsQuestions, err := x.Context(ctx).Where(builder.Eq{"type": constant.SiteTypeQuestions}).Get(siteInfoQuestions)
116+
if err != nil {
117+
return err
118+
}
119+
questionsContent, err := json.Marshal(siteQuestions)
120+
if err != nil {
121+
return err
122+
}
123+
if existsQuestions {
124+
_, err = x.Context(ctx).ID(siteInfoQuestions.ID).Update(&entity.SiteInfo{
125+
Type: constant.SiteTypeQuestions,
126+
Content: string(questionsContent),
127+
Status: 1,
128+
})
129+
if err != nil {
130+
return err
131+
}
132+
} else {
133+
_, err = x.Context(ctx).Insert(&entity.SiteInfo{
134+
Type: constant.SiteTypeQuestions,
135+
Content: string(questionsContent),
136+
Status: 1,
137+
})
138+
if err != nil {
139+
return err
140+
}
141+
}
142+
143+
// save tags settings
144+
existsTags, err := x.Context(ctx).Where(builder.Eq{"type": constant.SiteTypeTags}).Get(siteInfoTags)
145+
if err != nil {
146+
return err
147+
}
148+
tagsContent, err := json.Marshal(siteTags)
149+
if err != nil {
150+
return err
151+
}
152+
if existsTags {
153+
_, err = x.Context(ctx).ID(siteInfoTags.ID).Update(&entity.SiteInfo{
154+
Type: constant.SiteTypeTags,
155+
Content: string(tagsContent),
156+
Status: 1,
157+
})
158+
if err != nil {
159+
return err
160+
}
161+
} else {
162+
_, err = x.Context(ctx).Insert(&entity.SiteInfo{
163+
Type: constant.SiteTypeTags,
164+
Content: string(tagsContent),
165+
Status: 1,
166+
})
167+
if err != nil {
168+
return err
169+
}
170+
}
171+
172+
return nil
173+
}

internal/router/answer_api_router.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,14 @@ func (a *AnswerAPIRouter) RegisterAnswerAdminAPIRouter(r *gin.RouterGroup) {
347347
r.PUT("/siteinfo/interface", a.adminSiteInfoController.UpdateInterface)
348348
r.GET("/siteinfo/branding", a.adminSiteInfoController.GetSiteBranding)
349349
r.PUT("/siteinfo/branding", a.adminSiteInfoController.UpdateBranding)
350-
r.GET("/siteinfo/write", a.adminSiteInfoController.GetSiteWrite)
351-
r.PUT("/siteinfo/write", a.adminSiteInfoController.UpdateSiteWrite)
350+
351+
r.GET("/siteinfo/question", a.adminSiteInfoController.GetSiteQuestion)
352+
r.PUT("/siteinfo/question", a.adminSiteInfoController.UpdateSiteQuestion)
353+
r.GET("/siteinfo/tag", a.adminSiteInfoController.GetSiteTag)
354+
r.PUT("/siteinfo/tag", a.adminSiteInfoController.UpdateSiteTag)
355+
r.GET("/siteinfo/advanced", a.adminSiteInfoController.GetSiteAdvanced)
356+
r.PUT("/siteinfo/advanced", a.adminSiteInfoController.UpdateSiteAdvanced)
357+
352358
r.GET("/siteinfo/legal", a.adminSiteInfoController.GetSiteLegal)
353359
r.PUT("/siteinfo/legal", a.adminSiteInfoController.UpdateSiteLegal)
354360
r.GET("/siteinfo/seo", a.adminSiteInfoController.GetSeo)

0 commit comments

Comments
 (0)