166 lines
5.0 KiB
Go
166 lines
5.0 KiB
Go
package srv_actress
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/common/slugx"
|
|
"videoweb/pub/common/srvdef"
|
|
"videoweb/pub/common/utils"
|
|
"videoweb/pub/models/actress"
|
|
"videoweb/pub/mongos"
|
|
"videoweb/pub/pubdef"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
func ActressList(ctx context.Context, req *ActressListReq) (*ActressListResp, *srvdef.SrvErr) {
|
|
filter := bson.M{}
|
|
if req.Id != nil && *req.Id > 0 {
|
|
filter[actress.FN.Actress.Id] = *req.Id
|
|
}
|
|
if req.TranslationCategoryId != nil && *req.TranslationCategoryId > 0 {
|
|
filter[actress.FN.Actress.TranslationCategoryId] = *req.TranslationCategoryId
|
|
}
|
|
if req.Region != nil && len(*req.Region) > 0 {
|
|
filter[actress.FN.Actress.Region] = bson.M{"$regex": *req.Region}
|
|
}
|
|
if req.Status != nil {
|
|
filter[actress.FN.Actress.Status] = *req.Status
|
|
}
|
|
if req.Alias != nil && *req.Alias != "" {
|
|
filter[actress.FN.Actress.Alias] = bson.M{"$regex": *req.Alias}
|
|
}
|
|
count, err := actress.CountActresss(ctx, filter)
|
|
if err != nil {
|
|
log.Warn("ActressList CountActresss", log.Any("filter", filter), log.E(err))
|
|
return nil, err
|
|
}
|
|
resp := &ActressListResp{
|
|
Total: 0,
|
|
List: make([]*actress.Actress, 0),
|
|
}
|
|
if count == 0 {
|
|
return resp, nil
|
|
}
|
|
opts := &options.FindOptions{}
|
|
opts.SetLimit(req.PageSize)
|
|
opts.SetSkip((req.PageNum - 1) * req.PageSize)
|
|
sort := bson.M{actress.FN.Actress.CreatedAt: -1}
|
|
switch req.SortType {
|
|
case 1:
|
|
sort = bson.M{actress.FN.Actress.Score: -1}
|
|
case 2:
|
|
sort = bson.M{actress.FN.Actress.Rank: -1}
|
|
case 3:
|
|
sort = bson.M{actress.FN.Actress.Works: -1}
|
|
case 4:
|
|
sort = bson.M{actress.FN.Actress.Real.WatchTimes: -1}
|
|
case 5:
|
|
sort = bson.M{actress.FN.Actress.HotValue: -1, actress.FN.Actress.Id: -1}
|
|
}
|
|
opts.SetSort(sort)
|
|
list, err := actress.FindManyActresss(ctx, filter, opts)
|
|
if err != nil {
|
|
log.Warn("ActressList FindManyActresss", log.Any("filter", filter), log.E(err))
|
|
return nil, err
|
|
}
|
|
resp.Total = count
|
|
resp.List = list
|
|
return resp, nil
|
|
}
|
|
|
|
func UpdateActress(ctx context.Context, req *ActressUpdateReq) *srvdef.SrvErr {
|
|
current, err := actress.FindOneActress(ctx, bson.M{actress.FN.Actress.Id: req.Id})
|
|
if err != nil {
|
|
log.Warn("UpdateActress", log.Any("id", req.Id), log.E(err))
|
|
return err
|
|
}
|
|
alias := current.Alias
|
|
if req.Param.Alias != nil {
|
|
alias = *req.Param.Alias
|
|
}
|
|
keywords := current.SeoInfo.Keyworld
|
|
if req.Param.SeoInfo != nil {
|
|
keywords = req.Param.SeoInfo.Keyworld
|
|
}
|
|
exists := func(s string) bool {
|
|
doc, _ := actress.FindOneActress(ctx, slugx.Filter(actress.FN.Actress.Slug, actress.FN.Actress.Id, s, req.Id))
|
|
return doc != nil
|
|
}
|
|
slug, changed, serr := slugx.PrepareOnUpdate(current.Slug, req.Param.Slug,
|
|
utils.SlugSourceFromKeywordsOrTitle(keywords, alias), exists)
|
|
if serr != nil {
|
|
return serr
|
|
}
|
|
if changed {
|
|
req.Param.Slug = &slug
|
|
} else {
|
|
req.Param.Slug = nil
|
|
}
|
|
now := time.Now()
|
|
req.Param.UpdatedAt = &now
|
|
return actress.UpdateOneActress(ctx, bson.M{actress.FN.Actress.Id: req.Id}, bson.M{"$set": req.Param})
|
|
}
|
|
|
|
func AddActress(ctx context.Context, req *ActressAddReq) *srvdef.SrvErr {
|
|
if len(req.Alias) == 0 {
|
|
return srvdef.New(srvdef.ErrParamError, "alias 不能为空", "alias 不能为空")
|
|
}
|
|
_, err := actress.FindOneActress(ctx, bson.M{
|
|
actress.FN.Actress.Alias: req.Alias,
|
|
})
|
|
if err != nil && err.Code != srvdef.ErrNoData {
|
|
log.Warn("AddActress", log.Any("req", req), log.E(err))
|
|
return err
|
|
}
|
|
if err == nil {
|
|
log.Warn("AddActress Re", log.Any("req", req))
|
|
return srvdef.New(srvdef.RepeatActress)
|
|
}
|
|
|
|
now := time.Now()
|
|
info := &actress.Actress{
|
|
Id: mongos.Lid.Actress.Get(),
|
|
Alias: req.Alias,
|
|
Slug: req.Slug,
|
|
SeoInfo: req.SeoInfo,
|
|
Avatar: req.Avatar,
|
|
Cover: req.Cover,
|
|
Desc: req.Desc,
|
|
TranslationCategoryId: req.TranslationCategoryId,
|
|
Meas: req.Meas,
|
|
Office: req.Office,
|
|
DebutDate: req.DebutDate,
|
|
BornDate: req.BornDate,
|
|
Region: req.Region,
|
|
Score: req.Score,
|
|
Rank: req.Rank,
|
|
HotValue: req.HotValue,
|
|
Status: req.Status,
|
|
Works: 0,
|
|
Real: pubdef.Flow{},
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
}
|
|
exists := func(s string) bool {
|
|
doc, _ := actress.FindOneActress(ctx, slugx.Filter(actress.FN.Actress.Slug, actress.FN.Actress.Id, s, 0))
|
|
return doc != nil
|
|
}
|
|
if serr := slugx.Ensure(&info.Slug, utils.SlugSourceFromKeywordsOrTitle(info.SeoInfo.Keyworld, info.Alias), exists); serr != nil {
|
|
return serr
|
|
}
|
|
return actress.InsertOneActress(ctx, info)
|
|
}
|
|
|
|
func DeleteActress(ctx context.Context, req *ActressDelReq) *srvdef.SrvErr {
|
|
_, err := actress.FindOneActress(ctx, bson.M{actress.FN.Actress.Id: req.Id})
|
|
if err != nil {
|
|
log.Warn("DeleteActress", log.Any("id", req.Id), log.E(err))
|
|
return err
|
|
}
|
|
_, err = actress.DelOneActress(ctx, bson.M{actress.FN.Actress.Id: req.Id})
|
|
return err
|
|
}
|