bindbox-game/internal/api/keyword/keyword_material_create.go
2025-10-16 16:20:18 +08:00

144 lines
4.3 KiB
Go

package keyword
import (
"fmt"
"net/http"
"strconv"
"time"
"mini-chat/internal/code"
"mini-chat/internal/pkg/core"
"mini-chat/internal/pkg/validation"
"mini-chat/internal/repository/mysql/model"
"gorm.io/gorm"
)
type keywordMaterial struct {
Type int32 `json:"type" binding:"required"` // 素材类型(1:文本 2:图片)
Content string `json:"content" binding:"required"` // 素材内容
IntervalSeconds int32 `json:"interval_seconds" binding:"required"` // 发送间隔时间(单位:秒)
}
type createKeywordMaterialRequest struct {
MaterialList []keywordMaterial `json:"material_list" binding:"required"` // 素材列表
}
type createKeywordMaterialResponse struct {
Message string `json:"message"` // 提示信息
}
// CreateKeywordMaterial 配置意图关键字素材
// @Summary 配置意图关键字素材
// @Description 配置意图关键字素材
// @Tags 管理端.意图关键字
// @Accept json
// @Produce json
// @Param id path string true "编号ID"
// @Param RequestBody body createKeywordMaterialRequest true "请求参数"
// @Success 200 {object} createKeywordMaterialResponse
// @Failure 400 {object} code.Failure
// @Router /admin/app/keyword/material/{id} [post]
// @Security LoginVerifyToken
func (h *handler) CreateKeywordMaterial() core.HandlerFunc {
return func(ctx core.Context) {
req := new(createKeywordMaterialRequest)
res := new(createKeywordMaterialResponse)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ParamBindError,
validation.Error(err)),
)
return
}
ID, err := strconv.Atoi(ctx.Param("id"))
if err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.ParamBindError,
"未传递编号ID。"),
)
return
}
if len(req.MaterialList) == 0 {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.CreateKeywordMaterialError,
fmt.Sprintf("%s: 未配置素材", code.Text(code.CreateKeywordMaterialError))),
)
return
}
info, err := h.readDB.AppKeyword.WithContext(ctx.RequestContext()).
Where(h.readDB.AppKeyword.ID.Eq(int32(ID))).
First()
if err != nil && err != gorm.ErrRecordNotFound {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.CreateKeywordMaterialError,
fmt.Sprintf("%s: %s", code.Text(code.CreateKeywordMaterialError), err.Error())),
)
return
}
if info == nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.CreateKeywordMaterialError,
fmt.Sprintf("%s: 意图关键字编号(%d)不存在。", code.Text(code.CreateKeywordMaterialError), ID)),
)
return
}
// 先删除旧数据
if _, err := h.writeDB.AppKeywordReply.WithContext(ctx.RequestContext()).
Where(h.writeDB.AppKeywordReply.KeywordID.Eq(int32(ID))).
Delete(); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.CreateKeywordMaterialError,
fmt.Sprintf("%s: %s", code.Text(code.CreateKeywordMaterialError), err.Error())),
)
return
}
var keywordMaterials []*model.AppKeywordReply
for i := 0; i < len(req.MaterialList); i++ {
if req.MaterialList[i].Type == 0 || req.MaterialList[i].Content == "" || req.MaterialList[i].IntervalSeconds == 0 {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.CreateKeywordMaterialError,
fmt.Sprintf("%s: 配置素材数据不完整,请检查。", code.Text(code.CreateKeywordMaterialError))),
)
return
}
keywordMaterials = append(keywordMaterials, &model.AppKeywordReply{
KeywordID: int32(ID),
AppID: info.AppID,
Type: req.MaterialList[i].Type,
Content: req.MaterialList[i].Content,
IntervalSeconds: req.MaterialList[i].IntervalSeconds,
CreatedUser: ctx.SessionUserInfo().UserName,
CreatedAt: time.Now(),
})
}
// 批量插入
if err := h.writeDB.AppKeywordReply.WithContext(ctx.RequestContext()).CreateInBatches(keywordMaterials, len(req.MaterialList)); err != nil {
ctx.AbortWithError(core.Error(
http.StatusBadRequest,
code.CreateKeywordMaterialError,
fmt.Sprintf("%s: %s", code.Text(code.CreateKeywordMaterialError), err.Error())),
)
return
}
res.Message = "操作成功"
ctx.Payload(res)
}
}