ソースを参照

Add Models\PM\CalcStat

Visman 4 年 前
コミット
aad524e9fe
1 ファイル変更60 行追加0 行削除
  1. 60 0
      app/Models/PM/CalcStat.php

+ 60 - 0
app/Models/PM/CalcStat.php

@@ -0,0 +1,60 @@
+<?php
+/**
+ * This file is part of the ForkBB <https://github.com/forkbb>.
+ *
+ * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
+ * @license   The MIT License (MIT)
+ */
+
+declare(strict_types=1);
+
+namespace ForkBB\Models\PM;
+
+use ForkBB\Models\Method;
+use ForkBB\Models\PM\PTopic;
+use RuntimeException;
+
+class CalcStat extends Method
+{
+    /**
+     * Пересчитывает статистику темы
+     */
+    public function calcStat(): PTopic
+    {
+        if ($this->model->id < 1) {
+            throw new RuntimeException('The model does not have ID');
+        }
+
+        $vars = [
+            ':tid' => $this->model->id,
+        ];
+        $query = 'SELECT pp.id, pp.poster_id, pp.posted, pp.edited
+            FROM ::pm_posts AS pp
+            WHERE pp.topic_id=?i:tid
+            ORDER BY pp.id DESC
+            LIMIT 1'; // pp.poster,
+
+        $result = $this->c->DB->query($query, $vars)->fetch();
+
+        $this->model->last_post    = $result['edited'] > $result['posted'] ? $result['edited'] : $result['posted'];
+        $this->model->last_post_id = $result['id'];
+
+        if ($result['poster_id'] === $this->model->poster_id) {
+            $this->model->last_number = 0;
+            $this->model->poster_visit = $this->model->last_post;
+        } elseif ($result['poster_id'] === $this->model->target_id) {
+            $this->model->last_number = 1;
+            $this->model->target_visit = $this->model->last_post;
+        } else {
+            throw new RuntimeException("Bad user ID in ppost number {$result['id']}");
+        }
+
+        $query = 'SELECT COUNT(pp.id) - 1
+            FROM ::pm_posts AS pp
+            WHERE pp.topic_id=?i:tid';
+
+        $this->model->num_replies = $this->c->DB->query($query, $vars)->fetchColumn();
+
+        return $this->model;
+    }
+}