@@ -0,0 +1,300 @@
|
||||
package officialwebsiteser
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"91porn-server/common/stderr"
|
||||
officialwebsitemod "91porn-server/models/v/officialWebsitemod"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
// ─────────────────────────────────────────
|
||||
// Service functions
|
||||
// ─────────────────────────────────────────
|
||||
|
||||
func ListHero(req *HeroListReq) (int64, []officialwebsitemod.Hero, error) {
|
||||
filter, err := req.Query()
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
mod := &officialwebsitemod.Hero{}
|
||||
total, err := mod.Count(filter)
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
list, err := mod.FindMany(filter, req.FindOptions())
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
return total, list, nil
|
||||
}
|
||||
|
||||
func CreateHero(req *ModifyHeroReq) (officialwebsitemod.Hero, error) {
|
||||
data := req.toMod()
|
||||
// SEO slug:手填优先(校验唯一),为空则由名称生成雏形并去重
|
||||
var err error
|
||||
if data.SeoSlug, err = resolveHeroSeoSlug(data.SeoSlug, data.Name, primitive.NilObjectID); err != nil {
|
||||
return officialwebsitemod.Hero{}, err
|
||||
}
|
||||
if err := data.Create(); err != nil {
|
||||
return officialwebsitemod.Hero{}, err
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// resolveHeroSeoSlug 处理 seoSlug:手填则校验格式并查重(冲突报错);为空则由名称生成雏形并追加后缀去重。
|
||||
func resolveHeroSeoSlug(provided, name string, excludeID primitive.ObjectID) (string, error) {
|
||||
return ResolveSeoSlug(provided, name, func(slug string) (bool, error) {
|
||||
filter := officialwebsitemod.M{"seoSlug": slug}
|
||||
if !excludeID.IsZero() {
|
||||
filter["_id"] = officialwebsitemod.M{"$ne": excludeID}
|
||||
}
|
||||
n, err := (&officialwebsitemod.Hero{}).Count(filter)
|
||||
return n > 0, err
|
||||
})
|
||||
}
|
||||
|
||||
func UpdateHero(req *ModifyHeroReq) (resp CountResp, err error) {
|
||||
if req == nil || req.ID == "" {
|
||||
return
|
||||
}
|
||||
id, parseErr := primitive.ObjectIDFromHex(req.ID)
|
||||
if parseErr != nil || isNilObjectID(id) {
|
||||
err = stderr.ErrParamError
|
||||
return
|
||||
}
|
||||
mod := &officialwebsitemod.Hero{}
|
||||
if err = mod.FindOne(officialwebsitemod.M{"_id": id}); err != nil {
|
||||
return
|
||||
}
|
||||
// 若提交了 seoSlug,先校验/去重(排除自身),回写后由 toM 落库
|
||||
if req.SeoSlug != nil {
|
||||
var slug string
|
||||
if slug, err = resolveHeroSeoSlug(*req.SeoSlug, mod.Name, id); err != nil {
|
||||
return
|
||||
}
|
||||
*req.SeoSlug = slug
|
||||
}
|
||||
var update officialwebsitemod.M
|
||||
if update, err = req.toM(); err != nil || update == nil {
|
||||
return
|
||||
}
|
||||
resp.Count, err = mod.Update(officialwebsitemod.M{"_id": id}, update)
|
||||
return
|
||||
}
|
||||
|
||||
func DeleteHero(req *DeleteHeroReq) (data DeleteHeroResp, err error) {
|
||||
if req == nil {
|
||||
err = stderr.CodeEmptyData
|
||||
return
|
||||
}
|
||||
var id primitive.ObjectID
|
||||
if id, err = primitive.ObjectIDFromHex(req.ID); err != nil {
|
||||
return
|
||||
}
|
||||
if isNilObjectID(id) {
|
||||
err = stderr.ErrParamError
|
||||
return
|
||||
}
|
||||
mod := &officialwebsitemod.Hero{}
|
||||
data.Count, err = mod.Delete(officialwebsitemod.M{"_id": id})
|
||||
return
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────
|
||||
// Mutation (Modify) types
|
||||
// ─────────────────────────────────────────
|
||||
|
||||
type ModifyHeroReq struct {
|
||||
ID string `json:"id" form:"id"`
|
||||
Name *string `json:"name"`
|
||||
SeoSlug *string `json:"seoSlug"`
|
||||
Avatar *string `json:"avatar"`
|
||||
Description *string `json:"description"`
|
||||
FansCount *int64 `json:"fansCount"`
|
||||
Height *int64 `json:"height"`
|
||||
Bust *int64 `json:"bust"`
|
||||
Waist *int64 `json:"waist"`
|
||||
Hip *int64 `json:"hip"`
|
||||
Cover *string `json:"cover"`
|
||||
Partners *[]primitive.ObjectID `json:"partners"`
|
||||
Sort *int64 `json:"sort"`
|
||||
IsActive *bool `json:"isActive"`
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────
|
||||
// Delete types
|
||||
// ─────────────────────────────────────────
|
||||
|
||||
type DeleteHeroReq struct {
|
||||
ID string `json:"id" form:"id"`
|
||||
}
|
||||
|
||||
type DeleteHeroResp struct {
|
||||
Count int64 `json:"count"`
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────
|
||||
// toMod — ModifyHeroReq → model struct
|
||||
// ─────────────────────────────────────────
|
||||
|
||||
func (req *ModifyHeroReq) toMod() officialwebsitemod.Hero {
|
||||
if req == nil {
|
||||
return officialwebsitemod.Hero{}
|
||||
}
|
||||
data := officialwebsitemod.Hero{
|
||||
Name: stringOrZero(req.Name),
|
||||
Avatar: stringOrZero(req.Avatar),
|
||||
Description: stringOrZero(req.Description),
|
||||
FansCount: int64OrZero(req.FansCount),
|
||||
Height: int64OrZero(req.Height),
|
||||
Bust: int64OrZero(req.Bust),
|
||||
Waist: int64OrZero(req.Waist),
|
||||
Hip: int64OrZero(req.Hip),
|
||||
Cover: stringOrZero(req.Cover),
|
||||
SortModel: officialwebsitemod.SortModel{
|
||||
Sort: int64OrZero(req.Sort),
|
||||
IsActive: boolOrZero(req.IsActive),
|
||||
},
|
||||
}
|
||||
if req.Partners != nil {
|
||||
data.Partners = *req.Partners
|
||||
}
|
||||
if req.SeoSlug != nil {
|
||||
data.SeoSlug = *req.SeoSlug
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────
|
||||
// toM — ModifyHeroReq → officialwebsitemod.M
|
||||
// ─────────────────────────────────────────
|
||||
|
||||
func (req *ModifyHeroReq) toM() (officialwebsitemod.M, error) {
|
||||
if req == nil {
|
||||
return nil, stderr.CodeEmptyData
|
||||
}
|
||||
set := officialwebsitemod.M{}
|
||||
if req.Name != nil {
|
||||
set["name"] = *req.Name
|
||||
}
|
||||
if req.SeoSlug != nil && *req.SeoSlug != "" {
|
||||
set["seoSlug"] = *req.SeoSlug
|
||||
}
|
||||
if req.Avatar != nil {
|
||||
set["avatar"] = *req.Avatar
|
||||
}
|
||||
if req.Description != nil {
|
||||
set["description"] = *req.Description
|
||||
}
|
||||
if req.FansCount != nil {
|
||||
set["fansCount"] = *req.FansCount
|
||||
}
|
||||
if req.Height != nil {
|
||||
set["height"] = *req.Height
|
||||
}
|
||||
if req.Bust != nil {
|
||||
set["bust"] = *req.Bust
|
||||
}
|
||||
if req.Waist != nil {
|
||||
set["waist"] = *req.Waist
|
||||
}
|
||||
if req.Hip != nil {
|
||||
set["hip"] = *req.Hip
|
||||
}
|
||||
if req.Cover != nil {
|
||||
set["cover"] = *req.Cover
|
||||
}
|
||||
if req.Partners != nil {
|
||||
set["partners"] = *req.Partners
|
||||
}
|
||||
if req.Sort != nil {
|
||||
set["sort"] = *req.Sort
|
||||
}
|
||||
if req.IsActive != nil {
|
||||
set["isActive"] = *req.IsActive
|
||||
}
|
||||
if len(set) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
set["updatedAt"] = time.Now().UTC()
|
||||
return officialwebsitemod.M{"$set": set}, nil
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────
|
||||
// List types
|
||||
// ─────────────────────────────────────────
|
||||
|
||||
type HeroListReq struct {
|
||||
PageReq
|
||||
ID *string `form:"id"`
|
||||
Name *string `form:"name"`
|
||||
Avatar *string `form:"avatar"`
|
||||
Height *int64 `form:"height"`
|
||||
Bust *int64 `form:"bust"`
|
||||
Waist *int64 `form:"waist"`
|
||||
Hip *int64 `form:"hip"`
|
||||
Description *string `form:"description"`
|
||||
FansCount *int64 `form:"fansCount"`
|
||||
Cover *string `form:"cover"`
|
||||
Partners *string `form:"partners"`
|
||||
Sort *int64 `form:"sort"`
|
||||
IsActive *bool `form:"isActive"`
|
||||
CreatedAt *time.Time `form:"createdAt"`
|
||||
UpdatedAt *time.Time `form:"updatedAt"`
|
||||
DeletedAt *time.Time `form:"deletedAt"`
|
||||
}
|
||||
|
||||
func (r *HeroListReq) Query() (officialwebsitemod.M, error) {
|
||||
filter := officialwebsitemod.M{}
|
||||
if err := parseObjectIDFilter(filter, "_id", r.ID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if r.Name != nil {
|
||||
filter["name"] = *r.Name
|
||||
}
|
||||
if r.Avatar != nil {
|
||||
filter["avatar"] = *r.Avatar
|
||||
}
|
||||
if r.Height != nil {
|
||||
filter["height"] = *r.Height
|
||||
}
|
||||
if r.Bust != nil {
|
||||
filter["bust"] = *r.Bust
|
||||
}
|
||||
if r.Waist != nil {
|
||||
filter["waist"] = *r.Waist
|
||||
}
|
||||
if r.Hip != nil {
|
||||
filter["hip"] = *r.Hip
|
||||
}
|
||||
if r.Description != nil {
|
||||
filter["description"] = *r.Description
|
||||
}
|
||||
if r.FansCount != nil {
|
||||
filter["fansCount"] = *r.FansCount
|
||||
}
|
||||
if r.Cover != nil {
|
||||
filter["cover"] = *r.Cover
|
||||
}
|
||||
if err := parseJSONFilter(filter, "partners", r.Partners, &[]primitive.ObjectID{}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if r.Sort != nil {
|
||||
filter["sort"] = *r.Sort
|
||||
}
|
||||
if r.IsActive != nil {
|
||||
filter["isActive"] = *r.IsActive
|
||||
}
|
||||
if r.CreatedAt != nil {
|
||||
filter["createdAt"] = *r.CreatedAt
|
||||
}
|
||||
if r.UpdatedAt != nil {
|
||||
filter["updatedAt"] = *r.UpdatedAt
|
||||
}
|
||||
if r.DeletedAt != nil {
|
||||
filter["deletedAt"] = *r.DeletedAt
|
||||
}
|
||||
return filter, nil
|
||||
}
|
||||
Reference in New Issue
Block a user