Ejemplo n.º 1
0
 /**
  * Get the forum tree for the index, consisting of root forums (categories), and one level of descendants.
  *
  * @param bool $checkPermissions
  *
  * @return mixed
  */
 public function getIndexTree($checkPermissions = true)
 {
     $unviewable = $this->permissionChecker->getUnviewableIdsForContent('forum');
     // TODO: The caching decorator would also cache the relations here
     $baseQuery = $this->forumModel->where('parent_id', '=', null);
     if ($checkPermissions) {
         $baseQuery = $baseQuery->whereNotIn('id', $unviewable);
     }
     return $baseQuery->with(['children', 'children.lastPost', 'children.lastPost.topic', 'children.lastPostAuthor'])->get();
 }
Ejemplo n.º 2
0
 /**
  * @param array $postIds
  *
  * @return mixed
  */
 public function getPostsByIds(array $postIds)
 {
     $unviewableForums = $this->permissionChecker->getUnviewableIdsForContent('forum');
     return $this->postModel->whereIn('id', $postIds)->whereHas('topic', function ($query) use($unviewableForums) {
         $query->whereNotIn('forum_id', $unviewableForums);
     })->with(['author', 'topic'])->get();
 }
Ejemplo n.º 3
0
 /**
  * @param int $num
  *
  * @return mixed
  */
 public function getNewest($num = 20)
 {
     $unviewableForums = $this->permissionChecker->getUnviewableIdsForContent('forum');
     return $this->topicModel->orderBy('last_post_id', 'desc')->with(['lastPost', 'forum', 'lastPost.author'])->whereNotIn('forum_id', $unviewableForums)->take($num)->get();
 }
Ejemplo n.º 4
0
 /**
  * @return array
  */
 public function rules()
 {
     $unviewableForums = implode(',', $this->permissionChecker->getUnviewableIdsForContent('forum'));
     return ['content' => 'required', 'title' => 'required', 'forum_id' => "required|exists:forums,id|not_in:{$unviewableForums}"];
 }
Ejemplo n.º 5
0
 /**
  * @param PermissionChecker $permissionChecker
  * @param SearchRequest     $searchRequest
  *
  * @return \Illuminate\Http\RedirectResponse
  */
 public function makeSearch(PermissionChecker $permissionChecker, SearchRequest $searchRequest)
 {
     if ($searchRequest->result != 'posts') {
         $searchRequest->result = 'topics';
     }
     if ($searchRequest->result == 'topics') {
         $query = Topic::with(['firstPost']);
         $query->leftJoin('posts', 'topics.first_post_id', '=', 'posts.id');
         $query->where(function ($query) use(&$searchRequest) {
             $query->where(function ($query) use(&$searchRequest) {
                 $query->where('topics.title', 'like', '%' . $searchRequest->keyword . '%');
                 $query->orWhere('posts.content', 'like', '%' . $searchRequest->keyword . '%');
             });
         });
     } else {
         $query = Post::with(['topic']);
         $query->leftJoin('topics', 'posts.topic_id', '=', 'topics.id');
         $query->where('posts.content', 'like', '%' . $searchRequest->keyword . '%');
     }
     if ($searchRequest->author) {
         $query->leftJoin('users', 'posts.user_id', '=', 'users.id');
         $query->where(function ($query) use(&$searchRequest) {
             if ($searchRequest->matchusername) {
                 $query->where('users.name', $searchRequest->author);
                 $query->orWhere('posts.username', $searchRequest->author);
             } else {
                 $query->where('users.name', 'like', '%' . $searchRequest->author . '%');
                 $query->orWhere('posts.username', 'like', '%' . $searchRequest->author . '%');
             }
         });
     }
     if ($searchRequest->topic_replies_type) {
         switch ($searchRequest->topic_replies_type) {
             case 'atmost':
                 $query->where('topics.num_posts', '<=', $searchRequest->topic_replies);
                 break;
             case 'atleast':
                 $query->where('topics.num_posts', '>=', $searchRequest->topic_replies);
                 break;
             case 'exactly':
             default:
                 $query->where('topics.num_posts', $searchRequest->topic_replies);
                 break;
         }
     }
     if ($searchRequest->post_date) {
         $postDateType = '>=';
         if ($searchRequest->post_date_type == 'older') {
             $postDateType = '<=';
         }
         switch ($searchRequest->post_date) {
             case 'yesterday':
                 $postDate = '-1 day';
                 break;
             case 'oneweek':
                 $postDate = '-1 week';
                 break;
             case 'twoweek':
                 $postDate = '-2 weeks';
                 break;
             case 'onemonth':
                 $postDate = '-1 month';
                 break;
             case 'threemonth':
                 $postDate = '-3 months';
                 break;
             case 'sixmonth':
                 $postDate = '-3 months';
                 break;
             case 'oneyear':
                 $postDate = '-1 year';
                 break;
             default:
                 $postDate = '';
                 break;
         }
         if ($postDate) {
             $query->where($searchRequest->result . '.created_at', $postDateType, new \DateTime('today ' . $postDate));
         }
     }
     if (is_array($searchRequest->forums) && (!empty($searchRequest->forums) || !in_array('-1', $searchRequest->forums))) {
         $query->whereIn('topics.forum_id', $searchRequest->forums);
     }
     // Forum permissions need to be checked
     $unviewableForums = $permissionChecker->getUnviewableIdsForContent('forum');
     if (!empty($unviewableForums)) {
         $query->whereNotIn('topics.forum_id', $unviewableForums);
     }
     if (!$searchRequest->sortby) {
         $searchRequest->sortby = 'postdate';
         $searchRequest->sorttype = 'asc';
     }
     if (!$searchRequest->sorttype) {
         $searchRequest->sorttype = 'asc';
     }
     $topics = [];
     $posts = [];
     $results = $query->get();
     if ($searchRequest->result == 'topics') {
         foreach ($results as $result) {
             $topics[] = $result->id;
             $posts[] = $result->firstPost->id;
         }
     } else {
         foreach ($results as $result) {
             $topics[] = $result->topic->id;
             $posts[] = $result->id;
         }
     }
     $searchlog = $this->searchRepository->create(['topics' => implode(',', $topics), 'posts' => implode(',', $posts), 'keywords' => $searchRequest->keyword, 'as_topics' => $searchRequest->result == 'topics']);
     return redirect()->route('search.results', ['id' => $searchlog->id, 'orderBy' => $searchRequest->sortby, 'orderDir' => $searchRequest->sorttype]);
 }