From 9283fb88d80cb355ff98364a9a57b657fc511d98 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sat, 17 Oct 2015 15:27:43 -0400 Subject: Add metadata for users, tasks and projects --- app/Model/Config.php | 68 ++++++++---------------------- app/Model/Metadata.php | 98 +++++++++++++++++++++++++++++++++++++++++++ app/Model/ProjectMetadata.php | 30 +++++++++++++ app/Model/Setting.php | 96 ++++++++++++++++++++++++++++++++++++++++++ app/Model/TaskMetadata.php | 30 +++++++++++++ app/Model/UserMetadata.php | 30 +++++++++++++ 6 files changed, 302 insertions(+), 50 deletions(-) create mode 100644 app/Model/Metadata.php create mode 100644 app/Model/ProjectMetadata.php create mode 100644 app/Model/Setting.php create mode 100644 app/Model/TaskMetadata.php create mode 100644 app/Model/UserMetadata.php (limited to 'app/Model') diff --git a/app/Model/Config.php b/app/Model/Config.php index 6561efc8..cf634f80 100644 --- a/app/Model/Config.php +++ b/app/Model/Config.php @@ -12,15 +12,8 @@ use Kanboard\Core\Session; * @package model * @author Frederic Guillot */ -class Config extends Base +class Config extends Setting { - /** - * SQL table name - * - * @var string - */ - const TABLE = 'settings'; - /** * Get available currencies * @@ -170,8 +163,7 @@ class Config extends Base public function get($name, $default_value = '') { if (! Session::isOpen()) { - $value = $this->db->table(self::TABLE)->eq('option', $name)->findOneColumn('value'); - return $value ?: $default_value; + return $this->getOption($name, $default_value); } // Cache config in session @@ -186,43 +178,6 @@ class Config extends Base return $default_value; } - /** - * Get all settings - * - * @access public - * @return array - */ - public function getAll() - { - return $this->db->hashtable(self::TABLE)->getAll('option', 'value'); - } - - /** - * Save settings in the database - * - * @access public - * @param $values array Settings values - * @return boolean - */ - public function save(array $values) - { - foreach ($values as $option => $value) { - - // Be sure that a trailing slash is there for the url - if ($option === 'application_url' && ! empty($value) && substr($value, -1) !== '/') { - $value .= '/'; - } - - $result = $this->db->table(self::TABLE)->eq('option', $option)->update(array('value' => $value)); - - if (! $result) { - return false; - } - } - - return true; - } - /** * Reload settings in the session and the translations * @@ -310,8 +265,21 @@ class Config extends Base */ public function regenerateToken($option) { - return $this->db->table(self::TABLE) - ->eq('option', $option) - ->update(array('value' => Security::generateToken())); + $this->save(array($option => Security::generateToken())); + } + + /** + * Prepare data before save + * + * @access public + * @return array + */ + public function prepare(array $values) + { + if (! empty($values['application_url']) && substr($values['application_url'], -1) !== '/') { + $values['application_url'] = $values['application_url'].'/'; + } + + return $values; } } diff --git a/app/Model/Metadata.php b/app/Model/Metadata.php new file mode 100644 index 00000000..83c8f499 --- /dev/null +++ b/app/Model/Metadata.php @@ -0,0 +1,98 @@ +db + ->hashtable(static::TABLE) + ->eq($this->getEntityKey(), $entity_id) + ->asc('name') + ->getAll('name', 'value'); + } + + /** + * Get a metadata for the given entity + * + * @access public + * @param integer $entity_id + * @param string $name + * @param string $default + * @return mixed + */ + public function get($entity_id, $name, $default = '') + { + return $this->db + ->table(static::TABLE) + ->eq($this->getEntityKey(), $entity_id) + ->eq('name', $name) + ->findOneColumn('value') ?: $default; + } + + /** + * Return true if a metadata exists + * + * @access public + * @param integer $entity_id + * @param string $name + * @return boolean + */ + public function exists($entity_id, $name) + { + return $this->db + ->table(static::TABLE) + ->eq($this->getEntityKey(), $entity_id) + ->eq('name', $name) + ->exists(); + } + + /** + * Update or insert new metadata + * + * @access public + * @param integer $entity_id + * @param array $values + */ + public function save($entity_id, array $values) + { + $results = array(); + + $this->db->startTransaction(); + + foreach ($values as $key => $value) { + if ($this->exists($entity_id, $key)) { + $results[] = $this->db->table(static::TABLE)->eq($this->getEntityKey(), $entity_id)->eq('name', $key)->update(array('value' => $value)); + } else { + $results[] = $this->db->table(static::TABLE)->insert(array('name' => $key, 'value' => $value, $this->getEntityKey() => $entity_id)); + } + } + + $this->db->closeTransaction(); + + return ! in_array(false, $results, true); + } +} diff --git a/app/Model/ProjectMetadata.php b/app/Model/ProjectMetadata.php new file mode 100644 index 00000000..85498053 --- /dev/null +++ b/app/Model/ProjectMetadata.php @@ -0,0 +1,30 @@ +db->hashtable(self::TABLE)->getAll('option', 'value'); + } + + /** + * Get a setting value + * + * @access public + * @param string $name + * @param string $default + * @return mixed + */ + public function getOption($name, $default = '') + { + return $this->db + ->table(self::TABLE) + ->eq('option', $name) + ->findOneColumn('value') ?: $default; + } + + /** + * Return true if a setting exists + * + * @access public + * @param string $name + * @return boolean + */ + public function exists($name) + { + return $this->db + ->table(self::TABLE) + ->eq('option', $name) + ->exists(); + } + + /** + * Update or insert new settings + * + * @access public + * @param array $values + */ + public function save(array $values) + { + $results = array(); + $values = $this->prepare($values); + + $this->db->startTransaction(); + + foreach ($values as $option => $value) { + if ($this->exists($option)) { + $results[] = $this->db->table(self::TABLE)->eq('option', $option)->update(array('value' => $value)); + } else { + $results[] = $this->db->table(self::TABLE)->insert(array('option' => $option, 'value' => $value)); + } + } + + $this->db->closeTransaction(); + + return ! in_array(false, $results, true); + } +} diff --git a/app/Model/TaskMetadata.php b/app/Model/TaskMetadata.php new file mode 100644 index 00000000..1fd18415 --- /dev/null +++ b/app/Model/TaskMetadata.php @@ -0,0 +1,30 @@ +