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
130
131
132
133
134
135
136
137
|
<?php
namespace Kanboard\Model;
/**
* Metadata
*
* @package model
* @author Frederic Guillot
*/
abstract class Metadata extends Base
{
/**
* Get the table
*
* @abstract
* @access protected
* @return string
*/
abstract protected function getTable();
/**
* Define the entity key
*
* @abstract
* @access protected
* @return string
*/
abstract protected function getEntityKey();
/**
* Get all metadata for the entity
*
* @access public
* @param integer $entity_id
* @return array
*/
public function getAll($entity_id)
{
return $this->db
->hashtable($this->getTable())
->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($this->getTable())
->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($this->getTable())
->eq($this->getEntityKey(), $entity_id)
->eq('name', $name)
->exists();
}
/**
* Update or insert new metadata
*
* @access public
* @param integer $entity_id
* @param array $values
* @return boolean
*/
public function save($entity_id, array $values)
{
$results = array();
$user_id = $this->userSession->getId();
$timestamp = time();
$this->db->startTransaction();
foreach ($values as $key => $value) {
if ($this->exists($entity_id, $key)) {
$results[] = $this->db->table($this->getTable())
->eq($this->getEntityKey(), $entity_id)
->eq('name', $key)->update(array(
'value' => $value,
'changed_on' => $timestamp,
'changed_by' => $user_id,
));
} else {
$results[] = $this->db->table($this->getTable())->insert(array(
'name' => $key,
'value' => $value,
$this->getEntityKey() => $entity_id,
'changed_on' => $timestamp,
'changed_by' => $user_id,
));
}
}
$this->db->closeTransaction();
return ! in_array(false, $results, true);
}
/**
* Remove a metadata
*
* @access public
* @param integer $entity_id
* @param string $name
* @return bool
*/
public function remove($entity_id, $name)
{
return $this->db->table($this->getTable())
->eq($this->getEntityKey(), $entity_id)
->eq('name', $name)
->remove();
}
}
|