Files
be.ems/features/ue/cb_message/controller.go
T
2025-07-15 16:26:21 +08:00

287 lines
7.3 KiB
Go

package cb_message
import (
"encoding/json"
"io"
"strconv"
"time"
"be.ems/src/framework/i18n"
"be.ems/src/framework/middleware"
"be.ems/src/framework/utils/ctx"
"be.ems/src/framework/vo/result"
"github.com/gin-gonic/gin"
)
// @Description Register Routes for mf calling
func Register(r *gin.RouterGroup) {
cbGroup := r.Group("/:neId")
{
var m *CBMessage
cbGroup.GET("/message/list",
middleware.PreAuthorize(nil),
m.List,
)
cbGroup.GET("/message/:id",
middleware.PreAuthorize(nil),
m.GetById,
)
cbGroup.POST("/message",
middleware.PreAuthorize(nil),
m.Insert,
)
cbGroup.PUT("/message/:id/:status",
middleware.PreAuthorize(nil),
m.UpdateStatus,
)
cbGroup.PUT("/message/:id",
middleware.PreAuthorize(nil),
m.Update,
)
cbGroup.DELETE("/message/:id",
middleware.PreAuthorize(nil),
m.Delete,
)
}
}
func (m *CBMessage) List(c *gin.Context) {
language := ctx.AcceptLanguage(c)
neId := c.Param("neId")
if neId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
var query CBMessageQuery
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
query.NeType = "CBC"
query.NeId = neId
service := NewCBMessageService()
data, total, err := service.SelectCBMessage(query)
if err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
// 转换数据格式,确保 MessageJson 正确序列化
processedData := make([]map[string]interface{}, len(data))
for i, msg := range data {
var messageJson interface{}
if len(msg.MessageJson) > 0 {
// 尝试解析为 JSON 对象
if err := json.Unmarshal(msg.MessageJson, &messageJson); err != nil {
// 如果解析失败,就作为字符串
messageJson = string(msg.MessageJson)
}
}
processedData[i] = map[string]interface{}{
"id": msg.Id,
"neType": msg.NeType,
"neId": msg.NeId,
"messageJson": messageJson, // 这里是解析后的 JSON 对象
"status": msg.Status.Enum(),
"detail": msg.Detail,
"createdAt": msg.CreatedAt,
"updatedAt": msg.UpdatedAt,
}
}
c.JSON(200, result.Ok(gin.H{
"total": total,
"data": processedData,
}))
}
// Update 更新CB消息
func (m *CBMessage) Insert(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 绑定请求体
var msg CBMessage
msg.NeType = "CBC"
msg.NeId = c.Param("neId")
msg.Status = CBEventStatusInactive // 默认状态为 INACTIVE
if msg.NeId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
msg.CreatedAt = time.Now().Local().UnixMicro()
msg.UpdatedAt = nil // 新增时更新时间为nil
// 直接读取body为json.RawMessage
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
msg.MessageJson = json.RawMessage(body)
service := NewCBMessageService()
if err := service.InsertCBMessage(msg); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// Update 更新CB消息
func (m *CBMessage) Update(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 获取路径参数
messageId := c.Param("id")
if messageId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(messageId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
// 直接读取body为json.RawMessage
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
messageJson := json.RawMessage(body)
service := NewCBMessageService()
if err := service.UpdateCBMessage(id, messageJson); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// UpdateStatus 更新CB消息状态
// 这里的 neId 参数是为了兼容性,实际更新状态时不需要使用它
// 但为了保持与原有接口一致,仍然保留该参数
// 如果需要根据 neId 进行特定的逻辑处理,可以在服务层实现
// 但在当前实现中,neId 仅用于验证请求的有效性
// 实际的状态更新逻辑不依赖于 neId
// 该接口用于更新 CB 消息的状态,状态值通过查询参数传递
// 例如:PUT /:neId/message/status?status=ACTIVE
func (m *CBMessage) UpdateStatus(c *gin.Context) {
language := ctx.AcceptLanguage(c)
neId := c.Param("neId")
status := c.Param("status")
if neId == "" || status == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
messageId := c.Param("id")
if messageId != "" {
id, err := strconv.ParseInt(messageId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
// 如果提供了 messageId,则更新特定消息的状态
service := NewCBMessageService()
if err := service.UpdateCBMessageStatus(id, status); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
return
}
// 如果没有提供 messageId,则更新所有消息的状态
service := NewCBMessageService()
if err := service.UpdateCBMessageStatusByNeId(neId, status); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// Delete 删除CB消息
func (m *CBMessage) Delete(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 获取路径参数
messageId := c.Param("id")
if messageId == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(messageId, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
service := NewCBMessageService()
if err := service.DeleteCBMessage(id); err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
c.JSON(200, result.Ok(nil))
}
// GetById 根据ID获取CB消息
func (m *CBMessage) GetById(c *gin.Context) {
language := ctx.AcceptLanguage(c)
// 获取路径参数
idStr := c.Param("id")
if idStr == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
id, err := strconv.ParseInt(idStr, 10, 64)
if err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
service := NewCBMessageService()
data, err := service.SelectCBMessageById(id)
if err != nil {
c.JSON(500, result.ErrMsg(err.Error()))
return
}
if data == nil {
c.JSON(404, result.CodeMsg(404, i18n.TKey(language, "app.common.err404")))
return
}
// 转换数据格式,确保 MessageJson 正确序列化
var messageJson interface{}
if len(data.MessageJson) > 0 {
// 尝试解析为 JSON 对象
if err := json.Unmarshal(data.MessageJson, &messageJson); err != nil {
// 如果解析失败,就作为字符串
messageJson = string(data.MessageJson)
}
}
processedData := map[string]interface{}{
"id": data.Id,
"neType": data.NeType,
"neId": data.NeId,
"messageJson": messageJson, // 这里是解析后的 JSON 对象
"status": data.Status.Enum(),
"detail": data.Detail,
"createdAt": data.CreatedAt,
"updatedAt": data.UpdatedAt,
}
c.JSON(200, result.Ok(gin.H{
"data": processedData,
}))
}