Completed
Pull Request — master (#32545)
by Tom
09:55
created

TransferRequestMapper   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 75
Duplicated Lines 9.33 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
dl 7
loc 75
rs 10
c 0
b 0
f 0
wmc 5
lcom 1
cbo 7

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A findById() 7 7 1
A findRequestWithSameSignature() 0 12 1
A findOpenRequestForGivenFiles() 0 13 1
A findOpenRequestsOlderThan() 0 11 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
namespace OCA\Files\Service\TransferOwnership;
4
5
use OCP\AppFramework\Db\Mapper;
6
use OCP\IDBConnection;
7
8
class TransferRequestMapper extends Mapper {
9
10
	const TABLENAME = 'transfer_requests';
11
12
	public function __construct(IDBConnection $db) {
13
		parent::__construct($db, self::TABLENAME, TransferRequest::class);
14
	}
15
16
	/**
17
	 * @param $requestId
18
	 * @return \OCP\AppFramework\Db\Entity|TransferRequest
19
	 * @throws \OCP\AppFramework\Db\DoesNotExistException
20
	 * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
21
	 */
22 View Code Duplication
	public function findById($requestId) {
23
		$query = $this->db->getQueryBuilder();
24
		$query->select('*')
25
			->from($this->getTableName())
26
			->where($query->expr()->eq('id', $query->expr()->literal($requestId)));
27
		return $this->findEntity($query->getSQL(), $query->getParameters());
28
	}
29
30
	/**
31
	 * Finds a pending transfer for the same file between two users
32
	 * @param $sourceUser
33
	 * @param $destinationUser
34
	 * @param $fileId
35
	 * @return array
36
	 */
37
	public function findRequestWithSameSignature($sourceUser, $destinationUser, $fileId) {
38
		$query = $this->db->getQueryBuilder();
39
		$query->select('*')
40
			->from($this->getTableName())
41
			->where($query->expr()->eq('source_user_id', $query->expr()->literal($sourceUser)))
42
			->andWhere($query->expr()->eq('destination_user_id', $query->expr()->literal($destinationUser)))
43
			->andWhere($query->expr()->eq('file_id', $query->expr()->literal($fileId)))
44
			->andWhere($query->expr()->isNull('rejected_time'))
45
			->andWhere($query->expr()->isNull('accepted_time'))
46
			->andWhere($query->expr()->isNull('actioned_time'));
47
		return $this->findEntities($query->getSQL(), $query->getParameters());
48
	}
49
50
	/**
51
	 * Tries to see if there is an open request for a range of file ids
52
	 * This is used to check if we are trying to make a new request on a file that is already pending transfer
53
	 * @param array $files
54
	 * @return array
55
	 */
56
	public function findOpenRequestForGivenFiles($files) {
57
		$query = $this->db->getQueryBuilder();
58
		$files = array_map(function($fileid) use ($query) {
59
			return $query->expr()->literal($fileid);
60
		}, $files);
61
		$query->select('*')
62
			->from($this->getTableName())
63
			->where($query->expr()->in('file_id', $files))
64
			->andWhere($query->expr()->isNull('rejected_time'))
65
			->andWhere($query->expr()->isNull('accepted_time'))
66
			->andWhere($query->expr()->isNull('actioned_time'));
67
		return $this->findEntities($query->getSQL(), $query->getParameters());
68
	}
69
70
	public function findOpenRequestsOlderThan($days) {
71
		$threshold = \OC::$server->getTimeFactory()->getTime() - 60*60*$days;
72
		$query = $this->db->getQueryBuilder();
73
		$query->select('*')
74
			->from($this->getTableName())
75
			->where($query->expr()->isNull('rejected_time'))
76
			->andWhere($query->expr()->isNull('accepted_time'))
77
			->andWhere($query->expr()->isNull('actioned_time'))
78
			->andWhere($query->expr()->lt('requested_time', $query->expr()->literal($threshold)));
79
		return $this->findEntities($query->getSQL(), $query->getParameters());
80
	}
81
82
}