// EnableNotificationsTopic enable notication on one topic func (*UsersController) EnableNotificationsTopic(ctx *gin.Context) { topicIn, err := GetParam(ctx, "topic") if err != nil { return } user, err := PreCheckUser(ctx) if err != nil { return } var topic = models.Topic{} err = topic.FindByTopic(topicIn, true) if err != nil { AbortWithReturnError(ctx, http.StatusBadRequest, errors.New("topic "+topicIn+" does not exist")) return } isReadAccess := topic.IsUserReadAccess(user) if !isReadAccess { AbortWithReturnError(ctx, http.StatusForbidden, errors.New("No Read Access to this topic")) return } err = user.EnableNotificationsTopic(topic.Topic) if err != nil { AbortWithReturnError(ctx, http.StatusInternalServerError, fmt.Errorf("Error while enable notication on topic %s to user:%s", topic.Topic, user.Username)) return } ctx.JSON(http.StatusCreated, gin.H{"info": fmt.Sprintf("Notications enabled on Topic %s", topic.Topic)}) }
func (m *MessagesController) likeOrUnlike(ctx *gin.Context, action string, message models.Message, topic models.Topic, user models.User) { isReadAccess := topic.IsUserReadAccess(user) if !isReadAccess { ctx.AbortWithError(http.StatusInternalServerError, errors.New("No Read Access to topic "+message.Topics[0])) return } info := "" if action == "like" { err := message.Like(user) if err != nil { log.Errorf("Error while like a message %s", err) ctx.AbortWithError(http.StatusInternalServerError, err) return } info = "like added" } else if action == "unlike" { err := message.Unlike(user) if err != nil { log.Errorf("Error while like a message %s", err) ctx.AbortWithError(http.StatusInternalServerError, err) return } info = "like removed" } else { ctx.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("Invalid action : " + action)}) return } go models.WSMessage(&models.WSMessageJSON{Action: action, Username: user.Username, Message: message}) ctx.JSON(http.StatusCreated, gin.H{"info": info}) }
func (m *PresencesController) listWithCriteria(ctx *gin.Context, criteria *models.PresenceCriteria) { user, e := m.preCheckUser(ctx) if e != nil { return } var topic = models.Topic{} err := topic.FindByTopic(criteria.Topic, true) if err != nil { ctx.AbortWithError(http.StatusBadRequest, errors.New("topic "+criteria.Topic+" does not exist")) return } isReadAccess := topic.IsUserReadAccess(user) if !isReadAccess { ctx.AbortWithError(http.StatusForbidden, errors.New("No Read Access to this topic.")) return } // add / if search on topic // as topic is in path, it can't start with a / if criteria.Topic != "" && string(criteria.Topic[0]) != "/" { criteria.Topic = "/" + criteria.Topic } topicDM := "/Private/" + utils.GetCtxUsername(ctx) + "/DM/" if strings.HasPrefix(criteria.Topic, topicDM) { part := strings.Split(criteria.Topic, "/") if len(part) != 5 { log.Errorf("wrong topic name for DM") ctx.AbortWithError(http.StatusInternalServerError, errors.New("Wrong topic name for DM:"+criteria.Topic)) return } topicInverse := "/Private/" + part[4] + "/DM/" + utils.GetCtxUsername(ctx) criteria.Topic = criteria.Topic + "," + topicInverse } count, presences, err := models.ListPresences(criteria) if err != nil { ctx.AbortWithError(http.StatusInternalServerError, err) return } out := &presencesJSON{ Count: count, Presences: presences, } ctx.JSON(http.StatusOK, out) }
// List messages on one topic, with given criterias func (m *MessagesController) List(ctx *gin.Context) { var criteria = m.buildCriteria(ctx) presenceArg := ctx.Query("presence") topicIn, err := GetParam(ctx, "topic") if err != nil { return } criteria.Topic = topicIn // add / if search on topic // as topic is in path, it can't start with a / if criteria.Topic != "" && string(criteria.Topic[0]) != "/" { criteria.Topic = "/" + criteria.Topic } var topic = models.Topic{} err = topic.FindByTopic(criteria.Topic, true) if err != nil { topicCriteria := "" _, topicCriteria, err = m.checkDMTopic(ctx, criteria.Topic) if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": "topic " + criteria.Topic + " does not exist"}) return } // hack to get new created DM Topic err := topic.FindByTopic(criteria.Topic, true) if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": "topic " + criteria.Topic + " does not exist (2)"}) return } criteria.Topic = topicCriteria } out := &messagesJSON{} var user models.User var e error if utils.GetCtxUsername(ctx) != "" { user, e = PreCheckUser(ctx) if e != nil { return } isReadAccess := topic.IsUserReadAccess(user) if !isReadAccess { ctx.JSON(http.StatusForbidden, gin.H{"error": "No Read Access to this topic"}) return } out.IsTopicRw = topic.IsUserRW(&user) } else if !topic.IsROPublic { ctx.JSON(http.StatusForbidden, gin.H{"error": "No Public Read Access Public to this topic"}) return } else if topic.IsROPublic && strings.HasPrefix(topic.Topic, "/Private") { ctx.JSON(http.StatusForbidden, gin.H{"error": "No Public Read Access to this topic"}) return } // send presence if presenceArg != "" && !user.IsSystem { go func() { var presence = models.Presence{} err := presence.Upsert(user, topic, presenceArg) if err != nil { log.Errorf("Error while InsertPresence %s", err) } go models.WSPresence(&models.WSPresenceJSON{Action: "create", Presence: presence}) }() } messages, err := models.ListMessages(criteria) if err != nil { ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } out.Messages = messages ctx.JSON(http.StatusOK, out) }