summaryrefslogtreecommitdiff
path: root/web/_controller/_util/post.php
blob: b128d6781dfadb83186a3c9f1522b3f2876ded71 (plain)
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,
		);
	}
}