package controller import ( "net/http" "strings" "time" "gat1400Exchange/config" "gat1400Exchange/pkg/logger" "gat1400Exchange/repository" "gat1400Exchange/vo" "github.com/gin-gonic/gin" ) type SubscribeController struct { Repository repository.SubscribeRepository Capture repository.CaptureRepository Ape repository.ApeRepository } // 构造函数 func NewSubscribeController() SubscribeController { svr := repository.NewSubscribeRepository() svr1 := repository.NewCaptureRepository() svr2 := repository.NewApeRepository() controller := SubscribeController{svr, svr1, svr2} return controller } func (s SubscribeController) VIIDSubscribesList(c *gin.Context) { fromId := c.GetHeader("User-Identify") subList, _ := s.Repository.ListByFromId(fromId) c.Header("Content-Type", "application/VIID+json;charset=UTF-8") c.JSON(http.StatusOK, gin.H{"SubscribeList": subList}) } func (s SubscribeController) VIIDSubscribes(c *gin.Context) { var req vo.RequestSubscribe if err := c.BindJSON(&req); err != nil { c.AbortWithStatus(http.StatusBadRequest) return } fromId := c.GetHeader("User-Identify") var rsp vo.ResponseStatusList for idx, sub := range req.SubscribeListObject.SubscribeObject { if err := s.Repository.SaveReceiveSubscribe(fromId, &req.SubscribeListObject.SubscribeObject[idx]); err == nil { rsp.ResponseStatusObject = append(rsp.ResponseStatusObject, vo.ResponseStatus{ RequestURL: c.FullPath(), StatusCode: vo.StatusSuccess, StatusString: vo.StatusString[vo.StatusSuccess], Id: sub.SubscribeID, LocalTime: time.Now().Format("20060102150405"), }) } } c.Header("Content-Type", "application/VIID+json;charset=UTF-8") c.JSON(http.StatusOK, gin.H{"ResponseStatusListObject": rsp}) } func (s SubscribeController) VIIDUpdateSubscribes(c *gin.Context) { var req vo.RequestSubscribe if err := c.BindJSON(&req); err != nil { c.AbortWithStatus(http.StatusBadRequest) return } var rsp vo.ResponseStatusList for idx, sub := range req.SubscribeListObject.SubscribeObject { if err := s.Repository.UpdateReceiveSubscribe(&req.SubscribeListObject.SubscribeObject[idx]); err == nil { rsp.ResponseStatusObject = append(rsp.ResponseStatusObject, vo.ResponseStatus{ RequestURL: c.FullPath(), StatusCode: vo.StatusSuccess, StatusString: vo.StatusString[vo.StatusSuccess], Id: sub.SubscribeID, LocalTime: time.Now().Format("20060102150405"), }) } else { logger.Error("Update receive subscribe failure, %s", err.Error()) } } c.Header("Content-Type", "application/VIID+json;charset=UTF-8") c.JSON(http.StatusOK, gin.H{"ResponseStatusListObject": rsp}) } func (s SubscribeController) VIIDDeleteSubscribe(c *gin.Context) { idList := c.Query("IDList") var rsp vo.ResponseStatusList for _, id := range strings.Split(idList, ",") { if err := s.Repository.DeleteReceiveSubscribe(id); err == nil { rsp.ResponseStatusObject = append(rsp.ResponseStatusObject, vo.ResponseStatus{ RequestURL: c.FullPath(), StatusCode: vo.StatusSuccess, StatusString: vo.StatusString[vo.StatusSuccess], Id: id, LocalTime: time.Now().Format("20060102150405"), }) } } c.Header("Content-Type", "application/VIID+json;charset=UTF-8") c.JSON(http.StatusOK, gin.H{"ResponseStatusListObject": rsp}) } func (s SubscribeController) VIIDNotifications(c *gin.Context) { var rsp vo.ResponseStatusList var req vo.RequestSubscribeNotificationBind if err := c.BindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"ResponseStatusListObject": rsp}) return } logger.Debug("Receive notifications: %+v", req) for _, msg := range req.SubscribeNotificationListObject.SubscribeNotificationObject { rsp.ResponseStatusObject = append(rsp.ResponseStatusObject, vo.ResponseStatus{ RequestURL: c.FullPath(), StatusCode: vo.StatusSuccess, StatusString: vo.StatusString[vo.StatusSuccess], Id: msg.SubscribeID, LocalTime: time.Now().Format("20060102150405"), }) // 转发 if config.ForwardConf.SyncServer != "" && len(msg.FaceObjectList.FaceObject) > 0 { go s.Capture.FaceForward(msg.FaceObjectList.FaceObject) } if config.ForwardConf.SyncServer != "" && len(msg.PersonObjectList.PersonObject) > 0 { go s.Capture.PersonForward(msg.PersonObjectList.PersonObject) } if len(msg.DeviceList.APEObject) > 0 { fromId := c.GetHeader("User-Identify") go s.Ape.HandleNotification(fromId, msg.DeviceList.APEObject) } } c.Header("Content-Type", "application/VIID+json;charset=UTF-8") c.JSON(http.StatusOK, gin.H{"ResponseStatusListObject": rsp}) } // CreateSubscribes 添加下级平台的订阅消息 func (s SubscribeController) CreateSubscribes(c *gin.Context) { var req vo.Subscribe if err := c.BindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"msg": err.Error()}) return } if c.Param("id") == "" { c.JSON(http.StatusBadRequest, gin.H{"msg": "下级id为空"}) } if err := s.Repository.CreateSubscribe(c.Param("id"), &req); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"msg": "ok"}) } // UpdateSubscribes 更新下级平台的订阅消息 func (s SubscribeController) UpdateSubscribes(c *gin.Context) { var req vo.Subscribe if err := c.BindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"msg": err.Error()}) return } if c.Param("id") == "" { c.JSON(http.StatusBadRequest, gin.H{"msg": "下级id为空"}) } if err := s.Repository.UpdateSubscribe(c.Param("id"), &req); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"msg": "ok"}) } func (s SubscribeController) CancelSubscribes(c *gin.Context) { var req vo.Subscribe if err := c.BindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"msg": err.Error()}) return } if c.Param("id") == "" { c.JSON(http.StatusBadRequest, gin.H{"msg": "下级id为空"}) } if err := s.Repository.CancelSubscribe(c.Param("id"), &req); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"msg": "ok"}) } func (s SubscribeController) List(c *gin.Context) { if c.Param("id") == "" { c.JSON(http.StatusBadRequest, gin.H{"msg": "下级id为空"}) } list, err := s.Repository.ListByFromId(c.Param("id")) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"msg": "ok", "data": list}) } func (s SubscribeController) RemoteList(c *gin.Context) { if c.Param("id") == "" { c.JSON(http.StatusBadRequest, gin.H{"msg": "下级id为空"}) } data, err := s.Repository.RemoteList(c.Param("id")) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"msg": "ok", "data": data}) }