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  }