feat: all users display part Add user status

This commit is contained in:
LinkinStar 2022-09-29 15:27:56 +08:00
parent 00dc84c08f
commit b90ec5e11e
37 changed files with 197 additions and 596 deletions

View File

@ -102,13 +102,14 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database,
userController := controller.NewUserController(authService, userService, captchaService, emailService, uploaderService)
commentRepo := comment.NewCommentRepo(dataData, uniqueIDRepo)
commentCommonRepo := comment.NewCommentCommonRepo(dataData, uniqueIDRepo)
userCommon := usercommon.NewUserCommon(userRepo)
answerRepo := repo.NewAnswerRepo(dataData, uniqueIDRepo, userRankRepo, activityRepo)
questionRepo := repo.NewQuestionRepo(dataData, uniqueIDRepo)
tagRepo := tag.NewTagRepo(dataData, uniqueIDRepo)
objService := object_info.NewObjService(answerRepo, questionRepo, commentCommonRepo, tagRepo)
voteRepo := activity_common.NewVoteRepo(dataData, activityRepo)
commentService := comment2.NewCommentService(commentRepo, commentCommonRepo, userRepo, objService, voteRepo)
rankService := rank2.NewRankService(userRepo, userRankRepo, objService, configRepo)
commentService := comment2.NewCommentService(commentRepo, commentCommonRepo, userCommon, objService, voteRepo)
rankService := rank2.NewRankService(userCommon, userRankRepo, objService, configRepo)
commentController := controller.NewCommentController(commentService, rankService)
reportRepo := report.NewReportRepo(dataData, uniqueIDRepo)
reportService := report2.NewReportService(reportRepo, objService)
@ -128,7 +129,6 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database,
collectionGroupRepo := collection.NewCollectionGroupRepo(dataData)
tagRelRepo := tag.NewTagListRepo(dataData)
tagCommonService := tagcommon.NewTagCommonService(tagRepo, tagRelRepo, revisionService)
userCommon := usercommon.NewUserCommon(userRepo)
collectionCommon := collectioncommon.NewCollectionCommon(collectionRepo)
answerCommon := answercommon.NewAnswerCommon(answerRepo)
metaRepo := meta.NewMetaRepo(dataData)
@ -143,10 +143,10 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database,
questionController := controller.NewQuestionController(questionService, rankService)
answerService := service.NewAnswerService(answerRepo, questionRepo, questionCommon, userCommon, collectionCommon, userRepo, revisionService, answerActivityService, answerCommon, voteRepo)
answerController := controller.NewAnswerController(answerService, rankService)
searchRepo := repo.NewSearchRepo(dataData, uniqueIDRepo, userRepo)
searchService := service.NewSearchService(searchRepo, tagRepo, userRepo, followRepo)
searchRepo := repo.NewSearchRepo(dataData, uniqueIDRepo, userCommon)
searchService := service.NewSearchService(searchRepo, tagRepo, userCommon, followRepo)
searchController := controller.NewSearchController(searchService)
serviceRevisionService := service.NewRevisionService(revisionRepo, userRepo, questionCommon, answerService)
serviceRevisionService := service.NewRevisionService(revisionRepo, userCommon, questionCommon, answerService)
revisionController := controller.NewRevisionController(serviceRevisionService)
rankController := controller.NewRankController(rankService)
commonRepo := common.NewCommonRepo(dataData, uniqueIDRepo)

View File

@ -4246,6 +4246,10 @@ const docTemplate = `{
"description": "reply user id",
"type": "string"
},
"reply_user_status": {
"description": "reply user status",
"type": "string"
},
"reply_username": {
"description": "reply user username",
"type": "string"
@ -4262,6 +4266,10 @@ const docTemplate = `{
"description": "user id",
"type": "string"
},
"user_status": {
"description": "user status",
"type": "string"
},
"username": {
"description": "username",
"type": "string"
@ -5504,7 +5512,7 @@ const docTemplate = `{
},
"status": {
"description": "status",
"type": "integer"
"type": "string"
},
"username": {
"description": "name",

View File

@ -4234,6 +4234,10 @@
"description": "reply user id",
"type": "string"
},
"reply_user_status": {
"description": "reply user status",
"type": "string"
},
"reply_username": {
"description": "reply user username",
"type": "string"
@ -4250,6 +4254,10 @@
"description": "user id",
"type": "string"
},
"user_status": {
"description": "user status",
"type": "string"
},
"username": {
"description": "username",
"type": "string"
@ -5492,7 +5500,7 @@
},
"status": {
"description": "status",
"type": "integer"
"type": "string"
},
"username": {
"description": "name",

View File

@ -299,6 +299,9 @@ definitions:
reply_user_id:
description: reply user id
type: string
reply_user_status:
description: reply user status
type: string
reply_username:
description: reply user username
type: string
@ -311,6 +314,9 @@ definitions:
user_id:
description: user id
type: string
user_status:
description: user status
type: string
username:
description: username
type: string
@ -1209,7 +1215,7 @@ definitions:
type: integer
status:
description: status
type: integer
type: string
username:
description: name
type: string

14
go.mod
View File

@ -19,17 +19,17 @@ require (
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible
github.com/mojocn/base64Captcha v1.3.5
github.com/segmentfault/pacman v1.0.1
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20220926035018-18f894415e5b
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20220926035018-18f894415e5b
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20220926035018-18f894415e5b
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20220926035018-18f894415e5b
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20220926035018-18f894415e5b
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20220929065758-260b3093a347
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20220929065758-260b3093a347
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20220929065758-260b3093a347
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20220929065758-260b3093a347
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20220929065758-260b3093a347
github.com/stretchr/testify v1.8.0
github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a
github.com/swaggo/gin-swagger v1.5.3
github.com/swaggo/swag v1.8.6
golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be
golang.org/x/net v0.0.0-20220926192436-02166a98028e
golang.org/x/net v0.0.0-20220927171203-f486391704dc
xorm.io/builder v0.3.12
xorm.io/core v0.7.3
xorm.io/xorm v1.3.2
@ -76,7 +76,7 @@ require (
go.uber.org/multierr v1.8.0 // indirect
go.uber.org/zap v1.23.0 // indirect
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 // indirect
golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 // indirect
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.12 // indirect
google.golang.org/protobuf v1.28.1 // indirect

14
go.sum
View File

@ -525,14 +525,24 @@ github.com/segmentfault/pacman v1.0.1 h1:GFdvPtNxvVVjnDM4ty02D/+4unHwG9PmjcOZSc2
github.com/segmentfault/pacman v1.0.1/go.mod h1:5lNp5REd8QMThmBUvR3Fi9Y3AsOB4GRq7soCB4QLqOs=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20220926035018-18f894415e5b h1:jSnRy3z3KVtVuGM2YTZihXwc4zEhW+TvyyJbBm8rjh4=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20220926035018-18f894415e5b/go.mod h1:rmf1TCwz67dyM+AmTwSd1BxTo2AOYHj262lP93bOZbs=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20220929065758-260b3093a347 h1:0xWBBXHHuemzMY61KYJXh7F5FW/4K8g98RYKNXodTCc=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20220929065758-260b3093a347/go.mod h1:rmf1TCwz67dyM+AmTwSd1BxTo2AOYHj262lP93bOZbs=
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20220926035018-18f894415e5b h1:Gx3Brm+VMAyBJn4aBsxgKl+EIhFHc/YH5cLGeFHAW4g=
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20220926035018-18f894415e5b/go.mod h1:prPjFam7MyZ5b3S9dcDOt2tMPz6kf7C9c243s9zSwPY=
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20220929065758-260b3093a347 h1:WpnEbmZFE8FYIgvseX+NJtDgGJlM1KSaKJhoxJywUgo=
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20220929065758-260b3093a347/go.mod h1:prPjFam7MyZ5b3S9dcDOt2tMPz6kf7C9c243s9zSwPY=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20220926035018-18f894415e5b h1:uQmSgcV2w4OVXU6l3bQb9O+cSAVuzDQ9adJArQyFBa4=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20220926035018-18f894415e5b/go.mod h1:5Afm+OQdau/HQqSOp/ALlSUp0vZsMMMbv//kJhxuoi8=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20220929065758-260b3093a347 h1:Q29Ky9ZUGhdLIygfX6jwPYeEa7Wqn8o3f1NJWb8LvvE=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20220929065758-260b3093a347/go.mod h1:5Afm+OQdau/HQqSOp/ALlSUp0vZsMMMbv//kJhxuoi8=
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20220926035018-18f894415e5b h1:TaOBmAglooq+qKdnNTK2sy11t26ud7psHFB7/AV7l5U=
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20220926035018-18f894415e5b/go.mod h1:L4GqtXLoR73obTYqUQIzfkm8NG8pvZafxFb6KZFSSHk=
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20220929065758-260b3093a347 h1:7Adjc296AKv32dg88S0T8t9K3+N+PFYLSCctpPnCUr0=
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20220929065758-260b3093a347/go.mod h1:L4GqtXLoR73obTYqUQIzfkm8NG8pvZafxFb6KZFSSHk=
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20220926035018-18f894415e5b h1:n5n5VPeYGuZCmVppKPgWR/CaINHnL+ipEp9iE1XkcQc=
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20220926035018-18f894415e5b/go.mod h1:UjNiOFYv1uGCq1ZCcONaKq4eE7MW3nbgpLqgl8f9N40=
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20220929065758-260b3093a347 h1:CfuRhTPK2CBQIZruq5ceuTVthspe8U1FDjWXXI2RWdo=
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20220929065758-260b3093a347/go.mod h1:UjNiOFYv1uGCq1ZCcONaKq4eE7MW3nbgpLqgl8f9N40=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
@ -737,6 +747,8 @@ golang.org/x/net v0.0.0-20220923203811-8be639271d50 h1:vKyz8L3zkd+xrMeIaBsQ/MNVP
golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.0.0-20220926192436-02166a98028e h1:I51lVG9ykW5AQeTE50sJ0+gJCAF0J78Hf1+1VUCGxDI=
golang.org/x/net v0.0.0-20220926192436-02166a98028e/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.0.0-20220927171203-f486391704dc h1:FxpXZdoBqT8RjqTy6i1E8nXHhW21wK7ptQ/EPIGxzPQ=
golang.org/x/net v0.0.0-20220927171203-f486391704dc/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -821,6 +833,8 @@ golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RA
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 h1:nwzwVf0l2Y/lkov/+IYgMMbFyI+QypZDds9RxlSmsFQ=
golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI=
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=

View File

@ -13,6 +13,7 @@ const (
UserTokenCacheTime = 7 * 24 * time.Hour
AdminTokenCacheKey = "answer:admin:token:"
AdminTokenCacheTime = 7 * 24 * time.Hour
AcceptLanguageFlag = "Accept-Language"
)
const (

View File

@ -5,6 +5,7 @@ import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/segmentfault/answer/internal/base/constant"
"github.com/segmentfault/answer/internal/base/reason"
"github.com/segmentfault/answer/internal/base/validator"
myErrors "github.com/segmentfault/pacman/errors"
@ -44,13 +45,15 @@ func HandleResponse(ctx *gin.Context, err error, data interface{}) {
// BindAndCheck bind request and check
func BindAndCheck(ctx *gin.Context, data interface{}) bool {
lang := GetLang(ctx)
ctx.Set(constant.AcceptLanguageFlag, lang)
if err := ctx.ShouldBind(data); err != nil {
log.Errorf("http_handle BindAndCheck fail, %s", err.Error())
HandleResponse(ctx, myErrors.New(http.StatusBadRequest, reason.RequestFormatError), nil)
return true
}
errField, err := validator.GetValidatorByLang(GetLang(ctx).Abbr()).Check(data)
errField, err := validator.GetValidatorByLang(lang.Abbr()).Check(data)
if err != nil {
HandleResponse(ctx, myErrors.New(http.StatusBadRequest, reason.RequestFormatError).WithMsg(err.Error()), errField)
return true

View File

@ -2,12 +2,13 @@ package handler
import (
"github.com/gin-gonic/gin"
"github.com/segmentfault/answer/internal/base/constant"
"github.com/segmentfault/pacman/i18n"
)
// GetLang get language from header
func GetLang(ctx *gin.Context) i18n.Language {
acceptLanguage := ctx.GetHeader("Accept-Language")
acceptLanguage := ctx.GetHeader(constant.AcceptLanguageFlag)
switch i18n.Language(acceptLanguage) {
case i18n.LanguageChinese:
return i18n.LanguageChinese

View File

@ -17,7 +17,7 @@ type PageCond struct {
}
// NewPageModel new page model
func NewPageModel(page, pageSize int, totalRecords int64, records interface{}) *PageModel {
func NewPageModel(totalRecords int64, records interface{}) *PageModel {
sliceValue := reflect.Indirect(reflect.ValueOf(records))
if sliceValue.Kind() != reflect.Slice {
panic("not a slice")

View File

@ -93,16 +93,16 @@ func (nc *NotificationController) ClearIDUnRead(ctx *gin.Context) {
handler.HandleResponse(ctx, err, gin.H{})
}
// GetList
// @Summary GetRedDot
// @Description GetRedDot
// GetList get notification list
// @Summary get notification list
// @Description get notification list
// @Tags Notification
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param page query int false "page size"
// @Param page_size query int false "page size"
// @Param type query string false "type" Enums(inbox,achievement)
// @Param type query string true "type" Enums(inbox,achievement)
// @Success 200 {object} handler.RespBody
// @Router /answer/api/v1/notification/page [get]
func (nc *NotificationController) GetList(ctx *gin.Context) {
@ -111,9 +111,6 @@ func (nc *NotificationController) GetList(ctx *gin.Context) {
return
}
req.UserID = middleware.GetLoginUserIDFromContext(ctx)
list, count, err := nc.notificationService.GetList(ctx, req)
handler.HandleResponse(ctx, err, gin.H{
"list": list,
"count": count,
})
resp, err := nc.notificationService.GetList(ctx, req)
handler.HandleResponse(ctx, err, resp)
}

View File

@ -22,16 +22,16 @@ import (
// searchRepo tag repository
type searchRepo struct {
data *data.Data
userRepo usercommon.UserRepo
userCommon *usercommon.UserCommon
uniqueIDRepo unique.UniqueIDRepo
}
// NewSearchRepo new repository
func NewSearchRepo(data *data.Data, uniqueIDRepo unique.UniqueIDRepo, userRepo usercommon.UserRepo) search_common.SearchRepo {
func NewSearchRepo(data *data.Data, uniqueIDRepo unique.UniqueIDRepo, userCommon *usercommon.UserCommon) search_common.SearchRepo {
return &searchRepo{
data: data,
uniqueIDRepo: uniqueIDRepo,
userRepo: userRepo,
userCommon: userCommon,
}
}
@ -213,9 +213,7 @@ func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, limitAc
func (sr *searchRepo) parseResult(ctx context.Context, res []map[string][]byte) (resp []schema.SearchResp, err error) {
for _, r := range res {
var (
objectKey string
uInfo *schema.UserBasicInfo
objectKey string
tags []schema.TagResp
tagsEntity []entity.Tag
object schema.SearchObject
@ -228,16 +226,12 @@ func (sr *searchRepo) parseResult(ctx context.Context, res []map[string][]byte)
tp, _ := time.ParseInLocation("2006-01-02 15:04:05", string(r["created_at"]), time.Local)
// get user info
userInfo, exist, e := sr.userRepo.GetByUserID(ctx, string(r["user_id"]))
userInfo, _, e := sr.userCommon.GetUserBasicInfoByID(ctx, string(r["user_id"]))
if e != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(e).WithStack()
return
}
if exist {
uInfo = sr.userBasicInfoFormat(ctx, userInfo)
}
// get tags
err = sr.data.DB.
Select("`display_name`,`slug_name`,`main_tag_slug_name`").
@ -258,7 +252,7 @@ func (sr *searchRepo) parseResult(ctx context.Context, res []map[string][]byte)
Title: string(r["title"]),
Excerpt: cutOutParsedText(string(r["original_text"])),
CreatedAtParsed: tp.Unix(),
UserInfo: uInfo,
UserInfo: userInfo,
Tags: tags,
VoteCount: converter.StringToInt(string(r["vote_count"])),
Accepted: string(r["accepted"]) == "2",
@ -275,8 +269,8 @@ func (sr *searchRepo) parseResult(ctx context.Context, res []map[string][]byte)
// userBasicInfoFormat
func (sr *searchRepo) userBasicInfoFormat(ctx context.Context, dbinfo *entity.User) *schema.UserBasicInfo {
return &schema.UserBasicInfo{
UserId: dbinfo.ID,
UserName: dbinfo.Username,
ID: dbinfo.ID,
Username: dbinfo.Username,
Rank: dbinfo.Rank,
DisplayName: dbinfo.DisplayName,
Avatar: dbinfo.Avatar,

View File

@ -1,95 +1,13 @@
package schema
import (
"time"
)
// RemoveAnswerReq delete answer request
type RemoveAnswerReq struct {
// answer id
ID string `validate:"required" comment:"answer id" json:"id"`
ID string `validate:"required" json:"id"`
// user id
UserID string `json:"-"`
}
// GetAnswerListReq get answer list all request
type GetAnswerListReq struct {
// question id
QuestionID int64 `validate:"omitempty" comment:"question id" form:"question_id"`
// answer user id
UserID int64 `validate:"omitempty" comment:"answer user id" form:"user_id"`
// content markdown
Content string `validate:"omitempty" comment:"content markdown" form:"content"`
// content html
Html string `validate:"omitempty" comment:"content html" form:"html"`
// answer status(available: 1; deleted: 10)
Status int `validate:"omitempty" comment:" answer status(available: 1; deleted: 10)" form:"status"`
// adopted (1 failed 2 adopted)
Adopted int `validate:"omitempty" comment:"adopted (1 failed 2 adopted)" form:"adopted"`
// comment count
CommentCount int `validate:"omitempty" comment:"comment count" form:"comment_count"`
// vote count
VoteCount int `validate:"omitempty" comment:"vote count" form:"vote_count"`
//
CreateTime time.Time `validate:"omitempty" comment:"" form:"create_time"`
//
UpdateTime time.Time `validate:"omitempty" comment:"" form:"update_time"`
}
// GetAnswerWithPageReq get answer list page request
type GetAnswerWithPageReq struct {
// page
Page int `validate:"omitempty,min=1" form:"page"`
// page size
PageSize int `validate:"omitempty,min=1" form:"page_size"`
// question id
QuestionID int64 `validate:"omitempty" comment:"question id" form:"question_id"`
// answer user id
UserID int64 `validate:"omitempty" comment:"answer user id" form:"user_id"`
// content markdown
Content string `validate:"omitempty" comment:"content markdown" form:"content"`
// content html
Html string `validate:"omitempty" comment:"content html" form:"html"`
// answer status(available: 1; deleted: 10)
Status int `validate:"omitempty" comment:" answer status(available: 1; deleted: 10)" form:"status"`
// adopted (1 failed 2 adopted)
Adopted int `validate:"omitempty" comment:"adopted (1 failed 2 adopted)" form:"adopted"`
// comment count
CommentCount int `validate:"omitempty" comment:"comment count" form:"comment_count"`
// vote count
VoteCount int `validate:"omitempty" comment:"vote count" form:"vote_count"`
//
CreateTime time.Time `validate:"omitempty" comment:"" form:"create_time"`
//
UpdateTime time.Time `validate:"omitempty" comment:"" form:"update_time"`
}
// GetAnswerResp get answer response
type GetAnswerResp struct {
// answer id
ID int64 `json:"id"`
// question id
QuestionID int64 `json:"question_id"`
// answer user id
UserID int64 `json:"user_id"`
// content markdown
Content string `json:"content"`
// content html
Html string `json:"html"`
// answer status(available: 1; deleted: 10)
Status int `json:"status"`
// adopted (1 failed 2 adopted)
Adopted int `json:"adopted"`
// comment count
CommentCount int `json:"comment_count"`
// vote count
VoteCount int `json:"vote_count"`
//
CreateTime time.Time `json:"create_time"`
//
UpdateTime time.Time `json:"update_time"`
}
const (
Answer_Adopted_Failed = 1
Answer_Adopted_Enable = 2

View File

@ -9,16 +9,16 @@ type UpdateUserStatusReq struct {
}
const (
Normal = "normal"
Suspended = "suspended"
Deleted = "deleted"
Inactive = "inactive"
UserNormal = "normal"
UserSuspended = "suspended"
UserDeleted = "deleted"
UserInactive = "inactive"
)
func (r *UpdateUserStatusReq) IsNormal() bool { return r.Status == Normal }
func (r *UpdateUserStatusReq) IsSuspended() bool { return r.Status == Suspended }
func (r *UpdateUserStatusReq) IsDeleted() bool { return r.Status == Deleted }
func (r *UpdateUserStatusReq) IsInactive() bool { return r.Status == Inactive }
func (r *UpdateUserStatusReq) IsNormal() bool { return r.Status == UserNormal }
func (r *UpdateUserStatusReq) IsSuspended() bool { return r.Status == UserSuspended }
func (r *UpdateUserStatusReq) IsDeleted() bool { return r.Status == UserDeleted }
func (r *UpdateUserStatusReq) IsInactive() bool { return r.Status == UserInactive }
// GetUserPageReq get user list page request
type GetUserPageReq struct {
@ -34,9 +34,9 @@ type GetUserPageReq struct {
Status string `validate:"omitempty,oneof=suspended deleted inactive" form:"status"`
}
func (r *GetUserPageReq) IsSuspended() bool { return r.Status == Suspended }
func (r *GetUserPageReq) IsDeleted() bool { return r.Status == Deleted }
func (r *GetUserPageReq) IsInactive() bool { return r.Status == Inactive }
func (r *GetUserPageReq) IsSuspended() bool { return r.Status == UserSuspended }
func (r *GetUserPageReq) IsDeleted() bool { return r.Status == UserDeleted }
func (r *GetUserPageReq) IsInactive() bool { return r.Status == UserInactive }
// GetUserPageResp get user response
type GetUserPageResp struct {

View File

@ -43,12 +43,6 @@ type AddCollectionGroupReq struct {
UpdateTime time.Time `validate:"required" comment:"" json:"update_time"`
}
// RemoveCollectionGroupReq delete collection group request
type RemoveCollectionGroupReq struct {
//
ID int64 `validate:"required" comment:"" json:"id"`
}
// UpdateCollectionGroupReq update collection group request
type UpdateCollectionGroupReq struct {
//
@ -65,38 +59,6 @@ type UpdateCollectionGroupReq struct {
UpdateTime time.Time `validate:"omitempty" comment:"" json:"update_time"`
}
// GetCollectionGroupListReq get collection group list all request
type GetCollectionGroupListReq struct {
//
UserID int64 `validate:"omitempty" comment:"" form:"user_id"`
// the collection group name
Name string `validate:"omitempty,gt=0,lte=50" comment:"the collection group name" form:"name"`
// mark this group is default, default 1
DefaultGroup int `validate:"omitempty" comment:"mark this group is default, default 1" form:"default_group"`
//
CreateTime time.Time `validate:"omitempty" comment:"" form:"create_time"`
//
UpdateTime time.Time `validate:"omitempty" comment:"" form:"update_time"`
}
// GetCollectionGroupWithPageReq get collection group list page request
type GetCollectionGroupWithPageReq struct {
// page
Page int `validate:"omitempty,min=1" form:"page"`
// page size
PageSize int `validate:"omitempty,min=1" form:"page_size"`
//
UserID int64 `validate:"omitempty" comment:"" form:"user_id"`
// the collection group name
Name string `validate:"omitempty,gt=0,lte=50" comment:"the collection group name" form:"name"`
// mark this group is default, default 1
DefaultGroup int `validate:"omitempty" comment:"mark this group is default, default 1" form:"default_group"`
//
CreateTime time.Time `validate:"omitempty" comment:"" form:"create_time"`
//
UpdateTime time.Time `validate:"omitempty" comment:"" form:"update_time"`
}
// GetCollectionGroupResp get collection group response
type GetCollectionGroupResp struct {
//

View File

@ -1,87 +0,0 @@
package schema
import "time"
// AddCollectionReq add collection request
type AddCollectionReq struct {
// user id
UserID int64 `validate:"required" comment:"user id" json:"user_id"`
// object id
ObjectID int64 `validate:"required" comment:"object id" json:"object_id"`
// user collection group id
UserCollectionGroupID int64 `validate:"required" comment:"user collection group id" json:"user_collection_group_id"`
//
CreateTime time.Time `validate:"required" comment:"" json:"create_time"`
//
UpdateTime time.Time `validate:"required" comment:"" json:"update_time"`
}
// RemoveCollectionReq delete collection request
type RemoveCollectionReq struct {
// collection id
ID int64 `validate:"required" comment:"collection id" json:"id"`
}
// UpdateCollectionReq update collection request
type UpdateCollectionReq struct {
// collection id
ID int64 `validate:"required" comment:"collection id" json:"id"`
// user id
UserID int64 `validate:"omitempty" comment:"user id" json:"user_id"`
// object id
ObjectID int64 `validate:"omitempty" comment:"object id" json:"object_id"`
// user collection group id
UserCollectionGroupID int64 `validate:"omitempty" comment:"user collection group id" json:"user_collection_group_id"`
//
CreateTime time.Time `validate:"omitempty" comment:"" json:"create_time"`
//
UpdateTime time.Time `validate:"omitempty" comment:"" json:"update_time"`
}
// GetCollectionListReq get collection list all request
type GetCollectionListReq struct {
// user id
UserID int64 `validate:"omitempty" comment:"user id" form:"user_id"`
// object id
ObjectID int64 `validate:"omitempty" comment:"object id" form:"object_id"`
// user collection group id
UserCollectionGroupID int64 `validate:"omitempty" comment:"user collection group id" form:"user_collection_group_id"`
//
CreateTime time.Time `validate:"omitempty" comment:"" form:"create_time"`
//
UpdateTime time.Time `validate:"omitempty" comment:"" form:"update_time"`
}
// GetCollectionWithPageReq get collection list page request
type GetCollectionWithPageReq struct {
// page
Page int `validate:"omitempty,min=1" form:"page"`
// page size
PageSize int `validate:"omitempty,min=1" form:"page_size"`
// user id
UserID int64 `validate:"omitempty" comment:"user id" form:"user_id"`
// object id
ObjectID int64 `validate:"omitempty" comment:"object id" form:"object_id"`
// user collection group id
UserCollectionGroupID int64 `validate:"omitempty" comment:"user collection group id" form:"user_collection_group_id"`
//
CreateTime time.Time `validate:"omitempty" comment:"" form:"create_time"`
//
UpdateTime time.Time `validate:"omitempty" comment:"" form:"update_time"`
}
// GetCollectionResp get collection response
type GetCollectionResp struct {
// collection id
ID int64 `json:"id"`
// user id
UserID int64 `json:"user_id"`
// object id
ObjectID int64 `json:"object_id"`
// user collection group id
UserCollectionGroupID int64 `json:"user_collection_group_id"`
//
CreateTime time.Time `json:"create_time"`
//
UpdateTime time.Time `json:"update_time"`
}

View File

@ -109,6 +109,8 @@ type GetCommentResp struct {
UserDisplayName string `json:"user_display_name"`
// user avatar
UserAvatar string `json:"user_avatar"`
// user status
UserStatus string `json:"user_status"`
// reply user id
ReplyUserID string `json:"reply_user_id"`
@ -118,6 +120,8 @@ type GetCommentResp struct {
ReplyUserDisplayName string `json:"reply_user_display_name"`
// reply comment id
ReplyCommentID string `json:"reply_comment_id"`
// reply user status
ReplyUserStatus string `json:"reply_user_status"`
// MemberActions
MemberActions []*PermissionMemberAction `json:"member_actions"`

View File

@ -166,7 +166,7 @@ type CmsQuestionSearch struct {
Page int `json:"page" form:"page"` //Query number of pages
PageSize int `json:"page_size" form:"page_size"` //Search page size
Status int `json:"-" form:"-"`
StatusStr string `json:"status" form:"status"` //Status 1 Available 2 closed 10 Deleted
StatusStr string `json:"status" form:"status"` //Status 1 Available 2 closed 10 UserDeleted
}
type AdminSetQuestionStatusRequest struct {

View File

@ -166,7 +166,7 @@ const (
var UserStatusShow = map[int]string{
1: "normal",
9: "forbidden",
10: "delete",
10: "deleted",
}
var UserStatusShowMsg = map[int]string{
1: "",
@ -282,15 +282,15 @@ type ActionRecordResp struct {
}
type UserBasicInfo struct {
UserId string `json:"-" ` // user_id
UserName string `json:"username" ` // name
ID string `json:"-" ` // user_id
Username string `json:"username" ` // name
Rank int `json:"rank" ` // rank
DisplayName string `json:"display_name"` // display_name
Avatar string `json:"avatar" ` // avatar
Website string `json:"website" ` // website
Location string `json:"location" ` // location
IpInfo string `json:"ip_info"` // ip info
Status int `json:"status"` // status
Status string `json:"status"` // status
}
type GetOtherUserInfoByUsernameReq struct {

View File

@ -32,7 +32,7 @@ type CommentRepo interface {
type CommentService struct {
commentRepo CommentRepo
commentCommonRepo comment_common.CommentCommonRepo
userRepo usercommon.UserRepo
userCommon *usercommon.UserCommon
voteCommon activity_common.VoteRepo
objectInfoService *object_info.ObjService
}
@ -61,13 +61,13 @@ func (c *CommentQuery) GetOrderBy() string {
func NewCommentService(
commentRepo CommentRepo,
commentCommonRepo comment_common.CommentCommonRepo,
userRepo usercommon.UserRepo,
userCommon *usercommon.UserCommon,
objectInfoService *object_info.ObjService,
voteCommon activity_common.VoteRepo) *CommentService {
return &CommentService{
commentRepo: commentRepo,
commentCommonRepo: commentCommonRepo,
userRepo: userRepo,
userCommon: userCommon,
voteCommon: voteCommon,
objectInfoService: objectInfoService,
}
@ -124,19 +124,20 @@ func (cs *CommentService) AddComment(ctx context.Context, req *schema.AddComment
// get reply user info
if len(resp.ReplyUserID) > 0 {
replyUser, exist, err := cs.userRepo.GetByUserID(ctx, resp.ReplyUserID)
replyUser, exist, err := cs.userCommon.GetUserBasicInfoByID(ctx, resp.ReplyUserID)
if err != nil {
return nil, err
}
if exist {
resp.ReplyUsername = replyUser.Username
resp.ReplyUserDisplayName = replyUser.DisplayName
resp.ReplyUserStatus = replyUser.Status
}
cs.notificationCommentReply(ctx, replyUser.ID, objInfo.QuestionID, req.UserID)
}
// get user info
userInfo, exist, err := cs.userRepo.GetByUserID(ctx, resp.UserID)
userInfo, exist, err := cs.userCommon.GetUserBasicInfoByID(ctx, resp.UserID)
if err != nil {
return nil, err
}
@ -144,6 +145,7 @@ func (cs *CommentService) AddComment(ctx context.Context, req *schema.AddComment
resp.Username = userInfo.Username
resp.UserDisplayName = userInfo.DisplayName
resp.UserAvatar = userInfo.Avatar
resp.UserStatus = userInfo.Status
}
return resp, nil
}
@ -191,7 +193,7 @@ func (cs *CommentService) GetComment(ctx context.Context, req *schema.GetComment
// get comment user info
if len(resp.UserID) > 0 {
commentUser, exist, err := cs.userRepo.GetByUserID(ctx, resp.UserID)
commentUser, exist, err := cs.userCommon.GetUserBasicInfoByID(ctx, resp.UserID)
if err != nil {
return nil, err
}
@ -199,18 +201,20 @@ func (cs *CommentService) GetComment(ctx context.Context, req *schema.GetComment
resp.Username = commentUser.Username
resp.UserDisplayName = commentUser.DisplayName
resp.UserAvatar = commentUser.Avatar
resp.UserStatus = commentUser.Status
}
}
// get reply user info
if len(resp.ReplyUserID) > 0 {
replyUser, exist, err := cs.userRepo.GetByUserID(ctx, resp.ReplyUserID)
replyUser, exist, err := cs.userCommon.GetUserBasicInfoByID(ctx, resp.ReplyUserID)
if err != nil {
return nil, err
}
if exist {
resp.ReplyUsername = replyUser.Username
resp.ReplyUserDisplayName = replyUser.DisplayName
resp.ReplyUserStatus = replyUser.Status
}
}
@ -249,7 +253,7 @@ func (cs *CommentService) GetCommentWithPage(ctx context.Context, req *schema.Ge
// get comment user info
if len(commentResp.UserID) > 0 {
commentUser, exist, err := cs.userRepo.GetByUserID(ctx, commentResp.UserID)
commentUser, exist, err := cs.userCommon.GetUserBasicInfoByID(ctx, commentResp.UserID)
if err != nil {
return nil, err
}
@ -257,18 +261,20 @@ func (cs *CommentService) GetCommentWithPage(ctx context.Context, req *schema.Ge
commentResp.Username = commentUser.Username
commentResp.UserDisplayName = commentUser.DisplayName
commentResp.UserAvatar = commentUser.Avatar
commentResp.UserStatus = commentUser.Status
}
}
// get reply user info
if len(commentResp.ReplyUserID) > 0 {
replyUser, exist, err := cs.userRepo.GetByUserID(ctx, commentResp.ReplyUserID)
replyUser, exist, err := cs.userCommon.GetUserBasicInfoByID(ctx, commentResp.ReplyUserID)
if err != nil {
return nil, err
}
if exist {
commentResp.ReplyUsername = replyUser.Username
commentResp.ReplyUserDisplayName = replyUser.DisplayName
commentResp.ReplyUserStatus = replyUser.Status
}
}
@ -278,7 +284,7 @@ func (cs *CommentService) GetCommentWithPage(ctx context.Context, req *schema.Ge
commentResp.MemberActions = permission.GetCommentPermission(req.UserID, commentResp.UserID)
resp = append(resp, commentResp)
}
return pager.NewPageModel(req.Page, req.PageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}
func (cs *CommentService) checkCommentWhetherOwner(ctx context.Context, userID, commentID string) error {
@ -305,7 +311,7 @@ func (cs *CommentService) checkIsVote(ctx context.Context, userID, commentID str
func (cs *CommentService) GetCommentPersonalWithPage(ctx context.Context, req *schema.GetCommentPersonalWithPageReq) (
pageModel *pager.PageModel, err error) {
if len(req.Username) > 0 {
userInfo, exist, err := cs.userRepo.GetByUsername(ctx, req.Username)
userInfo, exist, err := cs.userCommon.GetUserBasicInfoByUserName(ctx, req.Username)
if err != nil {
return nil, err
}
@ -348,7 +354,7 @@ func (cs *CommentService) GetCommentPersonalWithPage(ctx context.Context, req *s
}
resp = append(resp, commentResp)
}
return pager.NewPageModel(req.Page, req.PageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}
func (cs *CommentService) notificationQuestionComment(ctx context.Context, questionUserID, commentID, commentUserID string) {
@ -389,7 +395,7 @@ func (cs *CommentService) notificationCommentReply(ctx context.Context, replyUse
func (cs *CommentService) notificationMention(ctx context.Context, mentionUsernameList []string, commentID, commentUserID string) {
for _, username := range mentionUsernameList {
userInfo, exist, err := cs.userRepo.GetByUsername(ctx, username)
userInfo, exist, err := cs.userCommon.GetUserBasicInfoByUserName(ctx, username)
if err != nil {
log.Error(err)
continue

View File

@ -97,5 +97,5 @@ func (ns *NotificationReadService) GetNotificationReadWithPage(ctx context.Conte
resp := &[]schema.GetNotificationReadResp{}
_ = copier.Copy(resp, notificationReads)
return pager.NewPageModel(page, pageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}

View File

@ -5,9 +5,13 @@ import (
"encoding/json"
"fmt"
"github.com/segmentfault/answer/internal/base/constant"
"github.com/segmentfault/answer/internal/base/data"
"github.com/segmentfault/answer/internal/base/pager"
"github.com/segmentfault/answer/internal/base/translator"
"github.com/segmentfault/answer/internal/schema"
notficationcommon "github.com/segmentfault/answer/internal/service/notification_common"
"github.com/segmentfault/pacman/i18n"
"github.com/segmentfault/pacman/log"
)
@ -91,30 +95,33 @@ func (ns *NotificationService) ClearIDUnRead(ctx context.Context, userID string,
return nil
}
func (ns *NotificationService) GetList(ctx context.Context, search *schema.NotificationSearch) ([]*schema.NotificationContent, int64, error) {
list := make([]*schema.NotificationContent, 0)
func (ns *NotificationService) GetList(ctx context.Context, search *schema.NotificationSearch) (
pageModel *pager.PageModel, err error) {
resp := make([]*schema.NotificationContent, 0)
searchType, ok := schema.NotificationType[search.TypeStr]
if !ok {
return list, 0, nil
return pager.NewPageModel(0, resp), nil
}
search.Type = searchType
dblist, count, err := ns.notificationRepo.SearchList(ctx, search)
notifications, count, err := ns.notificationRepo.SearchList(ctx, search)
if err != nil {
return list, count, err
return nil, err
}
for _, dbitem := range dblist {
for _, notificationInfo := range notifications {
item := &schema.NotificationContent{}
err := json.Unmarshal([]byte(dbitem.Content), item)
err := json.Unmarshal([]byte(notificationInfo.Content), item)
if err != nil {
log.Error("NotificationContent Unmarshal Error", err.Error())
continue
}
item.ID = dbitem.ID
item.UpdateTime = dbitem.UpdatedAt.Unix()
if dbitem.IsRead == schema.NotificationRead {
lang, _ := ctx.Value(constant.AcceptLanguageFlag).(i18n.Language)
item.NotificationAction = translator.GlobalTrans.Tr(lang, item.NotificationAction)
item.ID = notificationInfo.ID
item.UpdateTime = notificationInfo.UpdatedAt.Unix()
if notificationInfo.IsRead == schema.NotificationRead {
item.IsRead = true
}
list = append(list, item)
resp = append(resp, item)
}
return list, count, nil
return pager.NewPageModel(count, resp), nil
}

View File

@ -265,7 +265,7 @@ func (qs *QuestionService) SearchUserList(ctx context.Context, userName, order s
search.Order = order
search.Page = page
search.PageSize = pageSize
search.UserID = userinfo.UserId
search.UserID = userinfo.ID
questionlist, count, err := qs.SearchList(ctx, search, loginUserID)
if err != nil {
return userlist, 0, err
@ -289,7 +289,7 @@ func (qs *QuestionService) SearchUserAnswerList(ctx context.Context, userName, o
return userAnswerlist, 0, nil
}
answersearch := &entity.AnswerSearch{}
answersearch.UserID = userinfo.UserId
answersearch.UserID = userinfo.ID
answersearch.PageSize = pageSize
answersearch.Page = page
if order == "newest" {
@ -337,7 +337,7 @@ func (qs *QuestionService) SearchUserCollectionList(ctx context.Context, page, p
return list, 0, nil
}
collectionSearch := &entity.CollectionSearch{}
collectionSearch.UserID = userinfo.UserId
collectionSearch.UserID = userinfo.ID
collectionSearch.Page = page
collectionSearch.PageSize = pageSize
collectionlist, count, err := qs.collectionCommon.SearchList(ctx, collectionSearch)
@ -384,13 +384,13 @@ func (qs *QuestionService) SearchUserTopList(ctx context.Context, userName strin
search.Order = "score"
search.Page = 0
search.PageSize = 5
search.UserID = userinfo.UserId
search.UserID = userinfo.ID
questionlist, _, err := qs.SearchList(ctx, search, loginUserID)
if err != nil {
return userQuestionlist, userAnswerlist, err
}
answersearch := &entity.AnswerSearch{}
answersearch.UserID = userinfo.UserId
answersearch.UserID = userinfo.ID
answersearch.PageSize = 5
answersearch.Order = entity.Answer_Search_OrderBy_Vote
questionIDs := make([]string, 0)
@ -494,7 +494,7 @@ func (qs *QuestionService) SearchList(ctx context.Context, req *schema.QuestionS
if !exist {
return list, 0, err
}
req.UserID = userinfo.UserId
req.UserID = userinfo.ID
}
questionList, count, err := qs.questionRepo.SearchList(ctx, req)
if err != nil {

View File

@ -47,7 +47,7 @@ type UserRankRepo interface {
// RankService rank service
type RankService struct {
userRepo usercommon.UserRepo
userCommon *usercommon.UserCommon
configRepo config.ConfigRepo
userRankRepo UserRankRepo
objectInfoService *object_info.ObjService
@ -55,12 +55,12 @@ type RankService struct {
// NewRankService new rank service
func NewRankService(
userRepo usercommon.UserRepo,
userCommon *usercommon.UserCommon,
userRankRepo UserRankRepo,
objectInfoService *object_info.ObjService,
configRepo config.ConfigRepo) *RankService {
return &RankService{
userRepo: userRepo,
userCommon: userCommon,
configRepo: configRepo,
userRankRepo: userRankRepo,
objectInfoService: objectInfoService,
@ -74,7 +74,7 @@ func (rs *RankService) CheckRankPermission(ctx context.Context, userID string, a
}
// get the rank of the current user
userInfo, exist, err := rs.userRepo.GetByUserID(ctx, userID)
userInfo, exist, err := rs.userCommon.GetUserBasicInfoByID(ctx, userID)
if err != nil {
return false, err
}
@ -101,7 +101,7 @@ func (rs *RankService) CheckRankPermission(ctx context.Context, userID string, a
func (rs *RankService) GetRankPersonalWithPage(ctx context.Context, req *schema.GetRankPersonalWithPageReq) (
pageModel *pager.PageModel, err error) {
if len(req.Username) > 0 {
userInfo, exist, err := rs.userRepo.GetByUsername(ctx, req.Username)
userInfo, exist, err := rs.userCommon.GetUserBasicInfoByUserName(ctx, req.Username)
if err != nil {
return nil, err
}
@ -140,5 +140,5 @@ func (rs *RankService) GetRankPersonalWithPage(ctx context.Context, req *schema.
}
resp = append(resp, commentResp)
}
return pager.NewPageModel(req.Page, req.PageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}

View File

@ -2,9 +2,10 @@ package report_backyard
import (
"context"
"github.com/segmentfault/answer/internal/service/config"
"strings"
"github.com/segmentfault/answer/internal/service/config"
"github.com/jinzhu/copier"
"github.com/segmentfault/answer/internal/base/pager"
"github.com/segmentfault/answer/internal/base/reason"
@ -93,7 +94,7 @@ func (rs *ReportBackyardService) ListReportPage(ctx context.Context, dto schema.
}
rs.parseObject(ctx, &resp)
return pager.NewPageModel(dto.Page, dto.PageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}
// HandleReported handle the reported object

View File

@ -18,19 +18,19 @@ import (
// RevisionService user service
type RevisionService struct {
revisionRepo revision.RevisionRepo
userRepo usercommon.UserRepo
userCommon *usercommon.UserCommon
questionCommon *questioncommon.QuestionCommon
answerService *AnswerService
}
func NewRevisionService(
revisionRepo revision.RevisionRepo,
userRepo usercommon.UserRepo,
userCommon *usercommon.UserCommon,
questionCommon *questioncommon.QuestionCommon,
answerService *AnswerService) *RevisionService {
return &RevisionService{
revisionRepo: revisionRepo,
userRepo: userRepo,
userCommon: userCommon,
questionCommon: questionCommon,
answerService: answerService,
}
@ -69,7 +69,6 @@ func (rs *RevisionService) GetRevisionList(ctx context.Context, req *schema.GetR
)
resp = []schema.GetRevisionResp{}
_ = copier.Copy(&rev, req)
revs, err = rs.revisionRepo.GetRevisionList(ctx, &rev)
@ -79,29 +78,24 @@ func (rs *RevisionService) GetRevisionList(ctx context.Context, req *schema.GetR
for _, r := range revs {
var (
userInfo *entity.User
uinfo schema.UserBasicInfo
item schema.GetRevisionResp
exists bool
uinfo schema.UserBasicInfo
item schema.GetRevisionResp
)
_ = copier.Copy(&item, r)
rs.parseItem(ctx, &item)
// get user info
userInfo, exists, err = rs.userRepo.GetByUserID(ctx, item.UserID)
if err != nil {
return
userInfo, exists, e := rs.userCommon.GetUserBasicInfoByID(ctx, item.UserID)
if e != nil {
return nil, e
}
if exists {
err = copier.Copy(&uinfo, userInfo)
item.UserInfo = uinfo
}
resp = append(resp, item)
}
return
}

View File

@ -5,25 +5,24 @@ import (
"regexp"
"strings"
"github.com/segmentfault/answer/internal/entity"
"github.com/segmentfault/answer/internal/schema"
"github.com/segmentfault/answer/internal/service/search_common"
usercommon "github.com/segmentfault/answer/internal/service/user_common"
)
type AuthorSearch struct {
repo search_common.SearchRepo
userRepo usercommon.UserRepo
exp string
w string
page int
size int
repo search_common.SearchRepo
userCommon *usercommon.UserCommon
exp string
w string
page int
size int
}
func NewAuthorSearch(repo search_common.SearchRepo, userRepo usercommon.UserRepo) *AuthorSearch {
func NewAuthorSearch(repo search_common.SearchRepo, userCommon *usercommon.UserCommon) *AuthorSearch {
return &AuthorSearch{
repo: repo,
userRepo: userRepo,
repo: repo,
userCommon: userCommon,
}
}
@ -37,9 +36,6 @@ func (s *AuthorSearch) Parse(dto *schema.SearchDTO) (ok bool) {
p,
me,
name string
user *entity.User
has bool
err error
)
exp = ""
q = dto.Query
@ -51,8 +47,7 @@ func (s *AuthorSearch) Parse(dto *schema.SearchDTO) (ok bool) {
res := re.FindStringSubmatch(q)
if len(res) == 2 {
name = res[1]
user, has, err = s.userRepo.GetByUsername(nil, name)
user, has, err := s.userCommon.GetUserBasicInfoByUserName(nil, name)
if err == nil && has {
exp = user.ID
trimLen := len(res[0])

View File

@ -35,14 +35,14 @@ type SearchService struct {
func NewSearchService(
searchRepo search_common.SearchRepo,
tagRepo tagcommon.TagRepo,
userRepo usercommon.UserRepo,
userCommon *usercommon.UserCommon,
followCommon activity_common.FollowRepo,
) *SearchService {
return &SearchService{
searchRepo: searchRepo,
tagSearch: search.NewTagSearch(searchRepo, tagRepo, followCommon),
withinSearch: search.NewWithinSearch(searchRepo),
authorSearch: search.NewAuthorSearch(searchRepo, userRepo),
authorSearch: search.NewAuthorSearch(searchRepo, userCommon),
scoreSearch: search.NewScoreSearch(searchRepo),
answersSearch: search.NewAnswersSearch(searchRepo),
acceptedAnswerSearch: search.NewAcceptedAnswerSearch(searchRepo),

View File

@ -358,7 +358,7 @@ func (ts *TagService) GetTagWithPage(ctx context.Context, req *schema.GetTagWith
UpdatedAt: tag.UpdatedAt.Unix(),
})
}
return pager.NewPageModel(page, pageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}
// checkTagIsFollow get tag list page

View File

@ -108,17 +108,17 @@ func (us *UserBackyardService) GetUserPage(ctx context.Context, req *schema.GetU
Avatar: u.Avatar,
}
if u.Status == entity.UserStatusDeleted {
t.Status = schema.Deleted
t.Status = schema.UserDeleted
t.DeletedAt = u.DeletedAt.Unix()
} else if u.Status == entity.UserStatusSuspended {
t.Status = schema.Suspended
t.Status = schema.UserSuspended
t.SuspendedAt = u.SuspendedAt.Unix()
} else if u.MailStatus == entity.EmailStatusToBeVerified {
t.Status = schema.Inactive
t.Status = schema.UserInactive
} else {
t.Status = schema.Normal
t.Status = schema.UserNormal
}
resp = append(resp, t)
}
return pager.NewPageModel(req.Page, req.PageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}

View File

@ -35,12 +35,12 @@ func NewUserCommon(userRepo UserRepo) *UserCommon {
}
func (us *UserCommon) GetUserBasicInfoByID(ctx context.Context, ID string) (*schema.UserBasicInfo, bool, error) {
dbInfo, has, err := us.userRepo.GetByUserID(ctx, ID)
userInfo, exist, err := us.userRepo.GetByUserID(ctx, ID)
if err != nil {
return nil, has, err
return nil, exist, err
}
info := us.UserBasicInfoFormat(ctx, dbInfo)
return info, has, nil
info := us.UserBasicInfoFormat(ctx, userInfo)
return info, exist, nil
}
func (us *UserCommon) GetUserBasicInfoByUserName(ctx context.Context, username string) (*schema.UserBasicInfo, bool, error) {
@ -74,16 +74,20 @@ func (us *UserCommon) BatchUserBasicInfoByID(ctx context.Context, IDs []string)
}
// UserBasicInfoFormat
func (us *UserCommon) UserBasicInfoFormat(ctx context.Context, dbinfo *entity.User) *schema.UserBasicInfo {
info := new(schema.UserBasicInfo)
info.UserId = dbinfo.ID
info.UserName = dbinfo.Username
info.Rank = dbinfo.Rank
info.DisplayName = dbinfo.DisplayName
info.Avatar = dbinfo.Avatar
info.Website = dbinfo.Website
info.Location = dbinfo.Location
info.IpInfo = dbinfo.IPInfo
info.Status = dbinfo.Status
return info
func (us *UserCommon) UserBasicInfoFormat(ctx context.Context, userInfo *entity.User) *schema.UserBasicInfo {
userBasicInfo := &schema.UserBasicInfo{}
userBasicInfo.ID = userInfo.ID
userBasicInfo.Username = userInfo.Username
userBasicInfo.Rank = userInfo.Rank
userBasicInfo.DisplayName = userInfo.DisplayName
userBasicInfo.Avatar = userInfo.Avatar
userBasicInfo.Website = userInfo.Website
userBasicInfo.Location = userInfo.Location
userBasicInfo.IpInfo = userInfo.IPInfo
userBasicInfo.Status = schema.UserStatusShow[userInfo.Status]
if userBasicInfo.Status == schema.UserDeleted {
userBasicInfo.Avatar = ""
userBasicInfo.DisplayName = "Anonymous"
}
return userBasicInfo
}

View File

@ -97,5 +97,5 @@ func (us *UserGroupService) GetUserGroupWithPage(ctx context.Context, req *schem
resp := &[]schema.GetUserGroupResp{}
_ = copier.Copy(resp, userGroups)
return pager.NewPageModel(page, pageSize, total, resp), nil
return pager.NewPageModel(total, resp), nil
}

View File

@ -193,5 +193,5 @@ func (vs *VoteService) ListUserVotes(ctx context.Context, req schema.GetVoteWith
resp = append(resp, item)
}
return pager.NewPageModel(req.Page, req.PageSize, total, resp), err
return pager.NewPageModel(total, resp), err
}

View File

@ -1,75 +0,0 @@
package captcha
import (
"fmt"
"image/color"
"sync"
"github.com/mojocn/base64Captcha"
)
var store base64Captcha.Store
var once sync.Once
func NewCaptcha() {
once.Do(func() {
//var err error
//RedisDb, err = arch.App.Cache.GetQuestion("cache")
//if err != nil {
// store = base64Captcha.DefaultMemStore
// return
//}
//var ctx = context.Background()
//_, err = RedisDb.Ping(ctx).Result()
//
//if err != nil {
// store = base64Captcha.DefaultMemStore
// return
//}
store = RedisStore{}
})
}
// CaptchaClient
type CaptchaClient struct {
}
// NewCaptchaClient
func NewCaptchaClient() *CaptchaClient {
return &CaptchaClient{}
}
func MakeCaptcha() (id, b64s string, err error) {
var driver base64Captcha.Driver
//Configure the parameters of the CAPTCHA
driverString := base64Captcha.DriverString{
Height: 40,
Width: 100,
NoiseCount: 0,
ShowLineOptions: 2 | 4,
Length: 4,
Source: "1234567890qwertyuioplkjhgfdsazxcvbnm",
BgColor: &color.RGBA{R: 3, G: 102, B: 214, A: 125},
Fonts: []string{"wqy-microhei.ttc"},
}
//ConvertFonts Load fonts by name
driver = driverString.ConvertFonts()
//Create Captcha
captcha := base64Captcha.NewCaptcha(driver, store)
//Generate
id, b64s, err = captcha.Generate()
return id, b64s, err
}
// VerifyCaptcha Verification code
func VerifyCaptcha(id string, VerifyValue string) bool {
fmt.Println(id, VerifyValue)
if store.Verify(id, VerifyValue, true) {
//verify successfully
return true
} else {
//Verification failed
return false
}
}

View File

@ -1,46 +0,0 @@
package captcha
import (
"context"
"fmt"
"github.com/segmentfault/pacman/contrib/cache/memory"
)
const CAPTCHA = "captcha:"
var RedisDb = memory.NewCache()
type RedisStore struct {
}
func (r RedisStore) Set(id string, value string) error {
key := CAPTCHA + id
ctx := context.Background()
err := RedisDb.SetString(ctx, key, value, 2)
return err
}
func (r RedisStore) Get(id string, clear bool) string {
key := CAPTCHA + id
ctx := context.Background()
val, err := RedisDb.GetString(ctx, key)
if err != nil {
fmt.Println(err)
return ""
}
if clear {
err := RedisDb.Del(ctx, key)
if err != nil {
fmt.Println(err)
return ""
}
}
return val
}
func (r RedisStore) Verify(id, answer string, clear bool) bool {
v := RedisStore{}.Get(id, clear)
fmt.Println("key:" + id + ";value:" + v + ";answer:" + answer)
return v == answer
}

View File

@ -1,103 +0,0 @@
package email
import (
"bytes"
"fmt"
"net/smtp"
"text/template"
"github.com/jordan-wright/email"
"github.com/segmentfault/pacman/log"
)
// EmailClient
type EmailClient struct {
email *email.Email
config *Config
}
// Config .
type Config struct {
WebName string `json:"web_name"`
WebHost string `json:"web_host"`
SecretKey string `json:"secret_key"`
UserSessionKey string `json:"user_session_key"`
EmailFrom string `json:"email_from"`
EmailFromPass string `json:"email_from_pass"`
EmailFromHostname string `json:"email_from_hostname"`
EmailFromSMTP string `json:"email_from_smtp"`
EmailFromName string `json:"email_from_name"`
RegisterTitle string `json:"register_title"`
RegisterBody string `json:"register_body"`
PassResetTitle string `json:"pass_reset_title"`
PassResetBody string `json:"pass_reset_body"`
}
// NewEmailClient
func NewEmailClient() *EmailClient {
return &EmailClient{
email: email.NewEmail(),
}
}
func (s *EmailClient) Send(ToEmail, Title, Body string) {
from := s.config.EmailFrom
fromPass := s.config.EmailFromPass
fromName := s.config.EmailFromName
fromSmtp := s.config.EmailFromSMTP
fromHostName := s.config.EmailFromHostname
s.email.From = fmt.Sprintf("%s <%s>", fromName, from)
s.email.To = []string{ToEmail}
s.email.Subject = Title
s.email.HTML = []byte(Body)
err := s.email.Send(fromSmtp, smtp.PlainAuth("", from, fromPass, fromHostName))
if err != nil {
log.Error(err)
}
}
func (s *EmailClient) RegisterTemplate(RegisterUrl string) (Title, Body string, err error) {
webName := s.config.WebName
templateData := RegisterTemplateData{webName, RegisterUrl}
tmpl, err := template.New("register_title").Parse(s.config.RegisterTitle)
if err != nil {
return "", "", err
}
title := new(bytes.Buffer)
body := new(bytes.Buffer)
err = tmpl.Execute(title, templateData)
if err != nil {
return "", "", err
}
tmpl, err = template.New("register_body").Parse(s.config.RegisterBody)
err = tmpl.Execute(body, templateData)
if err != nil {
return "", "", err
}
return title.String(), body.String(), nil
}
func (s *EmailClient) PassResetTemplate(PassResetUrl string) (Title, Body string, err error) {
webName := s.config.WebName
templateData := PassResetTemplateData{webName, PassResetUrl}
tmpl, err := template.New("pass_reset_title").Parse(s.config.PassResetTitle)
if err != nil {
return "", "", err
}
title := new(bytes.Buffer)
body := new(bytes.Buffer)
err = tmpl.Execute(title, templateData)
if err != nil {
return "", "", err
}
tmpl, err = template.New("pass_reset_body").Parse(s.config.PassResetBody)
err = tmpl.Execute(body, templateData)
if err != nil {
return "", "", err
}
return title.String(), body.String(), nil
}

View File

@ -1,11 +0,0 @@
package email
type RegisterTemplateData struct {
SiteName string
RegisterUrl string
}
type PassResetTemplateData struct {
SiteName string
PassResetUrl string
}