Skip to content

Commit

Permalink
refactor: list only the feeds that match the condition
Browse files Browse the repository at this point in the history
  • Loading branch information
0x2E committed Aug 4, 2024
1 parent 2009a57 commit 8a25ffa
Show file tree
Hide file tree
Showing 12 changed files with 66 additions and 23 deletions.
2 changes: 1 addition & 1 deletion api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func Run() {

feeds := authed.Group("/feeds")
feedAPIHandler := newFeedAPI(server.NewFeed(repo.NewFeed(repo.DB)))
feeds.GET("", feedAPIHandler.All)
feeds.GET("", feedAPIHandler.List)
feeds.GET("/:id", feedAPIHandler.Get)
feeds.POST("", feedAPIHandler.Create)
feeds.POST("/validation", feedAPIHandler.CheckValidity)
Expand Down
9 changes: 7 additions & 2 deletions api/feed.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ func newFeedAPI(srv *server.Feed) *feedAPI {
}
}

func (f feedAPI) All(c echo.Context) error {
resp, err := f.srv.All(c.Request().Context())
func (f feedAPI) List(c echo.Context) error {
var req server.ReqFeedList
if err := bindAndValidate(&req, c); err != nil {
return err
}

resp, err := f.srv.List(c.Request().Context(), &req)
if err != nil {
return err
}
Expand Down
17 changes: 15 additions & 2 deletions frontend/src/lib/api/feed.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
import { api } from './api';
import type { Feed } from './model';

export async function allFeeds() {
const resp = await api.get('feeds').json<{ feeds: Feed[] }>();
export type FeedListFiler = {
have_unread?: boolean;
have_bookmark?: boolean;
};

export async function listFeeds(filter?: FeedListFiler) {
if (filter) {
filter = JSON.parse(JSON.stringify(filter));
}

const resp = await api
.get('feeds', {
searchParams: filter
})
.json<{ feeds: Feed[] }>();
return resp.feeds;
}

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/api/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ export type Item = {
bookmark: boolean;
pub_date: Date;
updated_at: Date;
feed: { id: number; name: string };
feed: Pick<Feed, 'id' | 'name'>;
};
4 changes: 2 additions & 2 deletions frontend/src/routes/+page.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { allFeeds } from '$lib/api/feed';
import { listFeeds } from '$lib/api/feed';
import { listItems, parseURLtoFilter } from '$lib/api/item';
import type { PageLoad } from './$types';

export const load: PageLoad = async ({ url }) => {
const filter = parseURLtoFilter(url.searchParams);
filter.unread = true;
filter.bookmark = undefined;
const feeds = await allFeeds();
const items = await listItems(filter);
const feeds = await listFeeds({ have_unread: true });
return {
feeds: feeds,
items: {
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/routes/all/+page.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { allFeeds } from '$lib/api/feed';
import { listFeeds } from '$lib/api/feed';
import { listItems, parseURLtoFilter } from '$lib/api/item';
import type { PageLoad } from './$types';

export const load: PageLoad = async ({ url }) => {
const filter = parseURLtoFilter(url.searchParams);
filter.unread = undefined;
filter.bookmark = undefined;
const feeds = await allFeeds();
const feeds = await listFeeds();
const items = await listItems(filter);
return {
feeds: feeds,
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/routes/bookmarks/+page.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { allFeeds } from '$lib/api/feed';
import { listFeeds } from '$lib/api/feed';
import { listItems, parseURLtoFilter } from '$lib/api/item';
import type { PageLoad } from './$types';

export const load: PageLoad = async ({ url }) => {
const filter = parseURLtoFilter(url.searchParams);
filter.unread = undefined;
filter.bookmark = true;
const feeds = await allFeeds();
const feeds = await listFeeds({ have_bookmark: true });
const items = await listItems(filter);
return {
feeds: feeds,
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/routes/feeds/+page.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { PageLoad } from './$types';
import type { Feed } from '$lib/api/model';
import { allFeeds } from '$lib/api/feed';
import { listFeeds } from '$lib/api/feed';
import { allGroups } from '$lib/api/group';

export type groupFeeds = {
Expand All @@ -10,7 +10,7 @@ export type groupFeeds = {
};

export const load: PageLoad = async () => {
const feeds = await allFeeds();
const feeds = await listFeeds();
const groups = await allGroups();
const data: groupFeeds[] = [];
for (const g of groups) {
Expand Down
20 changes: 18 additions & 2 deletions repo/feed.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,25 @@ type Feed struct {
db *gorm.DB
}

func (f Feed) All() ([]*model.Feed, error) {
type FeedListFilter struct {
HaveUnread *bool
HaveBookmark *bool
}

func (f Feed) List(filter *FeedListFilter) ([]*model.Feed, error) {
var res []*model.Feed
err := f.db.Model(&model.Feed{}).Joins("Group").Find(&res).Error
db := f.db.Model(&model.Feed{}).Joins("Group")
if filter != nil {
if filter.HaveUnread != nil && *filter.HaveUnread {
db = db.Joins("inner join items on feeds.id = items.feed_id and items.unread = true").
Group("feeds.id")
}
if filter.HaveBookmark != nil && *filter.HaveBookmark {
db = db.Joins("inner join items on feeds.id = items.feed_id and items.bookmark = true").
Group("feeds.id")
}
}
err := db.Find(&res).Error
return res, err
}

Expand Down
12 changes: 8 additions & 4 deletions server/feed.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
//go:generate mockgen -destination=feed_mock.go -source=feed.go -package=server

type FeedRepo interface {
All() ([]*model.Feed, error)
List(filter *repo.FeedListFilter) ([]*model.Feed, error)
Get(id uint) (*model.Feed, error)
Create(feed []*model.Feed) error
Update(id uint, feed *model.Feed) error
Expand All @@ -33,8 +33,12 @@ func NewFeed(repo FeedRepo) *Feed {
}
}

func (f Feed) All(ctx context.Context) (*RespFeedAll, error) {
data, err := f.repo.All()
func (f Feed) List(ctx context.Context, req *ReqFeedList) (*RespFeedList, error) {
filter := &repo.FeedListFilter{
HaveUnread: req.HaveUnread,
HaveBookmark: req.HaveBookmark,
}
data, err := f.repo.List(filter)
if err != nil {
return nil, err
}
Expand All @@ -52,7 +56,7 @@ func (f Feed) All(ctx context.Context) (*RespFeedAll, error) {
Group: GroupForm{ID: v.GroupID, Name: v.Group.Name},
})
}
return &RespFeedAll{
return &RespFeedList{
Feeds: feeds,
}, nil
}
Expand Down
7 changes: 6 additions & 1 deletion server/feed_form.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ type FeedForm struct {
Group GroupForm `json:"group"`
}

type RespFeedAll struct {
type ReqFeedList struct {
HaveUnread *bool `query:"have_unread"`
HaveBookmark *bool `query:"have_bookmark"`
}

type RespFeedList struct {
Feeds []*FeedForm `json:"feeds"`
}

Expand Down
4 changes: 2 additions & 2 deletions service/pull/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ var (
)

type FeedRepo interface {
All() ([]*model.Feed, error)
List(filter *repo.FeedListFilter) ([]*model.Feed, error)
Get(id uint) (*model.Feed, error)
Update(id uint, feed *model.Feed) error
}
Expand Down Expand Up @@ -57,7 +57,7 @@ func (p *Puller) PullAll(ctx context.Context, force bool) error {
ctx, cancel := context.WithTimeout(ctx, interval/2)
defer cancel()

feeds, err := p.feedRepo.All()
feeds, err := p.feedRepo.List(nil)
if err != nil {
if errors.Is(err, repo.ErrNotFound) {
err = nil
Expand Down

0 comments on commit 8a25ffa

Please sign in to comment.