Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

282 lines
8.2 KiB
Go

package checkinctrl
import (
"91porn-server/app/service/checkinser"
"91porn-server/common"
"91porn-server/common/stderr"
"91porn-server/models/v/checkinconfigmod"
"91porn-server/models/v/checkinprizemod"
"strings"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// ========== 签到配置 ==========
// GetCheckinConfig 获取签到配置
func GetCheckinConfig(c *gin.Context) {
cfg, err := checkinser.GetCheckinConfig()
if err != nil {
common.ServeJSON(c, stderr.ErrDbQueryError, nil)
return
}
common.ServeJSON(c, stderr.Success, cfg)
}
type checkinConfigUpdateReq struct {
Enable *bool `json:"enable" bson:"enable,omitempty"`
Description *string `json:"description" bson:"description,omitempty"`
BackgroundImage *string `json:"backgroundImage" bson:"backgroundImage,omitempty"`
RewardBgVideos *[]rewardBgVideoReq `json:"rewardBgVideos" bson:"rewardBgVideos,omitempty"`
IntegerExchangeList *[]giftItemReq `json:"integerExchangeList" bson:"integerExchangeList,omitempty"`
}
type rewardBgVideoReq struct {
PrizeType int `json:"prizeType" bson:"prizeType"`
BgMediaUrl string `json:"bgMediaUrl" bson:"bgMediaUrl"`
FsResourceId string `json:"fsResourceId" bson:"fsResourceId"`
FsResourceStatus string `json:"-" bson:"fsResourceStatus"`
}
type giftItemReq struct {
Name string `json:"name" bson:"name"`
Icon string `json:"icon" bson:"icon"`
}
// UpdateCheckinConfig 修改签到配置
func UpdateCheckinConfig(c *gin.Context) {
var req checkinConfigUpdateReq
if err := c.ShouldBindJSON(&req); err != nil {
common.ServeJSON(c, stderr.ErrParamError, err.Error())
return
}
// BgMediaUrl 不以 .m3u8 结尾时自动追加
// fsResourceId 变更时重置 fsResourceStatus
if req.RewardBgVideos != nil {
// 查询当前配置,用于比对 fsResourceId 是否变更
oldCfg, _ := checkinconfigmod.FindOne(bson.M{})
oldIdMap := make(map[int]string) // prizeType -> fsResourceId
oldStatusMap := make(map[int]string) // prizeType -> fsResourceStatus
if oldCfg != nil {
for _, v := range oldCfg.RewardBgVideos {
oldIdMap[int(v.PrizeType)] = v.FsResourceId
oldStatusMap[int(v.PrizeType)] = v.FsResourceStatus
}
}
for i := range *req.RewardBgVideos {
item := &(*req.RewardBgVideos)[i]
if item.BgMediaUrl != "" && !strings.HasSuffix(item.BgMediaUrl, ".m3u8") {
item.BgMediaUrl = item.BgMediaUrl + ".m3u8"
}
// fsResourceId 不为空且与旧值不同,重置状态让定时任务重新检查
if item.FsResourceId != "" && item.FsResourceId != oldIdMap[item.PrizeType] {
item.FsResourceStatus = ""
} else {
item.FsResourceStatus = oldStatusMap[item.PrizeType]
}
}
}
update := bson.M{"$set": req}
if err := checkinser.UpdateCheckinConfig(update); err != nil {
common.ServeJSON(c, stderr.ErrDbUpdateError, nil)
return
}
common.ServeJSON(c, stderr.Success, nil)
}
// ========== 签到奖品管理 ==========
type checkinPrizeListReq struct {
PageNumber int64 `json:"pageNumber" form:"pageNumber"`
PageSize int64 `json:"pageSize" form:"pageSize"`
}
// GetCheckinPrizeList 获取签到奖品列表
func GetCheckinPrizeList(c *gin.Context) {
var req checkinPrizeListReq
if err := c.ShouldBind(&req); err != nil {
common.ServeJSON(c, stderr.ErrParamError, nil)
return
}
if req.PageNumber <= 0 {
req.PageNumber = 1
}
if req.PageSize <= 0 {
req.PageSize = 20
}
list, total, err := checkinser.GetCheckinPrizeList(req.PageNumber, req.PageSize)
if err != nil {
common.ServeJSON(c, stderr.ErrDbQueryError, nil)
return
}
common.ServeJSON(c, stderr.Success, gin.H{
"list": list,
"total": total,
})
}
// AddOneCheckinPrize 添加签到奖品
func AddOneCheckinPrize(c *gin.Context) {
var req checkinprizemod.CheckinPrize
if err := c.ShouldBindJSON(&req); err != nil {
common.ServeJSON(c, stderr.ErrParamError, err.Error())
return
}
if err := checkinser.AddCheckinPrize(&req); err != nil {
common.ServeJSON(c, stderr.ErrDbInsertError, nil)
return
}
common.ServeJSON(c, stderr.Success, nil)
}
type checkinPrizeUpdateReq struct {
ID string `json:"id"`
checkinPrizeParams
}
type checkinPrizeParams struct {
Title *string `json:"title" bson:"title,omitempty"`
Image *string `json:"image" bson:"image,omitempty"`
CheckinDays *int64 `json:"checkinDays" bson:"checkinDays,omitempty"`
CheckinType *checkinprizemod.CheckinType `json:"checkinType" bson:"checkinType,omitempty"`
PrizeId *string `json:"prizeId" bson:"prizeId,omitempty"`
PrizeName *string `json:"prizeName" bson:"prizeName,omitempty"`
Status *bool `json:"status" bson:"status,omitempty"`
BigPrize *bool `json:"bigPrize" bson:"bigPrize,omitempty"`
}
// UpdateOneCheckinPrize 更新签到奖品
func UpdateOneCheckinPrize(c *gin.Context) {
var req checkinPrizeUpdateReq
if err := c.ShouldBindJSON(&req); err != nil {
common.ServeJSON(c, stderr.ErrParamError, nil)
return
}
id, err := primitive.ObjectIDFromHex(req.ID)
if err != nil {
common.ServeJSON(c, stderr.ErrParamError, "无效的ID")
return
}
now := time.Now()
updateFields := bson.M{"updatedAt": now}
if req.Title != nil {
updateFields["title"] = *req.Title
}
if req.Image != nil {
updateFields["image"] = *req.Image
}
if req.CheckinDays != nil {
updateFields["checkinDays"] = *req.CheckinDays
}
if req.CheckinType != nil {
updateFields["checkinType"] = *req.CheckinType
}
if req.PrizeId != nil {
pid, err := primitive.ObjectIDFromHex(*req.PrizeId)
if err == nil {
updateFields["prizeId"] = pid
}
}
if req.PrizeName != nil {
updateFields["prizeName"] = *req.PrizeName
}
if req.Status != nil {
updateFields["status"] = *req.Status
}
if req.BigPrize != nil {
updateFields["bigPrize"] = *req.BigPrize
}
if err := checkinser.UpdateCheckinPrize(id, updateFields); err != nil {
common.ServeJSON(c, stderr.ErrDbUpdateError, nil)
return
}
common.ServeJSON(c, stderr.Success, nil)
}
type delReq struct {
ID string `json:"id"`
}
// DelOneCheckinPrize 删除签到奖品
func DelOneCheckinPrize(c *gin.Context) {
var req delReq
if err := c.ShouldBindJSON(&req); err != nil {
common.ServeJSON(c, stderr.ErrParamError, nil)
return
}
id, err := primitive.ObjectIDFromHex(req.ID)
if err != nil {
common.ServeJSON(c, stderr.ErrParamError, "无效的ID")
return
}
if err := checkinser.DeleteCheckinPrize(id); err != nil {
common.ServeJSON(c, stderr.ErrDbDeleteError, nil)
return
}
common.ServeJSON(c, stderr.Success, nil)
}
// ========== 签到历史记录 ==========
type userCheckinsReq struct {
PageNumber int64 `json:"pageNumber" form:"pageNumber"`
PageSize int64 `json:"pageSize" form:"pageSize"`
UserId uint64 `json:"userId" form:"userId"`
Start time.Time `json:"start" form:"start"`
End time.Time `json:"end" form:"end"`
}
// GetUserCheckins 获取用户签到记录列表
func GetUserCheckins(c *gin.Context) {
var req userCheckinsReq
if err := c.ShouldBind(&req); err != nil {
common.ServeJSON(c, stderr.ErrParamError, nil)
return
}
if req.PageNumber <= 0 {
req.PageNumber = 1
}
if req.PageSize <= 0 {
req.PageSize = 20
}
filter := bson.M{}
if req.UserId != 0 {
filter["userId"] = req.UserId
}
if !req.Start.IsZero() && !req.End.IsZero() {
filter["createdAt"] = bson.M{"$gte": req.Start, "$lte": req.End}
}
list, total, err := checkinser.GetUserCheckinList(filter, req.PageNumber, req.PageSize)
if err != nil {
common.ServeJSON(c, stderr.ErrDbQueryError, nil)
return
}
common.ServeJSON(c, stderr.Success, gin.H{
"list": list,
"total": total,
})
}
// DelOneUserCheckin 删除用户签到记录
func DelOneUserCheckin(c *gin.Context) {
var req delReq
if err := c.ShouldBindJSON(&req); err != nil {
common.ServeJSON(c, stderr.ErrParamError, nil)
return
}
id, err := primitive.ObjectIDFromHex(req.ID)
if err != nil {
common.ServeJSON(c, stderr.ErrParamError, "无效的ID")
return
}
if err := checkinser.DeleteUserCheckin(id); err != nil {
common.ServeJSON(c, stderr.ErrDbDeleteError, nil)
return
}
common.ServeJSON(c, stderr.Success, nil)
}