Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a default sort option for the front page and comments #1400

Merged
merged 2 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading