initial commit
This commit is contained in:
118
category/internal/logic/createcategorylogic.go
Normal file
118
category/internal/logic/createcategorylogic.go
Normal file
@ -0,0 +1,118 @@
|
||||
package logic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"godemo/category/category"
|
||||
"godemo/category/internal/model"
|
||||
"godemo/category/internal/svc"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
type CreateCategoryLogic struct {
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
logx.Logger
|
||||
}
|
||||
|
||||
func NewCreateCategoryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateCategoryLogic {
|
||||
return &CreateCategoryLogic{
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
Logger: logx.WithContext(ctx),
|
||||
}
|
||||
}
|
||||
|
||||
func (l *CreateCategoryLogic) CreateCategory(in *category.CreateCategoryRequest) (*category.CategoryInfoResponse, error) {
|
||||
// 参数校验
|
||||
if in.SystemId == "" || in.Name == "" {
|
||||
return nil, status.Error(codes.InvalidArgument, "system_id 和 name 不能为空")
|
||||
}
|
||||
|
||||
// 检查唯一性
|
||||
exists, err := l.checkCategoryExists(in)
|
||||
if err != nil {
|
||||
logx.Error("唯一性检查失败: ", err)
|
||||
return nil, status.Error(codes.Internal, "内部错误")
|
||||
}
|
||||
if exists {
|
||||
return nil, status.Error(codes.AlreadyExists, "分类已存在")
|
||||
}
|
||||
|
||||
// 构建模型
|
||||
newCategory := &model.Categories{
|
||||
Id: uuid.New().String(),
|
||||
SystemId: in.SystemId,
|
||||
Name: in.Name,
|
||||
Alias: toNullString(in.Alias),
|
||||
ParentId: toNullString(in.ParentId),
|
||||
Description: toNullString(in.Description),
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: sql.NullTime{Time: time.Now(), Valid: true},
|
||||
}
|
||||
|
||||
// 插入数据库
|
||||
if _, err := l.svcCtx.CategoryModel.Insert(l.ctx, newCategory); err != nil {
|
||||
logx.Error("插入失败: ", err)
|
||||
return nil, status.Error(codes.Internal, "创建分类失败")
|
||||
}
|
||||
|
||||
// 返回响应
|
||||
return &category.CategoryInfoResponse{
|
||||
Category: &category.CategoryInfo{
|
||||
Id: newCategory.Id,
|
||||
SystemId: newCategory.SystemId,
|
||||
Name: newCategory.Name,
|
||||
Alias: in.Alias,
|
||||
ParentId: in.ParentId,
|
||||
Description: in.Description,
|
||||
CreatedAt: newCategory.CreatedAt.Unix(),
|
||||
UpdatedAt: newCategory.UpdatedAt.Time.Unix(),
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 空字符串转换为 sql.NullString
|
||||
func toNullString(s string) sql.NullString {
|
||||
return sql.NullString{String: s, Valid: s != ""}
|
||||
}
|
||||
|
||||
// 唯一性检查逻辑
|
||||
func (l *CreateCategoryLogic) checkCategoryExists(in *category.CreateCategoryRequest) (bool, error) {
|
||||
// 检查名称唯一性
|
||||
_, err := l.svcCtx.CategoryModel.FindBySystemParentName(
|
||||
l.ctx,
|
||||
in.SystemId,
|
||||
in.ParentId,
|
||||
in.Name,
|
||||
)
|
||||
if err == nil {
|
||||
return true, nil
|
||||
} else if !errors.Is(err, model.ErrNotFound) {
|
||||
return false, err
|
||||
}
|
||||
|
||||
// 检查别名唯一性(如果提供了别名)
|
||||
if in.Alias != "" {
|
||||
_, err := l.svcCtx.CategoryModel.FindBySystemParentAlias(
|
||||
l.ctx,
|
||||
in.SystemId,
|
||||
in.ParentId,
|
||||
in.Alias,
|
||||
)
|
||||
if err == nil {
|
||||
return true, nil
|
||||
} else if !errors.Is(err, model.ErrNotFound) {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
|
||||
return false, nil
|
||||
}
|
||||
Reference in New Issue
Block a user