Files
web_huakui_server/pub/common/slugx/slugx.go
T
rootandClaude Opus 4.7 85c0071fd8 feat: 从黄果 NET hgdjnet-server 9bfbafe 导入 HKDJ 官网后端
来源:hgdjnet-server 9bfbafe10d417deea959bd53117bc88a10e60a83
项目身份 HKDJ / JHA-216,独立官网仓库,Jenkins 守卫键 hkdjnet
测试目录 /server/hkdj_net,App/Web API 30331/30332

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-16 11:20:04 +08:00

71 lines
2.0 KiB
Go

package slugx
import (
"hkdj-web-server/pub/common/srvdef"
"hkdj-web-server/pub/common/utils"
"go.mongodb.org/mongo-driver/bson"
)
// Exists 判断 slug 是否已被占用
type Exists func(slug string) bool
// Ensure 新增时保证 slug:有值则校验唯一且不能全数字,无值则按 source 自动生成
func Ensure(slug *string, source string, exists Exists) *srvdef.SrvErr {
if slug == nil {
return srvdef.New(srvdef.ErrParamError, "Slug不能为空", "Slug不能为空")
}
*slug = utils.SanitizeSlug(*slug)
if *slug != "" {
if utils.IsSlugAllDigits(*slug) {
return srvdef.New(srvdef.ErrParamError, "Slug不能全是数字", "Slug不能全是数字")
}
if exists(*slug) {
return srvdef.New(srvdef.ErrDbInputExist, "Slug已存在", "Slug已存在")
}
return nil
}
*slug = utils.MakeUniqueSlug(source, exists)
return nil
}
// PrepareOnUpdate 更新时处理 slug:手动传入则校验,历史为空则自动生成
func PrepareOnUpdate(current string, reqSlug *string, source string, exists Exists) (string, bool, *srvdef.SrvErr) {
slug := current
if reqSlug != nil {
slug = utils.SanitizeSlug(*reqSlug)
}
if slug != "" {
if reqSlug != nil {
if utils.IsSlugAllDigits(slug) {
return "", false, srvdef.New(srvdef.ErrParamError, "Slug不能全是数字", "Slug不能全是数字")
}
if exists(slug) {
return "", false, srvdef.New(srvdef.ErrDbInputExist, "Slug已存在", "Slug已存在")
}
return slug, true, nil
}
return "", false, nil
}
return utils.MakeUniqueSlug(source, exists), true, nil
}
// Filter 构造按 slug 查重条件,excludeId>0 时排除自身
func Filter(slugField, idField, slug string, excludeId int64) bson.M {
filter := bson.M{slugField: slug}
if excludeId > 0 {
filter[idField] = bson.M{"$ne": excludeId}
}
return filter
}
// EmptyFilter 查询 slug 为空或不存在的历史数据
func EmptyFilter() bson.M {
return bson.M{
"$or": []bson.M{
{"slug": ""},
{"slug": bson.M{"$exists": false}},
},
}
}