// Contacts retrieves contacts presences since n seconds func (*UsersController) Contacts(ctx *gin.Context) { sinceSeconds, err := GetParam(ctx, "sinceSeconds") if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": "Error while getting seconds parameter"}) return } seconds, err := strconv.ParseInt(sinceSeconds, 10, 64) if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": "Invalid since parameter : must be an interger"}) return } var user = models.User{} err = user.FindByUsername(utils.GetCtxUsername(ctx)) if err != nil { ctx.JSON(http.StatusInternalServerError, errors.New("Error while fetching user")) return } criteria := models.PresenceCriteria{} for _, contact := range user.Contacts { criteria.Username = criteria.Username + "," + contact.Username } criteria.DateMinPresence = strconv.FormatInt(time.Now().Unix()-seconds, 10) count, presences, _ := models.ListPresences(&criteria) out := &contactsJSON{ Contacts: user.Contacts, CountContactsPresences: count, ContactsPresences: &presences, } ctx.JSON(http.StatusOK, out) }
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) }
func (*PresencesController) buildCriteria(ctx *gin.Context) *models.PresenceCriteria { c := models.PresenceCriteria{} skip, e := strconv.Atoi(ctx.DefaultQuery("skip", "0")) if e != nil { skip = 0 } c.Skip = skip limit, e2 := strconv.Atoi(ctx.DefaultQuery("limit", "100")) if e2 != nil { limit = 10 } c.Limit = limit c.IDPresence = ctx.Query("idPresence") c.Status = ctx.Query("status") c.Username = ctx.Query("username") c.DateMinPresence = ctx.Query("dateMinPresence") c.DateMaxPresence = ctx.Query("dateMaxPresence") return &c }