github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/web/index.go (about) 1 package web 2 3 import ( 4 "net/http" 5 "net/url" 6 "sync" 7 8 "github.com/ngocphuongnb/tetua/app/cache" 9 "github.com/ngocphuongnb/tetua/app/entities" 10 "github.com/ngocphuongnb/tetua/app/repositories" 11 "github.com/ngocphuongnb/tetua/app/server" 12 "github.com/ngocphuongnb/tetua/app/utils" 13 "github.com/ngocphuongnb/tetua/views" 14 ) 15 16 func Index(c server.Context) (err error) { 17 var page = c.QueryInt("page") 18 var wg sync.WaitGroup 19 var paginate *entities.Paginate[entities.Post] 20 var topPosts []*entities.Post 21 22 wg.Add(2) 23 go func(wg *sync.WaitGroup, page int) { 24 defer wg.Done() 25 paginate, err = repositories.Post.Paginate(c.Context(), &entities.PostFilter{ 26 Filter: &entities.Filter{Page: page}, 27 }) 28 }(&wg, page) 29 go func(wg *sync.WaitGroup, page int) { 30 defer wg.Done() 31 var topPostErr error 32 topPosts, topPostErr = repositories.Post.Find(c.Context(), &entities.PostFilter{ 33 Filter: &entities.Filter{ 34 Page: page, 35 Limit: 8, 36 Sorts: []*entities.Sort{{ 37 Field: "view_count", 38 Order: "desc", 39 }}, 40 }}) 41 if topPostErr != nil { 42 c.Logger().Error(topPostErr) 43 } 44 }(&wg, page) 45 46 wg.Wait() 47 48 if err != nil { 49 c.Logger().Error(err) 50 return c.Status(http.StatusBadGateway).Render(views.Error("Something went wrong")) 51 } 52 53 return c.Render(views.Index(cache.Topics, paginate, topPosts)) 54 } 55 56 func Search(c server.Context) (err error) { 57 c.Meta().Title = "Search" 58 var paginate *entities.Paginate[entities.Post] 59 var searchQuery = c.Query("q") 60 61 if searchQuery != "" { 62 c.Meta().Query = searchQuery 63 c.Meta().Title = searchQuery + " - Search result for " + searchQuery 64 c.Meta().Canonical = utils.Url(c.Path() + "?q=" + url.QueryEscape(searchQuery)) 65 } 66 67 paginate, err = repositories.Post.Paginate(c.Context(), &entities.PostFilter{ 68 Filter: &entities.Filter{ 69 Page: c.QueryInt("page"), 70 Search: searchQuery, 71 }}) 72 73 if err != nil { 74 c.Logger().Error(err) 75 return c.Status(http.StatusBadGateway).Render(views.Error("Something went wrong")) 76 } 77 78 return c.Render(views.Search(cache.Topics, paginate)) 79 }