Update Repositories, use queryBuilder filters.

pull/3844/head
Julio Montoya 5 years ago
parent 4cd5d987c2
commit 3fcb32724f
  1. 82
      src/CoreBundle/Repository/Node/UserRepository.php
  2. 25
      src/CourseBundle/Repository/CDocumentRepository.php
  3. 23
      src/CourseBundle/Repository/CForumPostRepository.php
  4. 29
      src/CourseBundle/Repository/CStudentPublicationRepository.php

@ -8,9 +8,7 @@ namespace Chamilo\CoreBundle\Repository\Node;
use Agenda;
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\GradebookCertificate;
use Chamilo\CoreBundle\Entity\GradebookResult;
use Chamilo\CoreBundle\Entity\Message;
@ -67,14 +65,7 @@ use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Serializer;
use UrlManager;
/**
* Class UserRepository.
*
* All functions that query the database (selects)
* Functions should return query builders.
*/
class UserRepository extends ResourceRepository implements UserLoaderInterface, PasswordUpgraderInterface
{
protected ?UserPasswordEncoderInterface $encoder = null;
@ -249,28 +240,25 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
*/
public function getCourses(User $user, AccessUrl $url, int $status, string $keyword = '')
{
$qb = $this->createQueryBuilder('user');
$qb = $this->createQueryBuilder('u');
$qb
->select('DISTINCT course')
->innerJoin(
CourseRelUser::class,
'courseRelUser',
Join::WITH,
'user = courseRelUser.user'
)
//->select('DISTINCT course')
->innerJoin('u.courses', 'courseRelUser')
->innerJoin('courseRelUser.course', 'course')
->innerJoin('course.urls', 'accessUrlRelCourse')
->innerJoin('accessUrlRelCourse.url', 'url')
->where('user = :user')
->andWhere('url = :url')
->where('url = :url')
->andWhere('courseRelUser.user = :user')
->andWhere('courseRelUser.status = :status')
->setParameters([
'user' => $user,
'url' => $url,
'status' => $status,
])
->addSelect('courseRelUser')
->setParameters(
[
'user' => $user,
'url' => $url,
'status' => $status,
]
)
// ->addSelect('courseRelUser')
;
if (!empty($keyword)) {
@ -327,12 +315,12 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
*
* @return User[]
*/
public function findByStatus(string $keyword, int $status, int $accessUrlId = null)
public function findByStatus(string $keyword, int $status, int $accessUrlId = 0)
{
$qb = $this->createQueryBuilder('u');
$this->addSearchByPortal($accessUrlId, $qb);
$this->addSearchByStatusQueryBuilder($status, $qb);
$this->addAccessUrlQueryBuilder($accessUrlId, $qb);
$this->addStatusQueryBuilder($status, $qb);
$this->addSearchByKeywordQueryBuilder($keyword, $qb);
return $qb->getQuery()->getResult();
@ -550,14 +538,14 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
}
$qb = $this->createQueryBuilder('u');
$this->addSearchByActiveAndNotAnonUser($qb);
$this->addSearchByPortal($accessUrlId, $qb);
$this->addActiveAndNotAnonUserQueryBuilder($qb);
$this->addAccessUrlQueryBuilder($accessUrlId, $qb);
$dql = null;
if ('true' === api_get_setting('allow_social_tool')) {
// All users
if ('true' === $allowSendMessageToAllUsers || api_is_platform_admin()) {
$this->addSearchByNotCurrentUser($currentUserId, $qb);
$this->addNotCurrentUserQueryBuilder($currentUserId, $qb);
/*$dql = "SELECT DISTINCT U
FROM ChamiloCoreBundle:User U
LEFT JOIN ChamiloCoreBundle:AccessUrlRelUser R
@ -568,7 +556,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
U.id != {$currentUserId} AND
R.url = {$accessUrlId}";*/
} else {
$this->addSearchByOnlyMyFriends($currentUserId, $qb);
$this->addOnlyMyFriendsQueryBuilder($currentUserId, $qb);
/*$dql = 'SELECT DISTINCT U
FROM ChamiloCoreBundle:AccessUrlRelUser R, ChamiloCoreBundle:UserRelUser UF
INNER JOIN ChamiloCoreBundle:User AS U
@ -584,7 +572,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
}
} else {
if ('true' === $allowSendMessageToAllUsers) {
$this->addSearchByNotCurrentUser($currentUserId, $qb);
$this->addNotCurrentUserQueryBuilder($currentUserId, $qb);
} else {
return [];
}
@ -618,9 +606,9 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
public function getAssignedHrmUserList(int $userId, int $urlId)
{
$qb = $this->createQueryBuilder('u');
$this->addSearchByPortal($urlId, $qb);
$this->addSearchByActiveAndNotAnonUser($qb);
$this->addSearchByMyConnectionsWithStatus($userId, USER_RELATION_TYPE_RRHH, $qb);
$this->addAccessUrlQueryBuilder($urlId, $qb);
$this->addActiveAndNotAnonUserQueryBuilder($qb);
$this->addUserRelUserQueryBuilder($userId, USER_RELATION_TYPE_RRHH, $qb);
return $qb->getQuery()->getResult();
}
@ -1419,15 +1407,15 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
public function getLastLogin(User $user)
{
$repo = $this->getEntityManager()->getRepository(TrackELogin::class);
$qb = $repo->createQueryBuilder('l');
$qb = $repo->createQueryBuilder('u');
return $qb
->select('l')
->select('u')
->where(
$qb->expr()->eq('l.loginUserId', $user->getId())
$qb->expr()->eq('u.loginUserId', $user->getId())
)
->setMaxResults(1)
->orderBy('l.loginDate', Criteria::DESC)
->orderBy('u.loginDate', Criteria::DESC)
->getQuery()
->getOneOrNullResult()
;
@ -1449,7 +1437,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb;
}
private function addSearchByMyConnectionsWithStatus(int $userId, int $status, QueryBuilder $qb = null): QueryBuilder
private function addUserRelUserQueryBuilder(int $userId, int $status, QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb, 'u');
$qb->leftJoin('u.userRelUsers', 'relations');
@ -1467,7 +1455,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb;
}
private function addSearchByOnlyMyFriends(int $userId, QueryBuilder $qb = null): QueryBuilder
private function addOnlyMyFriendsQueryBuilder(int $userId, QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb, 'u');
$qb->leftJoin('u.userRelUsers', 'relations');
@ -1482,7 +1470,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb;
}
private function addSearchByPortal(int $accessUrlId, QueryBuilder $qb = null): QueryBuilder
private function addAccessUrlQueryBuilder(int $accessUrlId, QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb, 'u');
$qb->innerJoin('u.portals', 'p');
@ -1494,7 +1482,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb;
}
private function addSearchByNotCurrentUser(int $userId, QueryBuilder $qb = null): QueryBuilder
private function addNotCurrentUserQueryBuilder(int $userId, QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb, 'u');
@ -1506,7 +1494,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb;
}
private function addSearchByActiveAndNotAnonUser(QueryBuilder $qb = null): QueryBuilder
private function addActiveAndNotAnonUserQueryBuilder(QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb, 'u');
@ -1519,7 +1507,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb;
}
private function addSearchByStatusQueryBuilder(int $status, QueryBuilder $qb = null): QueryBuilder
private function addStatusQueryBuilder(int $status, QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb, 'u');

@ -100,7 +100,7 @@ final class CDocumentRepository extends ResourceRepository implements GridInterf
}
/**
* @return array
* @return CDocument[]
*/
public function getAllDocumentsByAuthor(int $userId)
{
@ -122,8 +122,31 @@ final class CDocumentRepository extends ResourceRepository implements GridInterf
return $query->getResult();
}
public function countUserDocuments(User $user, Course $course, Session $session = null, CGroup $group = null)
{
$qb = $this->getResourcesByCourseLinkedToUser($user, $course, $session, $group);
// Add "not deleted" filters.
$qb->select('count(resource)');
$this->addFileTypeQueryBuilder('file', $qb);
return $qb->getQuery()->getSingleScalarResult();
}
public function getResourceFormType(): string
{
return CDocumentType::class;
}
protected function addFileTypeQueryBuilder(string $fileType, QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb);
$qb
->andWhere('resource.fileType :type')
->setParameter('type', $fileType)
;
return $qb;
}
}

@ -8,6 +8,7 @@ namespace Chamilo\CourseBundle\Repository;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ResourceInterface;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CourseBundle\Entity\CForumPost;
@ -22,7 +23,25 @@ class CForumPostRepository extends ResourceRepository
parent::__construct($registry, CForumPost::class);
}
public function findAllInCourseByThread(
public function countUserForumPosts(User $user, Course $course, Session $session = null)
{
$qb = $this->getResourcesByCourseLinkedToUser($user, $course, $session);
$qb->select('count(resource)');
return $qb->getQuery()->getSingleScalarResult();
}
public function countCourseForumPosts(Course $course, Session $session = null)
{
$qb = $this->getResourcesByCourse($course, $session);
$qb->select('count(resource)');
return $qb->getQuery()->getSingleScalarResult();
}
/*public function findAllInCourseByThread(
bool $onlyVisible,
bool $isAllowedToEdit,
CForumThread $thread,
@ -72,7 +91,7 @@ class CForumPostRepository extends ResourceRepository
])
->getResult()
;
}
}*/
public function delete(ResourceInterface $resource): void
{

@ -42,6 +42,25 @@ final class CStudentPublicationRepository extends ResourceRepository
return $qb;
}
public function countUserPublications(User $user, Course $course, Session $session = null, CGroup $group = null)
{
$qb = $this->getResourcesByCourseLinkedToUser($user, $course, $session);
$qb->select('count(resource)');
return $qb->getQuery()->getSingleScalarResult();
}
public function countCoursePublications(Course $course, Session $session = null, CGroup $group = null)
{
$qb = $this->getResourcesByCourse($course, $session, $group);
$qb->select('count(resource)');
$this->addNotDeletedPublicationQueryBuilder($qb);
return $qb->getQuery()->getSingleScalarResult();
}
/**
* Find all the works registered by a teacher.
*/
@ -78,4 +97,14 @@ final class CStudentPublicationRepository extends ResourceRepository
->getResult()
;
}
protected function addNotDeletedPublicationQueryBuilder(QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb);
$qb
->andWhere('resource.active <> 2')
;
return $qb;
}
}

Loading…
Cancel
Save