feat: import services and standardize Go 1.26.5

This commit is contained in:
2026-08-09 10:43:45 +08:00
parent 689c74b28f
commit 86024fa81d
1456 changed files with 220765 additions and 2 deletions

View File

@@ -0,0 +1,66 @@
// Package category 提供分类相关的业务逻辑处理
// 包括分类的创建、修改、删除、查询等功能
package category
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/bsm-sdk/core/vars"
)
// Create 创建新分类
// 验证用户身份和分类数据,创建分类记录
// 参数:
// - ctx: 请求上下文,包含用户身份信息
// - in: 分类数据包含标题、父级ID、介绍等
//
// 返回:
// - reply: 操作结果包含分类ID和时间戳
// - err: 错误信息
func Create(ctx context.Context, in *pb.CategoryItem) (reply *pb.StatusReply, err error) {
// 解析请求上下文,验证用户身份
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// 验证分类标题不能为空且长度不超过255字符
if in.GetSiteIdentity() == "" || in.GetTitle() == "" || len(in.GetTitle()) > 255 {
return nil, errcode.ErrInvalidArgument
}
// 构建分类数据模型
data := models.CmsCategory{
SiteIdentity: in.GetSiteIdentity(),
ParentId: uint(in.GetParentId()), // 父级分类ID0表示顶级分类
CategoryKey: in.GetCategoryKey(), // 分类键值用于URL等
Title: in.GetTitle(), // 分类标题
CoverPath: in.GetCoverPath(), // 分类封面图片路径
Intro: in.GetIntro(), // 分类介绍
}
// 生成分类唯一标识
data.Identity = utils.UUID()
// 保存分类数据到数据库
if err := impl.DBService.Model(&models.CmsCategory{}).Create(&data).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
// 返回成功响应
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Details: data.Identity,
Timeseq: time.Now().UnixMilli(),
}, nil
}

View File

@@ -0,0 +1,33 @@
package category
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
)
// 删除分类
func Delete(ctx context.Context, in *pb.DeleteCategoryRequest) (reply *pb.StatusReply, err error) {
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetIdentity() == "" || len(in.GetIdentity()) > 255 {
return nil, errcode.ErrInvalidArgument
}
if err := models.DeleteCategory(in.GetIdentity()); err != nil {
printer.Error(err.Error())
return nil, err
}
return &pb.StatusReply{
Code: 0,
Message: "OK",
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,59 @@
package category
import (
"context"
"fmt"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
)
// 分类列表
func Fetch(ctx context.Context, in *pb.IdentRequest) (reply *pb.CategoryListReply, err error) {
// list, cnt, err := logic.CategoryList()
var (
cnt int64 = 0
list []models.CmsCategory
)
tx := impl.DBService.Debug().Model(&models.CmsCategory{})
fmt.Println("in = ", in)
if in.GetId() != 0 {
tx = tx.Where("parent_id = ?", in.GetId())
} else {
tx = tx.Where("parent_id = 0")
}
err = tx.Order("created_at desc").Preload("Children").Count(&cnt).Find(&list).Error
if err != nil {
return nil, errcode.ErrDB
}
out := &pb.CategoryListReply{
Count: cnt,
Data: fetchCategory(list),
}
return out, nil
}
func fetchCategory(list []models.CmsCategory) (in []*pb.CategoryItem) {
for _, v := range list {
item := &pb.CategoryItem{
Id: int64(v.ID),
Identity: v.Identity,
ParentId: int64(v.ParentId),
CategoryKey: v.CategoryKey,
Title: v.Title,
CoverPath: v.CoverPath,
Intro: v.Intro,
CreatedAt: v.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: v.UpdatedAt.Format("2006-01-02 15:04:05"),
Child: make([]*pb.CategoryItem, 0, len(v.Children)),
}
if len(v.Children) > 0 {
item.Child = fetchCategory(v.Children)
}
in = append(in, item)
}
return in
}

View File

@@ -0,0 +1,44 @@
package category
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/types"
)
// 修改分类
func Modify(ctx context.Context, in *pb.ModifyCategoryRequest) (reply *pb.StatusReply, err error) {
if in.GetSiteIdentity() == "" || in.GetIdentity() == "" || len(in.GetIdentity()) > 255 {
return nil, errcode.ErrInvalidArgument
}
if in.GetTitle() == "" || len(in.GetTitle()) > 255 {
return nil, errcode.ErrInvalidArgument
}
data := &models.CmsCategory{
SiteIdentity: in.SiteIdentity,
ParentId: uint(in.GetParentId()),
CategoryKey: in.GetCategoryKey(),
Title: in.GetTitle(),
CoverPath: in.GetCoverPath(),
Intro: in.GetIntro(),
Std_Identity: types.Std_Identity{Identity: in.Identity},
}
if err := impl.DBService.Where("identity = ?", data.Identity).Updates(data).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Code: 0,
Message: "OK",
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,129 @@
// Package pages 提供页面相关的业务逻辑处理
// 包括页面的创建、修改、删除、查询等功能
package pages
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
"git.apinb.com/bsm-apps/cms/internal/utils"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/types"
sdkUtils "git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/bsm-sdk/core/vars"
"gorm.io/gorm"
)
// Create 创建新页面
// 验证用户身份和页面数据,创建页面记录并关联标签、附件等信息
// 参数:
// - ctx: 请求上下文,包含用户身份信息
// - in: 页面数据,包含标题、内容、标签等
//
// 返回:
// - reply: 操作结果包含页面ID和时间戳
// - err: 错误信息
func Create(ctx context.Context, in *pb.PagesItem) (reply *pb.StatusReply, err error) {
// 解析请求上下文,验证用户身份
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// 验证必填字段
if in.GetSiteIdentity() == "" || in.GetTitle() == "" || in.GetContent() == "" || in.GetKey() == "" {
return nil, errcode.ErrInvalidArgument
}
// 构建页面数据模型
var data = &models.CmsPages{
SiteIdentity: in.SiteIdentity,
Title: in.Title,
Key: utils.FormatKey(in.Key), // 格式化页面键值,确保唯一性
Description: in.Description,
CoverPath: in.CoverPath,
Content: in.Content,
HasAccessory: in.HasAccessory,
AccessoryIdentityArray: in.AccessoryIdentityArray,
TagsIdentityArray: in.TagsIdentityArray,
}
// 生成页面唯一标识
data.Identity = sdkUtils.UUID()
// 保存页面数据,包括关联的标签、附件信息
err = AddPostPages(data, in.AccessoryData, in.TagsIdentityArray)
if err != nil {
return nil, errcode.ErrDB
}
// 返回成功响应
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Details: data.Identity,
Timeseq: time.Now().UnixMilli(),
}, nil
}
// AddPostPages 添加页面及其关联数据
// 使用事务确保数据一致性,同时创建页面、标签关联和附件信息
// 参数:
// - pages: 页面数据模型
// - accessory: 附件数据列表
// - tags: 标签标识列表
//
// 返回:
// - err: 错误信息
func AddPostPages(pages *models.CmsPages, accessory []*pb.AccessoryItem, tags []string) (err error) {
var (
accessoryPage = make([]models.CmsAccessory, 0) // 页面附件数据
TagsPage = make([]models.CmsRelateTags, 0) // 页面标签关联数据
)
// 构建标签关联数据
for _, val := range tags {
TagsPage = append(TagsPage, models.CmsRelateTags{
Identity: sdkUtils.ULID(),
PagesIdentity: pages.Identity,
TagsIdentity: val,
})
}
// 使用事务确保数据一致性
return impl.DBService.Transaction(func(tx *gorm.DB) error {
// 创建页面记录
if err = tx.Create(pages).Error; err != nil {
return err
}
// 创建附件关联记录
if len(accessory) != 0 {
for _, v := range accessory {
accessoryPage = append(accessoryPage, models.CmsAccessory{
Std_Identity: types.Std_Identity{Identity: sdkUtils.UUID()},
PagesId: pages.ID,
PagesIdentity: pages.Identity,
FilePath: v.FilePath,
Title: v.Title,
})
}
if err := tx.Create(&accessoryPage).Error; err != nil {
return err
}
}
// 创建标签关联记录
if len(tags) != 0 {
if err := tx.Create(&TagsPage).Error; err != nil {
return err
}
}
return nil
})
}

View File

@@ -0,0 +1,52 @@
package pages
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/vars"
"gorm.io/gorm"
)
// 删除文章
func Delete(ctx context.Context, in *pb.IdentRequest) (reply *pb.StatusReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.Identity == "" {
return nil, errcode.ErrInvalidArgument
}
err = DeletePages(in.Identity)
if err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Timeseq: time.Now().UnixMilli(),
}, nil
}
func DeletePages(identity string) (err error) {
return impl.DBService.Transaction(func(tx *gorm.DB) error {
if err = tx.Where("identity = ?", identity).Delete(&models.CmsPages{}).Error; err != nil {
return err
}
if err = tx.Where("pages_identity = ?", identity).Delete(&models.CmsRelateTags{}).Error; err != nil {
return err
}
if err = tx.Where("pages_identity = ?", identity).Delete(&models.CmsAccessory{}).Error; err != nil {
return err
}
return nil
})
}

View File

@@ -0,0 +1,17 @@
package pages
import (
"regexp"
"strings"
)
func fmtKey(in string) string {
in = strings.ToLower(in)
in = strings.TrimSpace(in)
re := regexp.MustCompile(`\s+`)
in = re.ReplaceAllString(in, " ")
in = strings.ReplaceAll(in, " ", "-")
return in
}

View File

@@ -0,0 +1,103 @@
package pages
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 文章列表
func Fetch(ctx context.Context, in *pb.PagesListRequest) (reply *pb.PagesListReply, err error) {
if in.GetPage() < 1 {
in.Page = 1
}
if in.GetSize() < 10 {
in.Size = 10
}
if in.GetSize() > 50 {
in.Size = 50
}
list, cnt, err := PagesList(in.Page, in.Size, in.Keyword, int64(in.Type))
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
var res = pb.PagesListReply{
Count: cnt,
Data: make([]*pb.PagesItem, 0),
}
for _, val := range list {
var (
accessoryData = make([]*pb.AccessoryItem, 0)
accessories = make([]string, 0)
TagsData = make([]*pb.TagsItem, 0)
tagsIdentityArray = make([]string, 0)
)
for _, accessory := range val.Accessories {
accessoryData = append(accessoryData, &pb.AccessoryItem{
Identity: accessory.Identity,
Title: accessory.Title,
FilePath: accessory.FilePath,
CreatedAt: accessory.CreatedAt.Format(time.DateTime),
})
accessories = append(accessories, accessory.Identity)
}
for _, tags := range val.Tags {
TagsData = append(TagsData, &pb.TagsItem{
Id: int64(tags.Tags.ID),
Identity: tags.TagsIdentity,
Title: tags.Tags.Title,
Intro: tags.Tags.Intro,
CoverPath: tags.Tags.CoverPath,
CreatedAt: tags.Tags.CreatedAt.Format(time.DateTime),
})
tagsIdentityArray = append(tagsIdentityArray, tags.TagsIdentity)
}
res.Data = append(res.Data, &pb.PagesItem{
Identity: val.Identity,
Title: val.Title,
CoverPath: val.CoverPath,
Content: val.Content,
Hits: val.Hits,
HasAccessory: val.HasAccessory,
CreatedAt: val.CreatedAt.Format(time.DateTime),
UpdatedAt: val.UpdatedAt.Format(time.DateTime),
Description: val.Description,
PostType: val.Type,
Key: val.Key,
AccessoryData: accessoryData,
AccessoryIdentityArray: accessories,
TagsData: TagsData,
TagsIdentityArray: tagsIdentityArray,
})
}
return &res, nil
}
func PagesList(page, size int64, keyword string, userType int64) (list []*models.CmsPages, cnt int64, err error) {
tx := impl.DBService.Model(&models.CmsPages{})
if keyword != "" {
tx = tx.Where("Cms_pages.title like ?", "%"+keyword+"%")
}
if userType != 0 {
tx = tx.Where("Cms_pages.type = ?", userType)
}
if err = tx.Count(&cnt).Order("Cms_pages.created_at desc").Limit(int(size)).Offset(int((page - 1) * size)).Error; err != nil {
return nil, 0, errcode.ErrDB
}
err = tx.Preload("Accessories").Preload("Tags.Tags").Find(&list).Error
return
}

View File

@@ -0,0 +1,81 @@
package pages
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"gorm.io/gorm"
)
// 获取文章详情 By Identity
func GetByIdentity(ctx context.Context, in *pb.GetPagesRequest) (reply *pb.PagesItem, err error) {
if in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
data, err := GetPages("Cms_pages.identity", in.Identity)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
var res = &pb.PagesItem{}
if data != nil {
res.Identity = data.Identity
res.Title = data.Title
res.CoverPath = data.CoverPath
res.Content = data.Content
res.Hits = data.Hits
res.HasAccessory = data.HasAccessory
res.CreatedAt = data.CreatedAt.String()
res.UpdatedAt = data.UpdatedAt.String()
res.Description = data.Description
res.PostType = data.Type
}
for _, val := range data.Accessories {
res.AccessoryData = append(res.AccessoryData, &pb.AccessoryItem{
Identity: val.Identity,
Title: val.Title,
FilePath: val.FilePath,
CreatedAt: val.CreatedAt.Format(time.DateTime),
})
}
for _, val := range data.Accessories {
res.AccessoryIdentityArray = append(res.AccessoryIdentityArray, val.Identity)
}
for _, val := range data.Tags {
res.TagsData = append(res.TagsData, &pb.TagsItem{
Id: int64(val.ID),
Identity: val.Tags.Identity,
Title: val.Tags.Title,
Intro: val.Tags.Intro,
CoverPath: val.Tags.CoverPath,
CreatedAt: val.Tags.CreatedAt.Format(time.DateTime),
})
}
for _, val := range data.Tags {
res.TagsIdentityArray = append(res.TagsIdentityArray, val.Identity)
}
return res, nil
}
func GetPages(key, val string) (*models.CmsPages, error) {
var pages = models.CmsPages{}
//// 使用事务确保操作
// 查询帖子并更新点击量
err := impl.DBService.Model(&models.CmsPages{}).Debug().Preload("Accessories").Preload("Tags.Tags").
Where(key+" = ?", val).First(&pages).Error
if err != nil {
return nil, err
}
if err := impl.DBService.Model(&models.CmsPages{}).Where("key = ?", val).
UpdateColumn("hits", gorm.Expr("hits + 1")).Error; err != nil {
return nil, err
}
return &pages, err
}

View File

@@ -0,0 +1,63 @@
package pages
import (
"context"
"time"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 获取文章详情 By Key
func GetByKey(ctx context.Context, in *pb.GetPagesByKeyRequest) (reply *pb.PagesItem, err error) {
if in.GetKey() == "" {
return nil, errcode.ErrInvalidArgument
}
data, err := GetPages("key", in.Key)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
var res = &pb.PagesItem{}
if data != nil {
res.Identity = data.Identity
res.Title = data.Title
res.CoverPath = data.CoverPath
res.Content = data.Content
res.Hits = data.Hits
res.HasAccessory = data.HasAccessory
res.CreatedAt = data.CreatedAt.String()
res.UpdatedAt = data.UpdatedAt.String()
res.Description = data.Description
res.PostType = data.Type
}
for _, val := range data.Accessories {
res.AccessoryData = append(res.AccessoryData, &pb.AccessoryItem{
Identity: val.Identity,
Title: val.Title,
FilePath: val.FilePath,
CreatedAt: val.CreatedAt.Format(time.DateTime),
})
}
for _, val := range data.Accessories {
res.AccessoryIdentityArray = append(res.AccessoryIdentityArray, val.Identity)
}
for _, val := range data.Tags {
res.TagsData = append(res.TagsData, &pb.TagsItem{
Id: int64(val.ID),
Identity: val.Tags.Identity,
Title: val.Tags.Title,
Intro: val.Tags.Intro,
CoverPath: val.Tags.CoverPath,
CreatedAt: val.Tags.CreatedAt.Format(time.DateTime),
})
}
for _, val := range data.Tags {
res.TagsIdentityArray = append(res.TagsIdentityArray, val.Identity)
}
return res, nil
}

View File

@@ -0,0 +1,102 @@
package pages
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/types"
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/bsm-sdk/core/vars"
"gorm.io/gorm"
)
// 修改文章
func Modify(ctx context.Context, in *pb.PagesItem) (reply *pb.StatusReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// TODO: valid code
if in.GetSiteIdentity() == "" || in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
var data = &models.CmsPages{
SiteIdentity: in.SiteIdentity,
Title: in.Title,
Key: in.Key,
Description: in.Description,
CoverPath: in.CoverPath,
Content: in.Content,
HasAccessory: in.HasAccessory,
AccessoryIdentityArray: in.AccessoryIdentityArray,
TagsIdentityArray: in.TagsIdentityArray,
}
err = ModifyPages(in.Identity, data, in.AccessoryData, in.TagsIdentityArray)
if err != nil {
return nil, errcode.ErrDB
}
// TODO: add your logic code & delete this line.
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Timeseq: time.Now().UnixMilli(),
}, nil
}
func ModifyPages(identity string, pages *models.CmsPages, accessory []*pb.AccessoryItem, tags []string) (err error) {
var (
accessoryPath = make([]models.CmsAccessory, 0)
tagsData = make([]models.CmsRelateTags, 0)
)
for _, val := range tags {
tagsData = append(tagsData, models.CmsRelateTags{
Identity: utils.ULID(),
PagesIdentity: identity,
TagsIdentity: val,
})
}
for _, v := range accessory {
accessoryPath = append(accessoryPath, models.CmsAccessory{
Std_Identity: types.Std_Identity{Identity: utils.UUID()},
PagesId: pages.ID,
PagesIdentity: identity,
FilePath: v.FilePath,
})
}
return impl.DBService.Transaction(func(tx *gorm.DB) error {
if err = tx.Where("identity = ?", identity).Updates(pages).Error; err != nil {
return err
}
// 删除旧的附件、分类和标签关联
if err := tx.Where("pages_identity = ?", identity).Delete(&models.CmsAccessory{}).Error; err != nil {
return err
}
if err := tx.Where("pages_identity = ?", identity).Delete(&models.CmsRelateTags{}).Error; err != nil {
return err
}
// 创建新的标签关联
if len(tags) != 0 {
if err := tx.Create(&tagsData).Error; err != nil {
return err
}
}
// 创建新的附件关联
if len(accessory) != 0 {
if err := tx.Create(&accessoryPath).Error; err != nil {
return err
}
}
return nil
})
}

View File

@@ -0,0 +1,51 @@
package post
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/types"
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/bsm-sdk/core/vars"
)
// 发布评论
func AddComment(ctx context.Context, in *pb.CommentItem) (*pb.StatusReply, error) {
auth, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
var data = models.CmsComment{
Std_Identity: types.Std_Identity{Identity: utils.ULID()},
PostIdentity: in.PostIdentity,
OwnerIdentity: auth.Identity,
Role: auth.Role,
ParentId: uint(in.ParentId),
ReplyIdentity: in.ReplyIdentity,
Cms: in.Cms,
}
authName := map[string]any{}
err = impl.DBService.Table("mall_staff").Take(&authName, "identity=?", auth.Identity).Error
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
data.OwnerName = authName["name"].(string)
err = models.AddComment(&data, auth.Identity)
if err != nil {
return nil, err
}
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Details: data.Identity,
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,80 @@
package post
import (
"context"
"fmt"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 评论列表
func CommentList(ctx context.Context, in *pb.CommentListRequest) (*pb.CommentListResponse, error) {
var (
page = in.GetPage()
size = in.GetSize()
postIdentity = in.GetPostIdentity()
list = make([]models.CmsComment, 0)
cnt int64 = 0
)
// _, err := service.ParseMetaCtx(ctx, nil)
// if err != nil {
// return nil, err
// }
if in.GetPostIdentity() == "" {
fmt.Println("err = ", in.GetPostIdentity())
return nil, errcode.ErrInvalidArgument
}
if in.GetPage() < 1 {
in.Page = 1
}
if in.GetSize() < 10 {
in.Size = 10
}
if in.GetSize() > 50 {
in.Size = 50
}
// list, cnt, err := logic.CommentList(in.Page, in.Size, in.PostIdentity)
if err := impl.DBService.Model(&models.CmsComment{}).Debug().Where("post_identity = ?", postIdentity).
Order("created_at desc").Preload("Children").Count(&cnt).
Limit(int(size)).Offset(int((page - 1) * size)).Find(&list).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
return &pb.CommentListResponse{
List: GetCommentList(list),
Count: cnt,
}, nil
}
func GetCommentList(list []models.CmsComment) (res []*pb.CommentItem) {
for _, val := range list {
var comment = &pb.CommentItem{
Identity: val.Identity,
PostIdentity: val.PostIdentity,
OwnerName: val.OwnerName,
OwnerIdentity: val.OwnerIdentity,
Role: val.Role,
ParentId: int64(val.ParentId),
Cms: val.Cms,
ReplyIdentity: val.ReplyIdentity,
CreatedAt: val.CreatedAt.Format(time.DateTime),
UpdatedAt: val.UpdatedAt.Format(time.DateTime),
LikeHits: val.LikeHits,
UnlikeHits: val.UnlikeHits,
CommentHits: val.CommentHits,
}
if len(val.Children) != 0 {
comment.List = GetCommentList(val.Children)
}
res = append(res, comment)
}
return res
}

View File

@@ -0,0 +1,74 @@
// Package post 提供文章相关的业务逻辑处理
// 包括文章的创建、修改、删除、查询等功能
package post
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/models"
"git.apinb.com/bsm-apps/cms/internal/utils"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
sdkUtils "git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/bsm-sdk/core/vars"
)
// Create 创建新文章
// 验证用户身份和文章数据,创建文章记录并关联分类、标签、附件等信息
// 参数:
// - ctx: 请求上下文,包含用户身份信息
// - in: 文章数据,包含标题、内容、分类、标签等
//
// 返回:
// - reply: 操作结果包含文章ID和时间戳
// - err: 错误信息
func Create(ctx context.Context, in *pb.PostItem) (reply *pb.StatusReply, err error) {
// 解析请求上下文,获取用户身份信息
authCtx, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// 验证必填字段
if in.GetSiteIdentity() == "" || in.GetTitle() == "" || in.GetContent() == "" || in.GetKey() == "" {
return nil, errcode.ErrInvalidArgument
}
// 构建文章数据模型
var data = &models.CmsPost{
SiteIdentity: in.SiteIdentity,
Title: in.Title,
Hash: utils.FormatKey(in.Key), // 格式化文章键值,确保唯一性
Description: in.Description,
CoverPath: in.CoverPath,
Author: in.Author,
AuthorIdentity: authCtx.Identity, // 设置作者身份标识
Content: in.Content,
TargetUrl: in.TargetUrl,
SourceUrl: in.SourceUrl,
HasAccessory: in.HasAccessory,
Types: in.PostType,
AccessoryIdentityArray: in.AccessoryIdentityArray,
CategoryIdentityArray: in.CategoryIdentityArray,
TagsIdentityArray: in.TagsIdentityArray,
}
// 生成文章唯一标识
data.Identity = sdkUtils.UUID()
// 保存文章数据,包括关联的分类、标签、附件信息
err = models.AddPost(data, in.AccessoryData, in.CategoryIdentityArray, in.TagsIdentityArray)
if err != nil {
return nil, errcode.ErrDB
}
// 返回成功响应
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Details: data.Identity,
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,40 @@
package post
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
)
// 删除文章
func Delete(ctx context.Context, in *pb.IdentRequest) (reply *pb.StatusReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// valildate request id,identity.
if in.Id == 0 && in.Identity == "" {
return nil, errcode.ErrInvalidArgument
}
if in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.DeletePost(in.Identity, "") // Todo:
if err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Code: 0,
Message: "OK",
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,30 @@
package post
import (
"context"
"fmt"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
)
// DeleteComment 删除评论
func DeleteComment(ctx context.Context, in *pb.DeleteCommentRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.DeleteComment(in.Identity)
if err != nil {
fmt.Println()
return nil, errcode.ErrDB
}
return &pb.StatusReply{}, nil
}

View File

@@ -0,0 +1,30 @@
package post
import (
"context"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
)
// DescCommentLike 减少评论点赞数
func DescCommentLike(ctx context.Context, in *pb.CommentOpIdentityRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetCommentIdentity() == "" || in.GetOpIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.IncrOrDescCommentField(in.CommentIdentity, "like_hits", true)
if err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{}, nil
}

View File

@@ -0,0 +1,30 @@
package post
import (
"context"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
)
// DescCommentUnlike 减少评论踩
func DescCommentUnlike(ctx context.Context, in *pb.CommentOpIdentityRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetCommentIdentity() == "" || in.GetOpIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.IncrOrDescCommentField(in.CommentIdentity, "unlike_hits", true)
if err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{}, nil
}

View File

@@ -0,0 +1,31 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
)
// DescPostLike 处理帖子的点赞减少操作
func DescPostLike(ctx context.Context, in *pb.PostOpIdentityRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetOpIdentity() == "" || in.GetPostIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.IncrOrDescPostField(in.PostIdentity, "like_hits", true)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
return &pb.StatusReply{}, nil
}

View File

@@ -0,0 +1,31 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
)
// DescPostUnlike 处理用户取消点赞帖子的操作
func DescPostUnlike(ctx context.Context, in *pb.PostOpIdentityRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetOpIdentity() == "" || in.GetPostIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.IncrOrDescPostField(in.PostIdentity, "unlike_hits", true)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
return &pb.StatusReply{}, nil
}

View File

@@ -0,0 +1,17 @@
package post
import (
"regexp"
"strings"
)
func fmtKey(in string) string {
in = strings.ToLower(in)
in = strings.TrimSpace(in)
re := regexp.MustCompile(`\s+`)
in = re.ReplaceAllString(in, " ")
in = strings.ReplaceAll(in, " ", "-")
return in
}

View File

@@ -0,0 +1,107 @@
package post
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 文章列表
func Fetch(ctx context.Context, in *pb.PostListRequest) (reply *pb.PostListReply, err error) {
if in.GetPage() <= 0 {
in.Page = 1
}
if in.GetSize() <= 0 {
in.Size = 10
}
if in.GetSize() > 50 {
in.Size = 50
}
list, cnt, err := models.PostList(in.Page, in.Size, in.CategoryIdentity, in.Keyword, int64(in.Type))
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
var res = pb.PostListReply{
Count: cnt,
Data: make([]*pb.PostItem, 0),
}
for _, val := range list {
var (
accessoryData = make([]*pb.AccessoryItem, 0)
accessories = make([]string, 0)
categoryData = make([]*pb.CategoryItem, 0)
categories = make([]string, 0)
TagsData = make([]*pb.TagsItem, 0)
tagsIdentityArray = make([]string, 0)
)
for _, accessory := range val.Accessories {
accessoryData = append(accessoryData, &pb.AccessoryItem{
Identity: accessory.Identity,
Title: accessory.Title,
FilePath: accessory.FilePath,
})
accessories = append(accessories, accessory.Identity)
}
for _, category := range val.Categories {
categoryData = append(categoryData, &pb.CategoryItem{
Id: int64(category.Category.ID),
Identity: category.Category.Identity,
ParentId: int64(category.Category.ParentId),
Title: category.Category.Title,
CoverPath: category.Category.CoverPath,
Intro: category.Category.Intro,
})
categories = append(categories, category.CategoryIdentity)
}
for _, tags := range val.Tags {
TagsData = append(TagsData, &pb.TagsItem{
Id: int64(tags.Tags.ID),
Identity: tags.TagsIdentity,
Title: tags.Tags.Title,
Intro: tags.Tags.Intro,
CoverPath: tags.Tags.CoverPath,
})
tagsIdentityArray = append(tagsIdentityArray, tags.TagsIdentity)
}
res.Data = append(res.Data, &pb.PostItem{
Identity: val.Identity,
OwnerId: int64(val.OwnerID),
OwnerIdentity: val.OwnerIdentity,
Title: val.Title,
CoverPath: val.CoverPath,
Author: val.Author,
AuthorIdentity: val.AuthorIdentity,
Content: val.Content,
TargetUrl: val.TargetUrl,
SourceUrl: val.SourceUrl,
Hits: val.Hits,
HasAccessory: val.HasAccessory,
CreatedAt: val.CreatedAt.Format(time.DateTime),
UpdatedAt: val.UpdatedAt.Format(time.DateTime),
Description: val.Description,
LikeHits: val.LikeHits,
UnlikeHits: val.UnlikeHits,
CommentHits: val.CommentHits,
PostType: val.Types,
Key: val.Hash,
Hash: val.Hash,
AccessoryData: accessoryData,
AccessoryIdentityArray: accessories,
CategoryData: categoryData,
CategoryIdentityArray: categories,
TagsData: TagsData,
TagsIdentityArray: tagsIdentityArray,
})
}
return &res, nil
}

View File

@@ -0,0 +1,82 @@
package post
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 获取文章详情 By Identity
func GetByIdentity(ctx context.Context, in *pb.GetPostRequest) (reply *pb.PostItem, err error) {
if in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
data, err := models.GetPost("identity", in.Identity)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
var res = &pb.PostItem{}
if data != nil {
res.Identity = data.Identity
res.OwnerId = int64(data.OwnerID)
res.OwnerIdentity = data.OwnerIdentity
res.Title = data.Title
res.CoverPath = data.CoverPath
res.Author = data.Author
res.AuthorIdentity = data.AuthorIdentity
res.Content = data.Content
res.TargetUrl = data.TargetUrl
res.SourceUrl = data.SourceUrl
res.Hits = data.Hits
res.HasAccessory = data.HasAccessory
res.CreatedAt = data.CreatedAt.String()
res.UpdatedAt = data.UpdatedAt.String()
res.Description = data.Description
res.LikeHits = data.LikeHits
res.UnlikeHits = data.UnlikeHits
res.CommentHits = data.CommentHits
res.PostType = data.Types
res.Key = data.Hash
res.Hash = data.Hash
res.Lang = data.Lang
res.SourceOrigin = data.SourceOrigin
res.Rights = data.Rights
res.ExtendUrl = data.ExtendUrl
res.ExtendData = data.ExtendData
res.ExtendImg = data.ExtendImg
res.ExtendDesc = data.ExtendDesc
res.Published = data.Published.Format(time.DateTime)
}
for _, val := range data.Accessories {
res.AccessoryData = append(res.AccessoryData, &pb.AccessoryItem{
Identity: val.Identity,
Title: val.Title,
FilePath: val.FilePath,
CreatedAt: val.CreatedAt.Format(time.DateTime),
})
}
for _, val := range data.Accessories {
res.AccessoryIdentityArray = append(res.AccessoryIdentityArray, val.Identity)
}
for _, val := range data.Tags {
res.TagsData = append(res.TagsData, &pb.TagsItem{
Id: int64(val.ID),
Identity: val.Tags.Identity,
Title: val.Tags.Title,
Intro: val.Tags.Intro,
CoverPath: val.Tags.CoverPath,
CreatedAt: val.Tags.CreatedAt.Format(time.DateTime),
})
}
for _, val := range data.Tags {
res.TagsIdentityArray = append(res.TagsIdentityArray, val.Tags.Identity)
}
return res, nil
}

View File

@@ -0,0 +1,50 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/models"
"git.apinb.com/bsm-apps/cms/internal/utils"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 获取文章详情 By Key
func GetByKey(ctx context.Context, in *pb.GetPostByKeyRequest) (reply *pb.PostItem, err error) {
if in.GetKey() == "" {
return nil, errcode.ErrInvalidArgument
}
data, err := models.GetPost("hash", utils.FormatKey(in.Key))
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
var res = &pb.PostItem{}
if data != nil {
res.Identity = data.Identity
res.OwnerId = int64(data.OwnerID)
res.OwnerIdentity = data.OwnerIdentity
res.Title = data.Title
res.CoverPath = data.CoverPath
res.Author = data.Author
res.AuthorIdentity = data.AuthorIdentity
res.Content = data.Content
res.TargetUrl = data.TargetUrl
res.SourceUrl = data.SourceUrl
res.Hits = data.Hits
res.HasAccessory = data.HasAccessory
res.CreatedAt = data.CreatedAt.String()
res.UpdatedAt = data.UpdatedAt.String()
res.Description = data.Description
res.LikeHits = data.LikeHits
res.UnlikeHits = data.UnlikeHits
res.CommentHits = data.CommentHits
res.PostType = data.Types
res.Key = data.Hash
res.Hash = data.Hash
}
return res, nil
}

View File

@@ -0,0 +1,41 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/utils"
pb "git.apinb.com/bsm-apps/cms/pb"
)
// IncrCommentLike 评论点赞处理
func IncrCommentLike(ctx context.Context, in *pb.CommentOpIdentityRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
var (
cnt int64 = 0
)
if in.GetCommentIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.IncrOrDescCommentField(in.CommentIdentity, "like_hits", false)
if err != nil {
return nil, errcode.ErrDB
}
if err := impl.DBService.Model(&models.CmsComment{}).Where("identity = ?", in.CommentIdentity).
Pluck("like_hits", &cnt).Error; err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Details: utils.Int642String(cnt),
}, nil
}

View File

@@ -0,0 +1,36 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/utils"
pb "git.apinb.com/bsm-apps/cms/pb"
)
// 评论点踩处理
func IncrCommentUnlike(ctx context.Context, in *pb.CommentOpIdentityRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
var cnt int64
if in.GetCommentIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.IncrOrDescCommentField(in.CommentIdentity, "unlike_hits", false)
if err != nil {
return nil, errcode.ErrDB
}
if err := impl.DBService.Model(&models.CmsComment{}).Where("identity = ?", in.CommentIdentity).
Pluck("unlike_hits", &cnt).Error; err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Details: utils.Int642String(cnt),
}, nil
}

View File

@@ -0,0 +1,50 @@
// Package post 提供文章相关的业务逻辑处理
// 包括文章的创建、修改、删除、查询、点赞等功能
package post
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
)
// IncrPostLike 增加文章点赞数
// 验证用户身份后,增加指定文章的点赞计数
// 参数:
// - ctx: 请求上下文,包含用户身份信息
// - in: 操作请求包含操作ID和文章ID
//
// 返回:
// - *pb.StatusReply: 操作结果
// - error: 错误信息
func IncrPostLike(ctx context.Context, in *pb.PostOpIdentityRequest) (*pb.StatusReply, error) {
// 解析请求上下文,验证用户身份
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// 验证必填参数
if in.GetOpIdentity() == "" || in.GetPostIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
// 增加文章点赞数
err = models.IncrOrDescPostField(in.PostIdentity, "like_hits", false)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
// 返回成功响应
return &pb.StatusReply{
Code: 0,
Message: "OK",
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,29 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
)
// 文章点踩处理
func IncrPostUnlike(ctx context.Context, in *pb.PostOpIdentityRequest) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetOpIdentity() == "" || in.GetPostIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
err = models.IncrOrDescPostField(in.PostIdentity, "unlike_hits", false)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
return &pb.StatusReply{}, nil
}

View File

@@ -0,0 +1,54 @@
package post
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/models"
"git.apinb.com/bsm-apps/cms/internal/utils"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
)
// 修改文章
func Modify(ctx context.Context, in *pb.PostItem) (reply *pb.StatusReply, err error) {
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetSiteIdentity() == "" || in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
var data = &models.CmsPost{
SiteIdentity: in.SiteIdentity,
Title: in.Title,
Description: in.Description,
CoverPath: in.CoverPath,
Author: in.Author,
Content: in.Content,
TargetUrl: in.TargetUrl,
SourceUrl: in.SourceUrl,
HasAccessory: in.HasAccessory,
Types: in.PostType,
Hash: utils.FormatKey(in.Key),
Lang: in.Lang,
SourceOrigin: in.SourceOrigin,
Rights: in.Rights,
ExtendUrl: in.ExtendUrl,
ExtendData: in.ExtendData,
ExtendImg: in.ExtendImg,
ExtendDesc: in.ExtendDesc,
}
err = models.ModifyPost(in.Identity, data, in.AccessoryIdentityArray, in.CategoryIdentityArray, in.TagsIdentityArray)
if err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Code: 0,
Message: "OK",
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,37 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/types"
pb "git.apinb.com/bsm-apps/cms/pb"
)
// 修改评论
func ModifyComment(ctx context.Context, in *pb.CommentItem) (*pb.StatusReply, error) {
_, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
var data = models.CmsComment{
Std_Identity: types.Std_Identity{Identity: in.Identity},
PostIdentity: in.PostIdentity,
ParentId: uint(in.ParentId),
ReplyIdentity: in.ReplyIdentity,
Cms: in.Cms,
}
// err = logic.ModifyComment(&data)
if err := impl.DBService.Where("identity = ?", data.Identity).Updates(data).Error; err != nil {
return nil, err
}
return &pb.StatusReply{}, nil
}

View File

@@ -0,0 +1,74 @@
package post
import (
"context"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
)
// 搜索文章
func Search(ctx context.Context, in *pb.SearchRequest) (reply *pb.PostListReply, err error) {
if in.GetKeyword() == "" {
return nil, errcode.ErrInvalidArgument
}
var (
cnt int64 = 0
pageNo int64 = in.GetPageNo()
pageSize int64 = in.GetPageSize()
offset int64 = (pageNo - 1) * pageSize
)
// vlidate request page_no,page_size.
if pageNo < 1 {
pageNo = 1
offset = 0
}
if pageSize < 50 {
pageSize = 50
offset = (pageNo - 1) * pageSize
}
var data []*models.CmsPost
tx := impl.DBService.Model(&models.CmsPost{}).Where("title like ? or Cms like ?", "%"+in.Keyword+"%", "%"+in.Keyword+"%")
if err := tx.Count(&cnt).Offset(int(offset)).Limit(int(pageSize)).Find(&data).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
replyData := make([]*pb.PostItem, len(data))
for _, val := range data {
replyData = append(replyData, &pb.PostItem{
Identity: val.Identity,
OwnerId: int64(val.OwnerID),
OwnerIdentity: val.OwnerIdentity,
Title: val.Title,
CoverPath: val.CoverPath,
Author: val.Author,
AuthorIdentity: val.AuthorIdentity,
Content: val.Content,
TargetUrl: val.TargetUrl,
SourceUrl: val.SourceUrl,
Hits: val.Hits,
HasAccessory: val.HasAccessory,
CreatedAt: val.CreatedAt.String(),
UpdatedAt: val.UpdatedAt.String(),
Description: val.Description,
LikeHits: val.LikeHits,
UnlikeHits: val.UnlikeHits,
CommentHits: val.CommentHits,
PostType: val.Types,
Key: val.Hash,
Hash: val.Hash,
})
}
return &pb.PostListReply{
Count: cnt,
Data: replyData,
}, nil
}

View File

@@ -0,0 +1,29 @@
package site
import (
"context"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/vars"
"time"
)
// 添加站点
func Create(ctx context.Context, in *pb.SiteItem) (reply *pb.StatusReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// TODO: valid code
// TODO: add your logic code & delete this line.
return &pb.StatusReply{
Details: vars.OK,
Timeseq: time.Now().UnixMilli(),
}, nil
}

View File

@@ -0,0 +1,34 @@
package site
import (
"context"
"time"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/vars"
)
// 删除站点
func Delete(ctx context.Context, in *pb.IdentRequest) (reply *pb.StatusReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// valildate request id,identity.
if in.Id == 0 && in.Identity == "" {
return nil, errcode.ErrInvalidArgument
}
// TODO: add your logic code & delete this line.
return &pb.StatusReply{
Details: vars.OK,
Timeseq: time.Now().UnixMilli(),
}, nil
}

View File

@@ -0,0 +1,23 @@
package site
import (
"context"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/service"
)
// 站点列表
func Fetch(ctx context.Context, in *pb.Empty) (reply *pb.SiteListReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// TODO: valid code
// TODO: add your logic code & delete this line.
return
}

View File

@@ -0,0 +1,27 @@
package site
import (
"context"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
)
// 站点详情
func Get(ctx context.Context, in *pb.IdentRequest) (reply *pb.SiteItem, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// valildate request id,identity.
if in.Id == 0 && in.Identity == "" {
return nil, errcode.ErrInvalidArgument
}
// TODO: add your logic code & delete this line.
return
}

View File

@@ -0,0 +1,30 @@
package site
import (
"context"
"time"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/vars"
)
// 修改站点
func Modify(ctx context.Context, in *pb.SiteItem) (reply *pb.StatusReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// TODO: valid code
// TODO: add your logic code & delete this line.
return &pb.StatusReply{
Details: vars.OK,
Timeseq: time.Now().UnixMilli(),
}, nil
}

View File

@@ -0,0 +1,50 @@
package tags
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/types"
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/bsm-sdk/core/vars"
)
// 创建标签
func Create(ctx context.Context, in *pb.TagsItem) (reply *pb.StatusReply, err error) {
var cnt int64 = 0
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetTitle() == "" || in.GetCoverPath() == "" || in.GetIntro() == "" {
return nil, errcode.ErrInvalidArgument
}
if err := impl.DBService.Model(&models.CmsTags{}).Where("title = ?", in.Title).First(&models.CmsTags{}).Error; err == nil {
return nil, errcode.ErrDB
}
if cnt > 0 {
return nil, errcode.ErrAlreadyExists
}
var data = &models.CmsTags{
Std_Identity: types.Std_Identity{Identity: utils.UUID()},
Title: in.Title,
CoverPath: in.CoverPath,
Intro: in.Intro,
}
if err := impl.DBService.Model(&models.CmsTags{}).Create(data).Error; err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Code: 0,
Message: vars.OK,
Details: data.Identity,
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,34 @@
package tags
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
)
// 删除标签
func Delete(ctx context.Context, in *pb.IdentRequest) (reply *pb.StatusReply, err error) {
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
if err := impl.DBService.Where("identity = ?", in.GetIdentity()).Delete(&models.CmsTags{}).Error; err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Code: 0,
Message: "OK",
Timeseq: time.Now().Unix(),
}, nil
}

View File

@@ -0,0 +1,39 @@
package tags
import (
"context"
"fmt"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
)
// 标签列表
func Fetch(ctx context.Context, in *pb.IdentRequest) (reply *pb.TagsListReply, err error) {
var (
tags = make([]*models.CmsTags, 0)
cnt int64 = 0
)
if err := impl.DBService.Model(&models.CmsTags{}).Order("created_at desc").Count(&cnt).Find(&tags).Error; err != nil {
fmt.Println("err = ", err)
return nil, errcode.ErrDB
}
var res = &pb.TagsListReply{
Count: cnt,
Data: make([]*pb.TagsItem, 0, len(tags)),
}
for _, v := range tags {
res.Data = append(res.Data, &pb.TagsItem{
Id: int64(v.ID),
Identity: v.Identity,
Title: v.Title,
Intro: v.Intro,
CoverPath: v.CoverPath,
})
}
return res, nil
}

View File

@@ -0,0 +1,45 @@
package tags
import (
"context"
"time"
"git.apinb.com/bsm-apps/cms/internal/impl"
"git.apinb.com/bsm-apps/cms/internal/models"
pb "git.apinb.com/bsm-apps/cms/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/types"
)
// 修改标签
func Modify(ctx context.Context, in *pb.TagsItem) (reply *pb.StatusReply, err error) {
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetTitle() == "" || in.GetCoverPath() == "" || in.GetIntro() == "" {
return nil, errcode.ErrInvalidArgument
}
var tagsData = &models.CmsTags{
Title: in.Title,
CoverPath: in.CoverPath,
Intro: in.Intro,
Std_Identity: types.Std_Identity{Identity: in.Identity},
}
// err = logic.ModifyTags(tagsData)
if err := impl.DBService.Where("identity = ?", tagsData.Identity).Updates(tagsData).Error; err != nil {
return nil, errcode.ErrDB
}
return &pb.StatusReply{
Code: 0,
Message: "OK",
Timeseq: time.Now().Unix(),
}, nil
}