144 lines
4.3 KiB
Go
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)
|
|
}
|
|
}
|