/** * Returns a collection of posts as cited in a post's text body. * * @param \App\Post $post * @return Collection */ public static function getCites(Post $post) { $postCites = []; $boardCites = []; $lines = explode("\n", $post->body); $relative = "/\\s?>>(?P<board_id>\\d+)\\s?/"; $global = "/\\s?>>>\\/(?P<board_uri>" . Board::URI_PATTERN_INNER . ")\\/(?P<board_id>\\d+)?\\s?/"; foreach ($lines as $line) { $line = str_replace(">", ">", $line); preg_match_all($relative, $line, $relativeMatch); preg_match_all($global, $line, $globalMatch); if (isset($relativeMatch['board_id'])) { foreach ($relativeMatch['board_id'] as $matchIndex => $matchBoardId) { $postCites[] = ['board_uri' => $post->board_uri, 'board_id' => $matchBoardId]; } } if (isset($globalMatch['board_uri'])) { foreach ($globalMatch['board_uri'] as $matchIndex => $matchBoardUri) { $matchBoardId = $globalMatch['board_id'][$matchIndex]; if ($matchBoardId != "") { $postCites[] = ['board_uri' => $matchBoardUri, 'board_id' => $matchBoardId]; } else { $boardCites[] = $matchBoardUri; } } } } // Fetch all the boards and relevant content. if (count($boardCites)) { $boards = Board::whereIn('board_uri', $boardCites)->get(); } else { $boards = new Collection(); } if (count($postCites)) { $posts = Post::where(function ($query) use($postCites) { foreach ($postCites as $postCite) { $query->orWhere(function ($query) use($postCite) { $query->where('board_uri', $postCite['board_uri'])->where('board_id', $postCite['board_id']); }); } })->get(); } else { $posts = new Collection(); } return ['boards' => $boards, 'posts' => $posts]; }
/** * Returns a list of board_uris where the canEditConfig permission is given. * */ public function getBoardsWithConfigRights() { $boards = []; foreach ($this->getPermissions() as $board_uri => $permissions) { if ($this->canEditConfig($board_uri)) { if ($board_uri == "") { return Board::andCreator()->andOperator()->get(); } else { $boards[] = $board_uri; } } } return Board::whereIn('board_uri', $boards)->andCreator()->andOperator()->get(); }