-
Notifications
You must be signed in to change notification settings - Fork 1
/
api_article.go
104 lines (86 loc) · 2.35 KB
/
api_article.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package front
import (
"github.com/google/uuid"
"github.com/gowool/wool"
"github.com/rumorsflow/rumors/v2/internal/db"
"github.com/rumorsflow/rumors/v2/internal/entity"
"github.com/rumorsflow/rumors/v2/internal/http/action"
"github.com/rumorsflow/rumors/v2/internal/model"
"github.com/rumorsflow/rumors/v2/pkg/repository"
"github.com/spf13/cast"
"go.mongodb.org/mongo-driver/bson"
"net/http"
"strings"
"time"
)
type ArticleActions struct {
ArticleRepo repository.ReadRepository[*entity.Article]
SiteRepo repository.ReadRepository[*entity.Site]
}
func (a *ArticleActions) List(c wool.Ctx) error {
query := c.Req().URL.Query()
sitesFilter := bson.M{"enabled": true}
var (
ids []uuid.UUID
domains []string
)
if query.Has("sites") {
for _, item := range strings.Split(query.Get("sites"), ",") {
if siteID, err := uuid.Parse(item); err == nil {
ids = append(ids, siteID)
} else {
domains = append(domains, item)
}
}
}
if len(ids) > 0 {
sitesFilter["_id"] = bson.M{"$in": ids}
}
if len(domains) > 0 {
sitesFilter["domain"] = bson.M{"$in": domains}
}
sites, err := a.SiteRepo.Find(c.Req().Context(), &repository.Criteria{Filter: sitesFilter})
if err != nil {
return nil
}
siteIDs := make([]uuid.UUID, len(sites))
for i, s := range sites {
siteIDs[i] = s.ID
}
articlesFilter := bson.M{"site_id": bson.M{"$in": siteIDs}}
if query.Has("dt") {
if t, err := time.Parse(time.RFC3339, query.Get("dt")); err == nil {
articlesFilter["created_at"] = bson.M{"$lte": t}
}
}
if query.Has("langs") {
articlesFilter["lang"] = bson.M{"$in": strings.Split(query.Get("langs"), ",")}
}
total, err := a.ArticleRepo.Count(c.Req().Context(), articlesFilter)
if err != nil {
return err
}
criteria := &repository.Criteria{
Sort: bson.D{{Key: "created_at", Value: -1}},
Filter: articlesFilter,
}
criteria.SetIndex(cast.ToInt64(query.Get(db.QueryIndex)))
criteria.SetSize(cast.ToInt64(query.Get(db.QuerySize)))
response := action.ListResponse{
Total: total,
Index: *criteria.Index,
Size: *criteria.Size,
}
if total > 0 {
data, err := a.ArticleRepo.Find(c.Req().Context(), criteria)
if err != nil {
return err
}
mapped := make([]model.Article, len(data))
for i, item := range data {
mapped[i] = model.ArticleFromEntity(item)
}
response.Data = mapped
}
return c.JSON(http.StatusOK, response)
}