Skip to content

Commit 9409e30

Browse files
committed
feat: add pagination support to GetAllBlogPosts
Implement pagination in the GetAllBlogPosts repository method by accepting FilterPagination parameters, applying limit, offset, and orderBy to the query, and returning total count along with paginated data. Update related interfaces and usecase to support paginated responses. This enables efficient retrieval of blog posts with pagination metadata for API consumers.
1 parent ef6202a commit 9409e30

File tree

4 files changed

+50
-21
lines changed

4 files changed

+50
-21
lines changed

app/blog_post/delivery/http/http.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,31 @@ func (h Handler) DeleteBlogPost(w http.ResponseWriter, r *http.Request) {
9393

9494
// GetAllBlogPosts implements domain.BlogPostHandler.
9595
func (h Handler) GetAllBlogPosts(w http.ResponseWriter, r *http.Request) {
96-
resp, err := h.usecase.GetAllBlogPosts(r.Context())
96+
// Ambil parameter pagination dari request
97+
pagination, err := domain.GetPaginationFromCtx(r)
98+
if err != nil {
99+
logrus.Error("failed to parse pagination parameters: ", err)
100+
utils.Response(domain.HttpResponse{
101+
Code: http.StatusBadRequest,
102+
Message: "Invalid pagination parameters",
103+
}, w)
104+
return
105+
}
106+
107+
// Panggil usecase dengan parameter pagination
108+
data, paginationResponse, err := h.usecase.GetAllBlogPosts(r.Context(), pagination)
97109
if err != nil {
98110
resp := utils.CustomErrorResponse(err)
99111
utils.Response(resp, w)
100112
return
101113
}
102114

103115
utils.Response(domain.HttpResponse{
104-
Code: http.StatusOK,
105-
Message: "Blog posts retrieved successfully",
106-
Data: resp,
116+
Code: http.StatusOK,
117+
Message: "Blog posts retrieved successfully",
118+
Data: data,
119+
Pagination: paginationResponse,
107120
}, w)
108-
109121
}
110122

111123
// GetDetailBlogPost implements domain.BlogPostHandler.

app/blog_post/repository/repository.go

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,29 +182,44 @@ func (r *repository) DeleteBlogPost(ctx context.Context, id uint) error {
182182
}
183183

184184
// GetAllBlogPosts implements domain.BlogPostRepository.
185-
func (r *repository) GetAllBlogPosts(ctx context.Context) (data []domain.BlogPost, err error) {
186-
// Mengambil data blog posts dengan author dalam satu query
187-
err = r.db.DB(ctx).
188-
Preload("Author").Find(&data).Error
185+
func (r *repository) GetAllBlogPosts(ctx context.Context, pagination domain.FilterPagination) ([]domain.BlogPost, int, error) {
186+
var data []domain.BlogPost
187+
var totalCount int64
188+
189+
if err := r.db.DB(ctx).Model(&domain.BlogPost{}).Count(&totalCount).Error; err != nil {
190+
logrus.Error("failed to count blog posts: ", err)
191+
return nil, 0, err
192+
}
193+
194+
offset := pagination.GetOffset()
195+
limit := pagination.GetLimit()
196+
orderBy := pagination.GetOrderBy()
197+
198+
query := r.db.DB(ctx).Preload("Author")
199+
200+
if orderBy != "" {
201+
query = query.Order(orderBy)
202+
} else {
203+
query = query.Order("id DESC")
204+
}
205+
206+
err := query.Limit(limit).Offset(offset).Find(&data).Error
189207
if err != nil {
190208
logrus.Error("failed to get all blog posts: ", err)
191-
return nil, err
209+
return nil, 0, err
192210
}
193211

194-
// Mengambil tags untuk setiap blog post
195212
for i := range data {
196213
var tags []string
197214
if err := r.db.DB(ctx).Table("blog_post_tags").
198215
Select("tag").
199216
Where("blog_post_id = ?", data[i].Id).
200-
Pluck("tag", &tags).Error; err != nil {
201-
logrus.Error("failed to get tags for blog post ID ", data[i].Id, ": ", err)
202-
} else {
217+
Pluck("tag", &tags).Error; err == nil {
203218
data[i].Tags = tags
204219
}
205220
}
206221

207-
return data, nil
222+
return data, int(totalCount), nil
208223
}
209224

210225
func NewRepository(db pkgDB.DatabaseTransaction) domain.BlogPostRepository {

app/blog_post/usecase/usecase.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,15 @@ func (uc *usecase) DeleteBlogPost(ctx context.Context, id uint) error {
5555
}
5656

5757
// GetAllBlogPosts implements domain.BlogPostUsecase.
58-
func (uc *usecase) GetAllBlogPosts(ctx context.Context) ([]domain.BlogPost, error) {
59-
blogPosts, err := uc.repo.GetAllBlogPosts(ctx)
58+
func (uc *usecase) GetAllBlogPosts(ctx context.Context, pagination domain.FilterPagination) ([]domain.BlogPost, domain.Pagination, error) {
59+
blogPosts, totalCount, err := uc.repo.GetAllBlogPosts(ctx, pagination)
6060
if err != nil {
6161
logrus.Error("failed to get all blog posts: ", err)
62-
return nil, err
62+
return nil, domain.Pagination{}, err
6363
}
64-
return blogPosts, nil
64+
paginationResponse := domain.NewPagination(totalCount, pagination)
65+
66+
return blogPosts, paginationResponse, nil
6567
}
6668

6769
// GetDetailBlogPost implements domain.BlogPostUsecase.

domain/blog_post.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ type BlogPostUsecase interface {
1919
CreateBlogPost(ctx context.Context, data BlogPost, token string) (BlogPost, error)
2020
UpdateBlogPost(ctx context.Context, data BlogPost, id uint) error
2121
DeleteBlogPost(ctx context.Context, id uint) error
22-
GetAllBlogPosts(ctx context.Context) ([]BlogPost, error)
22+
GetAllBlogPosts(ctx context.Context, pagination FilterPagination) ([]BlogPost, Pagination, error)
2323
GetDetailBlogPost(ctx context.Context, slug string, id uint) (BlogPost, error)
2424
}
2525

2626
type BlogPostRepository interface {
2727
CreateBlogPost(ctx context.Context, data BlogPost) (BlogPost, error)
2828
UpdateBlogPost(ctx context.Context, data BlogPost, id uint) error
2929
DeleteBlogPost(ctx context.Context, id uint) error
30-
GetAllBlogPosts(ctx context.Context) ([]BlogPost, error)
30+
GetAllBlogPosts(ctx context.Context, pagination FilterPagination) ([]BlogPost, int, error)
3131
GetDetailBlogPost(ctx context.Context, slug, typeFind string, id uint) (BlogPost, error)
3232
}
3333

0 commit comments

Comments
 (0)