Skip to content

Commit 3907260

Browse files
committed
refactor: derive context from user's request
1 parent 450cfcc commit 3907260

File tree

10 files changed

+52
-51
lines changed

10 files changed

+52
-51
lines changed

api/api.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"os"
1010
"strings"
11+
"time"
1112

1213
"github.com/0x2e/fusion/conf"
1314
"github.com/0x2e/fusion/frontend"
@@ -67,6 +68,9 @@ func Run() {
6768
return nil
6869
},
6970
}))
71+
r.Use(middleware.TimeoutWithConfig(middleware.TimeoutConfig{
72+
Timeout: 30 * time.Second,
73+
}))
7074
r.Use(session.Middleware(sessions.NewCookieStore([]byte("fusion"))))
7175
r.Pre(middleware.RemoveTrailingSlash())
7276

api/feed.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func newFeedAPI(srv *server.Feed) *feedAPI {
1919
}
2020

2121
func (f feedAPI) All(c echo.Context) error {
22-
resp, err := f.srv.All()
22+
resp, err := f.srv.All(c.Request().Context())
2323
if err != nil {
2424
return err
2525
}
@@ -33,7 +33,7 @@ func (f feedAPI) Get(c echo.Context) error {
3333
return err
3434
}
3535

36-
resp, err := f.srv.Get(&req)
36+
resp, err := f.srv.Get(c.Request().Context(), &req)
3737
if err != nil {
3838
return err
3939
}
@@ -47,7 +47,7 @@ func (f feedAPI) Create(c echo.Context) error {
4747
return err
4848
}
4949

50-
if err := f.srv.Create(&req); err != nil {
50+
if err := f.srv.Create(c.Request().Context(), &req); err != nil {
5151
return err
5252
}
5353

@@ -60,7 +60,7 @@ func (f feedAPI) CheckValidity(c echo.Context) error {
6060
return err
6161
}
6262

63-
resp, err := f.srv.CheckValidity(&req)
63+
resp, err := f.srv.CheckValidity(c.Request().Context(), &req)
6464
if err != nil {
6565
return err
6666
}
@@ -74,7 +74,7 @@ func (f feedAPI) Update(c echo.Context) error {
7474
return err
7575
}
7676

77-
err := f.srv.Update(&req)
77+
err := f.srv.Update(c.Request().Context(), &req)
7878
if err != nil {
7979
return err
8080
}
@@ -88,7 +88,7 @@ func (f feedAPI) Delete(c echo.Context) error {
8888
return err
8989
}
9090

91-
if err := f.srv.Delete(&req); err != nil {
91+
if err := f.srv.Delete(c.Request().Context(), &req); err != nil {
9292
return err
9393
}
9494

@@ -101,7 +101,7 @@ func (f feedAPI) Refresh(c echo.Context) error {
101101
return err
102102
}
103103

104-
if err := f.srv.Refresh(&req); err != nil {
104+
if err := f.srv.Refresh(c.Request().Context(), &req); err != nil {
105105
return err
106106
}
107107

api/group.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func newGroupAPI(srv *server.Group) *groupAPI {
1919
}
2020

2121
func (f groupAPI) All(c echo.Context) error {
22-
resp, err := f.srv.All()
22+
resp, err := f.srv.All(c.Request().Context())
2323
if err != nil {
2424
return err
2525
}
@@ -33,7 +33,7 @@ func (f groupAPI) Create(c echo.Context) error {
3333
return err
3434
}
3535

36-
if err := f.srv.Create(&req); err != nil {
36+
if err := f.srv.Create(c.Request().Context(), &req); err != nil {
3737
return err
3838
}
3939

@@ -46,7 +46,7 @@ func (f groupAPI) Update(c echo.Context) error {
4646
return err
4747
}
4848

49-
err := f.srv.Update(&req)
49+
err := f.srv.Update(c.Request().Context(), &req)
5050
if err != nil {
5151
return err
5252
}
@@ -60,7 +60,7 @@ func (f groupAPI) Delete(c echo.Context) error {
6060
return err
6161
}
6262

63-
if err := f.srv.Delete(&req); err != nil {
63+
if err := f.srv.Delete(c.Request().Context(), &req); err != nil {
6464
return err
6565
}
6666

api/item.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func (i itemAPI) List(c echo.Context) error {
2424
return err
2525
}
2626

27-
resp, err := i.srv.List(&req)
27+
resp, err := i.srv.List(c.Request().Context(), &req)
2828
if err != nil {
2929
return err
3030
}
@@ -38,7 +38,7 @@ func (i itemAPI) Get(c echo.Context) error {
3838
return err
3939
}
4040

41-
resp, err := i.srv.Get(&req)
41+
resp, err := i.srv.Get(c.Request().Context(), &req)
4242
if err != nil {
4343
return err
4444
}
@@ -52,7 +52,7 @@ func (i itemAPI) Delete(c echo.Context) error {
5252
return err
5353
}
5454

55-
if err := i.srv.Delete(&req); err != nil {
55+
if err := i.srv.Delete(c.Request().Context(), &req); err != nil {
5656
return err
5757
}
5858

@@ -65,7 +65,7 @@ func (i itemAPI) UpdateUnread(c echo.Context) error {
6565
return err
6666
}
6767

68-
if err := i.srv.UpdateUnread(&req); err != nil {
68+
if err := i.srv.UpdateUnread(c.Request().Context(), &req); err != nil {
6969
return err
7070
}
7171

@@ -78,7 +78,7 @@ func (i itemAPI) UpdateBookmark(c echo.Context) error {
7878
return err
7979
}
8080

81-
if err := i.srv.UpdateBookmark(&req); err != nil {
81+
if err := i.srv.UpdateBookmark(c.Request().Context(), &req); err != nil {
8282
return err
8383
}
8484

pkg/httpx/httpx.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ func NewSafeClient() *http.Client {
4242
}
4343
return &http.Client{
4444
Transport: safeTransport,
45-
Timeout: 10 * time.Second,
45+
Timeout: 1 * time.Minute, // fallback
4646
}
4747
}

server/feed.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"net/http"
77
"net/url"
88
"sync"
9-
"time"
109

1110
"github.com/0x2e/fusion/model"
1211
"github.com/0x2e/fusion/repo"
@@ -40,7 +39,7 @@ func NewFeed(feedRepo FeedRepo, itemRepo ItemInFeedRepo) *Feed {
4039
}
4140
}
4241

43-
func (f Feed) All() (*RespFeedAll, error) {
42+
func (f Feed) All(ctx context.Context) (*RespFeedAll, error) {
4443
data, err := f.feedRepo.All()
4544
if err != nil {
4645
return nil, err
@@ -63,7 +62,7 @@ func (f Feed) All() (*RespFeedAll, error) {
6362
}, nil
6463
}
6564

66-
func (f Feed) Get(req *ReqFeedGet) (*RespFeedGet, error) {
65+
func (f Feed) Get(ctx context.Context, req *ReqFeedGet) (*RespFeedGet, error) {
6766
data, err := f.feedRepo.Get(req.ID)
6867
if err != nil {
6968
return nil, err
@@ -79,7 +78,7 @@ func (f Feed) Get(req *ReqFeedGet) (*RespFeedGet, error) {
7978
}, nil
8079
}
8180

82-
func (f Feed) Create(req *ReqFeedCreate) error {
81+
func (f Feed) Create(ctx context.Context, req *ReqFeedCreate) error {
8382
feeds := make([]*model.Feed, 0, len(req.Feeds))
8483
for _, r := range req.Feeds {
8584
feeds = append(feeds, &model.Feed{
@@ -109,7 +108,9 @@ func (f Feed) Create(req *ReqFeedCreate) error {
109108
routinePool <- struct{}{}
110109
wg.Add(1)
111110
go func() {
112-
puller.PullOne(feed.ID)
111+
// NOTE: do not use the incoming ctx, as it will be Done() automatically
112+
// by api timeout middleware
113+
puller.PullOne(context.Background(), feed.ID)
113114
<-routinePool
114115
wg.Done()
115116
}()
@@ -118,13 +119,10 @@ func (f Feed) Create(req *ReqFeedCreate) error {
118119
}()
119120
return nil
120121
}
121-
return puller.PullOne(feeds[0].ID)
122+
return puller.PullOne(ctx, feeds[0].ID)
122123
}
123124

124-
func (f Feed) CheckValidity(req *ReqFeedCheckValidity) (*RespFeedCheckValidity, error) {
125-
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
126-
defer cancel()
127-
125+
func (f Feed) CheckValidity(ctx context.Context, req *ReqFeedCheckValidity) (*RespFeedCheckValidity, error) {
128126
validLinks := make([]ValidityItem, 0)
129127
parsed, err := pull.Fetch(ctx, req.Link)
130128
if err == nil && parsed != nil {
@@ -153,7 +151,7 @@ func (f Feed) CheckValidity(req *ReqFeedCheckValidity) (*RespFeedCheckValidity,
153151
}, nil
154152
}
155153

156-
func (f Feed) Update(req *ReqFeedUpdate) error {
154+
func (f Feed) Update(ctx context.Context, req *ReqFeedUpdate) error {
157155
data := &model.Feed{
158156
Name: req.Name,
159157
Link: req.Link,
@@ -169,20 +167,22 @@ func (f Feed) Update(req *ReqFeedUpdate) error {
169167
return err
170168
}
171169

172-
func (f Feed) Delete(req *ReqFeedDelete) error {
170+
func (f Feed) Delete(ctx context.Context, req *ReqFeedDelete) error {
173171
// FIX: transaction
174172
if err := f.itemRepo.DeleteByFeed(req.ID); err != nil {
175173
return err
176174
}
177175
return f.feedRepo.Delete(req.ID)
178176
}
179177

180-
func (f Feed) Refresh(req *ReqFeedRefresh) error {
178+
func (f Feed) Refresh(ctx context.Context, req *ReqFeedRefresh) error {
181179
pull := pull.NewPuller(repo.NewFeed(repo.DB), repo.NewItem(repo.DB))
182180
if req.ID != nil {
183-
return pull.PullOne(*req.ID)
181+
return pull.PullOne(ctx, *req.ID)
184182
}
185183
if req.All != nil && *req.All {
184+
// NOTE: do not use the incoming ctx, as it will be Done() automatically
185+
// by api timeout middleware
186186
go pull.PullAll(context.Background(), true)
187187
}
188188
return nil

server/group.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package server
22

33
import (
4+
"context"
45
"errors"
56
"net/http"
67

@@ -32,7 +33,7 @@ func NewGroup(groupRepo GroupRepo, feedRepo FeedinGroupRepo) *Group {
3233
}
3334
}
3435

35-
func (g Group) All() (*RespGroupAll, error) {
36+
func (g Group) All(ctx context.Context) (*RespGroupAll, error) {
3637
data, err := g.groupRepo.All()
3738
if err != nil {
3839
return nil, err
@@ -50,7 +51,7 @@ func (g Group) All() (*RespGroupAll, error) {
5051
}, nil
5152
}
5253

53-
func (g Group) Create(req *ReqGroupCreate) error {
54+
func (g Group) Create(ctx context.Context, req *ReqGroupCreate) error {
5455
newGroup := &model.Group{
5556
Name: req.Name,
5657
}
@@ -61,7 +62,7 @@ func (g Group) Create(req *ReqGroupCreate) error {
6162
return err
6263
}
6364

64-
func (g Group) Update(req *ReqGroupUpdate) error {
65+
func (g Group) Update(ctx context.Context, req *ReqGroupUpdate) error {
6566
err := g.groupRepo.Update(req.ID, &model.Group{
6667
Name: req.Name,
6768
})
@@ -71,7 +72,7 @@ func (g Group) Update(req *ReqGroupUpdate) error {
7172
return err
7273
}
7374

74-
func (g Group) Delete(req *ReqGroupDelete) error {
75+
func (g Group) Delete(ctx context.Context, req *ReqGroupDelete) error {
7576
if req.ID == 1 {
7677
return errors.New("cannot delete the default group")
7778
}

server/item.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package server
22

33
import (
4+
"context"
5+
46
"github.com/0x2e/fusion/model"
57
"github.com/0x2e/fusion/repo"
68
)
@@ -25,7 +27,7 @@ func NewItem(repo ItemRepo) *Item {
2527
}
2628
}
2729

28-
func (i Item) List(req *ReqItemList) (*RespItemList, error) {
30+
func (i Item) List(ctx context.Context, req *ReqItemList) (*RespItemList, error) {
2931
filter := repo.ItemFilter{
3032
Keyword: req.Keyword,
3133
FeedID: req.FeedID,
@@ -66,7 +68,7 @@ func (i Item) List(req *ReqItemList) (*RespItemList, error) {
6668
}, nil
6769
}
6870

69-
func (i Item) Get(req *ReqItemGet) (*RespItemGet, error) {
71+
func (i Item) Get(ctx context.Context, req *ReqItemGet) (*RespItemGet, error) {
7072
data, err := i.repo.Get(req.ID)
7173
if err != nil {
7274
return nil, err
@@ -89,14 +91,14 @@ func (i Item) Get(req *ReqItemGet) (*RespItemGet, error) {
8991
}, nil
9092
}
9193

92-
func (i Item) Delete(req *ReqItemDelete) error {
94+
func (i Item) Delete(ctx context.Context, req *ReqItemDelete) error {
9395
return i.repo.Delete(req.ID)
9496
}
9597

96-
func (i Item) UpdateUnread(req *ReqItemUpdateUnread) error {
98+
func (i Item) UpdateUnread(ctx context.Context, req *ReqItemUpdateUnread) error {
9799
return i.repo.UpdateUnread(req.IDs, req.Unread)
98100
}
99101

100-
func (i Item) UpdateBookmark(req *ReqItemUpdateBookmark) error {
102+
func (i Item) UpdateBookmark(ctx context.Context, req *ReqItemUpdateBookmark) error {
101103
return i.repo.UpdateBookmark(req.ID, req.Bookmark)
102104
}

service/pull/handle.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import (
1515
)
1616

1717
func (p *Puller) do(ctx context.Context, f *model.Feed, force bool) error {
18+
ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
19+
defer cancel()
1820
if f.IsSuspended() {
1921
log.Printf("skip feed %d: suspended\n", f.ID)
2022
return nil

0 commit comments

Comments
 (0)