// Read handles GET func (ctl *CommentController) 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 limit, _, status, err := h.GetLimitAndOffset(c.Request.URL.Query()) if err != nil { c.RespondWithErrorDetail(err, status) return } m, status, err := models.GetComment(c.Site.ID, itemID, c.Auth.ProfileID, limit) if err != nil { c.RespondWithErrorDetail(err, status) return } m.Meta.Permissions = perms if c.Auth.ProfileID > 0 { go models.MarkAsRead(m.ItemTypeID, m.ItemID, c.Auth.ProfileID, m.Meta.Created) } c.RespondWithData(m) }
// 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) }
// Create handles POST func (ctl *CommentsController) Create(c *models.Context) { m := models.CommentSummaryType{} err := c.Fill(&m) if err != nil { c.RespondWithErrorMessage( fmt.Sprintf("The post data is invalid: %v", err.Error()), http.StatusBadRequest, ) return } // Populate where applicable from auth and context m.Meta.CreatedByID = c.Auth.ProfileID m.Meta.Created = time.Now() status, err := m.Validate(c.Site.ID, false) if err != nil { c.RespondWithErrorDetail(err, status) return } // Start : Authorisation perms := models.GetPermission( models.MakeAuthorisationContext( c, 0, m.ItemTypeID, m.ItemID), ) if !perms.CanCreate { c.RespondWithErrorDetail( e.New( c.Site.ID, c.Auth.ProfileID, "comments.go::Create", e.NoCreate, "Not authorized to create comment: CanCreate false", ), http.StatusForbidden, ) return } // End : Authorisation // Create status, err = m.Insert(c.Site.ID) if err != nil { c.RespondWithErrorDetail(err, status) return } go audit.Create( c.Site.ID, h.ItemTypes[h.ItemTypeComment], m.ID, c.Auth.ProfileID, time.Now(), c.IP, ) // Send updates and register watcher if m.ItemTypeID == h.ItemTypes[h.ItemTypeHuddle] { models.RegisterWatcher( c.Auth.ProfileID, h.UpdateTypes[h.UpdateTypeNewCommentInHuddle], m.ItemID, m.ItemTypeID, c.Site.ID, ) go models.SendUpdatesForNewCommentInHuddle(c.Site.ID, m) models.MarkAsRead(h.ItemTypes[h.ItemTypeHuddle], m.ItemID, c.Auth.ProfileID, time.Now()) models.UpdateUnreadHuddleCount(c.Auth.ProfileID) } else { models.RegisterWatcher( c.Auth.ProfileID, h.UpdateTypes[h.UpdateTypeNewComment], m.ItemID, m.ItemTypeID, c.Site.ID, ) go models.SendUpdatesForNewCommentInItem(c.Site.ID, m) } if m.InReplyTo > 0 { go models.SendUpdatesForNewReplyToYourComment(c.Site.ID, m) } // Respond c.RespondWithSeeOther( fmt.Sprintf( "%s/%d", h.APITypeComment, m.ID, ), ) }