Update Repositories, use queryBuilder filters.

pull/3844/head
Julio Montoya 5 years ago
parent 4cd5d987c2
commit 3fcb32724f
  1. 74
      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 Agenda;
use Chamilo\CoreBundle\Entity\AccessUrl; use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\GradebookCertificate; use Chamilo\CoreBundle\Entity\GradebookCertificate;
use Chamilo\CoreBundle\Entity\GradebookResult; use Chamilo\CoreBundle\Entity\GradebookResult;
use Chamilo\CoreBundle\Entity\Message; 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\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Serializer; 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 class UserRepository extends ResourceRepository implements UserLoaderInterface, PasswordUpgraderInterface
{ {
protected ?UserPasswordEncoderInterface $encoder = null; 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 = '') public function getCourses(User $user, AccessUrl $url, int $status, string $keyword = '')
{ {
$qb = $this->createQueryBuilder('user'); $qb = $this->createQueryBuilder('u');
$qb $qb
->select('DISTINCT course') //->select('DISTINCT course')
->innerJoin( ->innerJoin('u.courses', 'courseRelUser')
CourseRelUser::class,
'courseRelUser',
Join::WITH,
'user = courseRelUser.user'
)
->innerJoin('courseRelUser.course', 'course') ->innerJoin('courseRelUser.course', 'course')
->innerJoin('course.urls', 'accessUrlRelCourse') ->innerJoin('course.urls', 'accessUrlRelCourse')
->innerJoin('accessUrlRelCourse.url', 'url') ->innerJoin('accessUrlRelCourse.url', 'url')
->where('user = :user') ->where('url = :url')
->andWhere('url = :url') ->andWhere('courseRelUser.user = :user')
->andWhere('courseRelUser.status = :status') ->andWhere('courseRelUser.status = :status')
->setParameters([ ->setParameters(
[
'user' => $user, 'user' => $user,
'url' => $url, 'url' => $url,
'status' => $status, 'status' => $status,
]) ]
->addSelect('courseRelUser') )
// ->addSelect('courseRelUser')
; ;
if (!empty($keyword)) { if (!empty($keyword)) {
@ -327,12 +315,12 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
* *
* @return User[] * @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'); $qb = $this->createQueryBuilder('u');
$this->addSearchByPortal($accessUrlId, $qb); $this->addAccessUrlQueryBuilder($accessUrlId, $qb);
$this->addSearchByStatusQueryBuilder($status, $qb); $this->addStatusQueryBuilder($status, $qb);
$this->addSearchByKeywordQueryBuilder($keyword, $qb); $this->addSearchByKeywordQueryBuilder($keyword, $qb);
return $qb->getQuery()->getResult(); return $qb->getQuery()->getResult();
@ -550,14 +538,14 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
} }
$qb = $this->createQueryBuilder('u'); $qb = $this->createQueryBuilder('u');
$this->addSearchByActiveAndNotAnonUser($qb); $this->addActiveAndNotAnonUserQueryBuilder($qb);
$this->addSearchByPortal($accessUrlId, $qb); $this->addAccessUrlQueryBuilder($accessUrlId, $qb);
$dql = null; $dql = null;
if ('true' === api_get_setting('allow_social_tool')) { if ('true' === api_get_setting('allow_social_tool')) {
// All users // All users
if ('true' === $allowSendMessageToAllUsers || api_is_platform_admin()) { if ('true' === $allowSendMessageToAllUsers || api_is_platform_admin()) {
$this->addSearchByNotCurrentUser($currentUserId, $qb); $this->addNotCurrentUserQueryBuilder($currentUserId, $qb);
/*$dql = "SELECT DISTINCT U /*$dql = "SELECT DISTINCT U
FROM ChamiloCoreBundle:User U FROM ChamiloCoreBundle:User U
LEFT JOIN ChamiloCoreBundle:AccessUrlRelUser R LEFT JOIN ChamiloCoreBundle:AccessUrlRelUser R
@ -568,7 +556,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
U.id != {$currentUserId} AND U.id != {$currentUserId} AND
R.url = {$accessUrlId}";*/ R.url = {$accessUrlId}";*/
} else { } else {
$this->addSearchByOnlyMyFriends($currentUserId, $qb); $this->addOnlyMyFriendsQueryBuilder($currentUserId, $qb);
/*$dql = 'SELECT DISTINCT U /*$dql = 'SELECT DISTINCT U
FROM ChamiloCoreBundle:AccessUrlRelUser R, ChamiloCoreBundle:UserRelUser UF FROM ChamiloCoreBundle:AccessUrlRelUser R, ChamiloCoreBundle:UserRelUser UF
INNER JOIN ChamiloCoreBundle:User AS U INNER JOIN ChamiloCoreBundle:User AS U
@ -584,7 +572,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
} }
} else { } else {
if ('true' === $allowSendMessageToAllUsers) { if ('true' === $allowSendMessageToAllUsers) {
$this->addSearchByNotCurrentUser($currentUserId, $qb); $this->addNotCurrentUserQueryBuilder($currentUserId, $qb);
} else { } else {
return []; return [];
} }
@ -618,9 +606,9 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
public function getAssignedHrmUserList(int $userId, int $urlId) public function getAssignedHrmUserList(int $userId, int $urlId)
{ {
$qb = $this->createQueryBuilder('u'); $qb = $this->createQueryBuilder('u');
$this->addSearchByPortal($urlId, $qb); $this->addAccessUrlQueryBuilder($urlId, $qb);
$this->addSearchByActiveAndNotAnonUser($qb); $this->addActiveAndNotAnonUserQueryBuilder($qb);
$this->addSearchByMyConnectionsWithStatus($userId, USER_RELATION_TYPE_RRHH, $qb); $this->addUserRelUserQueryBuilder($userId, USER_RELATION_TYPE_RRHH, $qb);
return $qb->getQuery()->getResult(); return $qb->getQuery()->getResult();
} }
@ -1419,15 +1407,15 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
public function getLastLogin(User $user) public function getLastLogin(User $user)
{ {
$repo = $this->getEntityManager()->getRepository(TrackELogin::class); $repo = $this->getEntityManager()->getRepository(TrackELogin::class);
$qb = $repo->createQueryBuilder('l'); $qb = $repo->createQueryBuilder('u');
return $qb return $qb
->select('l') ->select('u')
->where( ->where(
$qb->expr()->eq('l.loginUserId', $user->getId()) $qb->expr()->eq('u.loginUserId', $user->getId())
) )
->setMaxResults(1) ->setMaxResults(1)
->orderBy('l.loginDate', Criteria::DESC) ->orderBy('u.loginDate', Criteria::DESC)
->getQuery() ->getQuery()
->getOneOrNullResult() ->getOneOrNullResult()
; ;
@ -1449,7 +1437,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb; 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 = $this->getOrCreateQueryBuilder($qb, 'u');
$qb->leftJoin('u.userRelUsers', 'relations'); $qb->leftJoin('u.userRelUsers', 'relations');
@ -1467,7 +1455,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb; 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 = $this->getOrCreateQueryBuilder($qb, 'u');
$qb->leftJoin('u.userRelUsers', 'relations'); $qb->leftJoin('u.userRelUsers', 'relations');
@ -1482,7 +1470,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb; 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 = $this->getOrCreateQueryBuilder($qb, 'u');
$qb->innerJoin('u.portals', 'p'); $qb->innerJoin('u.portals', 'p');
@ -1494,7 +1482,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb; 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'); $qb = $this->getOrCreateQueryBuilder($qb, 'u');
@ -1506,7 +1494,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb; return $qb;
} }
private function addSearchByActiveAndNotAnonUser(QueryBuilder $qb = null): QueryBuilder private function addActiveAndNotAnonUserQueryBuilder(QueryBuilder $qb = null): QueryBuilder
{ {
$qb = $this->getOrCreateQueryBuilder($qb, 'u'); $qb = $this->getOrCreateQueryBuilder($qb, 'u');
@ -1519,7 +1507,7 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
return $qb; 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'); $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) public function getAllDocumentsByAuthor(int $userId)
{ {
@ -122,8 +122,31 @@ final class CDocumentRepository extends ResourceRepository implements GridInterf
return $query->getResult(); 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 public function getResourceFormType(): string
{ {
return CDocumentType::class; 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\Course;
use Chamilo\CoreBundle\Entity\ResourceInterface; use Chamilo\CoreBundle\Entity\ResourceInterface;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Repository\ResourceRepository; use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CourseBundle\Entity\CForumPost; use Chamilo\CourseBundle\Entity\CForumPost;
@ -22,7 +23,25 @@ class CForumPostRepository extends ResourceRepository
parent::__construct($registry, CForumPost::class); 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 $onlyVisible,
bool $isAllowedToEdit, bool $isAllowedToEdit,
CForumThread $thread, CForumThread $thread,
@ -72,7 +91,7 @@ class CForumPostRepository extends ResourceRepository
]) ])
->getResult() ->getResult()
; ;
} }*/
public function delete(ResourceInterface $resource): void public function delete(ResourceInterface $resource): void
{ {

@ -42,6 +42,25 @@ final class CStudentPublicationRepository extends ResourceRepository
return $qb; 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. * Find all the works registered by a teacher.
*/ */
@ -78,4 +97,14 @@ final class CStudentPublicationRepository extends ResourceRepository
->getResult() ->getResult()
; ;
} }
protected function addNotDeletedPublicationQueryBuilder(QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb);
$qb
->andWhere('resource.active <> 2')
;
return $qb;
}
} }

Loading…
Cancel
Save