Files
hldrCenter/server/internal/meetingspeaker/internal/logic/meeting_speaker/createspeakerlogic.go
2025-10-29 11:09:43 +08:00

104 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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
}