Skip to content

Commit 58f96fb

Browse files
committed
implementing pagination on posts
1 parent c4085a8 commit 58f96fb

File tree

4 files changed

+54
-0
lines changed

4 files changed

+54
-0
lines changed

database/postgres.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,28 @@ func (repo *PostgresRepository) DeletePost(ctx context.Context, id string, userI
121121
id, userId)
122122
return err
123123
}
124+
125+
func (repo *PostgresRepository) ListPost(ctx context.Context, page uint64) ([]*models.Post, error){
126+
rows, err := repo.db.QueryContext(ctx,
127+
"SELECT id, post_content, user_id, created_at FROM posts LIMIT $1 OFFSET $2", 2, page * 2)
128+
if err != nil {
129+
return nil, err
130+
}
131+
defer func(){
132+
err = rows.Close()
133+
if err != nil {
134+
log.Fatal(err)
135+
}
136+
}()
137+
var posts []*models.Post
138+
for rows.Next() {
139+
var post = models.Post{}
140+
if err = rows.Scan(&post.Id, &post.PostContent, &post.UserId, &post.CreatedAt); err == nil {
141+
posts = append(posts, &post)
142+
}
143+
}
144+
if err = rows.Err(); err != nil {
145+
return nil, err
146+
}
147+
return posts, nil
148+
}

handlers/posts.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"net/http"
66
"strings"
7+
"strconv"
78

89
"github.com/golang-jwt/jwt/v4"
910
"github.com/gorilla/mux"
@@ -152,4 +153,26 @@ func DeletePostHandler(s server.Server) http.HandlerFunc {
152153
return
153154
}
154155
}
156+
}
157+
158+
func ListPostHandler(s server.Server) http.HandlerFunc {
159+
return func(w http.ResponseWriter, r *http.Request){
160+
var err error
161+
pageStr := r.URL.Query().Get("page")
162+
var page uint64
163+
if pageStr != "" {
164+
page, err = strconv.ParseUint(pageStr, 10, 64)
165+
if err != nil {
166+
http.Error(w, err.Error(), http.StatusBadRequest)
167+
return
168+
}
169+
}
170+
posts, err := repository.ListPost(r.Context(), page)
171+
if err != nil {
172+
http.Error(w, err.Error(), http.StatusInternalServerError)
173+
return
174+
}
175+
w.Header().Set("Content-Type", "application/json")
176+
json.NewEncoder(w).Encode(posts)
177+
}
155178
}

main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,5 @@ func BindRoutes(s server.Server, r *mux.Router) {
5050
r.HandleFunc("/posts/{id}", handlers.GetPostByIdHandler(s)).Methods(http.MethodGet)
5151
r.HandleFunc("/posts/{id}", handlers.UpdatePostHandler(s)).Methods(http.MethodPut)
5252
r.HandleFunc("/posts/{id}", handlers.DeletePostHandler(s)).Methods(http.MethodDelete)
53+
r.HandleFunc("/posts", handlers.ListPostHandler(s)).Methods(http.MethodGet)
5354
}

repository/repository.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type Repository interface {
1515
GetPostById(ctx context.Context, id string) (*models.Post, error)
1616
UpdatePost(ctx context.Context, post *models.Post) error
1717
DeletePost(ctx context.Context, id string, userId string) error
18+
ListPost(ctx context.Context, page uint64) ([]*models.Post, error)
1819
Close() error
1920
}
2021

@@ -54,4 +55,8 @@ func UpdatePost(ctx context.Context, post *models.Post) error {
5455

5556
func DeletePost(ctx context.Context, id string, userId string) error {
5657
return implementation.DeletePost(ctx, id, userId)
58+
}
59+
60+
func ListPost(ctx context.Context, page uint64) ([]*models.Post, error) {
61+
return implementation.ListPost(ctx, page)
5762
}

0 commit comments

Comments
 (0)