// Update handles PUT func (ctl *WatcherController) Update(c *models.Context) { m := models.WatcherType{} err := c.Fill(&m) if err != nil { glog.Warning(err) c.RespondWithErrorMessage( fmt.Sprintf("The post data is invalid: %v", err.Error()), http.StatusBadRequest, ) return } itemType := strings.ToLower(m.ItemType) if itemType != "" { if _, exists := h.ItemTypes[itemType]; !exists { glog.Warning(err) c.RespondWithErrorMessage( fmt.Sprintf("Watcher could not be saved: Item type not found"), http.StatusBadRequest, ) return } m.ItemTypeID = h.ItemTypes[itemType] } var status int // watcher must exist to be updated // Also the returned watcher ID belongs to the authed person by definition // - no need to check later m.ID, _, _, _, status, err = models.GetWatcherAndIgnoreStatus( m.ItemTypeID, m.ItemID, c.Auth.ProfileID, ) if err != nil { glog.Error(err) c.RespondWithErrorDetail(err, status) return } // To update we only need id, SendEmail and SendSMS status, err = m.Update() if err != nil { glog.Error(err) c.RespondWithErrorMessage( fmt.Sprintf("Could not update watcher: %v", err.Error()), http.StatusBadRequest, ) return } // Respond c.RespondWithOK() }
// Read handles GET func (ctl *EventController) Read(c *models.Context) { _, itemTypeID, itemID, status, err := c.GetItemTypeAndItemID() if err != nil { c.RespondWithErrorDetail(err, status) return } // Start Authorisation perms := models.GetPermission( models.MakeAuthorisationContext( c, 0, itemTypeID, itemID), ) if !perms.CanRead { c.RespondWithErrorMessage(h.NoAuthMessage, http.StatusForbidden) return } // End Authorisation // Read Event m, status, err := models.GetEvent(c.Site.ID, itemID, c.Auth.ProfileID) if err != nil { c.RespondWithErrorDetail(err, status) return } // Get Comments m.Comments, status, err = models.GetComments( c.Site.ID, h.ItemTypeEvent, m.ID, c.Request.URL, c.Auth.ProfileID, m.Meta.Created, ) if err != nil { c.RespondWithErrorDetail(err, status) return } m.Meta.Permissions = perms // Mark as read (to the last comment on this page if applicable) if c.Auth.ProfileID > 0 { read := m.Meta.Created switch m.Comments.Items.(type) { case []models.CommentSummaryType: comments := m.Comments.Items.([]models.CommentSummaryType) if len(comments) > 0 { read = comments[len(comments)-1].Meta.Created if m.Comments.Page >= m.Comments.Pages { read = time.Now() } } default: } go models.MarkAsRead(h.ItemTypes[h.ItemTypeEvent], m.ID, c.Auth.ProfileID, read) // Get watcher status watcherID, sendEmail, sendSms, ignored, status, err := models.GetWatcherAndIgnoreStatus( h.ItemTypes[h.ItemTypeEvent], m.ID, c.Auth.ProfileID, ) if err != nil { c.RespondWithErrorDetail(err, status) return } if ignored { m.Meta.Flags.Ignored = true } if watcherID > 0 { m.Meta.Flags.Watched = true m.Meta.Flags.SendEmail = sendEmail m.Meta.Flags.SendSMS = sendSms } } go models.IncrementViewCount(h.ItemTypes[h.ItemTypeEvent], m.ID) c.RespondWithData(m) }
// Delete handles DELETE func (ctl *WatcherController) Delete(c *models.Context) { _, _, itemID, status, err := c.GetItemTypeAndItemID() if itemID != 0 { m, status, err := models.GetWatcher(itemID, c.Site.ID) if err != nil { c.RespondWithErrorDetail(err, status) return } // Check ownership if c.Auth.ProfileID != m.ProfileID { c.RespondWithErrorMessage(h.NoAuthMessage, http.StatusForbidden) return } // Delete resource status, err = m.Delete() if err != nil { c.RespondWithErrorDetail(err, status) return } c.RespondWithOK() } // Fill from query string m := models.WatcherType{} itemID, itemType, status, err := h.GetItemAndItemType(c.Request.URL.Query()) if _, exists := h.ItemTypes[itemType]; !exists { c.RespondWithErrorMessage( fmt.Sprintf("Watcher could not be deleted: Item type not found"), http.StatusBadRequest, ) return } m.ItemTypeID = h.ItemTypes[itemType] m.ID, _, _, _, status, err = models.GetWatcherAndIgnoreStatus( m.ItemTypeID, itemID, c.Auth.ProfileID, ) if err != nil { c.RespondWithErrorDetail(err, status) return } // Get watcher item to delete it m, status, err = models.GetWatcher(m.ID, c.Site.ID) if err != nil { c.RespondWithErrorDetail(err, status) return } // Delete resource status, err = m.Delete() if err != nil { c.RespondWithErrorDetail(err, status) return } c.RespondWithOK() }
// Read handles GET func (ctl *ProfileController) Read(c *models.Context) { _, itemTypeID, itemID, status, err := c.GetItemTypeAndItemID() if err != nil { c.RespondWithErrorDetail(err, status) return } // Start Authorisation perms := models.GetPermission( models.MakeAuthorisationContext( c, 0, itemTypeID, itemID), ) if c.Site.ID == 1 { if c.Auth.ProfileID != itemID { perms.CanRead = false } } if !perms.CanRead { c.RespondWithErrorMessage(h.NoAuthMessage, http.StatusForbidden) return } // End Authorisation m, status, err := models.GetProfile(c.Site.ID, itemID) if err != nil { c.RespondWithErrorDetail(err, status) return } m.Meta.Permissions = perms if c.Auth.ProfileID > 0 { // Get watcher status watcherID, sendEmail, sendSms, ignored, status, err := models.GetWatcherAndIgnoreStatus( h.ItemTypes[h.ItemTypeProfile], m.ID, c.Auth.ProfileID, ) if err != nil { c.RespondWithErrorDetail(err, status) return } if ignored { m.Meta.Flags.Ignored = true } if watcherID > 0 { m.Meta.Flags.Watched = true m.Meta.Flags.SendEmail = sendEmail m.Meta.Flags.SendSMS = sendSms } if c.Auth.ProfileID == m.ID { // Get counts of things m.GetUnreadHuddleCount() } if perms.IsOwner { user, status, err := models.GetUser(c.Auth.UserID) if err != nil { c.RespondWithErrorDetail(err, status) return } m.Email = user.Email } } c.RespondWithData(m) }