1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
<?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,
);
}
}
|