// 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 = tat.User{} found, err := userDB.FindByUsername(&user, getCtxUsername(ctx)) if !found { ctx.JSON(http.StatusInternalServerError, errors.New("User unknown")) return } else if err != nil { ctx.JSON(http.StatusInternalServerError, errors.New("Error while fetching user")) return } criteria := tat.PresenceCriteria{} for _, contact := range user.Contacts { criteria.Username = criteria.Username + "," + contact.Username } criteria.DateMinPresence = strconv.FormatInt(time.Now().Unix()-seconds, 10) count, presences, _ := presenceDB.ListPresences(&criteria) out := &tat.ContactsJSON{ Contacts: user.Contacts, CountContactsPresences: count, ContactsPresences: &presences, } ctx.JSON(http.StatusOK, out) }
func (m *PresencesController) listWithCriteria(ctx *gin.Context, criteria *tat.PresenceCriteria) { user, e := m.preCheckUser(ctx) if e != nil { return } if criteria.Topic != "" { _, err := topicDB.FindByTopic(criteria.Topic, true, false, false, user) if err != nil { ctx.AbortWithError(http.StatusBadRequest, errors.New("topic "+criteria.Topic+" does not exist or you have no Read Access on it")) 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/" + 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/" + getCtxUsername(ctx) criteria.Topic = criteria.Topic + "," + topicInverse } } count, presences, err := presenceDB.ListPresences(criteria) if err != nil { ctx.AbortWithError(http.StatusInternalServerError, err) return } out := &tat.PresencesJSON{ Count: count, Presences: presences, } ctx.JSON(http.StatusOK, out) }
func (*PresencesController) buildCriteria(ctx *gin.Context) *tat.PresenceCriteria { c := tat.PresenceCriteria{} skip, e := strconv.Atoi(ctx.DefaultQuery("skip", "0")) if e != nil { skip = 0 } c.Skip = skip limit, e2 := strconv.Atoi(ctx.DefaultQuery("limit", "10")) 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") if c.SortBy == "" { c.SortBy = "-datePresence" } return &c }