Files
huangguo_server/app/service/officialWebsiteser/album.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

162 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package officialWebsiteser
import (
"91porn-server/common/stderr"
"91porn-server/models/v/officialWebsitemod"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
type AlbumListReq struct {
SortType int64 `json:"sortType" form:"sortType"` // 1: 创建时间 目前仅支持一种排序方式,后续增加后再完善这个字段
PageNumber int64 `json:"pageNumber" form:"pageNumber"`
PageSize int64 `json:"pageSize" form:"pageSize"`
}
type AlbumListResp struct {
HasNext bool `json:"hasNext"`
List []*AlbumResp `json:"list"`
}
type AlbumResp struct {
ID string `json:"id"`
HeroID string `json:"heroID"`
Title string `json:"title"`
SeoSlug string `json:"seoSlug"`
Description string `json:"description"`
Cover string `json:"cover"`
IsHot bool `json:"isHot"`
Tags []string `json:"tags"`
}
func (a *AlbumResp) FromModel(album *officialWebsitemod.Album) {
if album == nil {
return
}
a.ID = album.ID.Hex()
a.HeroID = album.HeroID.Hex()
a.Title = album.Title
a.SeoSlug = album.SeoSlug
a.Description = album.Description
a.Cover = album.Cover
a.IsHot = album.IsHot
a.Tags = make([]string, 0)
for _, tag := range album.Tags {
a.Tags = append(a.Tags, tag.Name)
}
}
func AlbumList(req *AlbumListReq) (resp AlbumListResp, err error) {
var sort = bson.D{}
switch req.SortType { // 目前仅支持一种排序方式,后续增加后再完善这个字段
default:
sort = bson.D{{Key: "createdAt", Value: -1}}
}
var albumMod = &officialWebsitemod.Album{}
var skip, limit = transPageAndPageNumber(req.PageSize, req.PageNumber)
var ops = options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit + 1)
albumsData, err := albumMod.FindMany(bson.M{"isActive": true}, ops)
if err != nil {
return
}
resp = AlbumListResp{
HasNext: len(albumsData) > int(limit),
List: make([]*AlbumResp, 0),
}
for _, v := range albumsData {
var albumResp = &AlbumResp{}
albumResp.FromModel(&v)
resp.List = append(resp.List, albumResp)
}
if resp.HasNext {
resp.List = resp.List[:len(resp.List)-1]
}
return resp, nil
}
type AlbumDetailReq struct {
ID string `uri:"id" form:"id"`
PageNumber int64 `json:"pageNumber" form:"pageNumber"`
PageSize int64 `json:"pageSize" form:"pageSize"`
}
type AlbumDetailResp struct {
AlbumResp
Videos []AlbumDetailVideoResp `json:"videos"`
}
type AlbumDetailVideoResp 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"`
IsHot bool `json:"isHot"`
Tags []VideoTagResp `json:"tags"`
WatchCount int64 `json:"watchCount"`
LikeCount int64 `json:"likeCount"`
CommentCount int64 `json:"commentCount"`
CollectCount int64 `json:"collectCount"`
}
func AlbumDetail(req *AlbumDetailReq) (resp AlbumDetailResp, err error) {
if req.ID == "" {
err = stderr.ErrParamError
return
}
// 兼容 id 与 seoSlug24 位 hex 按 _id 查,否则按 seoSlug 查
filter := bson.M{}
if objID, e := primitive.ObjectIDFromHex(req.ID); e == nil {
filter["_id"] = objID
} else {
filter["seoSlug"] = req.ID
}
albumMod := &officialWebsitemod.Album{}
err = albumMod.FindOne(filter)
if err != nil {
return
}
resp.FromModel(albumMod)
// 组装获取专辑下视频列表
filter = bson.M{"albumId": albumMod.ID}
var skip, limit = transPageAndPageNumber(req.PageSize, req.PageNumber)
var option = options.Find().SetSort(bson.D{{Key: "createdAt", Value: -1}}).SetSkip(skip).SetLimit(limit + 1)
videoMod := &officialWebsitemod.Video{}
var videos []officialWebsitemod.Video
videos, err = videoMod.FindMany(filter, option)
if err != nil {
return
}
for _, video := range videos {
var videoResp = AlbumDetailVideoResp{
ID: video.ID.Hex(),
Title: video.Title,
SeoSlug: video.SeoSlug,
Description: video.Description,
Cover: video.Cover,
Url: video.Url,
IsHot: video.IsHot,
WatchCount: video.WatchCount,
LikeCount: video.LikeCount,
CommentCount: video.CommentCount,
CollectCount: video.CollectCount,
}
for _, tag := range video.Tags {
videoResp.Tags = append(videoResp.Tags, VideoTagResp{
ID: tag.ID.Hex(),
Name: tag.Name,
})
}
resp.Videos = append(resp.Videos, videoResp)
}
return
}