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 }