summaryrefslogtreecommitdiff
path: root/web/_controller
diff options
context:
space:
mode:
Diffstat (limited to 'web/_controller')
-rw-r--r--web/_controller/_util/post.php129
-rw-r--r--web/_controller/apps/home.php70
2 files changed, 132 insertions, 67 deletions
diff --git a/web/_controller/_util/post.php b/web/_controller/_util/post.php
new file mode 100644
index 0000000..b128d67
--- /dev/null
+++ b/web/_controller/_util/post.php
@@ -0,0 +1,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,
+ );
+ }
+}
diff --git a/web/_controller/apps/home.php b/web/_controller/apps/home.php
index 25c8c4e..edf7e2b 100644
--- a/web/_controller/apps/home.php
+++ b/web/_controller/apps/home.php
@@ -4,17 +4,13 @@ class Home_controller extends Controller {
// the home model
private $home_model;
- // the request model
- private $request_model;
-
- // the caceh model
- private $cache_model;
+ // the post controller
+ protected $post_controller;
function __construct($load) {
parent::__construct($load);
$this->home_model = $this->load->model('apps/home');
- $this->request_model = $this->load->model('request');
- $this->cache_model = $this->load->model('cache');
+ $this->post_controller = $this->load->controller('_util/post');
}
public function index(): void {
@@ -24,66 +20,6 @@ class Home_controller extends Controller {
$this->view('apps/home/main', $data);
}
- public function posts(): void {
- $page = $this->request_model->get_int('page', 0);
- $page_size = 20;
- $offset = $page * $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')
- ->where('l.user_id')->eq($user['id'])
- ->or()->where('l.user_id IS NULL');
- }
-
- $posts = $query->limit($page_size)
- ->offset($offset)
- ->rows();
-
- $users = $this->cache_model->get_users($posts);
-
- foreach ($posts as $post) {
- $data = array();
- $data['user'] = $users[$post['user_id']];
- $data['post'] = $post;
- $this->view('template/post', $data);
- }
- }
-
- public function comments(): void {
- $page = $this->request_model->get_int('page', 0);
- $id = $this->request_model->get_int('id');
- $page_size = 20;
- $offset = $page * $page_size;
-
- $comments = $this->db
- ->select('*')
- ->from('admin.comment')
- ->limit($page_size)
- ->offset($offset)
- ->rows();
-
- $users = $this->cache_model->get_users($comments);
-
- foreach ($comments as $comment) {
- $data = array();
- $data['user'] = $users[$comment['user_id']];
- $data['comment'] = $comment;
- $this->view('template/comment', $data);
- }
- }
-
}
?>