request_model = $this->load->model('request'); $this->cache_model = $this->load->model('cache'); $this->page_size = 10; } public function index(): void { $this->view('template/posts'); } /** * @return array */ public function posts(): array { $page = $this->request_model->get_int('page', 0); $max = $this->request_model->get_int('max'); $offset = $page * $this->page_size; $user = $this->main->user(); $query = $this->db; if ($user) { $query = $query->select('p.*, l.post_id IS NOT NULL as liked'); } else { $query = $query->select('p.*, FALSE as liked'); } $query = $query->from('api.post p'); if ($user) { $query = $query->join('admin.like l', 'p.id = l.post_id AND l.user_id') ->eq($user['id']); } if ($max) { $query = $query ->where('id')->le($max); } $posts = $query ->limit($this->page_size) ->offset($offset) ->rows(); $users = $this->cache_model->get_users($posts); $max = 0; foreach ($posts as $post) { $max = max($max, $post['id']); $data = array(); $data['page_size'] = $this->page_size; $data['user'] = $users[$post['user_id']]; $data['post'] = $post; $this->view('template/post', $data); } $pc = $this->db ->select('COUNT(p.id) as pc') ->from('api.post p') ->row()['pc']; return array( 'loaded' => count($posts), 'total' => $pc, 'page_size' => $this->page_size, 'max' => $max, ); } /** * @return array */ public function comments(): array { $page = $this->request_model->get_int('page', 0); $max = $this->request_model->get_int('max'); $id = $this->request_model->get_int('id', 0); $offset = $page * $this->page_size; $query = $this->db ->select('*') ->from('api.comment') ->where('post_id') ->eq($id); if ($max) { $query = $query ->and() ->where('id') ->le($max); } $comments = $query ->limit($this->page_size) ->offset($offset) ->rows(); $users = $this->cache_model->get_users($comments); $max = 0; foreach ($comments as $comment) { $max = max($max, $comment['id']); $data = array(); $data['user'] = $users[$comment['user_id']]; $data['comment'] = $comment; $this->view('template/comment', $data); } return array( 'loaded' => count($comments), 'page_size' => $this->page_size, 'max' => $max, ); } }