summaryrefslogtreecommitdiff
path: root/app/Model/ProjectActivityModel.php
diff options
context:
space:
mode:
Diffstat (limited to 'app/Model/ProjectActivityModel.php')
-rw-r--r--app/Model/ProjectActivityModel.php94
1 files changed, 94 insertions, 0 deletions
diff --git a/app/Model/ProjectActivityModel.php b/app/Model/ProjectActivityModel.php
new file mode 100644
index 00000000..380ea125
--- /dev/null
+++ b/app/Model/ProjectActivityModel.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace Kanboard\Model;
+
+use Kanboard\Core\Base;
+use PicoDb\Table;
+
+/**
+ * Project activity model
+ *
+ * @package Kanboard\Model
+ * @author Frederic Guillot
+ */
+class ProjectActivityModel extends Base
+{
+ /**
+ * SQL table name
+ *
+ * @var string
+ */
+ const TABLE = 'project_activities';
+
+ /**
+ * Maximum number of events
+ *
+ * @var integer
+ */
+ const MAX_EVENTS = 1000;
+
+ /**
+ * Add a new event for the project
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param integer $task_id Task id
+ * @param integer $creator_id User id
+ * @param string $event_name Event name
+ * @param array $data Event data (will be serialized)
+ * @return boolean
+ */
+ public function createEvent($project_id, $task_id, $creator_id, $event_name, array $data)
+ {
+ $values = array(
+ 'project_id' => $project_id,
+ 'task_id' => $task_id,
+ 'creator_id' => $creator_id,
+ 'event_name' => $event_name,
+ 'date_creation' => time(),
+ 'data' => json_encode($data),
+ );
+
+ $this->cleanup(self::MAX_EVENTS - 1);
+ return $this->db->table(self::TABLE)->insert($values);
+ }
+
+ /**
+ * Get query
+ *
+ * @access public
+ * @return Table
+ */
+ public function getQuery()
+ {
+ return $this
+ ->db
+ ->table(ProjectActivityModel::TABLE)
+ ->columns(
+ ProjectActivityModel::TABLE.'.*',
+ 'uc.username AS author_username',
+ 'uc.name AS author_name',
+ 'uc.email',
+ 'uc.avatar_path'
+ )
+ ->join(TaskModel::TABLE, 'id', 'task_id')
+ ->join(ProjectModel::TABLE, 'id', 'project_id')
+ ->left(UserModel::TABLE, 'uc', 'id', ProjectActivityModel::TABLE, 'creator_id');
+ }
+
+ /**
+ * Remove old event entries to avoid large table
+ *
+ * @access public
+ * @param integer $max Maximum number of items to keep in the table
+ */
+ public function cleanup($max)
+ {
+ $total = $this->db->table(self::TABLE)->count();
+
+ if ($total > $max) {
+ $ids = $this->db->table(self::TABLE)->asc('id')->limit($total - $max)->findAllByColumn('id');
+ $this->db->table(self::TABLE)->in('id', $ids)->remove();
+ }
+ }
+}