Skip to content

Commit

Permalink
Merge branch 'feat-keyset-pagination' into 'master'
Browse files Browse the repository at this point in the history
completely redo the way submissions are fetched

Closes #8 and #11

See merge request edgyemma/Postmill!42
  • Loading branch information
Emma committed Apr 10, 2018
2 parents 049b378 + d4325c1 commit 4eabd19
Show file tree
Hide file tree
Showing 19 changed files with 478 additions and 212 deletions.
24 changes: 15 additions & 9 deletions config/app_routes/forum.yaml
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
multi:
controller: App\Controller\ForumController::multi
defaults: { sortBy: hot, page: 1 }
path: /f/{names}/{sortBy}/{page}
defaults: { sortBy: hot }
path: /f/{names}/{sortBy}
requirements:
names: '(?:\w{3,25}\+){1,70}\w{3,25}'
sortBy: hot|new
sortBy: "%submission_sort_modes%"

forum:
controller: App\Controller\ForumController::front
defaults: { sortBy: hot, page: 1 }
path: /f/{forum_name}/{sortBy}/{page}
defaults: { sortBy: hot }
path: /f/{forum_name}/{sortBy}
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

forum_feed:
controller: App\Controller\ForumController::feed
defaults: { sortBy: hot, page: 1, _format: xml }
path: /f/{forum_name}/{sortBy}/{page}.atom
defaults: { sortBy: hot, _format: xml }
path: /f/{forum_name}/{sortBy}.atom
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

forum_feed_legacy_redirect:
controller: FrameworkBundle:Redirect:redirect
defaults: { route: forum_feed, ignoreAttributes: [page] }
path: /f/{forum_name}/{sortBy}/{page}.atom
requirements: { page: \d+ }

edit_forum:
controller: App\Controller\ForumController::editForum
Expand Down
6 changes: 3 additions & 3 deletions config/app_routes/forum_category.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ manage_forum_categories:

forum_category:
controller: App\Controller\ForumCategoryController::category
defaults: { sortBy: hot, page: 1 }
path: /c/{name}/{sortBy}/{page}
defaults: { sortBy: hot }
path: /c/{name}/{sortBy}
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

create_forum_category:
controller: App\Controller\ForumCategoryController::create
Expand Down
43 changes: 25 additions & 18 deletions config/app_routes/front.yaml
Original file line number Diff line number Diff line change
@@ -1,41 +1,48 @@
front:
controller: App\Controller\FrontController::front
defaults: { sortBy: hot, page: 1 }
path: /{sortBy}/{page}
defaults: { sortBy: hot }
path: /{sortBy}
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

featured:
controller: App\Controller\FrontController::featured
defaults: { sortBy: hot, page: 1}
path: /featured/{sortBy}/{page}
defaults: { sortBy: hot }
path: /featured/{sortBy}
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

subscribed:
controller: App\Controller\FrontController::subscribed
defaults: { sortBy: hot, page: 1 }
path: /subscribed/{sortBy}/{page}
defaults: { sortBy: hot }
path: /subscribed/{sortBy}
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

all:
controller: App\Controller\FrontController::all
defaults: { sortBy: hot, page: 1 }
path: /all/{sortBy}/{page}
defaults: { sortBy: hot }
path: /all/{sortBy}
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

moderated:
controller: App\Controller\FrontController::moderated
defaults: { sortBy: hot, page: 1 }
path: /moderated/{sortBy}/{page}
defaults: { sortBy: hot }
path: /moderated/{sortBy}
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

featured_feed:
controller: App\Controller\FrontController::featuredFeed
defaults: { sortBy: hot, page: 1, _format: xml }
path: /featured/{sortBy}/{page}.atom
defaults: { sortBy: hot, _format: xml }
path: /featured/{sortBy}.atom
methods: [GET]
requirements: { sortBy: hot|new, page: \d+ }
requirements: { sortBy: "%submission_sort_modes%" }

featured_feed_legacy_redirect:
controller: FrameworkBundle:Redirect:redirect
defaults: { route: featured_feed, ignoreAttributes: true }
methods: [GET]
path: /featured/{sortBy}/{_page}.atom
requirements: { sortBy: "%submission_sort_modes%", page: \d+ }
1 change: 1 addition & 0 deletions config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ parameters:
uuid_regex: '[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}'
wiki_page_regex: '[A-Za-z][A-Za-z0-9_-]*(/[A-Za-z][A-Za-z0-9_-]*)*'
env(APP_ENABLE_WEBHOOKS): false
submission_sort_modes: hot|new|top|controversial|most_commented

services:
_defaults:
Expand Down
6 changes: 6 additions & 0 deletions src/Controller/AbstractController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@

namespace App\Controller;

use App\Repository\Submission\SubmissionPager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as BaseAbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;

abstract class AbstractController extends BaseAbstractController {
protected function submissionPage(string $sortBy, Request $request): array {
return SubmissionPager::getParamsFromRequest($sortBy, $request);
}

protected function validateCsrf(string $id, string $token) {
if (!$this->isCsrfTokenValid($id, $token)) {
throw new BadRequestHttpException('Invalid CSRF token');
Expand Down
9 changes: 6 additions & 3 deletions src/Controller/ForumCategoryController.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@
class ForumCategoryController extends AbstractController {
public function category(
ForumCategory $category,
string $sortBy, int $page,
string $sortBy,
ForumRepository $fr,
SubmissionRepository $sr
SubmissionRepository $sr,
Request $request
): Response {
$forums = $fr->findForumsInCategory($category);

$submissions = $sr->findFrontPageSubmissions($forums, $sortBy, $page);
$submissions = $sr->findSubmissions($sortBy, [
'forums' => array_keys($forums),
], $this->submissionPage($sortBy, $request));

return $this->render('forum_category/category.html.twig', [
'category' => $category,
Expand Down
41 changes: 25 additions & 16 deletions src/Controller/ForumController.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,34 @@
* @Entity("user", expr="repository.findOneOrRedirectToCanonical(username, 'username')")
*/
final class ForumController extends AbstractController {
/**
* @var SubmissionRepository
*/
private $submissions;

/**
* @var bool
*/
private $enableWebhooks;

public function __construct(bool $enableWebhooks) {
public function __construct(SubmissionRepository $submissions, bool $enableWebhooks) {
$this->submissions = $submissions;
$this->enableWebhooks = $enableWebhooks;
}

/**
* Show the front page of a given forum.
*
* @param SubmissionRepository $sr
* @param Forum $forum
* @param string $sortBy
* @param int $page
* @param Forum $forum
* @param string $sortBy
*
* @return Response
*/
public function front(SubmissionRepository $sr, Forum $forum, string $sortBy, int $page) {
$submissions = $sr->findForumSubmissions($forum, $sortBy, $page);
public function front(Forum $forum, string $sortBy, Request $request): Response {
$submissions = $this->submissions->findSubmissions($sortBy, [
'forums' => [$forum->getId()],
'stickies' => true,
], $this->submissionPage($sortBy, $request));

return $this->render('forum/forum.html.twig', [
'forum' => $forum,
Expand All @@ -63,8 +70,7 @@ public function front(SubmissionRepository $sr, Forum $forum, string $sortBy, in
]);
}

public function multi(ForumRepository $fr, SubmissionRepository $sr,
string $names, string $sortBy, int $page) {
public function multi(ForumRepository $fr, string $names, string $sortBy, Request $request) {
$names = preg_split('/[^\w]+/', $names, -1, PREG_SPLIT_NO_EMPTY);
$names = array_map(Forum::class.'::normalizeName', $names);
$names = $fr->findForumNames($names);
Expand All @@ -73,7 +79,9 @@ public function multi(ForumRepository $fr, SubmissionRepository $sr,
throw $this->createNotFoundException('no such forums');
}

$submissions = $sr->findFrontPageSubmissions($names, $sortBy, $page);
$submissions = $this->submissions->findSubmissions($sortBy, [
'forums' => array_keys($names),
], $this->submissionPage($sortBy, $request));

return $this->render('forum/multi.html.twig', [
'forums' => $names,
Expand Down Expand Up @@ -148,17 +156,18 @@ public function editForum(Request $request, Forum $forum, EntityManager $em) {
}

/**
* @param Forum $forum
* @param SubmissionRepository $sr
* @param string $sortBy
* @param int $page
* @param Forum $forum
* @param string $sortBy
* @param Request $request
*
* @return Response
*/
public function feed(Forum $forum, SubmissionRepository $sr, string $sortBy, int $page) {
public function feed(Forum $forum, string $sortBy, Request $request) {
return $this->render('forum/feed.xml.twig', [
'forum' => $forum,
'submissions' => $sr->findForumSubmissions($forum, $sortBy, $page),
'submissions' => $this->submissions->findSubmissions($sortBy, [
'forums' => [$forum->getId()],
], $this->submissionPage($sortBy, $request)),
]);
}

Expand Down
81 changes: 53 additions & 28 deletions src/Controller/FrontController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use App\Entity\User;
use App\Repository\ForumRepository;
use App\Repository\SubmissionRepository;
use App\Repository\Submission\SubmissionPager;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
Expand All @@ -25,7 +27,25 @@
* instead.
*/
final class FrontController extends AbstractController {
public function front(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) {
/**
* @var ForumRepository
*/
private $forums;

/**
* @var SubmissionRepository
*/
private $submissions;

public function __construct(
ForumRepository $forums,
SubmissionRepository $submissions
) {
$this->forums = $forums;
$this->submissions = $submissions;
}

public function front(string $sortBy, Request $request): Response {
$user = $this->getUser();

if (!$user instanceof User) {
Expand All @@ -38,21 +58,24 @@ public function front(ForumRepository $fr, SubmissionRepository $sr, string $sor

switch ($listing) {
case User::FRONT_SUBSCRIBED:
return $this->subscribed($fr, $sr, $sortBy, $page);
return $this->subscribed($sortBy, $request);
case User::FRONT_FEATURED:
return $this->featured($fr, $sr, $sortBy, $page);
return $this->featured($sortBy, $request);
case User::FRONT_ALL:
return $this->all($sr, $sortBy, $page);
return $this->all($sortBy, $request);
case User::FRONT_MODERATED:
return $this->moderated($fr, $sr, $sortBy, $page);
return $this->moderated($sortBy, $request);
default:
throw new \InvalidArgumentException('bad front page selection');
}
}

public function featured(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) {
$forums = $fr->findFeaturedForumNames();
$submissions = $sr->findFrontPageSubmissions($forums, $sortBy, $page);
public function featured(string $sortBy, Request $request): Response {
$forums = $this->forums->findFeaturedForumNames();

$submissions = $this->submissions->findSubmissions($sortBy, [
'forums' => array_keys($this->forums->findFeaturedForumNames()),
], $this->submissionPage($sortBy, $request));

return $this->render('front/featured.html.twig', [
'forums' => $forums,
Expand All @@ -62,17 +85,19 @@ public function featured(ForumRepository $fr, SubmissionRepository $sr, string $
]);
}

public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) {
public function subscribed(string $sortBy, Request $request): Response {
$this->denyAccessUnlessGranted('ROLE_USER');

$forums = $fr->findSubscribedForumNames($this->getUser());
$hasSubscriptions = count($forums) > 0;
$forums = $this->forums->findSubscribedForumNames($this->getUser());
$hasSubscriptions = \count($forums) > 0;

if (!$hasSubscriptions) {
$forums = $fr->findFeaturedForumNames();
$forums = $this->forums->findFeaturedForumNames();
}

$submissions = $sr->findFrontPageSubmissions($forums, $sortBy, $page);
$submissions = $this->submissions->findSubmissions($sortBy, [
'forums' => array_keys($forums),
], $this->submissionPage($sortBy, $request));

return $this->render('front/subscribed.html.twig', [
'forums' => $forums,
Expand All @@ -83,15 +108,9 @@ public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string
]);
}

/**
* @param SubmissionRepository $sr
* @param string $sortBy
* @param int $page
*
* @return Response
*/
public function all(SubmissionRepository $sr, string $sortBy, int $page) {
$submissions = $sr->findAllSubmissions($sortBy, $page);
public function all(string $sortBy, Request $request): Response {
$submissions = $this->submissions->findSubmissions($sortBy, [],
$this->submissionPage($sortBy, $request));

return $this->render('front/all.html.twig', [
'listing' => 'all',
Expand All @@ -100,11 +119,14 @@ public function all(SubmissionRepository $sr, string $sortBy, int $page) {
]);
}

public function moderated(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) {
public function moderated(string $sortBy, Request $request): Response {
$this->denyAccessUnlessGranted('ROLE_USER');

$forums = $fr->findModeratedForumNames($this->getUser());
$submissions = $sr->findFrontPageSubmissions($forums, $sortBy, $page);
$forums = $this->forums->findModeratedForumNames($this->getUser());

$submissions = $this->submissions->findSubmissions($sortBy, [
'forums' => array_keys($forums),
], $this->submissionPage($sortBy, $request));

return $this->render('front/moderated.html.twig', [
'forums' => $forums,
Expand All @@ -114,9 +136,12 @@ public function moderated(ForumRepository $fr, SubmissionRepository $sr, string
]);
}

public function featuredFeed(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page = 1) {
$forums = $fr->findFeaturedForumNames();
$submissions = $sr->findFrontPageSubmissions($forums, $sortBy, $page);
public function featuredFeed(string $sortBy, Request $request): Response {
$forums = $this->forums->findFeaturedForumNames();

$submissions = $this->submissions->findSubmissions($sortBy, [
'forums' => array_keys($forums),
], $this->submissionPage($sortBy, $request));

return $this->render('front/featured.xml.twig', [
'forums' => $forums,
Expand Down
Loading

0 comments on commit 4eabd19

Please sign in to comment.