Skip to content

Commit aa8317d

Browse files
authored
Merge pull request #9 from hatch-is/add-count-headres
Add count headres
2 parents 8a0371e + d173b92 commit aa8317d

File tree

3 files changed

+59
-24
lines changed

3 files changed

+59
-24
lines changed

model/articles.go

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,26 @@ import (
1515
type ArticlesModel struct{}
1616

1717
//Read get articles
18-
func (artModel *ArticlesModel) Read(qFilter string, qSkip string, qLimit string) (result []store.Article, err error) {
18+
func (artModel *ArticlesModel) Read(qFilter string) (result []store.Article, total int, left int, err error) {
1919
artDb := store.ArticlesCollectionConnect()
2020

2121
query, isSort, err := artModel.convertFilter(qFilter)
2222
if err != nil {
2323
return
2424
}
25+
skip, limit := getSkipLimit(qFilter)
2526
query["deleted"] = false
2627
if isSort == false {
27-
2828
fields := bson.M{}
29-
30-
skip, err := strconv.Atoi(qSkip)
31-
if err != nil {
32-
skip = 0
33-
}
34-
limit, err := strconv.Atoi(qLimit)
35-
if err != nil {
36-
limit = 0
37-
}
38-
result, err = artDb.Read(query, fields, skip, limit)
29+
result, total, left, err = artDb.Read(query, fields, skip, limit)
3930
} else {
40-
result, err = artDb.Search(query)
31+
result, total, left, err = artDb.Search(query, skip, limit)
4132
}
4233

4334
if err != nil {
4435
return
4536
}
46-
return result, nil
37+
return result, total, left, nil
4738
}
4839

4940
//ReadOne get article by ID
@@ -172,3 +163,27 @@ func (artModel *ArticlesModel) Delete(qID string) (err error) {
172163

173164
return
174165
}
166+
167+
func getSkipLimit(filter string) (skip int, limit int) {
168+
if filter != "" {
169+
jParser, err := gabs.ParseJSON([]byte(filter))
170+
if err != nil {
171+
return
172+
}
173+
174+
if s := jParser.Exists("skip"); s == true {
175+
sTmp, ok := jParser.Path("skip").Data().(string)
176+
if ok == true {
177+
skip, _ = strconv.Atoi(sTmp)
178+
}
179+
}
180+
181+
if l := jParser.Exists("limit"); l == true {
182+
lTmp, ok := jParser.Path("limit").Data().(string)
183+
if ok == true {
184+
limit, _ = strconv.Atoi(lTmp)
185+
}
186+
}
187+
}
188+
return skip, limit
189+
}

store/articles.go

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,27 @@ func ArticlesCollectionConnect() *ArticlesCollection {
5151
}
5252

5353
//Read return entries of Articles collections
54-
func (art *ArticlesCollection) Read(query bson.M, fields bson.M, skip int, limit int) (result []Article, err error) {
54+
func (art *ArticlesCollection) Read(query bson.M, fields bson.M, skip int, limit int) (result []Article, total int, left int, err error) {
5555
session, artCollection, err := art.conn.getSessionAndCollection(art.collection)
5656
if err != nil {
5757
return
5858
}
5959
defer session.Close()
6060
result = make([]Article, 0)
6161
err = artCollection.Find(query).Select(fields).Skip(skip).Limit(limit).All(&result)
62-
6362
if err != nil {
6463
return
6564
}
66-
67-
return result, nil
65+
count := len(result)
66+
total, err = artCollection.Find(query).Count()
67+
if err != nil {
68+
return
69+
}
70+
left = total - (skip + count)
71+
if left < 0 {
72+
left = 0
73+
}
74+
return result, total, left, nil
6875
}
6976

7077
//ReadOne return one enrty of Articles collection by query
@@ -161,7 +168,7 @@ func (art *ArticlesCollection) Delete(ID bson.ObjectId) (err error) {
161168
}
162169

163170
//Search implement full-text search
164-
func (art *ArticlesCollection) Search(q bson.M) (result []Article, err error) {
171+
func (art *ArticlesCollection) Search(q bson.M, skip int, limit int) (result []Article, total int, left int, err error) {
165172
session, artCollection, err := art.conn.getSessionAndCollection(art.collection)
166173
if err != nil {
167174
return
@@ -175,10 +182,22 @@ func (art *ArticlesCollection) Search(q bson.M) (result []Article, err error) {
175182
}
176183
sort := "$textScore:score"
177184
result = make([]Article, 0)
178-
err = artCollection.Find(q).Select(fields).Sort(sort).All(&result)
185+
err = artCollection.Find(q).Select(fields).Sort(sort).Skip(skip).Limit(limit).All(&result)
186+
if err != nil {
187+
return
188+
}
189+
count := len(result)
190+
total, err = artCollection.Find(q).Select(fields).Sort(sort).Count()
191+
if err != nil {
192+
return
193+
}
194+
left = total - (skip + count)
195+
if left < 0 {
196+
left = 0
197+
}
179198
if err != nil {
180199
return
181200
}
182201

183-
return result, nil
202+
return result, total, left, nil
184203
}

webActions/articlesWebActions.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package webActions
33
import (
44
"knowledge-base/model"
55
"net/http"
6+
"strconv"
67

78
"github.com/gorilla/mux"
89
)
@@ -14,11 +15,11 @@ type ArticlesWebActions struct {
1415

1516
//Read get all articles
1617
func (art *ArticlesWebActions) Read(w http.ResponseWriter, r *http.Request) {
17-
skip := r.URL.Query().Get("skip")
18-
limit := r.URL.Query().Get("limit")
1918
filter := r.URL.Query().Get("filter")
2019

21-
data, err := art.model.Read(filter, skip, limit)
20+
data, total, left, err := art.model.Read(filter)
21+
w.Header().Set("X-Total-Count", strconv.Itoa(total))
22+
w.Header().Set("X-RateLimit-Remaining", strconv.Itoa(left))
2223
if err != nil {
2324
ErrorWithJSON(w, r, err.Error(), 404)
2425
} else {

0 commit comments

Comments
 (0)