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

115 lines
3.9 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 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 处理Introsql.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
}