diff --git a/api/subreddits_list.go b/api/subreddits_list.go index 3a9c686..fecc07e 100644 --- a/api/subreddits_list.go +++ b/api/subreddits_list.go @@ -20,6 +20,7 @@ type ListSubredditsParams struct { Offset int64 OrderBy string Sort string + NSFW int } func (l *ListSubredditsParams) FillFromQuery(q Queryable) { @@ -37,6 +38,11 @@ func (l *ListSubredditsParams) FillFromQuery(q Queryable) { } l.OrderBy = q.Get("order_by") l.Sort = strings.ToLower(q.Get("sort")) + if nsfw, err := strconv.Atoi(q.Get("nsfw")); err == nil { + l.NSFW = nsfw + } else { + l.NSFW = -1 + } } func (l ListSubredditsParams) Query() (expr []bob.Mod[*dialect.SelectQuery]) { @@ -56,12 +62,23 @@ func (l ListSubredditsParams) Query() (expr []bob.Mod[*dialect.SelectQuery]) { expr = append(expr, sm.OrderBy(sqlite.Quote(l.OrderBy)).Asc()) } } else { - expr = append(expr, sm.OrderBy(models.SubredditColumns.Name).Asc()) + expr = append(expr, sm.OrderBy(models.SubredditColumns.UpdatedAt).Desc()) } return expr } +func (l ListSubredditsParams) ImageCoverQuery(subname string) (expr []bob.Mod[*dialect.SelectQuery]) { + expr = make([]bob.Mod[*dialect.SelectQuery], 0, 4) + expr = append(expr, models.SelectWhere.Images.Subreddit.EQ(subname)) + if l.NSFW >= 0 { + expr = append(expr, models.SelectWhere.Images.NSFW.EQ(int32(l.NSFW))) + } + expr = append(expr, sm.Limit(1)) + expr = append(expr, sm.OrderBy(models.ImageColumns.CreatedAt).Desc()) + return expr +} + func (l ListSubredditsParams) CountQuery() (expr []bob.Mod[*dialect.SelectQuery]) { if l.Q != "" { expr = append(expr, models.SelectWhere.Subreddits.Name.Like("%"+l.Q+"%")) @@ -112,11 +129,7 @@ func (api *API) ListSubredditsWithCover(ctx context.Context, arg ListSubredditsP // // Subreddit list is expected to be small, so this should be fine since SQLITE has no network latency. for _, subreddit := range result.Data { - subreddit.R.Images, err = models.Images.Query(ctx, api.db, - models.SelectWhere.Images.Subreddit.EQ(subreddit.Name), - sm.Limit(1), - sm.OrderBy(models.ImageColumns.CreatedAt).Desc(), - ).All() + subreddit.R.Images, err = models.Images.Query(ctx, api.db, arg.ImageCoverQuery(subreddit.Name)...).All() } return result, nil diff --git a/server/routes/page_subreddits.go b/server/routes/page_subreddits.go index 8ed0ef5..7b89f27 100644 --- a/server/routes/page_subreddits.go +++ b/server/routes/page_subreddits.go @@ -3,7 +3,6 @@ package routes import ( "net/http" - "github.com/tigorlazuardi/redmage/api" "github.com/tigorlazuardi/redmage/pkg/errs" "github.com/tigorlazuardi/redmage/pkg/log" "github.com/tigorlazuardi/redmage/views" @@ -15,14 +14,11 @@ func (routes *Routes) PageSubreddits(rw http.ResponseWriter, r *http.Request) { defer span.End() c := views.NewContext(routes.Config, r) - - var params api.ListSubredditsParams - params.FillFromQuery(r.URL.Query()) - var data subreddits.Data - var err error + data.Params.FillFromQuery(r.URL.Query()) - data.Subreddits, err = routes.API.ListSubredditsWithCover(ctx, params) + var err error + data.Subreddits, err = routes.API.ListSubredditsWithCover(ctx, data.Params) if err != nil { log.New(ctx).Err(err).Error("failed to list subreddits") code, message := errs.HTTPMessage(err) diff --git a/views/subreddits/filter.templ b/views/subreddits/filter.templ new file mode 100644 index 0000000..1f67492 --- /dev/null +++ b/views/subreddits/filter.templ @@ -0,0 +1,60 @@ +package subreddits + +import "github.com/tigorlazuardi/redmage/api" + +templ Filter(params api.ListSubredditsParams) { +
+ @searchInput(params) + @nsfwSelect(params) + @orderInput(params) + @sortInput(params) +
+} + +templ searchInput(params api.ListSubredditsParams) { + + +} + +templ nsfwSelect(params api.ListSubredditsParams) { + + +} + +templ orderInput(params api.ListSubredditsParams) { + + +} + +templ sortInput(params api.ListSubredditsParams) { + + +} diff --git a/views/subreddits/view.templ b/views/subreddits/view.templ index 075bb7c..08edf10 100644 --- a/views/subreddits/view.templ +++ b/views/subreddits/view.templ @@ -11,6 +11,7 @@ import "github.com/tigorlazuardi/redmage/views/icons" type Data struct { Subreddits api.ListSubredditsResult Error string + Params api.ListSubredditsParams } templ View(c *views.Context, data Data) { @@ -34,16 +35,21 @@ templ Content(c *views.Context, data Data) {
- if data.Subreddits.Total == 0 { -

No Subreddits Found

-

Click here to add a new subreddit.

- } else { -

{ strconv.FormatInt(data.Subreddits.Total, 10) } Subreddits Registered

+ if data.Subreddits.Total > 0 { + @Filter(data.Params) } -
- for _, subreddit := range data.Subreddits.Data { - @SubredditCard(c, subreddit) +
+ if data.Subreddits.Total == 0 { +

No Subreddits Found

+

Click here to add a new subreddit.

+ } else { +

{ strconv.FormatInt(data.Subreddits.Total, 10) } Subreddits Registered

} +
+ for _, subreddit := range data.Subreddits.Data { + @SubredditCard(c, subreddit) + } +
}