forked from leftypol/leftypol
SearchService.php: limit and expose the searchable boards
This commit is contained in:
parent
d6ca80f7fd
commit
63be2bca4e
1 changed files with 28 additions and 7 deletions
|
|
@ -37,6 +37,7 @@ class SearchService {
|
||||||
private float $max_weight;
|
private float $max_weight;
|
||||||
private int $max_query_length;
|
private int $max_query_length;
|
||||||
private int $post_limit;
|
private int $post_limit;
|
||||||
|
private array $searchable_board_uris;
|
||||||
|
|
||||||
|
|
||||||
private static function truncateQuery(string $text, int $byteLimit): ?string {
|
private static function truncateQuery(string $text, int $byteLimit): ?string {
|
||||||
|
|
@ -242,16 +243,30 @@ class SearchService {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param LogDriver $log Log river.
|
||||||
* @param UserPostQueries $user_queries User posts queries.
|
* @param UserPostQueries $user_queries User posts queries.
|
||||||
* @param ?flag_map $max_flag_length The key-value map of user flags, or null to disable flag search.
|
* @param ?array $flag_map The key-value map of user flags, or null to disable flag search.
|
||||||
|
* @param float $max_weight The maximum weight of the parsed user query. Body filters that go beyond this limit are discarded.
|
||||||
|
* @param int $max_query_length Maximum length of the raw input query before it's truncated.
|
||||||
|
* @param int $post_limit Maximum number of results.
|
||||||
|
* @param ?array $searchable_board_uris The uris of the board that can be searched. Null to search all the boards.
|
||||||
*/
|
*/
|
||||||
public function __construct(LogDriver $log, UserPostQueries $user_queries, ?array $flag_map, float $max_weight, int $max_query_length, int $post_limit) {
|
public function __construct(
|
||||||
|
LogDriver $log,
|
||||||
|
UserPostQueries $user_queries,
|
||||||
|
?array $flag_map,
|
||||||
|
float $max_weight,
|
||||||
|
int $max_query_length,
|
||||||
|
int $post_limit,
|
||||||
|
?array $searchable_board_uris
|
||||||
|
) {
|
||||||
$this->log = $log;
|
$this->log = $log;
|
||||||
$this->user_queries = $user_queries;
|
$this->user_queries = $user_queries;
|
||||||
$this->flag_map = $flag_map;
|
$this->flag_map = $flag_map;
|
||||||
$this->max_weight = $max_weight;
|
$this->max_weight = $max_weight;
|
||||||
$this->max_query_length = $max_query_length;
|
$this->max_query_length = $max_query_length;
|
||||||
$this->post_limit = $post_limit;
|
$this->post_limit = $post_limit;
|
||||||
|
$this->searchable_board_uris = $searchable_board_uris ?? listBoards(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -284,7 +299,7 @@ class SearchService {
|
||||||
if ($filters->flag !== null) {
|
if ($filters->flag !== null) {
|
||||||
$weighted->flag = [];
|
$weighted->flag = [];
|
||||||
|
|
||||||
if ($this->flag_map !== null && !empty($this->flag_map)) {
|
if (!empty($this->flag_map)) {
|
||||||
$max_flag_length = \array_reduce($this->flag_map, fn($max, $str) => \max($max, \strlen($str)), 0);
|
$max_flag_length = \array_reduce($this->flag_map, fn($max, $str) => \max($max, \strlen($str)), 0);
|
||||||
|
|
||||||
list($fragments, $total_len, $wildcard_weight) = self::filterAndWeight($filters->flag);
|
list($fragments, $total_len, $wildcard_weight) = self::filterAndWeight($filters->flag);
|
||||||
|
|
@ -322,13 +337,12 @@ class SearchService {
|
||||||
* @return array Data array straight from the PDO, with all the fields in posts.sql
|
* @return array Data array straight from the PDO, with all the fields in posts.sql
|
||||||
*/
|
*/
|
||||||
public function search(string $ip, string $raw_query, SearchFilters $filters, ?string $fallback_board): array {
|
public function search(string $ip, string $raw_query, SearchFilters $filters, ?string $fallback_board): array {
|
||||||
$board = $filters->board ?? $fallback_board;
|
$board = !empty($filters->board) ? $filters->board : $fallback_board;
|
||||||
if ($board === null) {
|
if ($board === null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$valid_uris = listBoards(true);
|
if (!\in_array($board, $this->searchable_board_uris)) {
|
||||||
if (!\in_array($board, $valid_uris)) {
|
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -341,7 +355,7 @@ class SearchService {
|
||||||
}
|
}
|
||||||
|
|
||||||
$flags = [];
|
$flags = [];
|
||||||
if ($filters->flag !== null && $this->flag_map !== null) {
|
if ($filters->flag !== null && !empty($this->flag_map)) {
|
||||||
$flags = $this->matchStrings($this->flag_map, $filters->flag);
|
$flags = $this->matchStrings($this->flag_map, $filters->flag);
|
||||||
if (empty($flags)) {
|
if (empty($flags)) {
|
||||||
// The query doesn't match any flags so it will always fail anyway.
|
// The query doesn't match any flags so it will always fail anyway.
|
||||||
|
|
@ -360,4 +374,11 @@ class SearchService {
|
||||||
$this->post_limit
|
$this->post_limit
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the uris of the boards that may be searched.
|
||||||
|
*/
|
||||||
|
public function getSearchableBoards(): array {
|
||||||
|
return $this->searchable_board_uris;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue