Skip to content

Commit d2c1941

Browse files
authored
Pagination for UI (#249)
* Pagination for UI
1 parent b6e81a1 commit d2c1941

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+1553
-966
lines changed

services/community/api/auth/token.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,11 @@ func ExtractTokenID(r *http.Request, db *gorm.DB) (uint32, error) {
7575

7676
tokenValid := resp.StatusCode == 200
7777
token, _, err := new(jwt.Parser).ParseUnverified(tokenString, jwt.MapClaims{})
78-
claims, ok := token.Claims.(jwt.MapClaims)
7978
if err != nil {
8079
log.Println(err)
8180
return 0, err
8281
}
82+
claims, ok := token.Claims.(jwt.MapClaims)
8383

8484
if ok && tokenValid {
8585
name := claims["sub"]

services/community/api/controllers/post_controller.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,17 @@ func (s *Server) GetPostByID(w http.ResponseWriter, r *http.Request) {
7171

7272
}
7373

74+
75+
7476
//GetPost Vulnerabilities
7577
func (s *Server) GetPost(w http.ResponseWriter, r *http.Request) {
7678
//post := models.Post{}
7779
limit_param := r.URL.Query().Get("limit")
78-
limit := 30
80+
var limit int64 = 30
7981
err := error(nil)
8082
if limit_param != "" {
8183
// Parse limit_param and set to limit
82-
limit, err = strconv.Atoi(limit_param)
84+
limit, err = strconv.ParseInt(limit_param, 10, 64)
8385
if err != nil {
8486
limit = 30
8587
}
@@ -88,10 +90,10 @@ func (s *Server) GetPost(w http.ResponseWriter, r *http.Request) {
8890
limit = 50
8991
}
9092

91-
offset := 0
93+
var offset int64 = 0
9294
offset_param := r.URL.Query().Get("offset")
9395
if offset_param != "" {
94-
offset, err = strconv.Atoi(offset_param)
96+
offset, err = strconv.ParseInt(offset_param, 10, 64)
9597
if err != nil {
9698
offset = 0
9799
}

services/community/api/models/coupon.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,27 @@ func (c *Coupon) Prepare() {
4646
func (c *Coupon) Validate() error {
4747

4848
if c.CouponCode == "" {
49-
return errors.New("Required Coupon Code")
49+
return errors.New("required coupon code")
5050
}
5151
if c.Amount == "" {
52-
return errors.New("Required Coupon Amount")
52+
return errors.New("required coupon amount")
5353
}
5454

5555
return nil
5656
}
5757

58-
//SaveCoupon save coupon database.
58+
//SaveCoupon save coupon in database.
5959
func SaveCoupon(client *mongo.Client, coupon Coupon) (Coupon, error) {
6060

6161
// Get a handle for your collection
62-
collection := client.Database("crapi").Collection("coupon")
62+
collection := client.Database("crapi").Collection("coupons")
6363

6464
// Insert a single document
6565
insertResult, err := collection.InsertOne(context.TODO(), coupon)
6666
if err != nil {
6767
log.Println(err)
6868
}
6969
log.Println("Inserted a single document: ", insertResult.InsertedID)
70-
7170
return coupon, err
7271
}
7372

services/community/api/models/post.go

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"errors"
2020
"html"
2121
"log"
22-
"reflect"
2322
"strings"
2423
"time"
2524

@@ -51,17 +50,24 @@ func (post *Post) Prepare() {
5150
post.CreatedAt = time.Now()
5251
}
5352

53+
type PostsResponse struct {
54+
Posts []Post `json:"posts"`
55+
NextOffset *int64 `json:"next_offset"`
56+
PrevOffset *int64 `json:"previous_offset"`
57+
Total int `json:"total"`
58+
}
59+
5460
//Validate data of post
5561
func (post *Post) Validate() error {
5662

5763
if post.Title == "" {
58-
return errors.New("Required Title")
64+
return errors.New("required title")
5965
}
6066
if post.Content == "" {
61-
return errors.New("Required Content")
67+
return errors.New("tequired content")
6268
}
6369
if post.AuthorID < 1 {
64-
return errors.New("Required Author")
70+
return errors.New("required author")
6571
}
6672
return nil
6773
}
@@ -97,42 +103,57 @@ func GetPostByID(client *mongo.Client, ID string) (Post, error) {
97103
collection := client.Database("crapi").Collection("post")
98104
filter := bson.D{{Key: "id", Value: ID}}
99105
err := collection.FindOne(context.TODO(), filter).Decode(&post)
106+
if err != nil {
107+
log.Println(err)
108+
}
100109

101110
return post, err
102111

103112
}
104113

105114
//FindAllPost return all recent post
106-
func FindAllPost(client *mongo.Client, offset int, limit int) ([]interface{}, error) {
107-
post := []Post{}
108-
115+
func FindAllPost(client *mongo.Client, offset int64, limit int64) (PostsResponse, error) {
116+
postList := []Post{}
117+
var postsResponse PostsResponse = PostsResponse{}
109118
options := options.Find()
110119
options.SetSort(bson.D{{Key: "_id", Value: -1}})
111-
options.SetLimit(int64(limit))
112-
options.SetSkip(int64(offset * limit))
120+
options.SetLimit(limit)
121+
options.SetSkip(offset)
122+
ctx := context.Background()
113123
collection := client.Database("crapi").Collection("post")
114-
cur, err := collection.Find(context.Background(), bson.D{}, options)
124+
cur, err := collection.Find(ctx, bson.D{}, options)
115125
if err != nil {
116-
log.Println(err)
126+
log.Println("Error in finding posts: ", err)
127+
return postsResponse, err
117128
}
118-
log.Println(cur)
119-
objectType := reflect.TypeOf(post).Elem()
120-
var list = make([]interface{}, 0)
121-
defer cur.Close(context.Background())
122-
for cur.Next(context.Background()) {
123-
result := reflect.New(objectType).Interface()
124-
err := cur.Decode(result)
125-
129+
for cur.Next(ctx) {
130+
var elem Post
131+
err := cur.Decode(&elem)
126132
if err != nil {
127-
log.Println(err)
128-
return nil, err
133+
log.Println("Error in decoding posts: ", err)
134+
return postsResponse, err
129135
}
136+
postList = append(postList, elem)
137+
}
130138

131-
list = append(list, result)
139+
postsResponse.Posts = postList
140+
// get posts count for pagination
141+
count, err1 := collection.CountDocuments(context.Background(), bson.D{})
142+
if err1 != nil {
143+
log.Println("Error in counting posts: ", err1)
144+
return postsResponse, err1
132145
}
133-
if err := cur.Err(); err != nil {
134-
return nil, err
146+
if offset - limit >= 0 {
147+
tempOffset := offset - limit
148+
postsResponse.PrevOffset = &tempOffset
135149
}
136-
137-
return list, err
150+
if offset + limit < count {
151+
tempOffset := offset + limit
152+
postsResponse.NextOffset = &tempOffset
153+
}
154+
postsResponse.Total = len(postList)
155+
if err = cur.Err(); err != nil {
156+
log.Println("Error in cursor: ", err)
157+
}
158+
return postsResponse, err
138159
}

services/community/api/models/user.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,36 +62,36 @@ func (u *Author) Validate(action string) error {
6262
switch strings.ToLower(action) {
6363
case "update":
6464
if u.Nickname == "" {
65-
return errors.New("Required Nickname")
65+
return errors.New("required nickname")
6666
}
6767
if u.Email == "" {
68-
return errors.New("Required Email")
68+
return errors.New("required email")
6969
}
7070
if err := checkmail.ValidateFormat(u.Email); err != nil {
71-
return errors.New("Invalid Email")
71+
return errors.New("invalid email")
7272
}
7373
return nil
7474

7575
case "login":
7676
if u.Nickname == "" {
77-
return errors.New("Required Nickname")
77+
return errors.New("required nickname")
7878
}
7979
if u.Email == "" {
80-
return errors.New("Required Email")
80+
return errors.New("required email")
8181
}
8282
if err := checkmail.ValidateFormat(u.Email); err != nil {
83-
return errors.New("Invalid Email")
83+
return errors.New("invalid email")
8484
}
8585
return nil
8686
default:
8787
if u.Nickname == "" {
88-
return errors.New("Required Nickname")
88+
return errors.New("required nickname")
8989
}
9090
if u.Email == "" {
91-
return errors.New("Required Email")
91+
return errors.New("required email")
9292
}
9393
if err := checkmail.ValidateFormat(u.Email); err != nil {
94-
return errors.New("Invalid Email")
94+
return errors.New("invalid email")
9595
}
9696
return nil
9797
}

services/web/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"name": "crapi-web",
33
"version": "0.1.0",
44
"private": true,
5+
"proxy": "http://localhost:8889",
56
"dependencies": {
67
"@ant-design/icons": "^4.8.1",
78
"@testing-library/jest-dom": "^4.2.4",
@@ -28,7 +29,8 @@
2829
"build": "react-scripts build",
2930
"test": "react-scripts test",
3031
"eject": "react-scripts eject",
31-
"lint": "prettier --check src/**/*.{js,jsx}"
32+
"lint": "prettier --check src/**/*.{js,jsx}",
33+
"lint:fix": "prettier --write src/**/*.{js,jsx}"
3234
},
3335
"eslintConfig": {
3436
"extends": "react-app"

services/web/src/actions/communityActions.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515

1616
import actionTypes from "../constants/actionTypes";
1717

18-
export const getPostsAction = ({ accessToken, callback }) => {
18+
export const getPostsAction = ({ accessToken, callback, ...data }) => {
1919
return {
2020
type: actionTypes.GET_POSTS,
2121
accessToken,
2222
callback,
23+
...data,
2324
};
2425
};
2526

services/web/src/actions/shopActions.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515

1616
import actionTypes from "../constants/actionTypes";
1717

18-
export const getProductsAction = ({ callback, accessToken }) => {
18+
export const getProductsAction = ({ callback, accessToken, ...data }) => {
1919
return {
2020
type: actionTypes.GET_PRODUCTS,
2121
accessToken,
2222
callback,
23+
...data,
2324
};
2425
};
2526

@@ -32,11 +33,12 @@ export const buyProductAction = ({ callback, accessToken, ...data }) => {
3233
};
3334
};
3435

35-
export const getOrdersAction = ({ callback, accessToken }) => {
36+
export const getOrdersAction = ({ callback, accessToken, ...data }) => {
3637
return {
3738
type: actionTypes.GET_ORDERS,
3839
accessToken,
3940
callback,
41+
...data,
4042
};
4143
};
4244

services/web/src/actions/userActions.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,12 @@ export const resetPasswordAction = ({
108108
};
109109
};
110110

111-
export const getServicesAction = ({ callback, accessToken }) => {
111+
export const getServicesAction = ({ callback, accessToken, ...data }) => {
112112
return {
113113
type: actionTypes.GET_SERVICES,
114114
accessToken,
115115
callback,
116+
...data,
116117
};
117118
};
118119

services/web/src/actions/vehicleActions.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,27 @@ export const verifyVehicleAction = ({ callback, accessToken, ...data }) => {
2424
};
2525
};
2626

27-
export const getMechanicsAction = ({ callback, accessToken }) => {
27+
export const getMechanicsAction = ({ callback, accessToken, ...data }) => {
2828
return {
2929
type: actionTypes.GET_MECHANICS,
3030
accessToken,
3131
callback,
32+
...data,
3233
};
3334
};
3435

35-
export const getVehiclesAction = ({ callback, accessToken, email }) => {
36+
export const getVehiclesAction = ({
37+
callback,
38+
accessToken,
39+
email,
40+
...data
41+
}) => {
3642
return {
3743
type: actionTypes.GET_VEHICLES,
3844
accessToken,
3945
callback,
4046
email,
47+
...data,
4148
};
4249
};
4350

0 commit comments

Comments
 (0)