104 lines
3.7 KiB
Go
104 lines
3.7 KiB
Go
// Code scaffolded by goctl. Safe to edit.
|
||
// goctl 1.9.1
|
||
|
||
package meeting_speaker
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"errors"
|
||
|
||
"github.com/JACKYMYPERSON/hldrCenter/config"
|
||
model2 "github.com/JACKYMYPERSON/hldrCenter/internal/meetingspeaker/internal/meetingmodel"
|
||
"github.com/JACKYMYPERSON/hldrCenter/internal/meetingspeaker/internal/model"
|
||
"github.com/JACKYMYPERSON/hldrCenter/internal/meetingspeaker/internal/types"
|
||
|
||
"github.com/zeromicro/go-zero/core/logx"
|
||
)
|
||
|
||
type CreateSpeakerLogic struct {
|
||
logx.Logger
|
||
ctx context.Context
|
||
cfg *config.Config
|
||
model model.MeetingSpeakerModel
|
||
meetingmodel model2.MeetingModel
|
||
}
|
||
|
||
func NewCreateSpeakerLogic(ctx context.Context, cfg *config.Config, model model.MeetingSpeakerModel, meetingmodel model2.MeetingModel) *CreateSpeakerLogic {
|
||
return &CreateSpeakerLogic{
|
||
Logger: logx.WithContext(ctx),
|
||
ctx: ctx,
|
||
cfg: cfg,
|
||
model: model,
|
||
meetingmodel: meetingmodel,
|
||
}
|
||
}
|
||
|
||
func (l *CreateSpeakerLogic) CreateSpeaker(req *types.CreateSpeakerReq) (resp *types.CreateSpeakerResp, err error) {
|
||
// 1. 基础参数二次校验(补充 validate 未覆盖的业务逻辑)
|
||
if req.MeetingId <= 0 {
|
||
return nil, errors.New("会议ID无效,需传入正整数")
|
||
}
|
||
if len(req.Name) == 0 || len(req.Name) > 100 {
|
||
return nil, errors.New("嘉宾姓名必填且长度不能超过100字")
|
||
}
|
||
if req.Title != "" && len(req.Title) > 200 {
|
||
return nil, errors.New("嘉宾头衔长度不能超过200字")
|
||
}
|
||
if req.Avatar != "" && len(req.Avatar) > 512 {
|
||
return nil, errors.New("头像URL长度不能超过512字符")
|
||
}
|
||
// 排序字段默认0(未传时设为0,符合非负整数要求)
|
||
if req.Sort < 0 {
|
||
return nil, errors.New("排序值不能为负数")
|
||
}
|
||
|
||
// 2. 校验关联会议是否存在(且未被删除)
|
||
_, err = l.meetingmodel.FindOne(l.ctx, req.MeetingId)
|
||
if err != nil {
|
||
if err == model.ErrNotFound {
|
||
return nil, errors.New("关联的会议不存在或已被删除")
|
||
}
|
||
l.Logger.Errorf("查询关联会议失败(MeetingId: %d):%v", req.MeetingId, err)
|
||
return nil, errors.New("创建嘉宾失败,请重试")
|
||
}
|
||
|
||
// 3. 构造数据库模型数据(字段一一对应)
|
||
speaker := &model.MeetingSpeaker{
|
||
MeetingId: req.MeetingId,
|
||
Name: req.Name,
|
||
Title: req.Title, // 可选字段,空字符串直接存储
|
||
Avatar: req.Avatar,
|
||
Intro: sql.NullString{
|
||
String: req.Intro, // 赋值实际字符串
|
||
Valid: req.Intro != "", // 若不为空字符串,则设为有效(存实际值);若为空,则设为无效(存 NULL)
|
||
}, // 长文本字段,支持空值
|
||
Sort: int64(req.Sort), // 未传时默认0,符合业务预期
|
||
// 若模型包含 CreateTime/UpdateTime/IsDelete,无需手动赋值(数据库自动处理)
|
||
}
|
||
|
||
// 4. 处理特殊字段(若模型中 Intro 为 sql.NullString 类型,需转换)
|
||
// 注:根据 Insert 方法参数推断 Intro 为 string 类型,若为 sql.NullString 则替换为:
|
||
// Intro: sql.NullString{String: req.Intro, Valid: req.Intro != ""},
|
||
|
||
// 5. 调用模型层插入嘉宾数据
|
||
result, err := l.model.Insert(l.ctx, speaker)
|
||
if err != nil {
|
||
l.Logger.Errorf("创建会议嘉宾失败(MeetingId: %d, Name: %s):%v", req.MeetingId, req.Name, err)
|
||
return nil, errors.New("创建嘉宾失败,请重试")
|
||
}
|
||
|
||
// 6. 获取新增嘉宾的主键ID(用于响应返回)
|
||
speakerId, err := result.LastInsertId()
|
||
if err != nil {
|
||
l.Logger.Errorf("获取嘉宾ID失败(MeetingId: %d, Name: %s):%v", req.MeetingId, req.Name, err)
|
||
return nil, errors.New("嘉宾创建成功,但获取ID失败")
|
||
}
|
||
|
||
// 7. 构造响应结果
|
||
return &types.CreateSpeakerResp{
|
||
Msg: "会议嘉宾创建成功",
|
||
SpeakerId: speakerId,
|
||
}, nil
|
||
}
|