refactor(core) : move user repository/providers to core and migrate all consumers off App\Entity\User

This commit is contained in:
Matthieu
2026-06-19 16:16:44 +02:00
parent d70925b812
commit 0b4874e94d
53 changed files with 109 additions and 115 deletions
-1
View File
@@ -8,7 +8,6 @@ use PhpCsFixer\Finder;
$finder = Finder::create()
->in('src')
->notName('Kernel.php')
->notPath('Module/Core/_compat_user_alias.php')
;
$rules = [
+1 -4
View File
@@ -55,10 +55,7 @@
"autoload": {
"psr-4": {
"App\\": "src/"
},
"files": [
"src/Module/Core/_compat_user_alias.php"
]
}
},
"autoload-dev": {
"psr-4": {
+2 -3
View File
@@ -27,9 +27,6 @@ services:
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/'
# Temporary legacy class_alias bootstrap file (no service): excluded from autowiring scan.
exclude:
- '../src/Module/Core/_compat_user_alias.php'
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
@@ -69,3 +66,5 @@ services:
$uploadDir: '%absence_justification_upload_dir%'
App\Service\Share\FileSource: '@App\Service\Share\SmbFileSource'
App\Module\Core\Domain\Repository\UserRepositoryInterface: '@App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository'
+2 -2
View File
@@ -5,8 +5,8 @@ declare(strict_types=1);
namespace App\Command;
use App\Enum\AbsenceType;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\AbsenceBalanceRepository;
use App\Repository\UserRepository;
use App\Service\AbsenceBalanceService;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
@@ -37,7 +37,7 @@ use function sprintf;
class AccrueLeaveCommand extends Command
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly AbsenceBalanceRepository $balanceRepository,
private readonly AbsenceBalanceService $balanceService,
private readonly EntityManagerInterface $entityManager,
+2 -2
View File
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Command;
use App\Repository\UserRepository;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
@@ -22,7 +22,7 @@ use function sprintf;
class GenerateApiTokenCommand extends Command
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly EntityManagerInterface $entityManager,
) {
parent::__construct();
@@ -4,13 +4,13 @@ declare(strict_types=1);
namespace App\Controller\Absence;
use App\Entity\User;
use App\Enum\AbsenceType;
use App\Enum\HalfDay;
use App\Repository\AbsenceBalanceRepository;
use App\Repository\AbsencePolicyRepository;
use App\Service\AbsenceBalanceService;
use App\Service\AbsenceDayCalculator;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeImmutable;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Bundle\SecurityBundle\Security;
@@ -71,7 +71,7 @@ class AbsencePreviewController extends AbstractController
);
$user = $this->security->getUser();
assert($user instanceof User);
assert($user instanceof UserInterface);
$available = null;
$projectedAvailable = null;
@@ -9,7 +9,7 @@ use App\Entity\Task;
use App\Entity\TaskGroup;
use App\Entity\TaskMailLink;
use App\Entity\TaskStatus;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use App\Repository\MailMessageRepository;
use App\Repository\TaskRepository;
use App\Security\MailAccessChecker;
+2 -2
View File
@@ -4,8 +4,8 @@ declare(strict_types=1);
namespace App\Controller;
use App\Entity\User;
use App\Repository\NotificationRepository;
use App\Shared\Domain\Contract\UserInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
@@ -21,7 +21,7 @@ class MarkAllReadController extends AbstractController
#[IsGranted('IS_AUTHENTICATED_FULLY')]
public function __invoke(): Response
{
/** @var User $user */
/** @var UserInterface $user */
$user = $this->getUser();
$this->notificationRepository->markAllReadByUser($user);
@@ -4,8 +4,8 @@ declare(strict_types=1);
namespace App\Controller;
use App\Entity\User;
use App\Repository\NotificationRepository;
use App\Shared\Domain\Contract\UserInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
@@ -21,7 +21,7 @@ class NotificationUnreadCountController extends AbstractController
#[IsGranted('IS_AUTHENTICATED_FULLY')]
public function __invoke(): JsonResponse
{
/** @var User $user */
/** @var UserInterface $user */
$user = $this->getUser();
$count = $this->notificationRepository->countUnreadByUser($user);
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Controller;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
+1 -1
View File
@@ -5,7 +5,7 @@ declare(strict_types=1);
namespace App\Controller;
use App\Entity\Project;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use App\Repository\TimeEntryRepository;
use App\Service\TimeEntryExportService;
use DateTimeImmutable;
+1 -1
View File
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Controller;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
+1 -1
View File
@@ -18,7 +18,6 @@ use App\Entity\TaskRecurrence;
use App\Entity\TaskStatus;
use App\Entity\TaskTag;
use App\Entity\TimeEntry;
use App\Entity\User;
use App\Entity\Workflow;
use App\Entity\ZimbraConfiguration;
use App\Enum\AbsenceStatus;
@@ -26,6 +25,7 @@ use App\Enum\AbsenceType;
use App\Enum\ContractType;
use App\Enum\RecurrenceType;
use App\Enum\StatusCategory;
use App\Module\Core\Domain\Entity\User;
use DateTimeImmutable;
use DateTimeZone;
use Doctrine\Bundle\FixturesBundle\Fixture;
@@ -6,7 +6,7 @@ namespace App\EventListener;
use App\Entity\Notification;
use App\Entity\Task;
use App\Entity\User;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeImmutable;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
use Doctrine\ORM\Event\OnFlushEventArgs;
@@ -18,7 +18,7 @@ use Symfony\Bundle\SecurityBundle\Security;
#[AsDoctrineListener(event: Events::postFlush)]
final class TaskNotificationListener
{
/** @var list<array{user: User, type: string, task: Task}> */
/** @var list<array{user: UserInterface, type: string, task: Task}> */
private array $pending = [];
public function __construct(private readonly Security $security) {}
@@ -26,7 +26,7 @@ final class TaskNotificationListener
public function onFlush(OnFlushEventArgs $args): void
{
$actor = $this->security->getUser();
if (!$actor instanceof User) {
if (!$actor instanceof UserInterface) {
return;
}
@@ -38,7 +38,7 @@ final class TaskNotificationListener
continue;
}
$assignee = $entity->getAssignee();
if ($assignee instanceof User && $assignee !== $actor) {
if ($assignee instanceof UserInterface && $assignee !== $actor) {
$this->pending[] = ['user' => $assignee, 'type' => 'task_assigned', 'task' => $entity];
}
}
@@ -53,7 +53,7 @@ final class TaskNotificationListener
continue;
}
$new = $changeSet['assignee'][1];
if ($new instanceof User && $new !== $actor) {
if ($new instanceof UserInterface && $new !== $actor) {
$this->pending[] = ['user' => $new, 'type' => 'task_assigned', 'task' => $entity];
}
}
@@ -68,7 +68,7 @@ final class TaskNotificationListener
continue;
}
foreach ($collection->getInsertDiff() as $user) {
if ($user instanceof User && $user !== $actor) {
if ($user instanceof UserInterface && $user !== $actor) {
$this->pending[] = ['user' => $user, 'type' => 'task_collaborator_added', 'task' => $owner];
}
}
@@ -91,7 +91,7 @@ final class TaskNotificationListener
$em->flush();
}
private function buildNotification(User $user, string $type, Task $task): Notification
private function buildNotification(UserInterface $user, string $type, Task $task): Notification
{
[$title, $message] = $this->render($type, $task);
@@ -9,9 +9,9 @@ use App\Enum\AbsenceStatus;
use App\Enum\AbsenceType;
use App\Enum\HalfDay;
use App\Mcp\Tool\Serializer;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\AbsencePolicyRepository;
use App\Repository\AbsenceRequestRepository;
use App\Repository\UserRepository;
use App\Service\AbsenceBalanceService;
use App\Service\AbsenceDayCalculator;
use DateTimeImmutable;
@@ -28,7 +28,7 @@ class CreateAbsenceRequestTool
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly AbsencePolicyRepository $policyRepository,
private readonly AbsenceRequestRepository $requestRepository,
private readonly AbsenceDayCalculator $calculator,
@@ -6,8 +6,8 @@ namespace App\Mcp\Tool\Absence;
use App\Enum\AbsenceType;
use App\Mcp\Tool\Serializer;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\AbsenceBalanceRepository;
use App\Repository\UserRepository;
use InvalidArgumentException;
use Mcp\Capability\Attribute\McpTool;
use Symfony\Bundle\SecurityBundle\Security;
@@ -20,7 +20,7 @@ class ListAbsenceBalancesTool
{
public function __construct(
private readonly AbsenceBalanceRepository $balanceRepository,
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly Security $security,
) {}
@@ -7,8 +7,8 @@ namespace App\Mcp\Tool\Absence;
use App\Enum\AbsenceStatus;
use App\Enum\AbsenceType;
use App\Mcp\Tool\Serializer;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\AbsenceRequestRepository;
use App\Repository\UserRepository;
use DateTimeImmutable;
use InvalidArgumentException;
use Mcp\Capability\Attribute\McpTool;
@@ -22,7 +22,7 @@ class ListAbsenceRequestsTool
{
public function __construct(
private readonly AbsenceRequestRepository $requestRepository,
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly Security $security,
) {}
@@ -4,11 +4,11 @@ declare(strict_types=1);
namespace App\Mcp\Tool\Absence;
use App\Entity\User;
use App\Enum\AbsenceStatus;
use App\Mcp\Tool\Serializer;
use App\Repository\AbsenceRequestRepository;
use App\Service\AbsenceBalanceService;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use InvalidArgumentException;
@@ -49,7 +49,7 @@ class ReviewAbsenceRequestTool
}
$admin = $this->security->getUser();
assert($admin instanceof User);
assert($admin instanceof UserInterface);
if ('approve' === $decision) {
// Never let an approval push the balance below zero (CP only).
+2 -2
View File
@@ -5,7 +5,7 @@ declare(strict_types=1);
namespace App\Mcp\Tool\Reference;
use App\Mcp\Tool\Serializer;
use App\Repository\UserRepository;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use InvalidArgumentException;
use Mcp\Capability\Attribute\McpTool;
use Symfony\Bundle\SecurityBundle\Security;
@@ -17,7 +17,7 @@ use function sprintf;
class GetUserTool
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly Security $security,
) {}
+2 -2
View File
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Mcp\Tool\Reference;
use App\Repository\UserRepository;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use Mcp\Capability\Attribute\McpTool;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
@@ -13,7 +13,7 @@ use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class ListUsersTool
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly Security $security,
) {}
+2 -2
View File
@@ -6,7 +6,7 @@ namespace App\Mcp\Tool\Reference;
use App\Enum\ContractType;
use App\Mcp\Tool\Serializer;
use App\Repository\UserRepository;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use InvalidArgumentException;
@@ -20,7 +20,7 @@ use function sprintf;
class UpdateUserTool
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly EntityManagerInterface $entityManager,
private readonly Security $security,
) {}
+1 -1
View File
@@ -17,7 +17,7 @@ use App\Entity\TaskPriority;
use App\Entity\TaskStatus;
use App\Entity\TaskTag;
use App\Entity\TimeEntry;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Doctrine\Common\Collections\Collection;
/**
+2 -2
View File
@@ -6,6 +6,7 @@ namespace App\Mcp\Tool\Task;
use App\Entity\Task;
use App\Mcp\Tool\Serializer;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\ProjectRepository;
use App\Repository\TaskEffortRepository;
use App\Repository\TaskGroupRepository;
@@ -13,7 +14,6 @@ use App\Repository\TaskPriorityRepository;
use App\Repository\TaskRepository;
use App\Repository\TaskStatusRepository;
use App\Repository\TaskTagRepository;
use App\Repository\UserRepository;
use App\Service\CalDavService;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
@@ -36,7 +36,7 @@ class CreateTaskTool
private readonly TaskEffortRepository $taskEffortRepository,
private readonly TaskGroupRepository $taskGroupRepository,
private readonly TaskTagRepository $taskTagRepository,
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly Security $security,
private readonly CalDavService $calDavService,
) {}
+2 -2
View File
@@ -5,13 +5,13 @@ declare(strict_types=1);
namespace App\Mcp\Tool\Task;
use App\Mcp\Tool\Serializer;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\TaskEffortRepository;
use App\Repository\TaskGroupRepository;
use App\Repository\TaskPriorityRepository;
use App\Repository\TaskRepository;
use App\Repository\TaskStatusRepository;
use App\Repository\TaskTagRepository;
use App\Repository\UserRepository;
use App\Service\CalDavService;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
@@ -33,7 +33,7 @@ class UpdateTaskTool
private readonly TaskEffortRepository $taskEffortRepository,
private readonly TaskGroupRepository $taskGroupRepository,
private readonly TaskTagRepository $taskTagRepository,
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly Security $security,
private readonly CalDavService $calDavService,
) {}
@@ -6,11 +6,11 @@ namespace App\Mcp\Tool\TimeEntry;
use App\Entity\TimeEntry;
use App\Mcp\Tool\Serializer;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\ProjectRepository;
use App\Repository\TaskRepository;
use App\Repository\TaskTagRepository;
use App\Repository\TimeEntryRepository;
use App\Repository\UserRepository;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use InvalidArgumentException;
@@ -25,7 +25,7 @@ class CreateTimeEntryTool
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
private readonly ProjectRepository $projectRepository,
private readonly TaskRepository $taskRepository,
private readonly TaskTagRepository $taskTagRepository,
+4 -4
View File
@@ -12,10 +12,10 @@ use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Patch;
use ApiPlatform\Metadata\Post;
use App\Enum\ContractType;
use App\Repository\UserRepository;
use App\Module\Core\Infrastructure\ApiPlatform\State\MeProvider;
use App\Module\Core\Infrastructure\ApiPlatform\State\UserPasswordHasherProcessor;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Shared\Domain\Contract\UserInterface as SharedUserInterface;
use App\State\MeProvider;
use App\State\UserPasswordHasherProcessor;
use DateTimeImmutable;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
@@ -43,7 +43,7 @@ use Symfony\Component\Serializer\Attribute\Groups;
],
denormalizationContext: ['groups' => ['user:write']],
)]
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\Entity(repositoryClass: DoctrineUserRepository::class)]
#[ORM\Table(name: '`user`')]
class User implements UserInterface, PasswordAuthenticatedUserInterface, SharedUserInterface
{
@@ -2,11 +2,11 @@
declare(strict_types=1);
namespace App\State;
namespace App\Module\Core\Infrastructure\ApiPlatform\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\SecurityBundle\Security;
/**
@@ -2,11 +2,11 @@
declare(strict_types=1);
namespace App\State;
namespace App\Module\Core\Infrastructure\ApiPlatform\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProcessorInterface;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
@@ -2,9 +2,11 @@
declare(strict_types=1);
namespace App\Repository;
namespace App\Module\Core\Infrastructure\Doctrine;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use App\Module\Core\Domain\Repository\UserRepositoryInterface;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeInterface;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -12,7 +14,7 @@ use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<User>
*/
class UserRepository extends ServiceEntityRepository
class DoctrineUserRepository extends ServiceEntityRepository implements UserRepositoryInterface
{
public function __construct(ManagerRegistry $registry)
{
@@ -20,7 +22,7 @@ class UserRepository extends ServiceEntityRepository
}
/**
* @return User[]
* @return list<UserInterface>
*/
public function findByRole(string $role): array
{
@@ -43,7 +45,7 @@ class UserRepository extends ServiceEntityRepository
/**
* Employees active on the given date (hired on/before it, not yet left).
*
* @return User[]
* @return list<UserInterface>
*/
public function findActiveEmployees(DateTimeInterface $date): array
{
@@ -59,4 +61,9 @@ class UserRepository extends ServiceEntityRepository
->getResult()
;
}
public function findOneByUsername(string $username): ?UserInterface
{
return $this->findOneBy(['username' => $username]);
}
}
-8
View File
@@ -1,8 +0,0 @@
<?php
declare(strict_types=1);
use App\Entity\User;
if (!class_exists(User::class, false)) {
class_alias(App\Module\Core\Domain\Entity\User::class, User::class);
}
+2 -2
View File
@@ -5,8 +5,8 @@ declare(strict_types=1);
namespace App\Repository;
use App\Entity\AbsenceBalance;
use App\Entity\User;
use App\Enum\AbsenceType;
use App\Shared\Domain\Contract\UserInterface;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -20,7 +20,7 @@ class AbsenceBalanceRepository extends ServiceEntityRepository
parent::__construct($registry, AbsenceBalance::class);
}
public function findOneForPeriod(User $user, AbsenceType $type, string $period): ?AbsenceBalance
public function findOneForPeriod(UserInterface $user, AbsenceType $type, string $period): ?AbsenceBalance
{
return $this->findOneBy([
'user' => $user,
+3 -3
View File
@@ -5,9 +5,9 @@ declare(strict_types=1);
namespace App\Repository;
use App\Entity\AbsenceRequest;
use App\Entity\User;
use App\Enum\AbsenceStatus;
use App\Enum\AbsenceType;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeInterface;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -28,7 +28,7 @@ class AbsenceRequestRepository extends ServiceEntityRepository
* end_a >= start_b.
*/
public function hasOverlap(
User $user,
UserInterface $user,
DateTimeInterface $startDate,
DateTimeInterface $endDate,
?int $excludeId = null,
@@ -77,7 +77,7 @@ class AbsenceRequestRepository extends ServiceEntityRepository
* @return AbsenceRequest[]
*/
public function findFiltered(
?User $user = null,
?UserInterface $user = null,
?AbsenceStatus $status = null,
?AbsenceType $type = null,
?DateTimeInterface $from = null,
+3 -3
View File
@@ -5,7 +5,7 @@ declare(strict_types=1);
namespace App\Repository;
use App\Entity\Notification;
use App\Entity\User;
use App\Shared\Domain\Contract\UserInterface as SharedUserInterface;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
@@ -30,7 +30,7 @@ class NotificationRepository extends ServiceEntityRepository
;
}
public function countUnreadByUser(User $user): int
public function countUnreadByUser(SharedUserInterface $user): int
{
return (int) $this->createQueryBuilder('n')
->select('COUNT(n.id)')
@@ -42,7 +42,7 @@ class NotificationRepository extends ServiceEntityRepository
;
}
public function markAllReadByUser(User $user): int
public function markAllReadByUser(SharedUserInterface $user): int
{
return $this->createQueryBuilder('n')
->update()
+5 -5
View File
@@ -6,7 +6,7 @@ namespace App\Repository;
use App\Entity\Project;
use App\Entity\TimeEntry;
use App\Entity\User;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeImmutable;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -21,7 +21,7 @@ class TimeEntryRepository extends ServiceEntityRepository
parent::__construct($registry, TimeEntry::class);
}
public function findActiveByUser(User $user): ?TimeEntry
public function findActiveByUser(UserInterface $user): ?TimeEntry
{
return $this->findOneBy([
'user' => $user,
@@ -30,9 +30,9 @@ class TimeEntryRepository extends ServiceEntityRepository
}
/**
* @param null|User[] $users
* @param null|Project[] $projects
* @param null|int[] $tagIds
* @param null|UserInterface[] $users
* @param null|Project[] $projects
* @param null|int[] $tagIds
*
* @return TimeEntry[]
*/
+3 -3
View File
@@ -4,8 +4,8 @@ declare(strict_types=1);
namespace App\Security;
use App\Entity\User;
use App\Repository\UserRepository;
use App\Module\Core\Domain\Entity\User;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -20,7 +20,7 @@ use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPasspor
class ApiTokenAuthenticator extends AbstractAuthenticator
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly DoctrineUserRepository $userRepository,
) {}
public function supports(Request $request): ?bool
+3 -3
View File
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Security;
use App\Entity\User;
use App\Shared\Domain\Contract\UserInterface as SharedUserInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\User\UserInterface;
@@ -23,7 +23,7 @@ final readonly class MailAccessChecker
*/
public function ensureCanAccessMail(?UserInterface $user): void
{
if (!$user instanceof User) {
if (!$user instanceof SharedUserInterface) {
throw new AccessDeniedException('Authentication required');
}
@@ -41,7 +41,7 @@ final readonly class MailAccessChecker
*/
public function ensureIsAdmin(?UserInterface $user): void
{
if (!$user instanceof User || !$this->authorizationChecker->isGranted('ROLE_ADMIN')) {
if (!$user instanceof SharedUserInterface || !$this->authorizationChecker->isGranted('ROLE_ADMIN')) {
throw new AccessDeniedException('Admin only');
}
}
+1 -1
View File
@@ -6,8 +6,8 @@ namespace App\Service;
use App\Entity\AbsenceBalance;
use App\Entity\AbsenceRequest;
use App\Entity\User;
use App\Enum\AbsenceType;
use App\Module\Core\Domain\Entity\User;
use App\Repository\AbsenceBalanceRepository;
use DateTimeInterface;
use Doctrine\ORM\EntityManagerInterface;
+2 -2
View File
@@ -7,7 +7,7 @@ namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Entity\AbsenceBalance;
use App\Entity\User;
use App\Shared\Domain\Contract\UserInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
@@ -24,7 +24,7 @@ final readonly class AbsenceBalanceProvider implements ProviderInterface
public function provide(Operation $operation, array $uriVariables = [], array $context = []): AbsenceBalance|array|null
{
$user = $this->security->getUser();
assert($user instanceof User);
assert($user instanceof UserInterface);
$repo = $this->entityManager->getRepository(AbsenceBalance::class);
$isAdmin = $this->security->isGranted('ROLE_ADMIN');
+2 -2
View File
@@ -7,13 +7,13 @@ namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProcessorInterface;
use App\Entity\AbsenceRequest;
use App\Entity\User;
use App\Enum\AbsenceStatus;
use App\Enum\AbsenceType;
use App\Repository\AbsencePolicyRepository;
use App\Repository\AbsenceRequestRepository;
use App\Service\AbsenceBalanceService;
use App\Service\AbsenceDayCalculator;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
@@ -42,7 +42,7 @@ final readonly class AbsenceRequestProcessor implements ProcessorInterface
assert($data instanceof AbsenceRequest);
$user = $this->security->getUser();
assert($user instanceof User);
assert($user instanceof UserInterface);
$type = $data->getType();
$startDate = $data->getStartDate();
+2 -2
View File
@@ -7,7 +7,7 @@ namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Entity\AbsenceRequest;
use App\Entity\User;
use App\Shared\Domain\Contract\UserInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
@@ -24,7 +24,7 @@ final readonly class AbsenceRequestProvider implements ProviderInterface
public function provide(Operation $operation, array $uriVariables = [], array $context = []): AbsenceRequest|array|null
{
$user = $this->security->getUser();
assert($user instanceof User);
assert($user instanceof UserInterface);
$repo = $this->entityManager->getRepository(AbsenceRequest::class);
$isAdmin = $this->security->isGranted('ROLE_ADMIN');
+2 -2
View File
@@ -7,9 +7,9 @@ namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProcessorInterface;
use App\Entity\AbsenceRequest;
use App\Entity\User;
use App\Enum\AbsenceStatus;
use App\Service\AbsenceBalanceService;
use App\Shared\Domain\Contract\UserInterface;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
@@ -55,7 +55,7 @@ final readonly class AbsenceReviewProcessor implements ProcessorInterface
}
$admin = $this->security->getUser();
assert($admin instanceof User);
assert($admin instanceof UserInterface);
if ($isApprove) {
// Never let an approval push the balance below zero (CP only): the
+2 -2
View File
@@ -7,7 +7,7 @@ namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Entity\TaskDocument;
use App\Entity\User;
use App\Shared\Domain\Contract\UserInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
@@ -24,7 +24,7 @@ final readonly class TaskDocumentProvider implements ProviderInterface
public function provide(Operation $operation, array $uriVariables = [], array $context = []): array|TaskDocument|null
{
$user = $this->security->getUser();
assert($user instanceof User);
assert($user instanceof UserInterface);
$repo = $this->entityManager->getRepository(TaskDocument::class);
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Controller\Mail;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Controller\Mail;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Controller\Mail;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Controller\Mail;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
@@ -8,7 +8,7 @@ use App\Entity\MailFolder;
use App\Entity\MailMessage;
use App\Entity\Project;
use App\Entity\Task;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use DateTimeImmutable;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Controller;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Controller;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Controller;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
@@ -6,7 +6,7 @@ namespace App\Tests\Functional\EventListener;
use App\Entity\Project;
use App\Entity\Task;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use App\Repository\NotificationRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
@@ -6,15 +6,15 @@ namespace App\Tests\Functional\Mcp;
use App\Entity\AbsenceBalance;
use App\Entity\AbsencePolicy;
use App\Entity\User;
use App\Enum\AbsenceType;
use App\Mcp\Tool\Absence\CancelAbsenceRequestTool;
use App\Mcp\Tool\Absence\CreateAbsenceRequestTool;
use App\Mcp\Tool\Absence\ReviewAbsenceRequestTool;
use App\Module\Core\Domain\Entity\User;
use App\Module\Core\Infrastructure\Doctrine\DoctrineUserRepository;
use App\Repository\AbsenceBalanceRepository;
use App\Repository\AbsencePolicyRepository;
use App\Repository\AbsenceRequestRepository;
use App\Repository\UserRepository;
use App\Service\AbsenceBalanceService;
use App\Service\AbsenceDayCalculator;
use Doctrine\ORM\EntityManagerInterface;
@@ -216,7 +216,7 @@ class AbsenceRequestLifecycleTest extends KernelTestCase
return new CreateAbsenceRequestTool(
$c->get(EntityManagerInterface::class),
$c->get(UserRepository::class),
$c->get(DoctrineUserRepository::class),
$c->get(AbsencePolicyRepository::class),
$c->get(AbsenceRequestRepository::class),
$c->get(AbsenceDayCalculator::class),
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Tests\Functional\Shared;
use App\Entity\User;
use App\Module\Core\Domain\Entity\User;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**