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) }