package routes import ( "log" "net/http" c "github.com/Azareal/Gosora/common" "github.com/Azareal/Gosora/common/phrases" ) func ForumList(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError { skip, rerr := header.Hooks.VhookSkippable("route_forum_list_start", w, r, &user, header) if skip || rerr != nil { return rerr } header.Title = phrases.GetTitlePhrase("forums") header.Zone = "forums" header.Path = "/forums/" header.MetaDesc = header.Settings["meta_desc"].(string) var err error var canSee []int if user.IsSuperAdmin { canSee, err = c.Forums.GetAllVisibleIDs() if err != nil { return c.InternalError(err, w, r) } } else { group, err := c.Groups.Get(user.Group) if err != nil { log.Printf("Group #%d doesn't exist despite being used by c.User #%d", user.Group, user.ID) return c.LocalError("Something weird happened", w, r, user) } canSee = group.CanSee } var forumList []c.Forum for _, fid := range canSee { // Avoid data races by copying the struct into something we can freely mold without worrying about breaking something somewhere else f := c.Forums.DirtyGet(fid).Copy() if f.ParentID == 0 && f.Name != "" && f.Active { if f.LastTopicID != 0 { if f.LastTopic.ID != 0 && f.LastReplyer.ID != 0 { f.LastTopicTime = c.RelativeTime(f.LastTopic.LastReplyAt) } } header.Hooks.Hook("forums_frow_assign", &f) forumList = append(forumList, f) } } return renderTemplate("forums", w, r, header, c.ForumsPage{header, forumList}) }