164 lines
4.6 KiB
Go
164 lines
4.6 KiB
Go
package officialWebsiteser
|
||
|
||
import (
|
||
"91porn-server/models/v/officialWebsitemod"
|
||
"time"
|
||
|
||
"go.mongodb.org/mongo-driver/bson"
|
||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||
"go.mongodb.org/mongo-driver/mongo/options"
|
||
)
|
||
|
||
type NewsListReq struct {
|
||
PageNumber int64 `form:"PageNumber"`
|
||
PageSize int64 `form:"pageSize"`
|
||
}
|
||
|
||
type NewsListResp struct {
|
||
HasNext bool `json:"hasNext"`
|
||
List []*NewsResp `json:"list"`
|
||
}
|
||
|
||
type NewsResp struct {
|
||
ID string `json:"id"`
|
||
Title string `json:"title"`
|
||
SeoSlug string `json:"seoSlug"`
|
||
Description string `json:"description"`
|
||
Cover string `json:"cover"`
|
||
Url string `json:"url"`
|
||
Tags []NewsTagResp `json:"tags"`
|
||
CreatedAt time.Time `json:"createdAt,omitempty" bson:"createdAt,omitempty"`
|
||
}
|
||
|
||
type NewsTagResp struct {
|
||
ID string `json:"id,omitempty" bson:"_id,omitempty"`
|
||
Name string `json:"name,omitempty" bson:"name,omitempty"`
|
||
Type string `json:"type,omitempty" bson:"type,omitempty"`
|
||
IsHot bool `json:"isHot,omitempty" bson:"isHot,omitempty"`
|
||
}
|
||
|
||
func NewsList(req *NewsListReq) (resp *NewsListResp, err error) {
|
||
var filter = bson.M{"isActive": true}
|
||
var newsMod = &officialWebsitemod.News{}
|
||
var skip, limit = transPageAndPageNumber(req.PageSize, req.PageNumber)
|
||
data, err := newsMod.FindMany(filter, options.Find().SetSort(bson.D{{Key: "isHot", Value: -1}, {Key: "sort", Value: -1}, {Key: "createdAt", Value: -1}}).SetSkip(skip).SetLimit(limit+1))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
resp = &NewsListResp{
|
||
HasNext: len(data) > int(limit),
|
||
List: make([]*NewsResp, 0),
|
||
}
|
||
for _, v := range data {
|
||
newsResp := &NewsResp{
|
||
ID: v.ID.Hex(),
|
||
Title: v.Title,
|
||
SeoSlug: v.SeoSlug,
|
||
Description: v.Description,
|
||
Cover: v.Cover,
|
||
Url: v.Url,
|
||
CreatedAt: v.CreatedAt,
|
||
}
|
||
for _, tag := range v.Tags {
|
||
newsResp.Tags = append(newsResp.Tags, NewsTagResp{
|
||
ID: tag.ID.Hex(),
|
||
Name: tag.Name,
|
||
Type: tag.Type,
|
||
IsHot: tag.IsHot,
|
||
})
|
||
}
|
||
resp.List = append(resp.List, newsResp)
|
||
}
|
||
if resp.HasNext {
|
||
resp.List = resp.List[:len(resp.List)-1]
|
||
}
|
||
return
|
||
}
|
||
|
||
type NewsDetailReq struct {
|
||
ID string `uri:"id" binding:"required"`
|
||
RelatedPageNumber int64 `form:"RelatedPageNumber"`
|
||
RelatedPageSize int64 `form:"RelatedPageSize"`
|
||
}
|
||
|
||
type NewsDetailResp struct {
|
||
ID string `json:"id"`
|
||
Title string `json:"title"`
|
||
SeoSlug string `json:"seoSlug"`
|
||
Description string `json:"description"`
|
||
Cover string `json:"cover"`
|
||
Url string `json:"url"`
|
||
Tags []NewsTagResp `json:"tags"`
|
||
Detail string `json:"detail"`
|
||
Related []*NewsResp `json:"related"`
|
||
CreatedAt time.Time `json:"createdAt"`
|
||
}
|
||
|
||
func NewsDetail(req *NewsDetailReq) (resp NewsDetailResp, err error) {
|
||
// 兼容 id 与 seoSlug:24 位 hex 按 _id 查,否则按 seoSlug 查
|
||
var filter = bson.M{"isActive": true}
|
||
if id, e := primitive.ObjectIDFromHex(req.ID); e == nil {
|
||
filter["_id"] = id
|
||
} else {
|
||
filter["seoSlug"] = req.ID
|
||
}
|
||
var newsMod = &officialWebsitemod.News{}
|
||
err = newsMod.FindOne(filter)
|
||
if err != nil {
|
||
return
|
||
}
|
||
resp = NewsDetailResp{
|
||
ID: newsMod.ID.Hex(),
|
||
Title: newsMod.Title,
|
||
SeoSlug: newsMod.SeoSlug,
|
||
Description: newsMod.Description,
|
||
Cover: newsMod.Cover,
|
||
Url: newsMod.Url,
|
||
Detail: newsMod.Detail,
|
||
CreatedAt: newsMod.CreatedAt,
|
||
}
|
||
var tagIDs []primitive.ObjectID
|
||
for _, tag := range newsMod.Tags {
|
||
resp.Tags = append(resp.Tags, NewsTagResp{
|
||
ID: tag.ID.Hex(),
|
||
Name: tag.Name,
|
||
Type: tag.Type,
|
||
IsHot: tag.IsHot,
|
||
})
|
||
tagIDs = append(tagIDs, tag.ID)
|
||
}
|
||
|
||
if len(resp.Tags) > 0 {
|
||
// 组装 Related,根据tagIDs搜索,并按照排序
|
||
filter = bson.M{"tags._id": bson.M{"$in": tagIDs}, "isActive": true}
|
||
} else {
|
||
filter = bson.M{"isActive": true}
|
||
}
|
||
skip, limit := transPageAndPageNumber(req.RelatedPageSize, req.RelatedPageNumber)
|
||
data, err := newsMod.FindMany(filter, options.Find().SetSort(bson.D{{Key: "isHot", Value: -1}, {Key: "sort", Value: -1}, {Key: "createdAt", Value: -1}}).SetSkip(skip).SetLimit(limit))
|
||
if err != nil {
|
||
return
|
||
}
|
||
for _, v := range data {
|
||
newsResp := &NewsResp{
|
||
ID: v.ID.Hex(),
|
||
Title: v.Title,
|
||
SeoSlug: v.SeoSlug,
|
||
Description: v.Description,
|
||
Cover: v.Cover,
|
||
Url: v.Url,
|
||
CreatedAt: v.CreatedAt,
|
||
}
|
||
for _, tag := range v.Tags {
|
||
newsResp.Tags = append(newsResp.Tags, NewsTagResp{
|
||
ID: tag.ID.Hex(),
|
||
Name: tag.Name,
|
||
Type: tag.Type,
|
||
IsHot: tag.IsHot,
|
||
})
|
||
}
|
||
resp.Related = append(resp.Related, newsResp)
|
||
}
|
||
return
|
||
}
|