完成speaker后端

This commit is contained in:
2025-10-29 11:09:43 +08:00
parent 70ca97bff2
commit b7309dec47
10 changed files with 301 additions and 48 deletions

View File

@@ -5,8 +5,11 @@ 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"
@@ -15,22 +18,86 @@ import (
type CreateSpeakerLogic struct {
logx.Logger
ctx context.Context
cfg *config.Config
model model.MeetingSpeakerModel
ctx context.Context
cfg *config.Config
model model.MeetingSpeakerModel
meetingmodel model2.MeetingModel
}
func NewCreateSpeakerLogic(ctx context.Context, cfg *config.Config, model model.MeetingSpeakerModel) *CreateSpeakerLogic {
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,
Logger: logx.WithContext(ctx),
ctx: ctx,
cfg: cfg,
model: model,
meetingmodel: meetingmodel,
}
}
func (l *CreateSpeakerLogic) CreateSpeaker(req *types.CreateSpeakerReq) (resp *types.CreateSpeakerResp, err error) {
// todo: add your logic here and delete this line
// 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("排序值不能为负数")
}
return
// 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
}