• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

LibreSign / libresign / 4660867154

pending completion
4660867154

push

github

GitHub
Merge pull request #1607 from LibreSign/backport/1584/stable26

9 of 14 new or added lines in 4 files covered. (64.29%)

1 existing line in 1 file now uncovered.

2595 of 4505 relevant lines covered (57.6%)

4.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

37.7
/lib/Db/AccountFileMapper.php
1
<?php
2

3
namespace OCA\Libresign\Db;
4

5
use OCA\Libresign\Helper\Pagination;
6
use OCP\AppFramework\Db\Entity;
7
use OCP\AppFramework\Db\QBMapper;
8
use OCP\DB\QueryBuilder\IQueryBuilder;
9
use OCP\DB\Types;
10
use OCP\IDBConnection;
11
use OCP\IURLGenerator;
12

13
/**
14
 * Class FileMapper
15
 *
16
 * @package OCA\Libresign\DB
17
 */
18
class AccountFileMapper extends QBMapper {
19
        /** @var IURLGenerator */
20
        private $urlGenerator;
21
        /** @var FileMapper */
22
        private $fileMapper;
23
        /** @var FileUserMapper */
24
        private $fileUserMapper;
25
        /** @var FileTypeMapper */
26
        private $fileTypeMapper;
27
        /**
28
         * @param IDBConnection $db
29
         */
30
        public function __construct(
31
                IDBConnection $db,
32
                IURLGenerator $urlGenerator,
33
                FileMapper $fileMapper,
34
                FileUserMapper $fileUserMapper,
35
                FileTypeMapper $fileTypeMapper
36
        ) {
37
                parent::__construct($db, 'libresign_account_file');
38✔
38
                $this->urlGenerator = $urlGenerator;
38✔
39
                $this->fileMapper = $fileMapper;
38✔
40
                $this->fileUserMapper = $fileUserMapper;
38✔
41
                $this->fileTypeMapper = $fileTypeMapper;
38✔
42
        }
43

44
        public function getByUserAndType(string $userId, string $type): AccountFile {
45
                $qb = $this->db->getQueryBuilder();
1✔
46

47
                $qb->select('*')
1✔
48
                        ->from($this->getTableName())
1✔
49
                        ->where(
1✔
50
                                $qb->expr()->eq('user_id', $qb->createNamedParameter($userId)),
1✔
51
                                $qb->expr()->eq('file_type', $qb->createNamedParameter($type))
1✔
52
                        );
1✔
53

54
                return $this->findEntity($qb);
1✔
55
        }
56

57
        public function getByUserIdAndNodeId(string $userId, int $nodeId): AccountFile {
58
                $qb = $this->db->getQueryBuilder();
×
59

60
                $qb->select('laf.*')
×
61
                        ->from($this->getTableName(), 'laf')
×
62
                        ->join('laf', 'libresign_file', 'lf', 'laf.file_id = lf.id')
×
63
                        ->where(
×
64
                                $qb->expr()->eq('laf.user_id', $qb->createNamedParameter($userId)),
×
65
                                $qb->expr()->eq('lf.node_id', $qb->createNamedParameter($nodeId, IQueryBuilder::PARAM_INT))
×
66
                        );
×
67

68
                return $this->findEntity($qb);
×
69
        }
70

71
        public function getByFileId(int $fileId): AccountFile {
72
                $qb = $this->db->getQueryBuilder();
×
73

74
                $qb->select('*')
×
75
                        ->from($this->getTableName())
×
76
                        ->where(
×
77
                                $qb->expr()->eq('file_id', $qb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))
×
78
                        );
×
79

80
                return $this->findEntity($qb);
×
81
        }
82

83
        /**
84
         * @return array<\OCA\Libresign\Helper\Pagination|array>
85
         * @psalm-return array{pagination: \OCA\Libresign\Helper\Pagination, data: array}
86
         */
87
        public function accountFileList(array $filter, int $page = null, int $length = null): array {
88
                $pagination = $this->getUserAccountFile($filter);
1✔
89
                $pagination->setMaxPerPage($length);
1✔
90
                $pagination->setCurrentPage($page);
1✔
91
                $currentPageResults = $pagination->getCurrentPageResults();
1✔
92

93
                $url = $this->urlGenerator->linkToRoute('libresign.page.getPdfUser', ['uuid' => '_replace_']);
1✔
94
                $url = str_replace('_replace_', '', $url);
1✔
95

96
                $data = [];
1✔
97
                $fileIds = [];
1✔
98

99
                foreach ($currentPageResults as $row) {
1✔
100
                        $fileIds[] = $row['id'];
×
101
                        $data[] = $this->formatListRow($row, $url);
×
102
                }
103
                $signers = $this->fileUserMapper->getByMultipleFileId($fileIds);
1✔
104
                $return['data'] = $this->assocFileToFileUserAndFormat($data, $signers);
1✔
105
                $return['pagination'] = $pagination;
1✔
106
                return $return;
1✔
107
        }
108

109
        /**
110
         * @return Pagination
111
         */
112
        private function getUserAccountFile(array $filter = [], bool $count = false): Pagination {
113
                $qb = $this->db->getQueryBuilder();
1✔
114
                $qb->select(
1✔
115
                        'f.id',
1✔
116
                        'f.uuid',
1✔
117
                        'f.name',
1✔
118
                        'f.callback',
1✔
119
                        'f.status',
1✔
120
                        'f.node_id',
1✔
121
                        'af.file_type'
1✔
122
                )
1✔
123
                        ->selectAlias('u.uid_lower', 'account_uid')
1✔
124
                        ->selectAlias('u.displayname', 'account_displayname')
1✔
125
                        ->selectAlias('f.created_at', 'request_date')
1✔
126
                        ->selectAlias($qb->func()->max('fu.signed'), 'status_date')
1✔
127
                        ->from($this->getTableName(), 'af')
1✔
128
                        ->join('af', 'libresign_file', 'f', 'f.id = af.file_id')
1✔
129
                        ->join('af', 'users', 'u', 'af.user_id = u.uid')
1✔
130
                        ->leftJoin('f', 'libresign_file_user', 'fu', 'fu.file_id = f.id')
1✔
131
                        ->groupBy(
1✔
132
                                'f.id',
1✔
133
                                'f.uuid',
1✔
134
                                'f.name',
1✔
135
                                'f.callback',
1✔
136
                                'f.node_id',
1✔
137
                                'f.created_at',
1✔
138
                                'af.file_type',
1✔
139
                                'u.uid_lower',
1✔
140
                                'u.displayname'
1✔
141
                        );
1✔
142
                if (!empty($filter['userId'])) {
1✔
143
                        $qb->where(
×
144
                                $qb->expr()->eq('af.user_id', $qb->createNamedParameter($filter['userId'])),
×
145
                        );
×
146
                }
147

148
                $countQueryBuilderModifier = function (IQueryBuilder &$qb) use ($filter): void {
1✔
149
                        $count = $qb->getConnection()->getQueryBuilder();
1✔
150
                        $count->selectAlias($count->func()->count(), 'total_results')
1✔
151
                                ->from($this->getTableName(), 'af')
1✔
152
                                ->setMaxResults(1);
1✔
153
                        if (!empty($filter['approved'])) {
1✔
154
                                if ($filter['approved'] === 'yes') {
×
155
                                        $qb->andWhere(
×
156
                                                $qb->expr()->eq('f.status', $qb->createNamedParameter(File::STATUS_SIGNED, Types::INTEGER)),
×
157
                                        );
×
158
                                }
159
                        }
160
                        if (!empty($filter['userId'])) {
1✔
161
                                $qb->andWhere(
×
162
                                        $qb->expr()->eq('af.user_id', $qb->createNamedParameter($filter['userId'])),
×
163
                                );
×
164
                        }
165
                        $qb = $count;
1✔
166
                };
1✔
167

168
                $pagination = new Pagination($qb, $countQueryBuilderModifier);
1✔
169
                return $pagination;
1✔
170
        }
171

172
        /**
173
         * @return (((int|mixed|string)[]|false|mixed|null|string)[]|mixed)[]
174
         *
175
         * @psalm-return array{file: array{name: mixed, status: mixed, status_text: null|string, status_date: false|mixed|string, request_date: false|string, requested_by: array{displayName: mixed, uid: mixed}, file: array{type: 'pdf', nodeId: int, url: string}, callback: mixed, uuid: mixed}}
176
         */
177
        private function formatListRow(array $row, string $url): array {
178
                $row['account'] = [
×
179
                        'uid' => $row['account_uid'],
×
180
                        'displayName' => $row['account_displayname']
×
181
                ];
×
182
                $row['file_type'] = [
×
183
                        'type' => $row['file_type'],
×
184
                        'name' => $this->fileTypeMapper->getNameOfType($row['file_type']),
×
185
                        'description' => $this->fileTypeMapper->getDescriptionOfType($row['file_type']),
×
186
                ];
×
187
                $row['request_date'] = (new \DateTime())
×
188
                        ->setTimestamp($row['request_date'])
×
189
                        ->format('Y-m-d H:i:s');
×
190
                if (!empty($row['status_date'])) {
×
191
                        $row['status_date'] = (new \DateTime())
×
192
                                ->setTimestamp($row['status_date'])
×
193
                                ->format('Y-m-d H:i:s');
×
194
                }
195
                $row['file'] = [
×
196
                        'name' => $row['name'],
×
197
                        'status' => $row['status'],
×
198
                        'status_text' => $this->fileMapper->getTextOfStatus($row['status']),
×
199
                        'status_date' => $row['status_date'],
×
200
                        'request_date' => $row['request_date'],
×
201
                        'requested_by' => [
×
202
                                'displayName' => $row['account_displayname'],
×
203
                                'uid' => $row['account_uid'],
×
204
                        ],
×
205
                        'file' => [
×
206
                                'type' => 'pdf',
×
207
                                'nodeId' => (int) $row['node_id'],
×
208
                                'url' => $url . $row['uuid'],
×
209
                        ],
×
210
                        'callback' => $row['callback'],
×
211
                        'uuid' => $row['uuid'],
×
212
                ];
×
213
                unset(
×
214
                        $row['node_id'],
×
215
                        $row['name'],
×
216
                        $row['status'],
×
217
                        $row['status_date'],
×
218
                        $row['request_date'],
×
219
                        $row['account_displayname'],
×
220
                        $row['account_uid'],
×
221
                        $row['callback'],
×
222
                        $row['uuid'],
×
223
                        $row['account_uid'],
×
224
                        $row['account_displayname']
×
225
                );
×
226
                return $row;
×
227
        }
228

229
        /**
230
         * @param array $files
231
         * @param FileUser[] $signers
232
         * @return array
233
         */
234
        private function assocFileToFileUserAndFormat(array $files, array $signers): array {
235
                foreach ($files as $key => $file) {
1✔
236
                        $totalSigned = 0;
×
237
                        $files[$key]['file']['signers'] = [];
×
238
                        foreach ($signers as $signerKey => $signer) {
×
239
                                if ($signer->getFileId() === $file['id']) {
×
240
                                        $data = [
×
241
                                                'email' => $signer->getEmail(),
×
242
                                                'description' => $signer->getDescription(),
×
243
                                                'displayName' => $signer->getDisplayName(),
×
244
                                                'request_sign_date' => (new \DateTime())
×
245
                                                        ->setTimestamp($signer->getCreatedAt())
×
246
                                                        ->format('Y-m-d H:i:s'),
×
247
                                                'sign_date' => null,
×
248
                                                'uid' => $signer->getUserId(),
×
NEW
249
                                                'fileUserId' => $signer->getId(),
×
NEW
250
                                                'identify' => $signer->getIdentifyMethod(),
×
251
                                        ];
×
252
                                        if ($signer->getSigned()) {
×
253
                                                $data['sign_date'] = (new \DateTime())
×
254
                                                        ->setTimestamp($signer->getSigned())
×
255
                                                        ->format('Y-m-d H:i:s');
×
256
                                                $totalSigned++;
×
257
                                        }
258
                                        $files[$key]['file']['signers'][] = $data;
×
259
                                        unset($signers[$signerKey]);
×
260
                                }
261
                        }
262
                        unset($files[$key]['id']);
×
263
                }
264
                return $files;
1✔
265
        }
266

267
        public function delete(Entity $entity): Entity {
268
                $qb = $this->db->getQueryBuilder();
×
269

270
                $qb->delete($this->tableName)
×
271
                        ->where(
×
272
                                $qb->expr()->eq('user_id', $qb->createNamedParameter($entity->getUserId(), Types::STRING)),
×
273
                                $qb->expr()->eq('file_id', $qb->createNamedParameter($entity->getFileId(), Types::INTEGER))
×
274
                        );
×
275
                $qb->executeStatement();
×
276
                $qb->resetQueryParts();
×
277
                $qb->delete('libresign_file')
×
278
                        ->where(
×
279
                                $qb->expr()->eq('id', $qb->createNamedParameter($entity->getFileId(), Types::INTEGER))
×
280
                        );
×
281
                $qb->executeStatement();
×
282
                return $entity;
×
283
        }
284
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc