github.com/ngocphuongnb/tetua@v0.0.7-alpha/packages/entrepository/comment.go (about)

     1  package entrepository
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"sync"
     7  
     8  	e "github.com/ngocphuongnb/tetua/app/entities"
     9  	"github.com/ngocphuongnb/tetua/app/utils"
    10  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent"
    11  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/comment"
    12  )
    13  
    14  type CommentRepository struct {
    15  	*BaseRepository[e.Comment, ent.Comment, *ent.CommentQuery, *e.CommentFilter]
    16  }
    17  
    18  func (c *CommentRepository) FindWithPost(ctx context.Context, filters ...*e.CommentFilter) ([]*e.Comment, error) {
    19  	query := c.QueryFilterFn(c.Client, filters...).WithPost()
    20  	if items, err := c.FindFn(ctx, query, filters...); err != nil {
    21  		return nil, err
    22  	} else {
    23  		return utils.SliceMap(items, c.ConvertFn), nil
    24  	}
    25  }
    26  
    27  func (c *CommentRepository) PaginateWithPost(ctx context.Context, filters ...*e.CommentFilter) (*e.Paginate[e.Comment], error) {
    28  	var err1 error
    29  	var err2 error
    30  	var wg sync.WaitGroup
    31  	total := 0
    32  	base := ""
    33  	items := make([]*ent.Comment, 0)
    34  	page, limit, _ := getPaginateParams(filters[0])
    35  
    36  	wg.Add(2)
    37  	go func(wg *sync.WaitGroup) {
    38  		defer wg.Done()
    39  		total, err1 = c.QueryFilterFn(c.Client, filters...).WithPost().Count(ctx)
    40  	}(&wg)
    41  	go func(wg *sync.WaitGroup) {
    42  		defer wg.Done()
    43  		items, err2 = c.FindFn(ctx, c.QueryFilterFn(c.Client, filters...).WithPost(), filters...)
    44  	}(&wg)
    45  	wg.Wait()
    46  
    47  	if err := utils.FirstError(err1, err2); err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	if len(filters) > 0 {
    52  		base = filters[0].Base()
    53  	}
    54  
    55  	return &e.Paginate[e.Comment]{
    56  		Data:        utils.SliceMap(items, c.ConvertFn),
    57  		BaseUrl:     base,
    58  		Total:       total,
    59  		PageSize:    limit,
    60  		PageCurrent: page,
    61  	}, nil
    62  }
    63  
    64  func CreateCommentRepository(client *ent.Client) *CommentRepository {
    65  	return &CommentRepository{
    66  		BaseRepository: &BaseRepository[e.Comment, ent.Comment, *ent.CommentQuery, *e.CommentFilter]{
    67  			Name:      "comment",
    68  			Client:    client,
    69  			ConvertFn: entCommentToComment,
    70  			ByIDFn: func(ctx context.Context, client *ent.Client, id int) (*ent.Comment, error) {
    71  				return client.Comment.Query().Where(comment.IDEQ(id)).WithUser().Only(ctx)
    72  			},
    73  			DeleteByIDFn: func(ctx context.Context, client *ent.Client, id int) error {
    74  				return client.Comment.DeleteOneID(id).Exec(ctx)
    75  			},
    76  			CreateFn: func(ctx context.Context, client *ent.Client, data *e.Comment) (comment *ent.Comment, err error) {
    77  				if data.UserID == 0 {
    78  					return nil, errors.New("user_id is required")
    79  				}
    80  				cc := client.Comment.Create().
    81  					SetContent(data.Content).
    82  					SetContentHTML(data.ContentHTML).
    83  					SetPostID(data.PostID).
    84  					SetUserID(data.UserID)
    85  
    86  				if data.ParentID > 0 {
    87  					cc.SetParentID(data.ParentID)
    88  				}
    89  
    90  				if comment, err = cc.Save(ctx); err != nil {
    91  					return nil, err
    92  				}
    93  
    94  				if err = client.Post.UpdateOneID(data.PostID).AddCommentCount(1).Exec(ctx); err != nil {
    95  					return nil, err
    96  				}
    97  
    98  				return
    99  			},
   100  			UpdateFn: func(ctx context.Context, client *ent.Client, data *e.Comment) (comment *ent.Comment, err error) {
   101  				return client.Comment.
   102  					UpdateOneID(data.ID).
   103  					SetContent(data.Content).
   104  					SetContentHTML(data.ContentHTML).
   105  					Save(ctx)
   106  			},
   107  			QueryFilterFn: func(client *ent.Client, filters ...*e.CommentFilter) *ent.CommentQuery {
   108  				query := client.Comment.Query()
   109  				if len(filters) > 0 {
   110  					if len(filters[0].UserIDs) > 0 {
   111  						query = query.Where(comment.UserIDIn(filters[0].UserIDs...))
   112  					}
   113  
   114  					if len(filters[0].PostIDs) > 0 {
   115  						query = query.Where(comment.PostIDIn(filters[0].PostIDs...))
   116  					}
   117  
   118  					if filters[0].Search != "" {
   119  						query = query.Where(comment.ContentContainsFold(filters[0].Search))
   120  					}
   121  				}
   122  				return query
   123  			},
   124  			FindFn: func(ctx context.Context, query *ent.CommentQuery, filters ...*e.CommentFilter) ([]*ent.Comment, error) {
   125  				page, limit, sorts := getPaginateParams(filters[0])
   126  				return query.
   127  					WithUser(func(uq *ent.UserQuery) {
   128  						uq.WithAvatarImage()
   129  					}).
   130  					Limit(limit).
   131  					Offset((page - 1) * limit).
   132  					Order(sorts...).
   133  					All(ctx)
   134  			},
   135  		},
   136  	}
   137  }