115 lines
3.9 KiB
Go
115 lines
3.9 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 UpdateSpeakerLogic struct {
|
||
logx.Logger
|
||
ctx context.Context
|
||
cfg *config.Config
|
||
model model.MeetingSpeakerModel
|
||
meetingmodel model2.MeetingModel
|
||
}
|
||
|
||
func NewUpdateSpeakerLogic(ctx context.Context, cfg *config.Config, model model.MeetingSpeakerModel, meetingmodel model2.MeetingModel) *UpdateSpeakerLogic {
|
||
return &UpdateSpeakerLogic{
|
||
Logger: logx.WithContext(ctx),
|
||
ctx: ctx,
|
||
cfg: cfg,
|
||
model: model,
|
||
meetingmodel: meetingmodel,
|
||
}
|
||
}
|
||
|
||
func (l *UpdateSpeakerLogic) UpdateSpeaker(req *types.UpdateSpeakerReq) (resp *types.UpdateSpeakerResp, err error) {
|
||
// 1. 基础参数校验(严格对齐字段类型与校验规则)
|
||
// 1.1 嘉宾ID必填且有效
|
||
if req.Id <= 0 {
|
||
return nil, errors.New("嘉宾ID无效,请传入正整数")
|
||
}
|
||
// 1.2 姓名:传入则需非空且长度≤100字(适配 validate:min=1,max=100)
|
||
if req.Name != "" && len(req.Name) > 100 {
|
||
return nil, errors.New("嘉宾姓名长度不能超过100字")
|
||
}
|
||
// 1.4 排序:传入则需非负(req.Sort为int,转int64适配模型)
|
||
if req.Sort < 0 {
|
||
return nil, errors.New("排序值不能为负数")
|
||
}
|
||
// 1.5 头衔/头像URL长度限制
|
||
if len(req.Title) > 200 {
|
||
return nil, errors.New("嘉宾头衔长度不能超过200字")
|
||
}
|
||
if len(req.Avatar) > 512 {
|
||
return nil, errors.New("头像URL长度不能超过512字符")
|
||
}
|
||
|
||
// 2. 校验嘉宾是否存在(未被软删除)
|
||
existingSpeaker, err := l.model.FindOne(l.ctx, req.Id)
|
||
if err != nil {
|
||
if err == model.ErrNotFound {
|
||
return nil, errors.New("嘉宾不存在或已被删除,无法更新")
|
||
}
|
||
l.Logger.Errorf("查询嘉宾失败(ID: %d):%v", req.Id, err)
|
||
return nil, errors.New("更新嘉宾失败,请重试")
|
||
}
|
||
|
||
// 4. 构造更新数据(仅更新用户明确传入的有效字段,对齐模型字段类型)
|
||
updateData := &model.MeetingSpeaker{
|
||
Id: req.Id,
|
||
MeetingId: existingSpeaker.MeetingId,
|
||
Name: existingSpeaker.Name,
|
||
Title: existingSpeaker.Title,
|
||
Avatar: existingSpeaker.Avatar,
|
||
Sort: existingSpeaker.Sort, // 模型中为int64
|
||
Intro: existingSpeaker.Intro, // 模型中为sql.NullString
|
||
}
|
||
|
||
// 4.1 覆盖用户主动更新的字段(非默认值即视为更新)
|
||
if req.Name != "" { // 非空表示主动更新姓名(已通过非空校验)
|
||
updateData.Name = req.Name
|
||
}
|
||
if req.Title != "" { // 非空表示主动更新头衔
|
||
updateData.Title = req.Title
|
||
}
|
||
if req.Avatar != "" { // 非空表示主动更新头像URL
|
||
updateData.Avatar = req.Avatar
|
||
}
|
||
if req.Sort != 0 { // 非0表示主动更新排序(int转int64适配模型)
|
||
updateData.Sort = int64(req.Sort)
|
||
}
|
||
// 4.2 处理Intro(sql.NullString类型):与原始值不同则更新(含主动传空字符串)
|
||
if req.Intro != existingSpeaker.Intro.String {
|
||
updateData.Intro = sql.NullString{
|
||
String: req.Intro,
|
||
Valid: true, // 主动传入即标记为有效(空字符串也视为有效数据)
|
||
}
|
||
// 若业务需将空字符串存为数据库NULL,可改为:
|
||
// updateData.Intro.Valid = req.Intro != ""
|
||
}
|
||
|
||
// 5. 执行更新操作(调用模型层Update方法,字段顺序完全匹配)
|
||
err = l.model.Update(l.ctx, updateData)
|
||
if err != nil {
|
||
l.Logger.Errorf("更新嘉宾失败(ID: %d):%v", req.Id, err)
|
||
return nil, errors.New("更新嘉宾失败,请重试")
|
||
}
|
||
|
||
// 6. 构造响应
|
||
return &types.UpdateSpeakerResp{
|
||
Msg: "嘉宾信息更新成功",
|
||
}, nil
|
||
}
|