130 lines
2.6 KiB
PHP
130 lines
2.6 KiB
PHP
|
<?php /* Copyright (c) 2024 Freya Murphy */
|
||
|
class Post_controller extends Controller {
|
||
|
|
||
|
// the request model
|
||
|
private $request_model;
|
||
|
|
||
|
// the caceh model
|
||
|
private $cache_model;
|
||
|
|
||
|
// page size
|
||
|
private $page_size;
|
||
|
|
||
|
function __construct($load) {
|
||
|
parent::__construct($load);
|
||
|
$this->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<string,mixed>
|
||
|
*/
|
||
|
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<string,mixed>
|
||
|
*/
|
||
|
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,
|
||
|
);
|
||
|
}
|
||
|
}
|