summaryrefslogtreecommitdiffstats
path: root/lib/Service/Service.php
blob: 951d460f6c9703cafe2ed5c9d0ee7d4be9c78ec0 (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
140
141
142
143
144
145
146
147
148
<?php
/**
 * Nextcloud - News
 *
 * This file is licensed under the Affero General Public License version 3 or
 * later. See the COPYING file.
 *
 * @author    Alessandro Cosentino <cosenal@gmail.com>
 * @author    Bernhard Posselt <dev@bernhard-posselt.com>
 * @copyright 2012 Alessandro Cosentino
 * @copyright 2012-2014 Bernhard Posselt
 */

namespace OCA\News\Service;

use OCA\News\Db\NewsMapperV2;
use OCA\News\Service\Exceptions\ServiceConflictException;
use OCA\News\Service\Exceptions\ServiceNotFoundException;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use Psr\Log\LoggerInterface;

/**
 * Class Service
 *
 * @package OCA\News\Service
 */
abstract class Service
{
    /**
     * @var NewsMapperV2
     */
    protected $mapper;
    /**
     * @var LoggerInterface
     */
    protected $logger;

    /**
     * Service constructor.
     *
     * @param NewsMapperV2    $mapper
     * @param LoggerInterface $logger
     */
    public function __construct(NewsMapperV2 $mapper, LoggerInterface $logger)
    {
        $this->mapper = $mapper;
        $this->logger = $logger;
    }

    /**
     * Finds all items of a user
     *
     * @param string $userId The ID/name of the user
     * @param array  $params Filter parameters
     *
     * @return Entity[]
     */
    abstract public function findAllForUser(string $userId, array $params = []): array;

    /**
     * Finds all items
     *
     * @return Entity[]
     */
    abstract public function findAll(): array;

    /**
     * Delete an entity
     *
     * @param int    $id     the id of the entity
     * @param string $userId the name of the user for security reasons
     *
     * @throws ServiceNotFoundException|ServiceConflictException if the entity does not exist, or there
     * are more than one of it
     */
    public function delete(string $userId, int $id): Entity
    {
        $entity = $this->find($userId, $id);

        return $this->mapper->delete($entity);
    }


    /**
     * Insert an entity
     *
     * @param Entity $entity The entity to insert
     *
     * @return Entity The inserted entity
     */
    public function insert(Entity $entity): Entity
    {
        return $this->mapper->insert($entity);
    }


    /**
     * Update an entity
     *
     * @param string $userId the name of the user for security reasons
     * @param Entity $entity the entity
     *
     * @throws ServiceNotFoundException|ServiceConflictException if the entity does not exist, or there
     * are more than one of it
     */
    public function update(string $userId, Entity $entity): Entity
    {
        $this->find($userId, $entity->getId());
        return $this->mapper->update($entity);
    }


    /**
     * Finds an entity by id
     *
     * @param int    $id     the id of the entity
     * @param string $userId the name of the user for security reasons
     *
     * @return Entity the entity
     * @throws ServiceNotFoundException|ServiceConflictException if the entity does not exist, or there
     * are more than one of it
     */
    public function find(string $userId, int $id): Entity
    {
        try {
            return $this->mapper->findFromUser($userId, $id);
        } catch (DoesNotExistException $ex) {
            throw ServiceNotFoundException::from($ex);
        } catch (MultipleObjectsReturnedException $ex) {
            throw ServiceConflictException::from($ex);
        }
    }

    /**
     * Delete all items of a user
     *
     * @param string $userId User ID/name
     */
    public function deleteUser(string $userId): void
    {
        $items = $this->findAllForUser($userId);
        foreach ($items as $item) {
            $this->mapper->delete($item);
        }
    }
}