github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/web/user/profile.go (about)

     1  package webuser
     2  
     3  import (
     4  	"net/http"
     5  	"sync"
     6  
     7  	"github.com/ngocphuongnb/tetua/app/entities"
     8  	"github.com/ngocphuongnb/tetua/app/repositories"
     9  	"github.com/ngocphuongnb/tetua/app/server"
    10  	"github.com/ngocphuongnb/tetua/app/utils"
    11  	"github.com/ngocphuongnb/tetua/views"
    12  )
    13  
    14  func Profile(c server.Context) (err1 error) {
    15  	username := c.Param("username")
    16  	user, err1 := repositories.User.ByUsername(c.Context(), username)
    17  	var err2 error
    18  	var paginate *entities.Paginate[entities.Post]
    19  	var comments []*entities.Comment
    20  	var wg sync.WaitGroup
    21  
    22  	if err1 != nil {
    23  		return c.Render(views.Error("User not found"))
    24  	}
    25  
    26  	wg.Add(2)
    27  	go func(wg *sync.WaitGroup) {
    28  		defer wg.Done()
    29  		paginate, err1 = repositories.Post.Paginate(c.Context(), &entities.PostFilter{
    30  			UserIDs: []int{user.ID},
    31  			Filter: &entities.Filter{
    32  				Page:            c.ParamInt("page", 1),
    33  				IgnoreUrlParams: []string{"user"},
    34  			},
    35  		})
    36  
    37  		if err1 != nil {
    38  			c.Logger().Error(err1)
    39  		}
    40  	}(&wg)
    41  
    42  	go func(wg *sync.WaitGroup) {
    43  		defer wg.Done()
    44  		if c.ParamInt("page", 1) > 1 {
    45  			return
    46  		}
    47  		comments, err2 = repositories.Comment.FindWithPost(c.Context(), &entities.CommentFilter{
    48  			UserIDs: []int{user.ID},
    49  			Filter: &entities.Filter{
    50  				Limit: 5,
    51  			},
    52  		})
    53  		if err1 != nil {
    54  			c.Logger().Error(err1)
    55  		}
    56  	}(&wg)
    57  
    58  	wg.Wait()
    59  
    60  	if err := utils.FirstError(err1, err2); err != nil {
    61  		c.Logger().Error("Error loading profile", err)
    62  		return c.Status(http.StatusBadRequest).Render(views.Error("Error loading profile"))
    63  	}
    64  
    65  	c.Meta().Title = user.Name()
    66  	return c.Render(views.Profile(user, paginate, comments))
    67  }