summaryrefslogtreecommitdiff
path: root/app/Model/Metadata.php
blob: b39ce098db695b1af500f19aeacf88bcdc8d482f (plain)
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
138
139
<?php

namespace Kanboard\Model;

use Kanboard\Core\Base;

/**
 * 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();
    }
}