172 lines
5.9 KiB
PHP
172 lines
5.9 KiB
PHP
<?php
|
|
|
|
namespace App\Repository;
|
|
|
|
use App\Entity\User;
|
|
use App\Entity\UsersOrganizations;
|
|
use App\Entity\Organizations;
|
|
use App\Entity\Roles;
|
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
|
use Doctrine\Persistence\ManagerRegistry;
|
|
|
|
/**
|
|
* @extends ServiceEntityRepository<UsersOrganizations>
|
|
*/
|
|
class UsersOrganizationsRepository extends ServiceEntityRepository
|
|
{
|
|
public function __construct(ManagerRegistry $registry)
|
|
{
|
|
parent::__construct($registry, UsersOrganizations::class);
|
|
}
|
|
|
|
/**
|
|
* Find all distinct active organizations for a given user ID.
|
|
*
|
|
* @param int $userId
|
|
* @return UsersOrganizations[]
|
|
*/
|
|
public function findAllDistinctOrganizationsByUserId(int $userId): array
|
|
{
|
|
return $this->createQueryBuilder('uo')
|
|
->select('DISTINCT uo')
|
|
->leftJoin('uo.organization', 'o')
|
|
->leftJoin('uo.role', 'r')
|
|
->addSelect('o', 'r')
|
|
->where('uo.users = :userId', 'uo.isActive = :isActive')
|
|
->setParameter('userId', $userId)
|
|
->setParameter('isActive', true)
|
|
->getQuery()
|
|
->getResult();
|
|
}
|
|
|
|
/**
|
|
* Find all organizations where a user (by email) has a specific role.
|
|
*
|
|
* @param string $userEmail
|
|
* @param string $roleName
|
|
* @return Organizations[]
|
|
*/
|
|
public function findOrganizationsByUserEmailAndRoleName(string $userEmail, string $roleName): array
|
|
{
|
|
$results = $this->createQueryBuilder('uo')
|
|
->innerJoin('uo.users', 'u')
|
|
->innerJoin('uo.organization', 'o')
|
|
->innerJoin('uo.role', 'r')
|
|
->where('u.email = :email')
|
|
->andWhere('r.name = :roleName')
|
|
->andWhere('uo.isActive = :isActive')
|
|
->andWhere('o.isActive = :orgIsActive') // Check if organization is active
|
|
->setParameter('email', $userEmail)
|
|
->setParameter('roleName', $roleName)
|
|
->setParameter('isActive', true)
|
|
->setParameter('orgIsActive', true) // Parameter for organization active status
|
|
->getQuery()
|
|
->getResult();
|
|
|
|
return array_map(fn($uo) => $uo->getOrganization(), $results);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Helper: Get all active UsersOrganizations links, optionally filtered by organizations.
|
|
*
|
|
* @param Organizations[]|null $organizations
|
|
* @return UsersOrganizations[]
|
|
*/
|
|
public function getAllActiveUserOrganizationLinks(array $organizations = null): array
|
|
{
|
|
$qb = $this->createQueryBuilder('uo')
|
|
->innerJoin('uo.organization', 'o')
|
|
->innerJoin('uo.users', 'u')
|
|
->where('uo.isActive = :isActive')
|
|
->setParameter('isActive', true);
|
|
|
|
if (!empty($organizations)) {
|
|
$qb->andWhere('o IN (:organizations)')
|
|
->setParameter('organizations', $organizations);
|
|
}
|
|
|
|
return $qb->getQuery()->getResult();
|
|
}
|
|
|
|
|
|
/**
|
|
* Get the last 10 new active users for a specific organization.
|
|
* Users are ordered by creation date (most recent first).
|
|
*
|
|
* @param Organizations $organization
|
|
* @return array
|
|
*/
|
|
public function getLastNewActiveUsersByOrganization(Organizations $organization): array
|
|
{
|
|
$results = $this->createQueryBuilder('uo')
|
|
->select('u.id', 'u.surname', 'u.name', 'u.email', 'u.pictureUrl', 'u.isActive', 'uo.createdAt')
|
|
->innerJoin('uo.users', 'u')
|
|
->innerJoin('uo.organization', 'o')
|
|
->where('uo.isActive = :isActive')
|
|
->andWhere('u.isActive = :userIsActive')
|
|
->andWhere('o.isActive = :orgIsActive')
|
|
->andWhere('uo.organization = :organization')
|
|
->setParameter('isActive', true)
|
|
->setParameter('userIsActive', true)
|
|
->setParameter('orgIsActive', true)
|
|
->setParameter('organization', $organization)
|
|
->orderBy('uo.createdAt', 'DESC')
|
|
->setMaxResults(10)
|
|
->getQuery()
|
|
->getResult();
|
|
|
|
// Remove duplicates by user ID (in case user has multiple roles)
|
|
$uniqueUsers = [];
|
|
foreach ($results as $result) {
|
|
$userId = $result['id'];
|
|
if (!isset($uniqueUsers[$userId])) {
|
|
$uniqueUsers[$userId] = $result;
|
|
}
|
|
}
|
|
|
|
return array_values($uniqueUsers);
|
|
}
|
|
|
|
/**
|
|
* Get all active admin users for a specific organization.
|
|
* Returns users who have the 'ADMIN' role in the given organization.
|
|
*
|
|
* @param Organizations $organization
|
|
* @return array
|
|
*/
|
|
public function getAdminUsersByOrganization(Organizations $organization): array
|
|
{
|
|
$results = $this->createQueryBuilder('uo')
|
|
->select('u.id', 'u.surname', 'u.name', 'u.email', 'u.pictureUrl', 'u.isActive')
|
|
->innerJoin('uo.users', 'u')
|
|
->innerJoin('uo.organization', 'o')
|
|
->innerJoin('uo.role', 'r')
|
|
->where('uo.isActive = :isActive')
|
|
->andWhere('u.isActive = :userIsActive')
|
|
->andWhere('o.isActive = :orgIsActive')
|
|
->andWhere('uo.organization = :organization')
|
|
->andWhere('r.name = :roleName')
|
|
->setParameter('isActive', true)
|
|
->setParameter('userIsActive', true)
|
|
->setParameter('orgIsActive', true)
|
|
->setParameter('organization', $organization)
|
|
->setParameter('roleName', 'ADMIN')
|
|
->orderBy('u.surname', 'ASC')
|
|
->getQuery()
|
|
->getResult();
|
|
|
|
// Remove duplicates by user ID (in case user has multiple admin-related roles)
|
|
$uniqueUsers = [];
|
|
foreach ($results as $result) {
|
|
$userId = $result['id'];
|
|
if (!isset($uniqueUsers[$userId])) {
|
|
$uniqueUsers[$userId] = $result;
|
|
}
|
|
}
|
|
|
|
return array_values($uniqueUsers);
|
|
}
|
|
}
|