. */ namespace SP\Infrastructure\Security\Repositories; use SP\Core\Exceptions\ConstraintException; use SP\Core\Exceptions\QueryException; use SP\DataModel\ItemSearchData; use SP\DataModel\TrackData; use SP\Domain\Security\In\TrackRepositoryInterface; use SP\Domain\Security\Services\TrackService; use SP\Infrastructure\Common\Repositories\Repository; use SP\Infrastructure\Database\QueryData; use SP\Infrastructure\Database\QueryResult; /** * Class TrackRepository * * @package SP\Infrastructure\Security\Repositories */ final class TrackRepository extends Repository implements TrackRepositoryInterface { /** * @param TrackRequest $trackRequest * * @return int * @throws ConstraintException * @throws QueryException */ public function add(TrackRequest $trackRequest): int { $query = /** @lang SQL */ 'INSERT INTO Track SET userId = ?, `source` = ?, `time` = UNIX_TIMESTAMP(), ipv4 = ?, ipv6 = ?'; $queryData = new QueryData(); $queryData->setQuery($query); $queryData->setParams([ $trackRequest->userId, $trackRequest->source, $trackRequest->getIpv4(), $trackRequest->getIpv6(), ]); $queryData->setOnErrorMessage(__u('Error while creating track')); return $this->db->doQuery($queryData)->getLastId(); } /** * @param $id int * * @return int * @throws QueryException * @throws ConstraintException */ public function delete(int $id): int { $queryData = new QueryData(); $queryData->setQuery('DELETE FROM Track WHERE id = ? LIMIT 1'); $queryData->addParam($id); $queryData->setOnErrorMessage(__u('Error while removing the track')); return $this->db->doQuery($queryData)->getAffectedNumRows(); } /** * @param $id int * * @return int * @throws QueryException * @throws ConstraintException */ public function unlock(int $id): int { $queryData = new QueryData(); $queryData->setQuery('UPDATE Track SET timeUnlock = UNIX_TIMESTAMP() WHERE id = ?'); $queryData->addParam($id); $queryData->setOnErrorMessage(__u('Error while updating the track')); return $this->db->doQuery($queryData)->getAffectedNumRows(); } /** * Clears tracks * * @return bool con el resultado * @throws QueryException * @throws ConstraintException */ public function clear(): bool { $queryData = new QueryData(); $queryData->setQuery('TRUNCATE TABLE Track'); $queryData->setOnErrorMessage(__u('Error while clearing tracks out')); return $this->db->doQuery($queryData)->getAffectedNumRows() > 0; } /** * @param $id int * * @return QueryResult * @throws ConstraintException * @throws QueryException */ public function getById(int $id): QueryResult { $query = /** @lang SQL */ 'SELECT id, userId, `source`, `time`, ipv4, ipv6 FROM Track WHERE id = ? LIMIT 1'; $queryData = new QueryData(); $queryData->setMapClassName(TrackData::class); $queryData->setQuery($query); $queryData->addParam($id); $queryData->setOnErrorMessage(__u('Error while retrieving the track')); return $this->db->doSelect($queryData); } /** * @return QueryResult * @throws ConstraintException * @throws QueryException */ public function getAll(): QueryResult { $query = /** @lang SQL */ 'SELECT id, userId, `source`, `time`, ipv4, ipv6 FROM Track'; $queryData = new QueryData(); $queryData->setMapClassName(TrackData::class); $queryData->setQuery($query); $queryData->setOnErrorMessage(__u('Error while retrieving the tracks')); return $this->db->doSelect($queryData); } /** * Devuelve los tracks de un cliente desde un tiempo y origen determinados * * @param TrackRequest $trackRequest * * @return QueryResult * @throws ConstraintException * @throws QueryException */ public function getTracksForClientFromTime(TrackRequest $trackRequest): QueryResult { $query = /** @lang SQL */ 'SELECT id, userId FROM Track WHERE `time` >= ? AND (ipv4 = ? OR ipv6 = ?) AND `source` = ? AND timeUnlock IS NULL'; $queryData = new QueryData(); $queryData->setMapClassName(TrackData::class); $queryData->setQuery($query); $queryData->setParams([ (int)$trackRequest->time, $trackRequest->getIpv4(), $trackRequest->getIpv6(), $trackRequest->source, ]); $queryData->setOnErrorMessage(__u('Error while retrieving the tracks')); return $this->db->doSelect($queryData); } /** * Searches for items by a given filter * * @param ItemSearchData $itemSearchData * * @return QueryResult * @throws ConstraintException * @throws QueryException */ public function search(ItemSearchData $itemSearchData): QueryResult { $queryData = new QueryData(); $queryData->setSelect( ' id, userId, source, time, timeUnlock, FROM_UNIXTIME(time) as dateTime, FROM_UNIXTIME(timeUnlock) as dateTimeUnlock, ipv4, ipv6, IF(`time` >= ? AND `timeUnlock` IS NULL, 1, 0) AS tracked ' ); $queryData->addParam(time() - TrackService::TIME_TRACKING); $queryData->setFrom('Track'); $queryData->setOrder('time DESC'); if (!empty($itemSearchData->getSeachString())) { $queryData->setWhere('source LIKE ?'); $search = '%'.$itemSearchData->getSeachString().'%'; $queryData->addParam($search); } $queryData->setLimit( '?,?', [$itemSearchData->getLimitStart(), $itemSearchData->getLimitCount()] ); return $this->db->doSelect($queryData, true); } }