Skip to content

Commit

Permalink
feat: add a solution filter for the posts endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
imorland committed Nov 6, 2024
1 parent 0284487 commit 4e5f8dc
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
4 changes: 4 additions & 0 deletions extend.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Flarum\Discussion\Filter\DiscussionFilterer;
use Flarum\Discussion\Search\DiscussionSearcher;
use Flarum\Extend;
use Flarum\Post\Filter\PostFilterer;
use Flarum\Post\Post;
use Flarum\Settings\Event\Saving as SettingsSaving;
use Flarum\Tags\Api\Serializer\TagSerializer;
Expand Down Expand Up @@ -127,6 +128,9 @@
(new Extend\Filter(DiscussionFilterer::class))
->addFilter(Search\BestAnswerFilterGambit::class),

(new Extend\Filter(PostFilterer::class))
->addFilter(Search\BestAnswerPostFilter::class),

(new Extend\ApiSerializer(TagSerializer::class))
->attributes(function (TagSerializer $serializer, Tag $tag, array $attributes) {
$attributes['isQnA'] = (bool) $tag->is_qna;
Expand Down
40 changes: 40 additions & 0 deletions src/Search/BestAnswerPostFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace FoF\BestAnswer\Search;

use Flarum\Filter\FilterInterface;
use Flarum\Filter\FilterState;
use Flarum\User\User;
use Illuminate\Database\Query\Builder;

class BestAnswerPostFilter implements FilterInterface
{
public function getFilterKey(): string
{
return 'is:solution';
}

public function filter(FilterState $filterState, string $filterValue, bool $negate)
{
$this->constrain($filterState->getQuery(), $filterState->getActor(), $negate);
}

protected function constrain(Builder $query, User $actor, bool $negate)
{
// Join the `discussions` table to access `best_answer_post_id`.
$query->join('discussions', 'posts.discussion_id', '=', 'discussions.id')
->where('posts.type', 'comment');

if ($negate) {
// Exclude posts that are marked as the best answer
$query->where(function ($query) {
$query->whereNull('discussions.best_answer_post_id')
->orWhereColumn('posts.id', '!=', 'discussions.best_answer_post_id');
});
} else {
// Include only posts that are marked as the best answer
$query->whereNotNull('discussions.best_answer_post_id')
->whereColumn('posts.id', '=', 'discussions.best_answer_post_id');
}
}
}

0 comments on commit 4e5f8dc

Please sign in to comment.