Skip to content

Commit

Permalink
Add a default sort option for the front page and comments (#1400)
Browse files Browse the repository at this point in the history
  • Loading branch information
BentiGorlich authored Jan 29, 2025
1 parent 675c151 commit cd4101b
Show file tree
Hide file tree
Showing 65 changed files with 650 additions and 94 deletions.
32 changes: 16 additions & 16 deletions config/mbin_routes/entry.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ entry_comment_moderate:

entry_comments_front:
controller: App\Controller\Entry\Comment\EntryCommentFrontController::front
defaults: { sortBy: hot, time: ~ }
defaults: { sortBy: default, time: ~ }
path: /comments/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -118,7 +118,7 @@ entry_comments_front:

entry_comments_subscribed:
controller: App\Controller\Entry\Comment\EntryCommentFrontController::subscribed
defaults: { sortBy: hot, time: ~ }
defaults: { sortBy: default, time: ~ }
path: /sub/comments/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -127,7 +127,7 @@ entry_comments_subscribed:

entry_comments_moderated:
controller: App\Controller\Entry\Comment\EntryCommentFrontController::moderated
defaults: { sortBy: hot, time: ~ }
defaults: { sortBy: default, time: ~ }
path: /mod/comments/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -136,7 +136,7 @@ entry_comments_moderated:

entry_comments_favourite:
controller: App\Controller\Entry\Comment\EntryCommentFrontController::favourite
defaults: { sortBy: hot, time: ~ }
defaults: { sortBy: default, time: ~ }
path: /fav/comments/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -145,7 +145,7 @@ entry_comments_favourite:

magazine_entry_comments:
controller: App\Controller\Entry\Comment\EntryCommentFrontController::front
defaults: { sortBy: hot, time: ~ }
defaults: { sortBy: default, time: ~ }
path: /m/{name}/comments/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand Down Expand Up @@ -198,39 +198,39 @@ magazine_entry_create:

entry_edit:
controller: App\Controller\Entry\EntryEditController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/edit
methods: [ GET, POST ]
requirements:
entry_id: \d+

entry_moderate:
controller: App\Controller\Entry\EntryModerateController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/moderate
methods: [ GET ]
requirements:
entry_id: \d+

entry_delete:
controller: App\Controller\Entry\EntryDeleteController::delete
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/delete
methods: [ POST ]
requirements:
entry_id: \d+

entry_restore:
controller: App\Controller\Entry\EntryDeleteController::restore
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/restore
methods: [ POST ]
requirements:
entry_id: \d+

entry_purge:
controller: App\Controller\Entry\EntryDeleteController::purge
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/purge
methods: [ POST ]
requirements:
Expand Down Expand Up @@ -270,15 +270,15 @@ entry_change_adult:

entry_pin:
controller: App\Controller\Entry\EntryPinController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/pin
methods: [ POST ]
requirements:
entry_id: \d+

entry_voters:
controller: App\Controller\Entry\EntryVotersController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/votes/{type}
methods: [ GET ]
requirements:
Expand All @@ -287,23 +287,23 @@ entry_voters:

entry_fav:
controller: App\Controller\Entry\EntryFavouriteController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/favourites
methods: [ GET ]
requirements:
entry_id: \d+

entry_tips:
controller: App\Controller\Entry\EntryTipController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/tips
methods: [ GET ]
requirements:
entry_id: \d+

entry_single:
controller: App\Controller\Entry\EntrySingleController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/{sortBy}
methods: [ GET ]
requirements:
Expand All @@ -312,7 +312,7 @@ entry_single:

entry_single_comments:
controller: App\Controller\Entry\EntrySingleController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/t/{entry_id}/{slug}/comments/{sortBy}
methods: [ GET ]
requirements:
Expand Down
14 changes: 7 additions & 7 deletions config/mbin_routes/front.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
front:
controller: App\Controller\Entry\EntryFrontController::front
defaults: &front_defaults { subscription: home, content: threads, sortBy: hot, time: '∞', federation: all }
defaults: &front_defaults { subscription: home, content: threads, sortBy: default, time: '∞', federation: all }
path: /{subscription}/{content}/{sortBy}/{time}/{federation}
methods: [GET]
requirements: &front_requirement
Expand Down Expand Up @@ -33,7 +33,7 @@ front_short:

front_magazine:
controller: App\Controller\Entry\EntryFrontController::magazine
defaults: &front_magazine_defaults { content: threads, sortBy: hot, time: '∞', federation: all }
defaults: &front_magazine_defaults { content: threads, sortBy: default, time: '∞', federation: all }
path: /m/{name}/{content}/{sortBy}/{time}/{federation}
methods: [GET]
requirements: *front_requirement
Expand All @@ -49,7 +49,7 @@ front_magazine_short:

posts_front:
controller: App\Controller\Entry\EntryFrontController::frontRedirect
defaults: { sortBy: hot, time: '∞', federation: all, content: microblog }
defaults: { sortBy: default, time: '∞', federation: all, content: microblog }
path: /microblog/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -58,7 +58,7 @@ posts_front:

posts_subscribed:
controller: App\Controller\Entry\EntryFrontController::frontRedirect
defaults: { sortBy: hot, time: '∞', federation: all, content: microblog, subscription: 'sub' }
defaults: { sortBy: default, time: '∞', federation: all, content: microblog, subscription: 'sub' }
path: /sub/microblog/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -67,7 +67,7 @@ posts_subscribed:

posts_moderated:
controller: App\Controller\Entry\EntryFrontController::frontRedirect
defaults: { sortBy: hot, time: '∞', federation: all, content: microblog, subscription: 'mod' }
defaults: { sortBy: default, time: '∞', federation: all, content: microblog, subscription: 'mod' }
path: /mod/microblog/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -76,7 +76,7 @@ posts_moderated:

posts_favourite:
controller: App\Controller\Entry\EntryFrontController::frontRedirect
defaults: { sortBy: hot, time: '∞', federation: all, content: microblog, subscription: 'fav' }
defaults: { sortBy: default, time: '∞', federation: all, content: microblog, subscription: 'fav' }
path: /fav/microblog/{sortBy}/{time}
methods: [ GET ]
requirements:
Expand All @@ -85,7 +85,7 @@ posts_favourite:

magazine_posts:
controller: App\Controller\Entry\EntryFrontController::magazineRedirect
defaults: { sortBy: hot, time: '∞', federation: all, content: microblog }
defaults: { sortBy: default, time: '∞', federation: all, content: microblog }
path: /m/{name}/microblog/{sortBy}/{time}/{federation}
methods: [ GET ]
requirements:
Expand Down
2 changes: 1 addition & 1 deletion config/mbin_routes/magazine.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ magazine_purge_content:

magazine_list_all:
controller: App\Controller\Magazine\MagazineListController
defaults: { sortBy: hot, view: table }
defaults: { sortBy: default, view: table }
path: /magazines/{sortBy}/{view}
methods: [GET]

Expand Down
2 changes: 1 addition & 1 deletion config/mbin_routes/post.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ post_change_adult:

post_single:
controller: App\Controller\Post\PostSingleController
defaults: { slug: -, sortBy: hot }
defaults: { slug: -, sortBy: default }
path: /m/{magazine_name}/p/{post_id}/{slug}/{sortBy}
methods: [ GET ]
requirements:
Expand Down
3 changes: 3 additions & 0 deletions config/packages/doctrine.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ doctrine:
citext: App\DoctrineExtensions\DBAL\Types\Citext
enumApplicationStatus: App\DoctrineExtensions\DBAL\Types\EnumApplicationStatus
enumNotificationStatus: App\DoctrineExtensions\DBAL\Types\EnumNotificationStatus
EnumNotificationStatus: App\DoctrineExtensions\DBAL\Types\EnumNotificationStatus
enumSortOptions: App\DoctrineExtensions\DBAL\Types\EnumSortOptions
mapping_types:
user_type: string
citext: citext
enumApplicationStatus: string
enumNotificationStatus: string
enumSortOptions: string

# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
Expand Down
2 changes: 1 addition & 1 deletion config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ parameters:
html5_validation: true

front_sort_options: top|hot|active|newest|oldest|commented # TODO remove fallback after tag rework
default_sort_options: top|hot|active|newest|oldest|commented
default_sort_options: default|top|hot|active|newest|oldest|commented
default_time_options: 3h|6h|12h|1d|1w|1m|1y|all|∞
default_type_options: article|articles|link|links|video|videos|photo|photos|image|images|all
default_subscription_options: sub|fav|mod|all|home
Expand Down
30 changes: 30 additions & 0 deletions migrations/Version20250128125727.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class Version20250128125727 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add the default sort columns for front and comments';
}

public function up(Schema $schema): void
{
$this->addSql('CREATE TYPE enumSortOptions AS ENUM(\'hot\', \'top\', \'newest\', \'active\', \'oldest\', \'commented\')');
$this->addSql('ALTER TABLE "user" ADD front_default_sort enumSortOptions DEFAULT \'hot\' NOT NULL');
$this->addSql('ALTER TABLE "user" ADD comment_default_sort enumSortOptions DEFAULT \'hot\' NOT NULL');
}

public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE "user" DROP front_default_sort');
$this->addSql('ALTER TABLE "user" DROP comment_default_sort');
$this->addSql('DROP TYPE enumSortOptions');
}
}
4 changes: 3 additions & 1 deletion src/Controller/AjaxController.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
use App\Utils\Embed;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;
Expand All @@ -47,6 +48,7 @@ public function __construct(
private readonly UserPushSubscriptionManager $pushSubscriptionManager,
private readonly TranslatorInterface $translator,
private readonly SettingsManager $settingsManager,
private readonly Security $security,
) {
}

Expand Down Expand Up @@ -173,7 +175,7 @@ public function fetchPostComment(PostComment $comment): JsonResponse

public function fetchPostComments(Post $post, PostCommentRepository $repository): JsonResponse
{
$criteria = new PostCommentPageView(1);
$criteria = new PostCommentPageView(1, $this->security);
$criteria->post = $post;
$criteria->sortOption = Criteria::SORT_OLD;
$criteria->perPage = 500;
Expand Down
4 changes: 3 additions & 1 deletion src/Controller/Api/Bookmark/BookmarkListApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
use Nelmio\ApiDocBundle\Annotation\Model;
use Nelmio\ApiDocBundle\Annotation\Security;
use OpenApi\Attributes as OA;
use Symfony\Bundle\SecurityBundle\Security as SymfonySecurity;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Attribute\MapQueryParameter;
use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;
Expand Down Expand Up @@ -141,10 +142,11 @@ public function front(
#[MapQueryParameter] ?int $p,
#[MapQueryParameter] ?int $perPage,
RateLimiterFactory $apiReadLimiter,
SymfonySecurity $security,
): JsonResponse {
$user = $this->getUserOrThrow();
$headers = $this->rateLimit($apiReadLimiter);
$criteria = new EntryPageView($p ?? 1);
$criteria = new EntryPageView($p ?? 1, $security);
$criteria->setTime($criteria->resolveTime($time ?? Criteria::TIME_ALL));
$criteria->setType($criteria->resolveType($type ?? 'all'));
$criteria->showSortOption($criteria->resolveSort($sort ?? Criteria::SORT_NEW));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Nelmio\ApiDocBundle\Attribute\Model;
use OpenApi\Attributes as OA;
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\RateLimiter\RateLimiterFactory;
Expand Down Expand Up @@ -136,10 +137,11 @@ public function __invoke(
RequestStack $request,
RateLimiterFactory $apiReadLimiter,
RateLimiterFactory $anonymousApiReadLimiter,
Security $security,
): JsonResponse {
$headers = $this->rateLimit($apiReadLimiter, $anonymousApiReadLimiter);

$criteria = new EntryCommentPageView((int) $request->getCurrentRequest()->get('p', 1));
$criteria = new EntryCommentPageView((int) $request->getCurrentRequest()->get('p', 1), $security);
$criteria->sortOption = $request->getCurrentRequest()->get('sort', Criteria::SORT_HOT);
$criteria->time = $criteria->resolveTime(
$request->getCurrentRequest()->get('time', Criteria::TIME_ALL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Nelmio\ApiDocBundle\Attribute\Model;
use OpenApi\Attributes as OA;
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\RateLimiter\RateLimiterFactory;

Expand Down Expand Up @@ -134,13 +135,14 @@ public function __invoke(
EntryCommentRepository $commentsRepository,
RateLimiterFactory $apiReadLimiter,
RateLimiterFactory $anonymousApiReadLimiter,
Security $security,
): JsonResponse {
$headers = $this->rateLimit($apiReadLimiter, $anonymousApiReadLimiter);

$this->handlePrivateContent($entry);

$request = $this->request->getCurrentRequest();
$criteria = new EntryCommentPageView($this->getPageNb($request));
$criteria = new EntryCommentPageView($this->getPageNb($request), $security);
$criteria->showSortOption($criteria->resolveSort($request->get('sortBy', Criteria::SORT_HOT)));
$criteria->entry = $entry;
$criteria->perPage = self::constrainPerPage($request->get('perPage', EntryCommentRepository::PER_PAGE));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Nelmio\ApiDocBundle\Attribute\Model;
use OpenApi\Attributes as OA;
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\RateLimiter\RateLimiterFactory;
Expand Down Expand Up @@ -136,10 +137,11 @@ public function __invoke(
RequestStack $request,
RateLimiterFactory $apiReadLimiter,
RateLimiterFactory $anonymousApiReadLimiter,
Security $security,
): JsonResponse {
$headers = $this->rateLimit($apiReadLimiter, $anonymousApiReadLimiter);

$criteria = new EntryCommentPageView((int) $request->getCurrentRequest()->get('p', 1));
$criteria = new EntryCommentPageView((int) $request->getCurrentRequest()->get('p', 1), $security);
$criteria->sortOption = $request->getCurrentRequest()->get('sort', Criteria::SORT_HOT);
$criteria->time = $criteria->resolveTime(
$request->getCurrentRequest()->get('time', Criteria::TIME_ALL)
Expand Down
Loading

0 comments on commit cd4101b

Please sign in to comment.