mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 19:04:35 +00:00
84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
package handler
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
log "github.com/micro/micro/v3/service/logger"
|
|
"github.com/micro/micro/v3/service/model"
|
|
|
|
feeds "github.com/micro/services/feeds/proto"
|
|
posts "github.com/micro/services/posts/proto"
|
|
)
|
|
|
|
type Feeds struct {
|
|
feeds model.Model
|
|
entries model.Model
|
|
postsService posts.PostsService
|
|
feedsIdIndex model.Index
|
|
feedsNameIndex model.Index
|
|
entriesDateIndex model.Index
|
|
entriesURLIndex model.Index
|
|
}
|
|
|
|
func NewFeeds(postsService posts.PostsService) *Feeds {
|
|
idIndex := model.ByEquality("url")
|
|
idIndex.Order.Type = model.OrderTypeUnordered
|
|
|
|
nameIndex := model.ByEquality("name")
|
|
nameIndex.Unique = true
|
|
nameIndex.Order.Type = model.OrderTypeUnordered
|
|
|
|
dateIndex := model.ByEquality("date")
|
|
dateIndex.Order.Type = model.OrderTypeDesc
|
|
|
|
entriesURLIndex := model.ByEquality("url")
|
|
entriesURLIndex.Order.Type = model.OrderTypeDesc
|
|
entriesURLIndex.Order.FieldName = "date"
|
|
|
|
f := &Feeds{
|
|
feeds: model.NewModel(
|
|
model.WithNamespace("feeds"),
|
|
model.WithIndexes(nameIndex),
|
|
),
|
|
entries: model.NewModel(
|
|
model.WithNamespace("entries"),
|
|
model.WithIndexes(dateIndex, entriesURLIndex),
|
|
),
|
|
postsService: postsService,
|
|
feedsIdIndex: idIndex,
|
|
feedsNameIndex: nameIndex,
|
|
entriesDateIndex: dateIndex,
|
|
entriesURLIndex: entriesURLIndex,
|
|
}
|
|
|
|
go f.crawl()
|
|
return f
|
|
}
|
|
|
|
func (e *Feeds) crawl() {
|
|
e.fetchAll()
|
|
tick := time.NewTicker(1 * time.Minute)
|
|
for _ = range tick.C {
|
|
e.fetchAll()
|
|
}
|
|
}
|
|
|
|
func (e *Feeds) New(ctx context.Context, req *feeds.NewRequest, rsp *feeds.NewResponse) error {
|
|
log.Info("Received Feeds.New request")
|
|
e.feeds.Create(feeds.Feed{
|
|
Name: req.Name,
|
|
Url: req.Url,
|
|
})
|
|
return nil
|
|
}
|
|
|
|
func (e *Feeds) Entries(ctx context.Context, req *feeds.EntriesRequest, rsp *feeds.EntriesResponse) error {
|
|
log.Info("Received Feeds.New request")
|
|
err := e.fetch(req.Url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return e.entries.Read(e.entriesURLIndex.ToQuery(req.Url), &rsp.Entries)
|
|
}
|