From de17c2f0e935f4cfd0bfe4c82695867a8abde8db Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Sat, 20 Jan 2024 21:42:43 +0000 Subject: [PATCH 01/16] doc(factory) removed useless phpdoc --- src/Factory/FlashcardFactory.php | 4 ---- src/Factory/TopicFactory.php | 4 ---- src/Factory/UnitFactory.php | 4 ---- 3 files changed, 12 deletions(-) diff --git a/src/Factory/FlashcardFactory.php b/src/Factory/FlashcardFactory.php index 7ed35e0..6b405d0 100644 --- a/src/Factory/FlashcardFactory.php +++ b/src/Factory/FlashcardFactory.php @@ -47,8 +47,6 @@ final class FlashcardFactory extends ModelFactory { /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#factories-as-services - * - * @todo inject services if required */ public function __construct() { @@ -57,8 +55,6 @@ public function __construct() /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#model-factories - * - * @todo add your default values here */ protected function getDefaults(): array { diff --git a/src/Factory/TopicFactory.php b/src/Factory/TopicFactory.php index bf3bc04..2ced1d3 100644 --- a/src/Factory/TopicFactory.php +++ b/src/Factory/TopicFactory.php @@ -47,8 +47,6 @@ final class TopicFactory extends ModelFactory { /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#factories-as-services - * - * @todo inject services if required */ public function __construct() { @@ -57,8 +55,6 @@ public function __construct() /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#model-factories - * - * @todo add your default values here */ protected function getDefaults(): array { diff --git a/src/Factory/UnitFactory.php b/src/Factory/UnitFactory.php index 4f47dd7..5774413 100644 --- a/src/Factory/UnitFactory.php +++ b/src/Factory/UnitFactory.php @@ -47,8 +47,6 @@ final class UnitFactory extends ModelFactory { /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#factories-as-services - * - * @todo inject services if required */ public function __construct() { @@ -57,8 +55,6 @@ public function __construct() /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#model-factories - * - * @todo add your default values here */ protected function getDefaults(): array { From be07fdd569745a0c489ad3fe96c0649f57164474 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Sat, 20 Jan 2024 21:46:04 +0000 Subject: [PATCH 02/16] feat(pagination) Added Page DTO with types --- src/Controller/AbstractRestController.php | 13 ++++++-- .../Admin/FlashcardAdminController.php | 6 ++-- src/Controller/Admin/TopicAdminController.php | 6 ++-- src/Controller/Admin/UnitAdminController.php | 6 ++-- src/Controller/Admin/UserAdminController.php | 6 ++-- src/Controller/User/FlashcardController.php | 6 ++-- src/Controller/User/TopicController.php | 12 +++---- src/Controller/User/UnitController.php | 12 +++---- src/Model/Page.php | 13 ++++++++ src/Service/ObjectInstantiator.php | 33 +++++++++++++++++++ .../Controller/AbstractRestControllerTest.php | 18 +++++----- 11 files changed, 93 insertions(+), 38 deletions(-) create mode 100644 src/Model/Page.php create mode 100644 src/Service/ObjectInstantiator.php diff --git a/src/Controller/AbstractRestController.php b/src/Controller/AbstractRestController.php index 8fc9fc3..cb1e0bb 100644 --- a/src/Controller/AbstractRestController.php +++ b/src/Controller/AbstractRestController.php @@ -3,6 +3,8 @@ namespace App\Controller; use Exception; +use App\Model\Page; +use App\Service\ObjectFactory; use App\Exception\ApiException; use App\Service\EntityValidator; use App\Service\SortableEntityChecker; @@ -27,7 +29,7 @@ public function __construct( * @param string $classname This classname is used to retrieve the sortable fields * @param Request $request Request to retrieve the query parameters */ - public function getPaginationParameter(string $classname, Request $request): array + public function getPaginationParameter(string $classname, Request $request): Page { $sortableFields = $this->sortableEntityChecker->getSortableFields($classname); @@ -41,7 +43,14 @@ public function getPaginationParameter(string $classname, Request $request): arr throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } - return $queryParams; + try { + /** @var Page $page */ + $page = ObjectFactory::create(Page::class, $queryParams); + } catch (Exception $e) { + throw new ApiException(Response::HTTP_INTERNAL_SERVER_ERROR, 'An error occured'); + } + + return $page; } public function validateEntity(mixed $entity, array $validationGroups = ['Default']): void diff --git a/src/Controller/Admin/FlashcardAdminController.php b/src/Controller/Admin/FlashcardAdminController.php index 6a7b8b2..9d0f0c0 100644 --- a/src/Controller/Admin/FlashcardAdminController.php +++ b/src/Controller/Admin/FlashcardAdminController.php @@ -28,9 +28,9 @@ public function getAllFlashcards( $pagination = $this->getPaginationParameter(Flashcard::class, $request); $flashcards = $flashcardRepository->findAllWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'] + $pagination->page, + $pagination->sort, + $pagination->order ); return $this->json($flashcards, context: ['groups' => ['read:flashcard:admin']]); diff --git a/src/Controller/Admin/TopicAdminController.php b/src/Controller/Admin/TopicAdminController.php index a92749a..758b3ad 100644 --- a/src/Controller/Admin/TopicAdminController.php +++ b/src/Controller/Admin/TopicAdminController.php @@ -29,9 +29,9 @@ public function getAllTopics( // Get data with pagination $topics = $topicRepository->findAllWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'] + $pagination->page, + $pagination->sort, + $pagination->order ); // Return paginate data diff --git a/src/Controller/Admin/UnitAdminController.php b/src/Controller/Admin/UnitAdminController.php index bd9c6f5..ac6c040 100644 --- a/src/Controller/Admin/UnitAdminController.php +++ b/src/Controller/Admin/UnitAdminController.php @@ -29,9 +29,9 @@ public function getAllUnits( // Get data with pagination $units = $unitRepository->findAllWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'] + $pagination->page, + $pagination->sort, + $pagination->order ); // Return paginate data diff --git a/src/Controller/Admin/UserAdminController.php b/src/Controller/Admin/UserAdminController.php index 0984311..59928c1 100644 --- a/src/Controller/Admin/UserAdminController.php +++ b/src/Controller/Admin/UserAdminController.php @@ -32,9 +32,9 @@ public function getAllUsers( // Get data with pagination $users = $userRepository->findAllWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'] + $pagination->page, + $pagination->sort, + $pagination->order ); // Return paginate data diff --git a/src/Controller/User/FlashcardController.php b/src/Controller/User/FlashcardController.php index 957027c..a531b59 100644 --- a/src/Controller/User/FlashcardController.php +++ b/src/Controller/User/FlashcardController.php @@ -37,9 +37,9 @@ public function getAllFlashcards(Request $request, FlashcardRepository $flashcar $user = $this->getUser(); $flashcards = $flashcardRepository->findAllWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'], + $pagination->page, + $pagination->sort, + $pagination->order, $user ); diff --git a/src/Controller/User/TopicController.php b/src/Controller/User/TopicController.php index 50b1b6a..465bb99 100644 --- a/src/Controller/User/TopicController.php +++ b/src/Controller/User/TopicController.php @@ -35,9 +35,9 @@ public function getAllTopics(Request $request, TopicRepository $topicRepository) // Get data with pagination $topics = $topicRepository->findAllWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'], + $pagination->page, + $pagination->sort, + $pagination->order, $user ); @@ -175,9 +175,9 @@ public function getUnitsFromTopic(int $id, Request $request, TopicRepository $to // Get data with pagination $units = $unitRepository->findByTopicWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'], + $pagination->page, + $pagination->sort, + $pagination->order, $topic ); diff --git a/src/Controller/User/UnitController.php b/src/Controller/User/UnitController.php index d80dec5..d1a84b9 100644 --- a/src/Controller/User/UnitController.php +++ b/src/Controller/User/UnitController.php @@ -37,9 +37,9 @@ public function getAllUnits( // Get data with pagination $units = $unitRepository->findAllWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'], + $pagination->page, + $pagination->sort, + $pagination->order, $user ); @@ -182,9 +182,9 @@ public function getUnitsFromTopic(int $id, Request $request, FlashcardRepository // Get data with pagination $flashcards = $flashcardRepository->findByUnitWithPagination( - $pagination['page'], - $pagination['sort'], - $pagination['order'], + $pagination->page, + $pagination->sort, + $pagination->order, $unit ); diff --git a/src/Model/Page.php b/src/Model/Page.php new file mode 100644 index 0000000..bff394d --- /dev/null +++ b/src/Model/Page.php @@ -0,0 +1,13 @@ + $className + * @param int $id + * @return T + */ + public static function create(string $fqcn, array $constructorArgs = []): object + { + if (! class_exists($fqcn)) { + throw new InvalidArgumentException("Class $fqcn doesn't exist"); + } + + $reflectionClass = new ReflectionClass($fqcn); + + $instance = $reflectionClass->newInstanceArgs($constructorArgs); + + if ($instance === null) { + throw new InvalidArgumentException("Error while creating the $fqcn object"); + } + + return $instance; + } +} diff --git a/tests/Controller/AbstractRestControllerTest.php b/tests/Controller/AbstractRestControllerTest.php index cd86225..ddd3072 100644 --- a/tests/Controller/AbstractRestControllerTest.php +++ b/tests/Controller/AbstractRestControllerTest.php @@ -3,6 +3,7 @@ namespace App\Tests\Controller; use Exception; +use App\Model\Page; use App\Attribut\Sortable; use App\Exception\ApiException; use App\Controller\AbstractRestController; @@ -29,17 +30,16 @@ public function testGetPaginationParameter(): void $result = $abstractController->getPaginationParameter(__Foo__::class, $request); - $this->assertArrayHasKey('page', $result); - $this->assertIsInt($result['page']); - $this->assertSame(1, $result['page']); + $this->assertInstanceOf(Page::class, $result); - $this->assertArrayHasKey('sort', $result); - $this->assertIsString($result['sort']); - $this->assertSame('id', $result['sort']); + $this->assertIsInt($result->page); + $this->assertSame(1, $result->page); - $this->assertArrayHasKey('order', $result); - $this->assertIsString($result['order']); - $this->assertSame('ASC', $result['order']); + $this->assertIsString($result->sort); + $this->assertSame('id', $result->sort); + + $this->assertIsString($result->order); + $this->assertSame('ASC', $result->order); } public function testGetPaginationParameterInvalidPage(): void From eafa8bfe8e7e6589e4ee3bd5f6ece877268307c7 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Sun, 21 Jan 2024 22:40:06 +0000 Subject: [PATCH 03/16] fix(service) Fix error on ObjectFactory --- src/Service/{ObjectInstantiator.php => ObjectFactory.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Service/{ObjectInstantiator.php => ObjectFactory.php} (100%) diff --git a/src/Service/ObjectInstantiator.php b/src/Service/ObjectFactory.php similarity index 100% rename from src/Service/ObjectInstantiator.php rename to src/Service/ObjectFactory.php From 72525cc77ed6773e60df2cebf39adfa01aee489f Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Sun, 21 Jan 2024 22:40:57 +0000 Subject: [PATCH 04/16] feat(user) Added token and roles to serialization context + updated status code to bad request when invalid creds --- config/packages/security.yaml | 2 +- src/Controller/User/SecurityController.php | 7 +++++ src/Entity/User.php | 3 ++- src/Security/AuthenticationFailureHandler.php | 2 +- src/Security/AuthenticationSuccessHandler.php | 27 ------------------- .../User/SecurityControllerTest.php | 4 +-- 6 files changed, 13 insertions(+), 32 deletions(-) delete mode 100644 src/Security/AuthenticationSuccessHandler.php diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 424e592..ab509bd 100755 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -28,7 +28,7 @@ security: username_path: identifier password_path: password check_path: api_auth_login - success_handler: App\Security\AuthenticationSuccessHandler + # success_handler: App\Security\AuthenticationSuccessHandler failure_handler: App\Security\AuthenticationFailureHandler api: diff --git a/src/Controller/User/SecurityController.php b/src/Controller/User/SecurityController.php index 6b52c9b..e65b103 100644 --- a/src/Controller/User/SecurityController.php +++ b/src/Controller/User/SecurityController.php @@ -23,6 +23,13 @@ class SecurityController extends AbstractRestController #[Route('/login', name: 'login', methods: ['POST'])] public function login() { + $user = $this->getUser(); + + if ($user === null) { + throw new ApiException(Response::HTTP_UNAUTHORIZED, 'Unauthenticated user'); + } + + return $this->json($user, context: ['groups' => ['read:user:user']]); } #[Route('/register', name: 'register', methods: ['POST'])] diff --git a/src/Entity/User.php b/src/Entity/User.php index 3c9ef2f..2cc8a92 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -49,6 +49,7 @@ class User implements PasswordAuthenticatedUserInterface, UserInterface #[ORM\Column(length: 100)] #[Assert\NotBlank(message: 'The token can not be blank')] #[Assert\Length(max: 100, maxMessage: 'The token can not exceed {{ limit }} characters')] + #[Groups(['read:user:user'])] private ?string $token = null; #[ORM\Column] @@ -62,7 +63,7 @@ class User implements PasswordAuthenticatedUserInterface, UserInterface private ?DateTimeImmutable $updatedAt = null; #[ORM\Column(type: Types::JSON)] - #[Groups(['read:user:admin'])] + #[Groups(['read:user:user', 'read:user:admin'])] private array $roles = []; /** diff --git a/src/Security/AuthenticationFailureHandler.php b/src/Security/AuthenticationFailureHandler.php index 1475f67..3b5c2f9 100644 --- a/src/Security/AuthenticationFailureHandler.php +++ b/src/Security/AuthenticationFailureHandler.php @@ -13,6 +13,6 @@ class AuthenticationFailureHandler implements AuthenticationFailureHandlerInterf { public function onAuthenticationFailure(Request $request, AuthenticationException $exception): JsonResponse { - throw new ApiException(Response::HTTP_UNAUTHORIZED, 'Invalid credentials'); + throw new ApiException(Response::HTTP_BAD_REQUEST, 'Invalid credentials'); } } diff --git a/src/Security/AuthenticationSuccessHandler.php b/src/Security/AuthenticationSuccessHandler.php deleted file mode 100644 index 712d753..0000000 --- a/src/Security/AuthenticationSuccessHandler.php +++ /dev/null @@ -1,27 +0,0 @@ -getUser(); - - if ($user === null) { - throw new ApiException(Response::HTTP_UNAUTHORIZED, 'Unauthenticated user'); - } - - $userApiToken = $user->getToken(); - - return new JsonResponse(['token' => $userApiToken]); - } -} diff --git a/tests/Controller/User/SecurityControllerTest.php b/tests/Controller/User/SecurityControllerTest.php index c295761..cd88d56 100644 --- a/tests/Controller/User/SecurityControllerTest.php +++ b/tests/Controller/User/SecurityControllerTest.php @@ -59,7 +59,7 @@ public function testLoginWithBadPassword() $client->request('POST', '/api/auth/login', content: json_encode($content)); - $this->assertResponseStatusCodeSame(Response::HTTP_UNAUTHORIZED); + $this->assertResponseStatusCodeSame(Response::HTTP_BAD_REQUEST); } public function testLoginWithBadIdentifier() @@ -76,6 +76,6 @@ public function testLoginWithBadIdentifier() $client->request('POST', '/api/auth/login', content: json_encode($content)); - $this->assertResponseStatusCodeSame(Response::HTTP_UNAUTHORIZED); + $this->assertResponseStatusCodeSame(Response::HTTP_BAD_REQUEST); } } From 4e3c0b58e37490ca1c3e546f0c90db688d235f82 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Mon, 22 Jan 2024 21:42:03 +0000 Subject: [PATCH 05/16] fix(register) Updated register response --- src/Controller/User/SecurityController.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Controller/User/SecurityController.php b/src/Controller/User/SecurityController.php index e65b103..f5e38db 100644 --- a/src/Controller/User/SecurityController.php +++ b/src/Controller/User/SecurityController.php @@ -73,12 +73,6 @@ public function register( $em->persist($user); $em->flush(); - // Return the element with the the status 201 (Created) - return $this->json( - [ - 'token' => $user->getToken(), - ], - Response::HTTP_CREATED, - ); + return $this->json($user, Response::HTTP_CREATED, context: ['groups' => ['read:user:user']]); } } From 92aa4f4671f123dbb1b46e8c2691c244dd832c43 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Mon, 22 Jan 2024 21:42:21 +0000 Subject: [PATCH 06/16] fix(user) Updated password strength --- src/Entity/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/User.php b/src/Entity/User.php index 2cc8a92..7ced292 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -74,7 +74,7 @@ class User implements PasswordAuthenticatedUserInterface, UserInterface #[Assert\NotBlank(message: 'Your password can not be blank', groups: ['edit:user:password'])] #[Assert\NotCompromisedPassword(message: 'This password has been compromised. Please choose another password', groups: ['edit:user:password'])] - #[PasswordStrength(minScore: PasswordStrength::STRENGTH_VERY_STRONG, message: 'You must choose a stronger password', groups: ['edit:user:password'])] + #[PasswordStrength(minScore: PasswordStrength::STRENGTH_STRONG, message: 'You must choose a stronger password', groups: ['edit:user:password'])] #[Assert\NotEqualTo(propertyPath: 'username', message: 'You must choose a stronger password', groups: ['edit:user:password'])] #[Assert\NotEqualTo(propertyPath: 'email', message: 'You must choose a stronger password', groups: ['edit:user:password'])] private ?string $rawPassword = null; From e6d79656091cb2fceefa5e094537048300fdd4c8 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Wed, 24 Jan 2024 22:01:39 +0000 Subject: [PATCH 07/16] fix(user) Updated password strength validation --- src/Entity/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/User.php b/src/Entity/User.php index 7ced292..08345f5 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -74,7 +74,7 @@ class User implements PasswordAuthenticatedUserInterface, UserInterface #[Assert\NotBlank(message: 'Your password can not be blank', groups: ['edit:user:password'])] #[Assert\NotCompromisedPassword(message: 'This password has been compromised. Please choose another password', groups: ['edit:user:password'])] - #[PasswordStrength(minScore: PasswordStrength::STRENGTH_STRONG, message: 'You must choose a stronger password', groups: ['edit:user:password'])] + #[PasswordStrength(minScore: PasswordStrength::STRENGTH_MEDIUM, message: 'You must choose a stronger password', groups: ['edit:user:password'])] #[Assert\NotEqualTo(propertyPath: 'username', message: 'You must choose a stronger password', groups: ['edit:user:password'])] #[Assert\NotEqualTo(propertyPath: 'email', message: 'You must choose a stronger password', groups: ['edit:user:password'])] private ?string $rawPassword = null; From 3afc1a1087b8b2f2f295997344263a249da07907 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Wed, 28 Feb 2024 22:05:18 +0100 Subject: [PATCH 08/16] feat(core) updated php version --- .devcontainer/Dockerfile => Dockerfile | 6 ++--- bin/console | 0 bin/phpunit | 0 composer.json | 2 +- config/bundles.php | 0 config/packages/cache.yaml | 0 config/packages/doctrine.yaml | 0 config/packages/doctrine_migrations.yaml | 0 config/packages/framework.yaml | 0 config/packages/routing.yaml | 0 config/packages/security.yaml | 0 config/packages/zenstruck_foundry.yaml | 0 config/preload.php | 0 config/routes.yaml | 0 config/routes/framework.yaml | 0 config/services.yaml | 0 .../devcontainer.json => devcontainer.json | 6 ++++- ...docker-compose.yaml => docker-compose.yaml | 26 +++++++++---------- 18 files changed, 21 insertions(+), 19 deletions(-) rename .devcontainer/Dockerfile => Dockerfile (77%) mode change 100755 => 100644 bin/console mode change 100755 => 100644 bin/phpunit mode change 100755 => 100644 config/bundles.php mode change 100755 => 100644 config/packages/cache.yaml mode change 100755 => 100644 config/packages/doctrine.yaml mode change 100755 => 100644 config/packages/doctrine_migrations.yaml mode change 100755 => 100644 config/packages/framework.yaml mode change 100755 => 100644 config/packages/routing.yaml mode change 100755 => 100644 config/packages/security.yaml mode change 100755 => 100644 config/packages/zenstruck_foundry.yaml mode change 100755 => 100644 config/preload.php mode change 100755 => 100644 config/routes.yaml mode change 100755 => 100644 config/routes/framework.yaml mode change 100755 => 100644 config/services.yaml rename .devcontainer/devcontainer.json => devcontainer.json (91%) rename .devcontainer/docker-compose.yaml => docker-compose.yaml (71%) diff --git a/.devcontainer/Dockerfile b/Dockerfile similarity index 77% rename from .devcontainer/Dockerfile rename to Dockerfile index b3b6f91..8403d7d 100644 --- a/.devcontainer/Dockerfile +++ b/Dockerfile @@ -29,9 +29,9 @@ RUN install-php-extensions zip COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer # Copy configuration files -COPY apache/vhosts.conf /etc/apache2/sites-available/000-default.conf -# COPY xdebug/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -# COPY xdebug/error_reporting.ini /usr/local/etc/php/conf.d/error_reporting.ini +COPY .devcontainer/apache/vhosts.conf /etc/apache2/sites-available/000-default.conf +# COPY .devcontainer/xdebug/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# COPY .devcontainer/xdebug/error_reporting.ini /usr/local/etc/php/conf.d/error_reporting.ini # Start apache CMD apachectl -D FOREGROUND diff --git a/bin/console b/bin/console old mode 100755 new mode 100644 diff --git a/bin/phpunit b/bin/phpunit old mode 100755 new mode 100644 diff --git a/composer.json b/composer.json index ee9a14d..af33ff0 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "minimum-stability": "stable", "prefer-stable": true, "require": { - "php": ">=8.1", + "php": ">=8.2", "ext-ctype": "*", "ext-iconv": "*", "doctrine/annotations": "^2.0", diff --git a/config/bundles.php b/config/bundles.php old mode 100755 new mode 100644 diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml old mode 100755 new mode 100644 diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml old mode 100755 new mode 100644 diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml old mode 100755 new mode 100644 diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml old mode 100755 new mode 100644 diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml old mode 100755 new mode 100644 diff --git a/config/packages/security.yaml b/config/packages/security.yaml old mode 100755 new mode 100644 diff --git a/config/packages/zenstruck_foundry.yaml b/config/packages/zenstruck_foundry.yaml old mode 100755 new mode 100644 diff --git a/config/preload.php b/config/preload.php old mode 100755 new mode 100644 diff --git a/config/routes.yaml b/config/routes.yaml old mode 100755 new mode 100644 diff --git a/config/routes/framework.yaml b/config/routes/framework.yaml old mode 100755 new mode 100644 diff --git a/config/services.yaml b/config/services.yaml old mode 100755 new mode 100644 diff --git a/.devcontainer/devcontainer.json b/devcontainer.json similarity index 91% rename from .devcontainer/devcontainer.json rename to devcontainer.json index bb28257..11a18ef 100644 --- a/.devcontainer/devcontainer.json +++ b/devcontainer.json @@ -1,6 +1,10 @@ { "name": "Flashcard API", - "forwardPorts": [8080, 8081, 8082], + "forwardPorts": [ + 8080, + 8081, + 8082 + ], "portsAttributes": { "8080": { "label": "Api" diff --git a/.devcontainer/docker-compose.yaml b/docker-compose.yaml similarity index 71% rename from .devcontainer/docker-compose.yaml rename to docker-compose.yaml index 0ae73b6..495c991 100644 --- a/.devcontainer/docker-compose.yaml +++ b/docker-compose.yaml @@ -6,7 +6,7 @@ services: container_name: flashcard-database image: mariadb ports: - - 3306:3306 # To access the database through the mysql extension in vscode + - "3306:3306" environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: flashcard @@ -17,20 +17,18 @@ services: networks: - dev - maildev: - image: maildev/maildev - container_name: flashcard-mail - command: bin/maildev --web 80 --smtp 25 --hide-extensions STARTTLS - ports: - - 8082:80 - networks: - - dev +# maildev: +# image: maildev/maildev +# container_name: flashcard-mail +# command: bin/maildev --web 80 --smtp 25 --hide-extensions STARTTLS +# ports: +# - "8082:80" +# networks: +# - dev phpmyadmin: image: phpmyadmin/phpmyadmin container_name: flashcard-phpmyadmin - links: - - database environment: PMA_HOST: database PMA_PORT: 3306 @@ -40,7 +38,7 @@ services: networks: - dev ports: - - 8081:80 + - "8081:80" api: container_name: flashcard-api @@ -50,9 +48,9 @@ services: args: - VARIANT=8.2.8-apache ports: - - 8080:80 + - "8080:80" volumes: - - ../:/var/www + - ./:/var/www networks: - dev depends_on: From 15271ec96ca60487c5cb3437078232470e483f6c Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Wed, 28 Feb 2024 22:07:02 +0100 Subject: [PATCH 09/16] feat(core) updated gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 94cf160..da3a72e 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ .phpunit.result.cache /phpunit.xml ###< symfony/phpunit-bridge ### + +.idea From 622c4ac60efb8e75ee4d3c8895ff5cfd5cacd30f Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Wed, 28 Feb 2024 22:10:49 +0100 Subject: [PATCH 10/16] feat(core) updated container --- {.devcontainer => .docker}/apache/vhosts.conf | 0 {.devcontainer => .docker}/xdebug/error_reporting.ini | 0 {.devcontainer => .docker}/xdebug/xdebug.ini | 0 Dockerfile | 6 +++--- devcontainer.json | 8 -------- 5 files changed, 3 insertions(+), 11 deletions(-) rename {.devcontainer => .docker}/apache/vhosts.conf (100%) rename {.devcontainer => .docker}/xdebug/error_reporting.ini (100%) rename {.devcontainer => .docker}/xdebug/xdebug.ini (100%) diff --git a/.devcontainer/apache/vhosts.conf b/.docker/apache/vhosts.conf similarity index 100% rename from .devcontainer/apache/vhosts.conf rename to .docker/apache/vhosts.conf diff --git a/.devcontainer/xdebug/error_reporting.ini b/.docker/xdebug/error_reporting.ini similarity index 100% rename from .devcontainer/xdebug/error_reporting.ini rename to .docker/xdebug/error_reporting.ini diff --git a/.devcontainer/xdebug/xdebug.ini b/.docker/xdebug/xdebug.ini similarity index 100% rename from .devcontainer/xdebug/xdebug.ini rename to .docker/xdebug/xdebug.ini diff --git a/Dockerfile b/Dockerfile index 8403d7d..eb1fe06 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,9 +29,9 @@ RUN install-php-extensions zip COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer # Copy configuration files -COPY .devcontainer/apache/vhosts.conf /etc/apache2/sites-available/000-default.conf -# COPY .devcontainer/xdebug/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -# COPY .devcontainer/xdebug/error_reporting.ini /usr/local/etc/php/conf.d/error_reporting.ini +COPY .docker/apache/vhosts.conf /etc/apache2/sites-available/000-default.conf +# COPY .docker/xdebug/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# COPY .docker/xdebug/error_reporting.ini /usr/local/etc/php/conf.d/error_reporting.ini # Start apache CMD apachectl -D FOREGROUND diff --git a/devcontainer.json b/devcontainer.json index 11a18ef..3cd86bd 100644 --- a/devcontainer.json +++ b/devcontainer.json @@ -20,14 +20,6 @@ "service": "api", "workspaceFolder": "/var/www", "postCreateCommand": "task app:default:config", - // "remoteUser": "vscode", - "customizations": { - "vscode": { - "settings": { - "php.executablePath": "/usr/local/bin/php" - } - } - }, "features": { "ghcr.io/devcontainers/features/github-cli:1": { "version": "latest" From 35966724da1a13d951a573673a6424d40eee26ab Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Wed, 28 Feb 2024 22:12:15 +0100 Subject: [PATCH 11/16] feat(core) renamed devcontainer.json --- devcontainer.json => .devcontainer | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename devcontainer.json => .devcontainer (100%) diff --git a/devcontainer.json b/.devcontainer similarity index 100% rename from devcontainer.json rename to .devcontainer From dafd0de3e3195a4743bedf4bcaa724a958c2ef0e Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Mon, 4 Mar 2024 23:35:45 +0100 Subject: [PATCH 12/16] feat(core) updated config --- .devcontainer | 28 --------- .docker/apache/vhosts.conf | 21 ------- .docker/xdebug/error_reporting.ini | 1 - .docker/xdebug/xdebug.ini | 6 -- .vscode/extensions.json | 23 ++------ .vscode/settings.json | 10 +++- Dockerfile | 37 ------------ bin/console | 0 bin/phpunit | 0 config/bundles.php | 28 ++++++--- config/packages/cache.yaml | 0 config/packages/doctrine.yaml | 0 config/packages/doctrine_migrations.yaml | 0 config/packages/framework.yaml | 0 config/packages/routing.yaml | 0 config/packages/security.yaml | 0 config/packages/zenstruck_foundry.yaml | 0 config/preload.php | 0 config/routes.yaml | 0 config/routes/framework.yaml | 0 config/services.yaml | 0 docker-compose.yaml | 63 --------------------- src/Controller/User/FlashcardController.php | 11 ++-- src/Controller/User/TopicController.php | 9 +-- src/Controller/User/UnitController.php | 7 ++- src/Enum/GradeType.php | 8 +-- 26 files changed, 51 insertions(+), 201 deletions(-) delete mode 100644 .devcontainer delete mode 100644 .docker/apache/vhosts.conf delete mode 100644 .docker/xdebug/error_reporting.ini delete mode 100644 .docker/xdebug/xdebug.ini delete mode 100644 Dockerfile mode change 100644 => 100755 bin/console mode change 100644 => 100755 bin/phpunit mode change 100644 => 100755 config/bundles.php mode change 100644 => 100755 config/packages/cache.yaml mode change 100644 => 100755 config/packages/doctrine.yaml mode change 100644 => 100755 config/packages/doctrine_migrations.yaml mode change 100644 => 100755 config/packages/framework.yaml mode change 100644 => 100755 config/packages/routing.yaml mode change 100644 => 100755 config/packages/security.yaml mode change 100644 => 100755 config/packages/zenstruck_foundry.yaml mode change 100644 => 100755 config/preload.php mode change 100644 => 100755 config/routes.yaml mode change 100644 => 100755 config/routes/framework.yaml mode change 100644 => 100755 config/services.yaml delete mode 100644 docker-compose.yaml diff --git a/.devcontainer b/.devcontainer deleted file mode 100644 index 3cd86bd..0000000 --- a/.devcontainer +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "Flashcard API", - "forwardPorts": [ - 8080, - 8081, - 8082 - ], - "portsAttributes": { - "8080": { - "label": "Api" - }, - "8081": { - "label": "PhpMyAdmin" - }, - "8082": { - "label": "Mailer" - } - }, - "dockerComposeFile": "docker-compose.yaml", - "service": "api", - "workspaceFolder": "/var/www", - "postCreateCommand": "task app:default:config", - "features": { - "ghcr.io/devcontainers/features/github-cli:1": { - "version": "latest" - } - } -} diff --git a/.docker/apache/vhosts.conf b/.docker/apache/vhosts.conf deleted file mode 100644 index 29d6d83..0000000 --- a/.docker/apache/vhosts.conf +++ /dev/null @@ -1,21 +0,0 @@ - - ServerName localhost - - DocumentRoot /var/www/public - DirectoryIndex /index.php - - # Add this line to enable passing authorization header - SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - - - AllowOverride None - Order Allow,Deny - Allow from All - - FallbackResource /index.php - - - ErrorLog /var/log/apache2/app.log - CustomLog /var/log/apache2/app.log combined - - diff --git a/.docker/xdebug/error_reporting.ini b/.docker/xdebug/error_reporting.ini deleted file mode 100644 index d040e65..0000000 --- a/.docker/xdebug/error_reporting.ini +++ /dev/null @@ -1 +0,0 @@ -error_reporting=E_ALL \ No newline at end of file diff --git a/.docker/xdebug/xdebug.ini b/.docker/xdebug/xdebug.ini deleted file mode 100644 index e29c8bd..0000000 --- a/.docker/xdebug/xdebug.ini +++ /dev/null @@ -1,6 +0,0 @@ -zend_extension=xdebug - -[xdebug] -xdebug.mode=develop,debug -xdebug.client_host=host.docker.internal -xdebug.start_with_request=yes \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index a1f1c9e..130f2d8 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,27 +1,16 @@ { "recommendations": [ - "devsense.phptools-vscode", - "aaron-bond.better-comments", // "hbenl.vscode-test-explorer", // "ms-vscode.test-adapter-converter", - "esbenp.prettier-vscode", // "recca0120.vscode-phpunit", + "esbenp.prettier-vscode", "MehediDracula.php-namespace-resolver", - // "bmewburn.vscode-intelephense-client", - // "neilbrayfield.php-docblocker", - // "junstyle.php-cs-fixer", - // "MykhailoKushnir.vscode-php-getter-setter", - // "christian-kohler.path-intellisense", - "formulahendry.vscode-mysql", - "PKief.material-icon-theme", - "Tyriar.lorem-ipsum", - "eamodio.gitlens", - "github.vscode-github-actions", - "miguelsolorio.fluent-icons", - "EditorConfig.EditorConfig", + "bmewburn.vscode-intelephense-client", + "neilbrayfield.php-docblocker", "mikestead.dotenv", - "adpyke.codesnap", "open-southeners.laravel-pint", - "Postman.postman-for-vscode" + "MehediDracula.php-namespace-resolver", + "mikestead.dotenv", + "EditorConfig.EditorConfig" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 9dccf14..338b74f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,12 @@ { - "php.version": "8.2", + "php.validate.executablePath": "/usr/local/bin/php", + "php.suggest.basic": false, "[php]": { "editor.formatOnSave": true, - "editor.defaultFormatter": "open-southeners.laravel-pint" + "editor.defaultFormatter": "DEVSENSE.phptools-vscode" }, - "php.highlight-todo.enable": false + "[yaml][json][jsonc]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index eb1fe06..0000000 --- a/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# Dockerfile arguments -ARG VARIANT=8.2.8-apache - -# Pull existing php image -FROM php:${VARIANT} - -# Install Taskfile -RUN sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin - -# Set the working dir -WORKDIR /var/www - -# Install php extension installer -ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ -RUN chmod +x /usr/local/bin/install-php-extensions - -# Install PCOV using Pecl -RUN pecl install pcov -RUN docker-php-ext-enable pcov - -# Install the actual php extensions -RUN install-php-extensions pdo_mysql -RUN install-php-extensions intl -RUN install-php-extensions opcache -RUN install-php-extensions zip -# RUN install-php-extensions xdebug - -# Retrieve the lastest version of composer -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer - -# Copy configuration files -COPY .docker/apache/vhosts.conf /etc/apache2/sites-available/000-default.conf -# COPY .docker/xdebug/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -# COPY .docker/xdebug/error_reporting.ini /usr/local/etc/php/conf.d/error_reporting.ini - -# Start apache -CMD apachectl -D FOREGROUND diff --git a/bin/console b/bin/console old mode 100644 new mode 100755 diff --git a/bin/phpunit b/bin/phpunit old mode 100644 new mode 100755 diff --git a/config/bundles.php b/config/bundles.php old mode 100644 new mode 100755 index eec0df5..23ce69f --- a/config/bundles.php +++ b/config/bundles.php @@ -1,13 +1,23 @@ ['all' => true], - Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], - Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], - Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], - Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Zenstruck\Foundry\ZenstruckFoundryBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], - Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], - Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true], + FrameworkBundle::class => ['all' => true], + DoctrineBundle::class => ['all' => true], + DoctrineMigrationsBundle::class => ['all' => true], + MakerBundle::class => ['dev' => true], + DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + ZenstruckFoundryBundle::class => ['dev' => true, 'test' => true], + SecurityBundle::class => ['all' => true], + MonologBundle::class => ['all' => true], + NelmioCorsBundle::class => ['all' => true], ]; diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml old mode 100644 new mode 100755 diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml old mode 100644 new mode 100755 diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml old mode 100644 new mode 100755 diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml old mode 100644 new mode 100755 diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml old mode 100644 new mode 100755 diff --git a/config/packages/security.yaml b/config/packages/security.yaml old mode 100644 new mode 100755 diff --git a/config/packages/zenstruck_foundry.yaml b/config/packages/zenstruck_foundry.yaml old mode 100644 new mode 100755 diff --git a/config/preload.php b/config/preload.php old mode 100644 new mode 100755 diff --git a/config/routes.yaml b/config/routes.yaml old mode 100644 new mode 100755 diff --git a/config/routes/framework.yaml b/config/routes/framework.yaml old mode 100644 new mode 100755 diff --git a/config/services.yaml b/config/services.yaml old mode 100644 new mode 100755 diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 495c991..0000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,63 +0,0 @@ -version: "3.8" - -services: - database: - command: --max-allowed-packet=64MB - container_name: flashcard-database - image: mariadb - ports: - - "3306:3306" - environment: - MYSQL_ROOT_PASSWORD: password - MYSQL_DATABASE: flashcard - MYSQL_USER: user - MYSQL_PASSWORD: password - volumes: - - data:/var/lib/mariadb - networks: - - dev - -# maildev: -# image: maildev/maildev -# container_name: flashcard-mail -# command: bin/maildev --web 80 --smtp 25 --hide-extensions STARTTLS -# ports: -# - "8082:80" -# networks: -# - dev - - phpmyadmin: - image: phpmyadmin/phpmyadmin - container_name: flashcard-phpmyadmin - environment: - PMA_HOST: database - PMA_PORT: 3306 - PMA_ARBITRARY: 1 - depends_on: - - database - networks: - - dev - ports: - - "8081:80" - - api: - container_name: flashcard-api - build: - context: . - dockerfile: Dockerfile - args: - - VARIANT=8.2.8-apache - ports: - - "8080:80" - volumes: - - ./:/var/www - networks: - - dev - depends_on: - - database - -volumes: - data: - -networks: - dev: diff --git a/src/Controller/User/FlashcardController.php b/src/Controller/User/FlashcardController.php index a531b59..6cb9e59 100644 --- a/src/Controller/User/FlashcardController.php +++ b/src/Controller/User/FlashcardController.php @@ -4,6 +4,7 @@ use DateTime; use Exception; +use App\Entity\User; use App\Utility\Regex; use App\Voter\UnitVoter; use App\Entity\Flashcard; @@ -33,7 +34,7 @@ public function getAllFlashcards(Request $request, FlashcardRepository $flashcar { $pagination = $this->getPaginationParameter(Flashcard::class, $request); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $flashcards = $flashcardRepository->findAllWithPagination( @@ -218,7 +219,7 @@ public function reviewFlashcard( $spacedRepetitionScheduler->review($flashcard, $data['grade']); $this->validateEntity($flashcard); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $review = $reviewManager->createReview($flashcard, $user, $data['grade']); @@ -235,7 +236,7 @@ public function resetAllFlashcards( ReviewManager $reviewManager ): JsonResponse { - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $reviewManager->resetAllFlashcards($user); @@ -251,7 +252,7 @@ public function resetFlashcard( $flashcard = $this->getResourceById(Flashcard::class, $id); $this->denyAccessUnlessGranted(FlashcardVoter::OWNER, $flashcard, 'You can not update this resource'); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $reviewManager->resetFlashcard($flashcard, $user); @@ -264,7 +265,7 @@ public function getFlashcardSession( ReviewManager $reviewManager, FlashcardRepository $flashcardRepository ): JsonResponse { - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $cardsToReview = $flashcardRepository->findFlashcardToReview($user, SpacedRepetitionScheduler::SESSION_SIZE); diff --git a/src/Controller/User/TopicController.php b/src/Controller/User/TopicController.php index 465bb99..36fe94d 100644 --- a/src/Controller/User/TopicController.php +++ b/src/Controller/User/TopicController.php @@ -4,6 +4,7 @@ use Exception; use App\Entity\Unit; +use App\Entity\User; use App\Entity\Topic; use App\Utility\Regex; use App\Voter\TopicVoter; @@ -30,7 +31,7 @@ public function getAllTopics(Request $request, TopicRepository $topicRepository) { $pagination = $this->getPaginationParameter(Topic::class, $request); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); // Get data with pagination @@ -75,7 +76,7 @@ public function createTopic( throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); // Temporarly create the element @@ -195,7 +196,7 @@ public function resetUnit( $topic = $this->getResourceById(Topic::class, $id); $this->denyAccessUnlessGranted(TopicVoter::OWNER, $topic, 'You can not update this resource'); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $reviewManager->resetFlashcards($topic, $user); @@ -210,7 +211,7 @@ public function getFlashcardSession( $topic = $this->getResourceById(Topic::class, $id); $this->denyAccessUnlessGranted(TopicVoter::OWNER, $topic, 'You can not update this resource'); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $cardsToReview = $flashcardRepository->findFlashcardToReviewBy($topic, $user, SpacedRepetitionScheduler::SESSION_SIZE); diff --git a/src/Controller/User/UnitController.php b/src/Controller/User/UnitController.php index d1a84b9..088aefc 100644 --- a/src/Controller/User/UnitController.php +++ b/src/Controller/User/UnitController.php @@ -4,6 +4,7 @@ use Exception; use App\Entity\Unit; +use App\Entity\User; use App\Utility\Regex; use App\Voter\UnitVoter; use App\Voter\TopicVoter; @@ -32,7 +33,7 @@ public function getAllUnits( $pagination = $this->getPaginationParameter(Unit::class, $request); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); // Get data with pagination @@ -200,7 +201,7 @@ public function resetUnit( $unit = $this->getResourceById(Unit::class, $id); $this->denyAccessUnlessGranted(UnitVoter::OWNER, $unit, 'You can not update this resource'); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $reviewManager->resetFlashcards($unit, $user); @@ -215,7 +216,7 @@ public function getFlashcardSession( $unit = $this->getResourceById(Unit::class, $id); $this->denyAccessUnlessGranted(UnitVoter::OWNER, $unit, 'You can not update this resource'); - /** @var \App\Entity\User $user */ + /** @var User $user */ $user = $this->getUser(); $cardsToReview = $flashcardRepository->findFlashcardToReviewBy($unit, $user, SpacedRepetitionScheduler::SESSION_SIZE); diff --git a/src/Enum/GradeType.php b/src/Enum/GradeType.php index 3b167cd..e3738a4 100644 --- a/src/Enum/GradeType.php +++ b/src/Enum/GradeType.php @@ -4,10 +4,10 @@ enum GradeType: int { - case AGAIN = 1; // Complete blackout - case HARD = 2; // Correct response recalled with serious difficulty - case GOOD = 3; // Correct response after a hesitation - case EASY = 4; // Perfect response + case AGAIN = 1; // Complete blackout + case HARD = 2; // Correct response recalled with serious difficulty + case GOOD = 3; // Correct response after a hesitation + case EASY = 4; // Perfect response public function isCorrect(): bool { From e9119f2e19f4977405079435bcf54e48e8ad2e86 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Tue, 5 Mar 2024 22:29:38 +0000 Subject: [PATCH 13/16] fix(core) Updated cs library from pint to php-cs-fixer --- .devcontainer/Dockerfile | 37 ++ .devcontainer/apache/vhosts.conf | 21 ++ .devcontainer/devcontainer.json | 32 ++ .devcontainer/docker-compose.yaml | 63 ++++ .devcontainer/xdebug/error_reporting.ini | 1 + .devcontainer/xdebug/xdebug.ini | 6 + .gitignore | 4 + .php-cs-fixer.php | 36 ++ .vscode/extensions.json | 4 +- .vscode/settings.json | 3 +- composer.json | 6 +- composer.lock | 316 ++++++++++++++++-- pint.json | 29 -- src/Controller/AbstractRestController.php | 6 +- .../Admin/FlashcardAdminController.php | 8 +- src/Controller/Admin/TopicAdminController.php | 8 +- src/Controller/Admin/UnitAdminController.php | 8 +- src/Controller/Admin/UserAdminController.php | 8 +- src/Controller/User/FlashcardController.php | 19 +- src/Controller/User/SecurityController.php | 3 +- src/Controller/User/TopicController.php | 8 +- src/Controller/User/UnitController.php | 9 +- src/Entity/Flashcard.php | 30 +- src/Entity/Review.php | 7 +- src/Entity/Topic.php | 15 +- src/Entity/Unit.php | 15 +- src/Entity/User.php | 17 +- src/EventListener/ExceptionListener.php | 4 +- src/Model/Paginator.php | 5 +- src/Repository/FlashcardRepository.php | 5 +- src/Repository/ReviewRepository.php | 2 +- src/Repository/UserRepository.php | 2 +- src/Service/ObjectFactory.php | 13 +- src/Service/SortableEntityChecker.php | 13 +- src/Service/SpacedRepetitionScheduler.php | 7 +- src/Voter/FlashcardVoter.php | 6 +- src/Voter/TopicVoter.php | 6 +- src/Voter/UnitVoter.php | 6 +- symfony.lock | 12 + .../Controller/AbstractRestControllerTest.php | 3 +- tests/Entity/FlashcardTest.php | 5 +- tests/Entity/TopicTest.php | 5 +- tests/Entity/UnitTest.php | 5 +- tests/Entity/UserTest.php | 5 +- tests/Service/EntityCheckerTest.php | 8 +- 45 files changed, 600 insertions(+), 231 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/apache/vhosts.conf create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yaml create mode 100644 .devcontainer/xdebug/error_reporting.ini create mode 100644 .devcontainer/xdebug/xdebug.ini create mode 100644 .php-cs-fixer.php delete mode 100644 pint.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..b3b6f91 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,37 @@ +# Dockerfile arguments +ARG VARIANT=8.2.8-apache + +# Pull existing php image +FROM php:${VARIANT} + +# Install Taskfile +RUN sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin + +# Set the working dir +WORKDIR /var/www + +# Install php extension installer +ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ +RUN chmod +x /usr/local/bin/install-php-extensions + +# Install PCOV using Pecl +RUN pecl install pcov +RUN docker-php-ext-enable pcov + +# Install the actual php extensions +RUN install-php-extensions pdo_mysql +RUN install-php-extensions intl +RUN install-php-extensions opcache +RUN install-php-extensions zip +# RUN install-php-extensions xdebug + +# Retrieve the lastest version of composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +# Copy configuration files +COPY apache/vhosts.conf /etc/apache2/sites-available/000-default.conf +# COPY xdebug/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# COPY xdebug/error_reporting.ini /usr/local/etc/php/conf.d/error_reporting.ini + +# Start apache +CMD apachectl -D FOREGROUND diff --git a/.devcontainer/apache/vhosts.conf b/.devcontainer/apache/vhosts.conf new file mode 100644 index 0000000..29d6d83 --- /dev/null +++ b/.devcontainer/apache/vhosts.conf @@ -0,0 +1,21 @@ + + ServerName localhost + + DocumentRoot /var/www/public + DirectoryIndex /index.php + + # Add this line to enable passing authorization header + SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 + + + AllowOverride None + Order Allow,Deny + Allow from All + + FallbackResource /index.php + + + ErrorLog /var/log/apache2/app.log + CustomLog /var/log/apache2/app.log combined + + diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..aba7052 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,32 @@ +{ + "name": "Flashcard API", + "forwardPorts": [8080, 8081, 8082], + "portsAttributes": { + "8080": { + "label": "Api" + }, + "8081": { + "label": "PhpMyAdmin" + }, + "8082": { + "label": "Mailer" + } + }, + "dockerComposeFile": "docker-compose.yaml", + "service": "api", + "workspaceFolder": "/var/www", + "postCreateCommand": "task app:default:config", + // "remoteUser": "vscode", + // "customizations": { + // "vscode": { + // "settings": { + // "php.executablePath": "/usr/local/bin/php" + // } + // } + // }, + "features": { + "ghcr.io/devcontainers/features/github-cli:1": { + "version": "latest" + } + } +} diff --git a/.devcontainer/docker-compose.yaml b/.devcontainer/docker-compose.yaml new file mode 100644 index 0000000..6edc011 --- /dev/null +++ b/.devcontainer/docker-compose.yaml @@ -0,0 +1,63 @@ +version: "3.8" + +services: + database: + command: --max-allowed-packet=64MB + container_name: flashcard-database + image: mariadb + ports: + - 3306:3306 # To access the database through the mysql extension in vscode + environment: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: flashcard + MYSQL_USER: user + MYSQL_PASSWORD: password + volumes: + - data:/var/lib/mariadb + networks: + - dev + + maildev: + image: maildev/maildev + container_name: flashcard-mail + command: bin/maildev --web 80 --smtp 25 --hide-extensions STARTTLS + ports: + - 8082:80 + networks: + - dev + + phpmyadmin: + image: phpmyadmin/phpmyadmin + container_name: flashcard-phpmyadmin + environment: + PMA_HOST: database + PMA_PORT: 3306 + PMA_ARBITRARY: 1 + depends_on: + - database + networks: + - dev + ports: + - 8081:80 + + api: + container_name: flashcard-api + build: + context: . + dockerfile: Dockerfile + args: + - VARIANT=8.2.8-apache + ports: + - 8080:80 + volumes: + - ../:/var/www + networks: + - dev + depends_on: + - database + +volumes: + data: + +networks: + dev: diff --git a/.devcontainer/xdebug/error_reporting.ini b/.devcontainer/xdebug/error_reporting.ini new file mode 100644 index 0000000..d040e65 --- /dev/null +++ b/.devcontainer/xdebug/error_reporting.ini @@ -0,0 +1 @@ +error_reporting=E_ALL \ No newline at end of file diff --git a/.devcontainer/xdebug/xdebug.ini b/.devcontainer/xdebug/xdebug.ini new file mode 100644 index 0000000..e29c8bd --- /dev/null +++ b/.devcontainer/xdebug/xdebug.ini @@ -0,0 +1,6 @@ +zend_extension=xdebug + +[xdebug] +xdebug.mode=develop,debug +xdebug.client_host=host.docker.internal +xdebug.start_with_request=yes \ No newline at end of file diff --git a/.gitignore b/.gitignore index da3a72e..1e1ac56 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,7 @@ ###< symfony/phpunit-bridge ### .idea + +###> friendsofphp/php-cs-fixer ### +/.php-cs-fixer.cache +###< friendsofphp/php-cs-fixer ### diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 0000000..0318003 --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,36 @@ +in(__DIR__) + ->exclude('var') + ->exclude('vendor') +; + +return (new PhpCsFixer\Config()) + ->setRules([ + '@Symfony:risky' => true, + 'concat_space' => [ + 'spacing' => 'one', + ], + 'ordered_imports' => [ + 'sort_algorithm' => 'length', + 'imports_order' => [ + 'const', + 'class', + 'function', + ], + ], + 'single_trait_insert_per_statement' => true, + 'fully_qualified_strict_types' => true, + 'phpdoc_align' => [ + 'align' => 'left', + ], + "final_class" => true, + 'ordered_interfaces' => [ + 'order' => 'alpha', + 'direction' => 'ascend', + ], + 'yoda_style' => false, + ]) + ->setFinder($finder) +; diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 130f2d8..47f0e9f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -8,9 +8,9 @@ "bmewburn.vscode-intelephense-client", "neilbrayfield.php-docblocker", "mikestead.dotenv", - "open-southeners.laravel-pint", "MehediDracula.php-namespace-resolver", "mikestead.dotenv", - "EditorConfig.EditorConfig" + "EditorConfig.EditorConfig", + "junstyle.php-cs-fixer" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 338b74f..13c9fb4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,10 @@ { "php.validate.executablePath": "/usr/local/bin/php", "php.suggest.basic": false, + "php-cs-fixer.allowRisky": false, "[php]": { "editor.formatOnSave": true, - "editor.defaultFormatter": "DEVSENSE.phptools-vscode" + "editor.defaultFormatter": "junstyle.php-cs-fixer" }, "[yaml][json][jsonc]": { "editor.formatOnSave": true, diff --git a/composer.json b/composer.json index af33ff0..ac5794e 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.4", - "laravel/pint": "^1.12", + "friendsofphp/php-cs-fixer": "^3.51", "pestphp/pest": "^1.23", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5", @@ -83,8 +83,8 @@ "post-update-cmd": [ "@auto-scripts" ], - "cs:fix": "./vendor/bin/pint", - "cs:check": "@cs:fix --test", + "cs:fix": "./vendor/bin/php-cs-fixer fix", + "cs:check": "@cs:fix --dry-run", "stan": "@stan:default --ansi --error-format=table", "stan:default": "vendor/bin/phpstan analyse -c phpstan.neon --memory-limit 500M", "stan:github": "@stan:default --error-format=github --quiet", diff --git a/composer.lock b/composer.lock index 418ab1f..190168e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "61a0a26ebdb7c204b353ab9fc269be13", + "content-hash": "373250010a994bd92abe6049c1ed17b0", "packages": [ { "name": "doctrine/annotations", @@ -6124,6 +6124,224 @@ } ], "packages-dev": [ + { + "name": "composer/pcre", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-10-11T07:11:09+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, { "name": "doctrine/data-fixtures", "version": "1.7.0", @@ -6435,44 +6653,62 @@ "time": "2023-11-03T12:00:00+00:00" }, { - "name": "laravel/pint", - "version": "v1.13.9", + "name": "friendsofphp/php-cs-fixer", + "version": "v3.51.0", "source": { "type": "git", - "url": "https://github.com/laravel/pint.git", - "reference": "e3e269cc5d874c8efd2dc7962b1c7ff2585fe525" + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/e3e269cc5d874c8efd2dc7962b1c7ff2585fe525", - "reference": "e3e269cc5d874c8efd2dc7962b1c7ff2585fe525", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd", "shasum": "" }, "require": { + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", "ext-json": "*", - "ext-mbstring": "*", "ext-tokenizer": "*", - "ext-xml": "*", - "php": "^8.1.0" + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.47.0", - "illuminate/view": "^10.40.0", - "larastan/larastan": "^2.8.1", - "laravel-zero/framework": "^10.3.0", - "mockery/mockery": "^1.6.7", - "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.31.0" + "facile-it/paraunit": "^1.3 || ^2.0", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", + "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." }, "bin": [ - "builds/pint" + "php-cs-fixer" ], - "type": "project", + "type": "application", "autoload": { "psr-4": { - "App\\": "app/", - "Database\\Seeders\\": "database/seeders/", - "Database\\Factories\\": "database/factories/" + "PhpCsFixer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6481,24 +6717,32 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz RumiÅ„ski", + "email": "dariusz.ruminski@gmail.com" } ], - "description": "An opinionated code formatter for PHP.", - "homepage": "https://laravel.com", + "description": "A tool to automatically fix PHP code style", "keywords": [ - "format", - "formatter", - "lint", - "linter", - "php" + "Static code analysis", + "fixer", + "standards", + "static analysis" ], "support": { - "issues": "https://github.com/laravel/pint/issues", - "source": "https://github.com/laravel/pint" + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0" }, - "time": "2024-01-16T17:39:29+00:00" + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-02-28T19:50:06+00:00" }, { "name": "masterminds/html5", @@ -9192,10 +9436,10 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.1", + "php": ">=8.2", "ext-ctype": "*", "ext-iconv": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/pint.json b/pint.json deleted file mode 100644 index ff67c5a..0000000 --- a/pint.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "preset": "laravel", - "exclude": [ - "var", - "vendor" - ], - "rules": { - "concat_space": { - "spacing": "one" - }, - "ordered_imports": { - "sort_algorithm": "length", - "imports_order": [ - "const", - "class", - "function" - ] - }, - "single_trait_insert_per_statement": true, - "fully_qualified_strict_types": true, - "phpdoc_align": { - "align": "left" - }, - "ordered_interfaces": { - "order": "alpha", - "direction": "ascend" - } - } -} diff --git a/src/Controller/AbstractRestController.php b/src/Controller/AbstractRestController.php index cb1e0bb..5d161d6 100644 --- a/src/Controller/AbstractRestController.php +++ b/src/Controller/AbstractRestController.php @@ -2,7 +2,6 @@ namespace App\Controller; -use Exception; use App\Model\Page; use App\Service\ObjectFactory; use App\Exception\ApiException; @@ -39,14 +38,14 @@ public function getPaginationParameter(string $classname, Request $request): Pag ->configureSort($sortableFields) ->configureOrder() ->resolve($request->query->all()); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } try { /** @var Page $page */ $page = ObjectFactory::create(Page::class, $queryParams); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_INTERNAL_SERVER_ERROR, 'An error occured'); } @@ -66,6 +65,7 @@ public function validateEntity(mixed $entity, array $validationGroups = ['Defaul * @template T * * @param class-string $classname + * * @return T */ public function getResourceById(string $classname, int $id): mixed diff --git a/src/Controller/Admin/FlashcardAdminController.php b/src/Controller/Admin/FlashcardAdminController.php index 9d0f0c0..fe2ff0a 100644 --- a/src/Controller/Admin/FlashcardAdminController.php +++ b/src/Controller/Admin/FlashcardAdminController.php @@ -2,7 +2,6 @@ namespace App\Controller\Admin; -use Exception; use App\Utility\Regex; use App\Entity\Flashcard; use App\Exception\ApiException; @@ -24,7 +23,6 @@ public function getAllFlashcards( Request $request, FlashcardRepository $flashcardRepository ): JsonResponse { - $pagination = $this->getPaginationParameter(Flashcard::class, $request); $flashcards = $flashcardRepository->findAllWithPagination( @@ -57,7 +55,6 @@ public function createFlashcard( FlashcardOptionsResolver $flashcardOptionsResolver, RequestPayloadService $requestPayloadService ): JsonResponse { - try { // Retrieve the request body $body = $requestPayloadService->getRequestPayload($request); @@ -69,7 +66,7 @@ public function createFlashcard( ->configureDetails(true) ->configureUnit(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -125,7 +122,6 @@ public function updateFlashcard( Request $request, FlashcardOptionsResolver $flashcardOptionsResolver ): JsonResponse { - // Retrieve the flashcard by id $flashcard = $flashcardRepository->find($id); @@ -149,7 +145,7 @@ public function updateFlashcard( ->configureDetails($mandatoryParameters) ->configureUnit($mandatoryParameters) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } diff --git a/src/Controller/Admin/TopicAdminController.php b/src/Controller/Admin/TopicAdminController.php index 758b3ad..ff22e7d 100644 --- a/src/Controller/Admin/TopicAdminController.php +++ b/src/Controller/Admin/TopicAdminController.php @@ -2,7 +2,6 @@ namespace App\Controller\Admin; -use Exception; use App\Entity\Topic; use App\Utility\Regex; use App\Exception\ApiException; @@ -24,7 +23,6 @@ public function getAllTopics( Request $request, TopicRepository $topicRepository ): JsonResponse { - $pagination = $this->getPaginationParameter(Topic::class, $request); // Get data with pagination @@ -59,7 +57,6 @@ public function createTopic( TopicOptionsResolver $topicOptionsResolver, RequestPayloadService $requestPayloadService ): JsonResponse { - try { // Retrieve the request body $body = $requestPayloadService->getRequestPayload($request); @@ -69,7 +66,7 @@ public function createTopic( ->configureName(true) ->configureAuthor(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -123,7 +120,6 @@ public function updateTopic( Request $request, TopicOptionsResolver $flashcardOptionsResolver, ): JsonResponse { - // Retrieve the element by id $topic = $topicRepository->find($id); @@ -145,7 +141,7 @@ public function updateTopic( ->configureName($mandatoryParameters) ->configureAuthor($mandatoryParameters) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } diff --git a/src/Controller/Admin/UnitAdminController.php b/src/Controller/Admin/UnitAdminController.php index ac6c040..0336882 100644 --- a/src/Controller/Admin/UnitAdminController.php +++ b/src/Controller/Admin/UnitAdminController.php @@ -2,7 +2,6 @@ namespace App\Controller\Admin; -use Exception; use App\Entity\Unit; use App\Utility\Regex; use App\Exception\ApiException; @@ -24,7 +23,6 @@ public function getAllUnits( Request $request, UnitRepository $unitRepository ): JsonResponse { - $pagination = $this->getPaginationParameter(Unit::class, $request); // Get data with pagination @@ -59,7 +57,6 @@ public function createUnit( UnitOptionsResolver $unitOptionsResolver, RequestPayloadService $requestPayloadService ): JsonResponse { - try { // Retrieve the request body $body = $requestPayloadService->getRequestPayload($request); @@ -69,7 +66,7 @@ public function createUnit( ->configureName(true) ->configureTopic(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -123,7 +120,6 @@ public function updateUnit( Request $request, UnitOptionsResolver $unitOptionsResolver, ): JsonResponse { - // Retrieve the element by id $unit = $unitRepository->find($id); @@ -145,7 +141,7 @@ public function updateUnit( ->configureName($mandatoryParameters) ->configureTopic($mandatoryParameters) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } diff --git a/src/Controller/Admin/UserAdminController.php b/src/Controller/Admin/UserAdminController.php index 59928c1..3f678c1 100644 --- a/src/Controller/Admin/UserAdminController.php +++ b/src/Controller/Admin/UserAdminController.php @@ -2,7 +2,6 @@ namespace App\Controller\Admin; -use Exception; use App\Entity\User; use App\Utility\Regex; use App\Exception\ApiException; @@ -27,7 +26,6 @@ public function getAllUsers( Request $request, UserRepository $userRepository ): JsonResponse { - $pagination = $this->getPaginationParameter(User::class, $request); // Get data with pagination @@ -65,7 +63,6 @@ public function createUser( RequestPayloadService $requestPayloadService, TokenGenerator $tokenGenerator ): JsonResponse { - try { // Retrieve the request body $body = $requestPayloadService->getRequestPayload($request); @@ -77,7 +74,7 @@ public function createUser( ->configurePassword(true) ->configureRoles(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -137,7 +134,6 @@ public function updateUser( UserOptionsResolver $userOptionsResolver, UserPasswordHasherInterface $passwordHasher ): JsonResponse { - // Retrieve the user by id $user = $userRepository->find($id); @@ -161,7 +157,7 @@ public function updateUser( ->configurePassword($mandatoryParameters) ->configureRoles($mandatoryParameters) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } diff --git a/src/Controller/User/FlashcardController.php b/src/Controller/User/FlashcardController.php index 6cb9e59..855fed9 100644 --- a/src/Controller/User/FlashcardController.php +++ b/src/Controller/User/FlashcardController.php @@ -2,8 +2,6 @@ namespace App\Controller\User; -use DateTime; -use Exception; use App\Entity\User; use App\Utility\Regex; use App\Voter\UnitVoter; @@ -64,7 +62,6 @@ public function createFlashcard( FlashcardOptionsResolver $flashcardOptionsResolver, RequestPayloadService $requestPayloadService ): JsonResponse { - try { // Retrieve the request body $body = $requestPayloadService->getRequestPayload($request); @@ -76,7 +73,7 @@ public function createFlashcard( ->configureDetails(true) ->configureUnit(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -130,7 +127,6 @@ public function updateFlashcard( Request $request, FlashcardOptionsResolver $flashcardOptionsResolver ): JsonResponse { - $flashcard = $this->getResourceById(Flashcard::class, $id); $this->denyAccessUnlessGranted(FlashcardVoter::OWNER, $flashcard, 'You can not update this resource'); @@ -150,7 +146,7 @@ public function updateFlashcard( ->configureDetails($mandatoryParameters) ->configureUnit($mandatoryParameters) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -194,16 +190,12 @@ public function reviewFlashcard( SpacedRepetitionScheduler $spacedRepetitionScheduler, ReviewManager $reviewManager ): JsonResponse { - $flashcard = $this->getResourceById(Flashcard::class, $id); $this->denyAccessUnlessGranted(FlashcardVoter::OWNER, $flashcard, 'You can not update this resource'); // If the next review is in the future - if ($flashcard->getNextReview() > (new DateTime)) { - throw new ApiException(Response::HTTP_BAD_REQUEST, 'You can not review the flashcard with id %d yet. The next review is scheduled for %s', [ - $flashcard->getId(), - $flashcard->getNextReview()->format('jS \of F Y'), - ]); + if ($flashcard->getNextReview() > (new \DateTime())) { + throw new ApiException(Response::HTTP_BAD_REQUEST, 'You can not review the flashcard with id %d yet. The next review is scheduled for %s', [$flashcard->getId(), $flashcard->getNextReview()->format('jS \of F Y')]); } try { @@ -212,7 +204,7 @@ public function reviewFlashcard( $data = $spacedRepetitionOptionsResolver ->configureGrade() ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -235,7 +227,6 @@ public function reviewFlashcard( public function resetAllFlashcards( ReviewManager $reviewManager ): JsonResponse { - /** @var User $user */ $user = $this->getUser(); $reviewManager->resetAllFlashcards($user); diff --git a/src/Controller/User/SecurityController.php b/src/Controller/User/SecurityController.php index f5e38db..24fca74 100644 --- a/src/Controller/User/SecurityController.php +++ b/src/Controller/User/SecurityController.php @@ -2,7 +2,6 @@ namespace App\Controller\User; -use Exception; use App\Entity\User; use App\Exception\ApiException; use App\Service\TokenGenerator; @@ -52,7 +51,7 @@ public function register( ->configureEmail(true) ->configurePassword(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } diff --git a/src/Controller/User/TopicController.php b/src/Controller/User/TopicController.php index 36fe94d..dfb1270 100644 --- a/src/Controller/User/TopicController.php +++ b/src/Controller/User/TopicController.php @@ -2,7 +2,6 @@ namespace App\Controller\User; -use Exception; use App\Entity\Unit; use App\Entity\User; use App\Entity\Topic; @@ -63,7 +62,6 @@ public function createTopic( TopicOptionsResolver $topicOptionsResolver, RequestPayloadService $requestPayloadService ): JsonResponse { - try { // Retrieve the request body $body = $requestPayloadService->getRequestPayload($request); @@ -72,7 +70,7 @@ public function createTopic( $data = $topicOptionsResolver ->configureName(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -125,7 +123,6 @@ public function updateTopic( Request $request, TopicOptionsResolver $flashcardOptionsResolver, ): JsonResponse { - $topic = $this->getResourceById(Topic::class, $id); $this->denyAccessUnlessGranted(TopicVoter::OWNER, $topic, 'You can not update this resource'); @@ -142,7 +139,7 @@ public function updateTopic( $data = $flashcardOptionsResolver ->configureName($mandatoryParameters) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -192,7 +189,6 @@ public function resetUnit( EntityManagerInterface $em, ReviewManager $reviewManager ): JsonResponse { - $topic = $this->getResourceById(Topic::class, $id); $this->denyAccessUnlessGranted(TopicVoter::OWNER, $topic, 'You can not update this resource'); diff --git a/src/Controller/User/UnitController.php b/src/Controller/User/UnitController.php index 088aefc..882eb9a 100644 --- a/src/Controller/User/UnitController.php +++ b/src/Controller/User/UnitController.php @@ -2,7 +2,6 @@ namespace App\Controller\User; -use Exception; use App\Entity\Unit; use App\Entity\User; use App\Utility\Regex; @@ -30,7 +29,6 @@ public function getAllUnits( Request $request, UnitRepository $unitRepository ): JsonResponse { - $pagination = $this->getPaginationParameter(Unit::class, $request); /** @var User $user */ @@ -65,7 +63,6 @@ public function createUnit( UnitOptionsResolver $unitOptionsResolver, RequestPayloadService $requestPayloadService ): JsonResponse { - try { // Retrieve the request body $body = $requestPayloadService->getRequestPayload($request); @@ -75,7 +72,7 @@ public function createUnit( ->configureName(true) ->configureTopic(true) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -127,7 +124,6 @@ public function updateUnit( Request $request, UnitOptionsResolver $unitOptionsResolver, ): JsonResponse { - $unit = $this->getResourceById(Unit::class, $id); $this->denyAccessUnlessGranted(UnitVoter::OWNER, $unit, 'You can not update this resource'); @@ -145,7 +141,7 @@ public function updateUnit( ->configureName($mandatoryParameters) ->configureTopic($mandatoryParameters) ->resolve($body); - } catch (Exception $e) { + } catch (\Exception $e) { throw new ApiException(Response::HTTP_BAD_REQUEST, $e->getMessage()); } @@ -197,7 +193,6 @@ public function resetUnit( int $id, ReviewManager $reviewManager ): JsonResponse { - $unit = $this->getResourceById(Unit::class, $id); $this->denyAccessUnlessGranted(UnitVoter::OWNER, $unit, 'You can not update this resource'); diff --git a/src/Entity/Flashcard.php b/src/Entity/Flashcard.php index 895053b..6584f0e 100644 --- a/src/Entity/Flashcard.php +++ b/src/Entity/Flashcard.php @@ -2,8 +2,6 @@ namespace App\Entity; -use DateTime; -use DateTimeImmutable; use App\Enum\StateType; use App\Attribut\Sortable; use Doctrine\DBAL\Types\Types; @@ -28,12 +26,12 @@ class Flashcard #[ORM\Column] #[Groups(['read:flashcard:admin', 'read:flashcard:user'])] #[Sortable] - private ?DateTimeImmutable $createdAt = null; + private ?\DateTimeImmutable $createdAt = null; #[ORM\Column] #[Groups(['read:flashcard:admin', 'read:flashcard:user'])] #[Sortable] - private ?DateTimeImmutable $updatedAt = null; + private ?\DateTimeImmutable $updatedAt = null; #[ORM\Column(length: 255)] #[Assert\NotBlank(message: 'The front side of a flashcard can not be blank')] @@ -54,11 +52,11 @@ class Flashcard #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] #[Groups(['read:flashcard:admin', 'read:flashcard:user'])] - private ?DateTime $nextReview = null; + private ?\DateTime $nextReview = null; #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] #[Groups(['read:flashcard:admin', 'read:flashcard:user'])] - private ?DateTime $previousReview = null; + private ?\DateTime $previousReview = null; #[ORM\Column(type: Types::INTEGER, enumType: StateType::class)] #[Groups(['read:flashcard:admin', 'read:flashcard:user'])] @@ -96,7 +94,7 @@ public function getId(): ?int return $this->id; } - public function getCreatedAt(): ?DateTimeImmutable + public function getCreatedAt(): ?\DateTimeImmutable { return $this->createdAt; } @@ -104,12 +102,12 @@ public function getCreatedAt(): ?DateTimeImmutable #[ORM\PrePersist] public function setCreatedAt(): static { - $this->createdAt = new DateTimeImmutable(); + $this->createdAt = new \DateTimeImmutable(); return $this; } - public function getUpdatedAt(): ?DateTimeImmutable + public function getUpdatedAt(): ?\DateTimeImmutable { return $this->updatedAt; } @@ -118,7 +116,7 @@ public function getUpdatedAt(): ?DateTimeImmutable #[ORM\PreUpdate] public function setUpdatedAt(): static { - $this->updatedAt = new DateTimeImmutable(); + $this->updatedAt = new \DateTimeImmutable(); return $this; } @@ -159,24 +157,24 @@ public function setDetails(?string $details): static return $this; } - public function getNextReview(): ?DateTime + public function getNextReview(): ?\DateTime { return $this->nextReview; } - public function setNextReview(?DateTime $nextReview): static + public function setNextReview(?\DateTime $nextReview): static { $this->nextReview = $nextReview; return $this; } - public function getPreviousReview(): ?DateTime + public function getPreviousReview(): ?\DateTime { return $this->previousReview; } - public function setPreviousReview(?DateTime $previousReview): static + public function setPreviousReview(?\DateTime $previousReview): static { $this->previousReview = $previousReview; @@ -185,7 +183,7 @@ public function setPreviousReview(?DateTime $previousReview): static public function refreshPreviousReview(): static { - $this->previousReview = new DateTime; + $this->previousReview = new \DateTime(); return $this; } @@ -248,7 +246,7 @@ public function getReviewHistory(): Collection public function addReviewHistory(Review $reviewHistory): static { - if (! $this->reviewHistory->contains($reviewHistory)) { + if (!$this->reviewHistory->contains($reviewHistory)) { $this->reviewHistory->add($reviewHistory); $reviewHistory->setFlashcard($this); } diff --git a/src/Entity/Review.php b/src/Entity/Review.php index 1782361..092575c 100644 --- a/src/Entity/Review.php +++ b/src/Entity/Review.php @@ -2,7 +2,6 @@ namespace App\Entity; -use DateTimeImmutable; use App\Enum\GradeType; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; @@ -27,7 +26,7 @@ class Review private ?User $user = null; #[ORM\Column] - private ?DateTimeImmutable $date = null; + private ?\DateTimeImmutable $date = null; #[ORM\Column(type: Types::INTEGER, enumType: GradeType::class)] #[Assert\NotBlank(message: 'The grade of a review can not be blank')] @@ -65,7 +64,7 @@ public function setUser(?User $user): static return $this; } - public function getDate(): ?DateTimeImmutable + public function getDate(): ?\DateTimeImmutable { return $this->date; } @@ -73,7 +72,7 @@ public function getDate(): ?DateTimeImmutable #[ORM\PrePersist] public function setDate(): static { - $this->date = new DateTimeImmutable('now'); + $this->date = new \DateTimeImmutable('now'); return $this; } diff --git a/src/Entity/Topic.php b/src/Entity/Topic.php index 85d44d5..b60a12e 100644 --- a/src/Entity/Topic.php +++ b/src/Entity/Topic.php @@ -2,7 +2,6 @@ namespace App\Entity; -use DateTimeImmutable; use App\Attribut\Sortable; use Doctrine\ORM\Mapping as ORM; use App\Repository\TopicRepository; @@ -32,12 +31,12 @@ class Topic #[ORM\Column] #[Groups(['read:topic:admin', 'read:topic:user', 'read:unit:admin', 'read:unit:user'])] #[Sortable] - private ?DateTimeImmutable $createdAt = null; + private ?\DateTimeImmutable $createdAt = null; #[ORM\Column] #[Groups(['read:topic:admin', 'read:topic:user', 'read:unit:admin', 'read:unit:user'])] #[Sortable] - private ?DateTimeImmutable $updatedAt = null; + private ?\DateTimeImmutable $updatedAt = null; #[ORM\ManyToOne(inversedBy: 'topics')] #[Assert\NotBlank(message: 'You must associate a user to this topic')] @@ -69,7 +68,7 @@ public function setName(string $name): static return $this; } - public function getCreatedAt(): ?DateTimeImmutable + public function getCreatedAt(): ?\DateTimeImmutable { return $this->createdAt; } @@ -77,12 +76,12 @@ public function getCreatedAt(): ?DateTimeImmutable #[ORM\PrePersist] public function setCreatedAt(): static { - $this->createdAt = new DateTimeImmutable(); + $this->createdAt = new \DateTimeImmutable(); return $this; } - public function getUpdatedAt(): ?DateTimeImmutable + public function getUpdatedAt(): ?\DateTimeImmutable { return $this->updatedAt; } @@ -91,7 +90,7 @@ public function getUpdatedAt(): ?DateTimeImmutable #[ORM\PreUpdate] public function setUpdatedAt(): static { - $this->updatedAt = new DateTimeImmutable(); + $this->updatedAt = new \DateTimeImmutable(); return $this; } @@ -118,7 +117,7 @@ public function getUnits(): Collection public function addUnit(Unit $unit): static { - if (! $this->units->contains($unit)) { + if (!$this->units->contains($unit)) { $this->units->add($unit); $unit->setTopic($this); } diff --git a/src/Entity/Unit.php b/src/Entity/Unit.php index 9b31033..d2bf773 100644 --- a/src/Entity/Unit.php +++ b/src/Entity/Unit.php @@ -2,7 +2,6 @@ namespace App\Entity; -use DateTimeImmutable; use App\Attribut\Sortable; use Doctrine\ORM\Mapping as ORM; use App\Repository\UnitRepository; @@ -32,12 +31,12 @@ class Unit #[ORM\Column] #[Groups(['read:unit:admin', 'read:unit:user', 'read:flashcard:admin', 'read:flashcard:user'])] #[Sortable] - private ?DateTimeImmutable $createdAt = null; + private ?\DateTimeImmutable $createdAt = null; #[ORM\Column] #[Groups(['read:unit:admin', 'read:unit:user', 'read:flashcard:admin', 'read:flashcard:user'])] #[Sortable] - private ?DateTimeImmutable $updatedAt = null; + private ?\DateTimeImmutable $updatedAt = null; #[ORM\ManyToOne(inversedBy: 'units')] #[Assert\NotBlank(message: 'You must associate a topic to this unit')] @@ -69,7 +68,7 @@ public function setName(string $name): static return $this; } - public function getCreatedAt(): ?DateTimeImmutable + public function getCreatedAt(): ?\DateTimeImmutable { return $this->createdAt; } @@ -77,12 +76,12 @@ public function getCreatedAt(): ?DateTimeImmutable #[ORM\PrePersist] public function setCreatedAt(): static { - $this->createdAt = new DateTimeImmutable(); + $this->createdAt = new \DateTimeImmutable(); return $this; } - public function getUpdatedAt(): ?DateTimeImmutable + public function getUpdatedAt(): ?\DateTimeImmutable { return $this->updatedAt; } @@ -91,7 +90,7 @@ public function getUpdatedAt(): ?DateTimeImmutable #[ORM\PreUpdate] public function setUpdatedAt(): static { - $this->updatedAt = new DateTimeImmutable(); + $this->updatedAt = new \DateTimeImmutable(); return $this; } @@ -118,7 +117,7 @@ public function getFlashcards(): Collection public function addFlashcard(Flashcard $flashcard): static { - if (! $this->flashcards->contains($flashcard)) { + if (!$this->flashcards->contains($flashcard)) { $this->flashcards->add($flashcard); $flashcard->setUnit($this); } diff --git a/src/Entity/User.php b/src/Entity/User.php index 08345f5..5d53bd3 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -3,7 +3,6 @@ namespace App\Entity; use App\Utility\Regex; -use DateTimeImmutable; use App\Attribut\Sortable; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; @@ -55,12 +54,12 @@ class User implements PasswordAuthenticatedUserInterface, UserInterface #[ORM\Column] #[Groups(['read:user:admin', 'read:user:user', 'read:topic:admin'])] #[Sortable] - private ?DateTimeImmutable $createdAt = null; + private ?\DateTimeImmutable $createdAt = null; #[ORM\Column] #[Groups(['read:user:admin', 'read:user:user', 'read:topic:admin'])] #[Sortable] - private ?DateTimeImmutable $updatedAt = null; + private ?\DateTimeImmutable $updatedAt = null; #[ORM\Column(type: Types::JSON)] #[Groups(['read:user:user', 'read:user:admin'])] @@ -140,7 +139,7 @@ public function getUserIdentifier(): string return (string) $this->username; } - public function getCreatedAt(): ?DateTimeImmutable + public function getCreatedAt(): ?\DateTimeImmutable { return $this->createdAt; } @@ -148,12 +147,12 @@ public function getCreatedAt(): ?DateTimeImmutable #[ORM\PrePersist] public function setCreatedAt(): static { - $this->createdAt = new DateTimeImmutable(); + $this->createdAt = new \DateTimeImmutable(); return $this; } - public function getUpdatedAt(): ?DateTimeImmutable + public function getUpdatedAt(): ?\DateTimeImmutable { return $this->updatedAt; } @@ -162,7 +161,7 @@ public function getUpdatedAt(): ?DateTimeImmutable #[ORM\PreUpdate] public function setUpdatedAt(): static { - $this->updatedAt = new DateTimeImmutable(); + $this->updatedAt = new \DateTimeImmutable(); return $this; } @@ -240,7 +239,7 @@ public function getTopics(): Collection public function addTopic(Topic $topic): static { - if (! $this->topics->contains($topic)) { + if (!$this->topics->contains($topic)) { $this->topics->add($topic); $topic->setAuthor($this); } @@ -270,7 +269,7 @@ public function getReviewHistory(): Collection public function addReviewHistory(Review $reviewHistory): static { - if (! $this->reviewHistory->contains($reviewHistory)) { + if (!$this->reviewHistory->contains($reviewHistory)) { $this->reviewHistory->add($reviewHistory); $reviewHistory->setUser($this); } diff --git a/src/EventListener/ExceptionListener.php b/src/EventListener/ExceptionListener.php index b92d4ee..bba4bf8 100644 --- a/src/EventListener/ExceptionListener.php +++ b/src/EventListener/ExceptionListener.php @@ -2,8 +2,6 @@ namespace App\EventListener; -use DateTime; -use DateTimeZone; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Event\ExceptionEvent; @@ -21,7 +19,7 @@ public function __invoke(ExceptionEvent $event): void $statusCode = $exception instanceof HttpExceptionInterface ? $exception->getStatusCode() : Response::HTTP_INTERNAL_SERVER_ERROR; $format = [ - 'timestamp' => (new DateTime('now', new DateTimeZone('UTC')))->format(DateTime::ATOM), + 'timestamp' => (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTime::ATOM), 'status' => $statusCode, // 'code' => $exception->getCode(), 'message' => Response::$statusTexts[$statusCode], diff --git a/src/Model/Paginator.php b/src/Model/Paginator.php index c434ef7..ddcdbf4 100644 --- a/src/Model/Paginator.php +++ b/src/Model/Paginator.php @@ -2,7 +2,6 @@ namespace App\Model; -use ArrayIterator; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator; @@ -88,9 +87,9 @@ public function hasPreviousPage(): bool return false; } - public function getIterator(): ArrayIterator + public function getIterator(): \ArrayIterator { - return new ArrayIterator([ + return new \ArrayIterator([ 'data' => $this->getData(), 'pagination' => [ 'total' => $this->getTotal(), diff --git a/src/Repository/FlashcardRepository.php b/src/Repository/FlashcardRepository.php index fae2e15..8a8fcce 100644 --- a/src/Repository/FlashcardRepository.php +++ b/src/Repository/FlashcardRepository.php @@ -2,7 +2,6 @@ namespace App\Repository; -use DateTime; use App\Entity\Unit; use App\Entity\User; use App\Entity\Topic; @@ -132,7 +131,7 @@ public function findFlashcardToReview(User $user, int $cardsToReview) ->orderBy('f.nextReview', 'ASC') ->setMaxResults($cardsToReview) ->setParameter('user', $user) - ->setParameter('today', new DateTime()) + ->setParameter('today', new \DateTime()) ->getQuery() ->getResult(); @@ -156,7 +155,7 @@ public function findFlashcardToReviewBy(Unit|Topic $reviewBy, User $user, int $c $qb->orderBy('f.nextReview', 'ASC') ->setMaxResults($cardsToReview) ->setParameter('user', $user) - ->setParameter('today', (new DateTime())->format('Y-m-d')) + ->setParameter('today', (new \DateTime())->format('Y-m-d')) ->setParameter('reviewBy', $reviewBy); return $qb->getQuery()->getResult(); diff --git a/src/Repository/ReviewRepository.php b/src/Repository/ReviewRepository.php index 86c1971..09c908a 100644 --- a/src/Repository/ReviewRepository.php +++ b/src/Repository/ReviewRepository.php @@ -73,7 +73,7 @@ public function countReviews(User $user, bool $withReset = false) ->where('r.user = :user') ->setParameter('user', $user); - if (! $withReset) { + if (!$withReset) { $query ->andWhere('r.reset = :withReset') ->setParameter('withReset', false); diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index 0fe7fe8..f02de27 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -31,7 +31,7 @@ public function __construct(ManagerRegistry $registry) */ public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void { - if (! $user instanceof User) { + if (!$user instanceof User) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', $user::class)); } diff --git a/src/Service/ObjectFactory.php b/src/Service/ObjectFactory.php index f806bf1..8e10ab3 100644 --- a/src/Service/ObjectFactory.php +++ b/src/Service/ObjectFactory.php @@ -2,30 +2,25 @@ namespace App\Service; -use ReflectionClass; -use InvalidArgumentException; - class ObjectFactory { /** * @template T * - * @param class-string $className - * @param int $id * @return T */ public static function create(string $fqcn, array $constructorArgs = []): object { - if (! class_exists($fqcn)) { - throw new InvalidArgumentException("Class $fqcn doesn't exist"); + if (!class_exists($fqcn)) { + throw new \InvalidArgumentException("Class $fqcn doesn't exist"); } - $reflectionClass = new ReflectionClass($fqcn); + $reflectionClass = new \ReflectionClass($fqcn); $instance = $reflectionClass->newInstanceArgs($constructorArgs); if ($instance === null) { - throw new InvalidArgumentException("Error while creating the $fqcn object"); + throw new \InvalidArgumentException("Error while creating the $fqcn object"); } return $instance; diff --git a/src/Service/SortableEntityChecker.php b/src/Service/SortableEntityChecker.php index 9fd3d3e..06eb85b 100644 --- a/src/Service/SortableEntityChecker.php +++ b/src/Service/SortableEntityChecker.php @@ -3,18 +3,17 @@ namespace App\Service; use App\Attribut\Sortable; -use InvalidArgumentException; class SortableEntityChecker { public function isFieldSortable(string $classname, string $field): bool { - if (! class_exists($classname)) { - throw new InvalidArgumentException("Unknown class $classname"); + if (!class_exists($classname)) { + throw new \InvalidArgumentException("Unknown class $classname"); } - if (! property_exists($classname, $field)) { - throw new InvalidArgumentException("Field $field doesn't exist in entity $classname"); + if (!property_exists($classname, $field)) { + throw new \InvalidArgumentException("Field $field doesn't exist in entity $classname"); } $reflectionClass = new \ReflectionClass($classname); @@ -28,8 +27,8 @@ public function isFieldSortable(string $classname, string $field): bool public function getSortableFields(string $classname): array { - if (! class_exists($classname)) { - throw new InvalidArgumentException("Unknown class $classname"); + if (!class_exists($classname)) { + throw new \InvalidArgumentException("Unknown class $classname"); } $sortableFields = []; diff --git a/src/Service/SpacedRepetitionScheduler.php b/src/Service/SpacedRepetitionScheduler.php index 8dedd15..2ec23cf 100644 --- a/src/Service/SpacedRepetitionScheduler.php +++ b/src/Service/SpacedRepetitionScheduler.php @@ -2,7 +2,6 @@ namespace App\Service; -use DateTime; use App\Enum\GradeType; use App\Enum\StateType; use App\Utility\Random; @@ -20,7 +19,7 @@ class SpacedRepetitionScheduler public function review(Flashcard &$flashcard, GradeType $grade): void { - if ($flashcard->getNextReview() > (new DateTime)) { + if ($flashcard->getNextReview() > (new \DateTime())) { return; } @@ -33,7 +32,7 @@ public function review(Flashcard &$flashcard, GradeType $grade): void } $interval = $this->nextInterval($flashcard); - $flashcard->setNextReview((new DateTime)->modify("+$interval days")->setTime(0, 0, 0)); + $flashcard->setNextReview((new \DateTime())->modify("+$interval days")->setTime(0, 0, 0)); $flashcard->refreshPreviousReview(); $flashcard->setState(StateType::Learning); } @@ -62,7 +61,7 @@ private function nextDifficulty(Flashcard $flashcard, GradeType $grade): float private function getRetrievability(Flashcard $flashcard): float { - $elapsedDays = (int) $flashcard->getPreviousReview()->diff(new DateTime)->format('%a'); + $elapsedDays = (int) $flashcard->getPreviousReview()->diff(new \DateTime())->format('%a'); return pow(1 + ($elapsedDays / (9 * $flashcard->getStability())), -1); } diff --git a/src/Voter/FlashcardVoter.php b/src/Voter/FlashcardVoter.php index 6207d4f..ef12938 100644 --- a/src/Voter/FlashcardVoter.php +++ b/src/Voter/FlashcardVoter.php @@ -13,11 +13,11 @@ class FlashcardVoter extends Voter protected function supports(string $attribute, mixed $subject): bool { - if (! in_array($attribute, [self::OWNER])) { + if (!in_array($attribute, [self::OWNER])) { return false; } - if (! $subject instanceof Flashcard) { + if (!$subject instanceof Flashcard) { return false; } @@ -29,7 +29,7 @@ protected function voteOnAttribute(string $attribute, mixed $subject, TokenInter $user = $token->getUser(); // the user must be logged in; if not, deny access - if (! $user instanceof User) { + if (!$user instanceof User) { return false; } diff --git a/src/Voter/TopicVoter.php b/src/Voter/TopicVoter.php index 2e3d560..bb8e116 100644 --- a/src/Voter/TopicVoter.php +++ b/src/Voter/TopicVoter.php @@ -13,11 +13,11 @@ class TopicVoter extends Voter protected function supports(string $attribute, mixed $subject): bool { - if (! in_array($attribute, [self::OWNER])) { + if (!in_array($attribute, [self::OWNER])) { return false; } - if (! $subject instanceof Topic) { + if (!$subject instanceof Topic) { return false; } @@ -29,7 +29,7 @@ protected function voteOnAttribute(string $attribute, mixed $subject, TokenInter $user = $token->getUser(); // the user must be logged in; if not, deny access - if (! $user instanceof User) { + if (!$user instanceof User) { return false; } diff --git a/src/Voter/UnitVoter.php b/src/Voter/UnitVoter.php index 8c23315..0303603 100644 --- a/src/Voter/UnitVoter.php +++ b/src/Voter/UnitVoter.php @@ -13,11 +13,11 @@ class UnitVoter extends Voter protected function supports(string $attribute, mixed $subject): bool { - if (! in_array($attribute, [self::OWNER])) { + if (!in_array($attribute, [self::OWNER])) { return false; } - if (! $subject instanceof Unit) { + if (!$subject instanceof Unit) { return false; } @@ -29,7 +29,7 @@ protected function voteOnAttribute(string $attribute, mixed $subject, TokenInter $user = $token->getUser(); // the user must be logged in; if not, deny access - if (! $user instanceof User) { + if (!$user instanceof User) { return false; } diff --git a/symfony.lock b/symfony.lock index c6a11cd..6d777e0 100644 --- a/symfony.lock +++ b/symfony.lock @@ -47,6 +47,18 @@ "migrations/.gitignore" ] }, + "friendsofphp/php-cs-fixer": { + "version": "3.51", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.0", + "ref": "be2103eb4a20942e28a6dd87736669b757132435" + }, + "files": [ + ".php-cs-fixer.dist.php" + ] + }, "nelmio/cors-bundle": { "version": "2.3", "recipe": { diff --git a/tests/Controller/AbstractRestControllerTest.php b/tests/Controller/AbstractRestControllerTest.php index ddd3072..482a5b4 100644 --- a/tests/Controller/AbstractRestControllerTest.php +++ b/tests/Controller/AbstractRestControllerTest.php @@ -2,7 +2,6 @@ namespace App\Tests\Controller; -use Exception; use App\Model\Page; use App\Attribut\Sortable; use App\Exception\ApiException; @@ -75,7 +74,7 @@ public function testValidateEntityWithValidationGroup() try { $abstractController->validateEntity($entity, ['special_group']); $this->assertTrue(true); - } catch (Exception $e) { + } catch (\Exception $e) { $this->fail($e); } } diff --git a/tests/Entity/FlashcardTest.php b/tests/Entity/FlashcardTest.php index 1aff98f..1f6689e 100644 --- a/tests/Entity/FlashcardTest.php +++ b/tests/Entity/FlashcardTest.php @@ -3,7 +3,6 @@ namespace App\Tests\Entity; use App\Entity\Topic; -use DateTimeImmutable; use App\Entity\Flashcard; use Doctrine\ORM\EntityManager; use App\Repository\UnitRepository; @@ -50,7 +49,7 @@ public function testCreatedAt() { $flashcard = new Flashcard(); $this->em->persist($flashcard); - $this->assertInstanceOf(DateTimeImmutable::class, $flashcard->getCreatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $flashcard->getCreatedAt()); $this->em->detach($flashcard); } @@ -58,7 +57,7 @@ public function testUpdatedAt() { $flashcard = new Flashcard(); $this->em->persist($flashcard); - $this->assertInstanceOf(DateTimeImmutable::class, $flashcard->getUpdatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $flashcard->getUpdatedAt()); $this->em->detach($flashcard); } diff --git a/tests/Entity/TopicTest.php b/tests/Entity/TopicTest.php index 6f7b989..1b404c3 100644 --- a/tests/Entity/TopicTest.php +++ b/tests/Entity/TopicTest.php @@ -5,7 +5,6 @@ use App\Entity\Unit; use App\Entity\User; use App\Entity\Topic; -use DateTimeImmutable; use Doctrine\ORM\EntityManager; use App\Repository\UnitRepository; use App\Repository\UserRepository; @@ -70,7 +69,7 @@ public function testCreatedAt() { $topic = new Topic(); $this->em->persist($topic); - $this->assertInstanceOf(DateTimeImmutable::class, $topic->getCreatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $topic->getCreatedAt()); $this->em->detach($topic); } @@ -78,7 +77,7 @@ public function testUpdatedAt() { $topic = new Topic(); $this->em->persist($topic); - $this->assertInstanceOf(DateTimeImmutable::class, $topic->getUpdatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $topic->getUpdatedAt()); $this->em->detach($topic); } diff --git a/tests/Entity/UnitTest.php b/tests/Entity/UnitTest.php index 4d5eeec..2e2d3ed 100644 --- a/tests/Entity/UnitTest.php +++ b/tests/Entity/UnitTest.php @@ -4,7 +4,6 @@ use App\Entity\Unit; use App\Entity\Topic; -use DateTimeImmutable; use App\Entity\Flashcard; use Doctrine\ORM\EntityManager; use App\Repository\UnitRepository; @@ -70,7 +69,7 @@ public function testCreatedAt() { $unit = new Unit(); $this->em->persist($unit); - $this->assertInstanceOf(DateTimeImmutable::class, $unit->getCreatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $unit->getCreatedAt()); $this->em->detach($unit); } @@ -78,7 +77,7 @@ public function testUpdatedAt() { $unit = new Unit(); $this->em->persist($unit); - $this->assertInstanceOf(DateTimeImmutable::class, $unit->getUpdatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $unit->getUpdatedAt()); $this->em->detach($unit); } diff --git a/tests/Entity/UserTest.php b/tests/Entity/UserTest.php index b6e3a7b..0173b87 100644 --- a/tests/Entity/UserTest.php +++ b/tests/Entity/UserTest.php @@ -4,7 +4,6 @@ use App\Entity\User; use App\Entity\Topic; -use DateTimeImmutable; use Doctrine\ORM\EntityManager; use App\Repository\UserRepository; use App\Repository\TopicRepository; @@ -140,7 +139,7 @@ public function testCreatedAt() { $user = new User(); $this->em->persist($user); - $this->assertInstanceOf(DateTimeImmutable::class, $user->getCreatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $user->getCreatedAt()); $this->em->detach($user); } @@ -148,7 +147,7 @@ public function testUpdatedAt() { $user = new User(); $this->em->persist($user); - $this->assertInstanceOf(DateTimeImmutable::class, $user->getUpdatedAt()); + $this->assertInstanceOf(\DateTimeImmutable::class, $user->getUpdatedAt()); $this->em->detach($user); } diff --git a/tests/Service/EntityCheckerTest.php b/tests/Service/EntityCheckerTest.php index bea838f..dd3d010 100644 --- a/tests/Service/EntityCheckerTest.php +++ b/tests/Service/EntityCheckerTest.php @@ -2,9 +2,7 @@ namespace App\Tests\Service; -use Exception; use App\Attribut\Sortable; -use InvalidArgumentException; use App\Service\SortableEntityChecker; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; @@ -32,7 +30,7 @@ public function testIsFieldSortableWithUnknownClass() /** @var SortableEntityChecker $service */ $checker = self::getContainer()->get(SortableEntityChecker::class); - $this->expectException(Exception::class); + $this->expectException(\Exception::class); $checker->isFieldSortable('UnknownClass', 'sortable'); } @@ -42,7 +40,7 @@ public function testIsFieldSortableWithUnknownField() /** @var SortableEntityChecker $service */ $checker = self::getContainer()->get(SortableEntityChecker::class); - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $checker->isFieldSortable(__Foo__::class, 'unknownField'); } @@ -60,7 +58,7 @@ public function testGetSortableFieldsWithUnknownClass() /** @var SortableEntityChecker $service */ $checker = self::getContainer()->get(SortableEntityChecker::class); - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $checker->getSortableFields('UnknownClass'); } } From d0f08e52e9bc15fc68faa2eaed5a1ad5ef8662d8 Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Wed, 13 Mar 2024 18:46:18 +0100 Subject: [PATCH 14/16] fix(core) Updated cs config --- .php-cs-fixer.php | 83 ++++++++++++------- config/bundles.php | 12 +-- config/preload.php | 2 + public/index.php | 2 + src/Attribut/Sortable.php | 6 +- src/Controller/AbstractRestController.php | 10 ++- .../Admin/FlashcardAdminController.php | 12 +-- src/Controller/Admin/TopicAdminController.php | 10 ++- src/Controller/Admin/UnitAdminController.php | 10 ++- src/Controller/Admin/UserAdminController.php | 14 ++-- src/Controller/User/FlashcardController.php | 28 ++++--- src/Controller/User/ReviewController.php | 4 +- src/Controller/User/SecurityController.php | 12 +-- src/Controller/User/TopicController.php | 22 ++--- src/Controller/User/UnitController.php | 20 +++-- src/Controller/User/UserController.php | 4 +- src/DataFixtures/FlashcardFixtures.php | 8 +- src/DataFixtures/TopicFixtures.php | 8 +- src/DataFixtures/UnitFixtures.php | 8 +- src/DataFixtures/UserFixtures.php | 8 +- src/Entity/Flashcard.php | 24 +++--- src/Entity/Review.php | 4 +- src/Entity/Topic.php | 6 +- src/Entity/Unit.php | 6 +- src/Entity/User.php | 16 ++-- src/Enum/GradeType.php | 2 + src/Enum/StateType.php | 2 + src/EventListener/ExceptionListener.php | 8 +- src/Exception/ApiException.php | 2 + src/Exception/JsonException.php | 2 + src/Factory/FlashcardFactory.php | 6 +- src/Factory/TopicFactory.php | 4 +- src/Factory/UnitFactory.php | 4 +- src/Factory/UserFactory.php | 10 ++- src/Kernel.php | 4 +- src/Logger/ExtraLogProcessor.php | 2 + src/Model/Page.php | 2 + src/Model/Paginator.php | 4 +- .../FlashcardOptionsResolver.php | 6 +- .../PaginatorOptionsResolver.php | 6 +- .../SpacedRepetitionOptionsResolver.php | 2 + src/OptionsResolver/TopicOptionsResolver.php | 6 +- src/OptionsResolver/UnitOptionsResolver.php | 6 +- src/OptionsResolver/UserOptionsResolver.php | 2 + src/Repository/FlashcardRepository.php | 16 ++-- src/Repository/ReviewRepository.php | 12 +-- src/Repository/TopicRepository.php | 8 +- src/Repository/UnitRepository.php | 10 ++- src/Repository/UserRepository.php | 10 ++- src/Security/AuthenticationFailureHandler.php | 4 +- src/Security/TokenAuthenticator.php | 6 +- src/Service/EntityValidator.php | 4 +- src/Service/ObjectFactory.php | 6 +- src/Service/RequestPayloadService.php | 4 +- src/Service/ReviewManager.php | 16 ++-- src/Service/SortableEntityChecker.php | 12 +-- src/Service/SpacedRepetitionScheduler.php | 20 +++-- src/Service/TokenGenerator.php | 2 + src/Utility/Random.php | 2 + src/Utility/Regex.php | 6 +- src/Voter/FlashcardVoter.php | 8 +- src/Voter/TopicVoter.php | 8 +- src/Voter/UnitVoter.php | 6 +- .../Controller/AbstractRestControllerTest.php | 12 +-- .../User/SecurityControllerTest.php | 12 +-- tests/Controller/User/UserControllerTest.php | 8 +- tests/Entity/FlashcardTest.php | 26 +++--- tests/Entity/TopicTest.php | 26 +++--- tests/Entity/UnitTest.php | 30 +++---- tests/Entity/UserTest.php | 42 +++++----- tests/Logger/ExtraLogProcessorTest.php | 10 ++- tests/Model/PaginationTest.php | 12 +-- .../FlashcardOptionsResolverTest.php | 14 ++-- .../PaginationOptionsResolverTest.php | 28 ++++--- .../TopicOptionsResolverTest.php | 8 +- .../UnitOptionsResolverTest.php | 8 +- .../UserOptionsResolverTest.php | 10 ++- tests/Pest.php | 2 + tests/Repository/FlashcardRepositoryTest.php | 2 + tests/Repository/TopicRepositoryTest.php | 4 +- tests/Repository/UnitRepositoryTest.php | 2 + tests/Repository/UserRepositoryTest.php | 4 +- tests/Service/EntityCheckerTest.php | 12 +-- tests/Service/RequestPayloadServiceTest.php | 10 ++- tests/Utility/RegexTest.php | 8 +- tests/bootstrap.php | 2 + 86 files changed, 532 insertions(+), 339 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 0318003..7adde74 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -1,36 +1,61 @@ in(__DIR__) - ->exclude('var') - ->exclude('vendor') -; +declare(strict_types=1); return (new PhpCsFixer\Config()) + ->setRiskyAllowed(true) + ->setFinder(PhpCsFixer\Finder::create() + ->in(__DIR__) + ->exclude('var') + ->exclude('vendor')) ->setRules([ '@Symfony:risky' => true, - 'concat_space' => [ - 'spacing' => 'one', - ], - 'ordered_imports' => [ - 'sort_algorithm' => 'length', - 'imports_order' => [ - 'const', - 'class', - 'function', - ], - ], - 'single_trait_insert_per_statement' => true, - 'fully_qualified_strict_types' => true, - 'phpdoc_align' => [ - 'align' => 'left', - ], - "final_class" => true, - 'ordered_interfaces' => [ - 'order' => 'alpha', - 'direction' => 'ascend', - ], + '@Symfony' => true, + // Each element of an array must be indented exactly once. + 'array_indentation' => true, + // PHP attributes declared without arguments must (not) be followed by empty parentheses. + 'attribute_empty_parentheses' => true, + // Converts FQCN strings to `*::class` keywords. + 'class_keyword' => true, + // Using `isset($var) &&` multiple times should be done in one call. + 'combine_consecutive_issets' => true, + // Calling `unset` on multiple items should be done in one call. + 'combine_consecutive_unsets' => true, + // Concatenation should be spaced according to configuration. + 'concat_space' => ['spacing' => 'one'], + // Class `DateTimeImmutable` should be used instead of `DateTime`. + 'date_time_immutable' => true, + // Force strict types declaration in all files. Requires PHP >= 7.0. + 'declare_strict_types' => true, + // Escape implicit backslashes in strings and heredocs to ease the understanding of which are special chars interpreted by PHP and which not. + 'escape_implicit_backslashes' => true, + // Converts implicit variables into explicit ones in double-quoted strings or heredoc syntax. + 'explicit_string_variable' => true, + // List (`array` destructuring) assignment should be declared using the configured syntax. Requires PHP >= 7.1. + 'list_syntax' => true, + // Replace non multibyte-safe functions with corresponding mb function. + 'mb_str_functions' => true, + // Method chaining MUST be properly indented. Method chaining with different levels of indentation is not supported. + 'method_chaining_indentation' => true, + // Forbid multi-line whitespace before the closing semicolon or move the semicolon to the new line for chained calls. + 'multiline_whitespace_before_semicolons' => true, + // There should not be useless `else` cases. + 'no_useless_else' => true, + // There should not be an empty `return` statement at the end of a function. + 'no_useless_return' => true, + // Orders the interfaces in an `implements` or `interface extends` clause. + // All items of the given PHPDoc tags must be either left-aligned or (by default) aligned vertically. + 'phpdoc_align' => ['align' => 'left'], + // Inside an enum or `final`/anonymous class, `self` should be preferred over `static`. + 'self_static_accessor' => true, + // A return statement wishing to return `void` should not return `null`. + 'simplified_null_return' => true, + // Handles implicit backslashes in strings and heredocs. Depending on the chosen strategy, it can escape implicit backslashes to ease the understanding of which are special chars interpreted by PHP and which not (`escape`), or it can remove these additional backslashes if you find them superfluous (`unescape`). You can also leave them as-is using `ignore` strategy. + 'string_implicit_backslashes' => ['single_quoted' => 'escape'], + // Use `null` coalescing operator `??` where possible. Requires PHP >= 7.0. + 'ternary_to_null_coalescing' => true, + // Add `void` return type to functions with missing or empty return statements, but priority is given to `@return` annotations. Requires PHP >= 7.1. + 'void_return' => true, + // Write conditions in Yoda style (true), non-Yoda style (['equal' => false, 'identical' => false, 'less_and_greater' => false]) or ignore those conditions (null) based on configuration. 'yoda_style' => false, - ]) - ->setFinder($finder) -; + ]); diff --git a/config/bundles.php b/config/bundles.php index 23ce69f..f9fbcc3 100755 --- a/config/bundles.php +++ b/config/bundles.php @@ -1,14 +1,16 @@ ['all' => true], diff --git a/config/preload.php b/config/preload.php index db37723..69de615 100755 --- a/config/preload.php +++ b/config/preload.php @@ -1,5 +1,7 @@ denyAccessUnlessGranted(FlashcardVoter::OWNER, $flashcard, 'You can not update this resource'); // If the next review is in the future - if ($flashcard->getNextReview() > (new \DateTime())) { - throw new ApiException(Response::HTTP_BAD_REQUEST, 'You can not review the flashcard with id %d yet. The next review is scheduled for %s', [$flashcard->getId(), $flashcard->getNextReview()->format('jS \of F Y')]); + if ($flashcard->getNextReview() > (new \DateTimeImmutable())) { + throw new ApiException(Response::HTTP_BAD_REQUEST, 'You can not review the flashcard with id %d yet. The next review is scheduled for %s', [$flashcard->getId(), $flashcard->getNextReview()->format('jS \\of F Y')]); } try { diff --git a/src/Controller/User/ReviewController.php b/src/Controller/User/ReviewController.php index d0284ba..3f98bfc 100644 --- a/src/Controller/User/ReviewController.php +++ b/src/Controller/User/ReviewController.php @@ -1,10 +1,12 @@ 'admin', 'roles' => ['ROLE_ADMIN']]); UserFactory::createOne(['username' => 'user']); UserFactory::createOne(['username' => 'test']); diff --git a/src/Entity/Flashcard.php b/src/Entity/Flashcard.php index 6584f0e..1493d2e 100644 --- a/src/Entity/Flashcard.php +++ b/src/Entity/Flashcard.php @@ -1,14 +1,16 @@ nextReview; } - public function setNextReview(?\DateTime $nextReview): static + public function setNextReview(?\DateTimeImmutable $nextReview): static { $this->nextReview = $nextReview; return $this; } - public function getPreviousReview(): ?\DateTime + public function getPreviousReview(): ?\DateTimeImmutable { return $this->previousReview; } - public function setPreviousReview(?\DateTime $previousReview): static + public function setPreviousReview(?\DateTimeImmutable $previousReview): static { $this->previousReview = $previousReview; @@ -183,7 +185,7 @@ public function setPreviousReview(?\DateTime $previousReview): static public function refreshPreviousReview(): static { - $this->previousReview = new \DateTime(); + $this->previousReview = new \DateTimeImmutable(); return $this; } diff --git a/src/Entity/Review.php b/src/Entity/Review.php index 092575c..ba93247 100644 --- a/src/Entity/Review.php +++ b/src/Entity/Review.php @@ -1,11 +1,13 @@ getStatusCode() : Response::HTTP_INTERNAL_SERVER_ERROR; $format = [ - 'timestamp' => (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTime::ATOM), + 'timestamp' => (new \DateTimeImmutable('now', new \DateTimeZone('UTC')))->format(\DateTime::ATOM), 'status' => $statusCode, // 'code' => $exception->getCode(), 'message' => Response::$statusTexts[$statusCode], diff --git a/src/Exception/ApiException.php b/src/Exception/ApiException.php index a123cc5..a452d09 100644 --- a/src/Exception/ApiException.php +++ b/src/Exception/ApiException.php @@ -1,5 +1,7 @@ diff --git a/src/Factory/TopicFactory.php b/src/Factory/TopicFactory.php index 2ced1d3..2f6e4e7 100644 --- a/src/Factory/TopicFactory.php +++ b/src/Factory/TopicFactory.php @@ -1,11 +1,13 @@ @@ -79,7 +81,7 @@ protected function getDefaults(): array protected function initialize(): self { return $this - ->afterInstantiate(function (User $user) { + ->afterInstantiate(function (User $user): void { $user->setPassword($this->passwordHasher->hashPassword($user, $user->getPassword())); }); } diff --git a/src/Kernel.php b/src/Kernel.php index b0df0e3..ad0fb48 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -1,9 +1,11 @@ total = $this->count(); $this->data = iterator_to_array(parent::getIterator()); - $this->count = count($this->data); + $this->count = \count($this->data); $this->page = $page; $this->totalpages = (int) ceil($this->total / self::ITEMS_PER_PAGE); diff --git a/src/OptionsResolver/FlashcardOptionsResolver.php b/src/OptionsResolver/FlashcardOptionsResolver.php index f524257..7a47dd7 100644 --- a/src/OptionsResolver/FlashcardOptionsResolver.php +++ b/src/OptionsResolver/FlashcardOptionsResolver.php @@ -1,11 +1,13 @@ unitRepository->find($value); if ($unit === null) { - throw new InvalidOptionsException("Unit with id $value was not found"); + throw new InvalidOptionsException("Unit with id {$value} was not found"); } return $unit; diff --git a/src/OptionsResolver/PaginatorOptionsResolver.php b/src/OptionsResolver/PaginatorOptionsResolver.php index 575c40e..8a5f4d7 100644 --- a/src/OptionsResolver/PaginatorOptionsResolver.php +++ b/src/OptionsResolver/PaginatorOptionsResolver.php @@ -1,5 +1,7 @@ setDefault('page', 1) ->setAllowedTypes('page', 'numeric') ->setAllowedValues('page', function ($page) { - $validatedValue = filter_var($page, FILTER_VALIDATE_INT, [ - 'flags' => FILTER_NULL_ON_FAILURE, + $validatedValue = filter_var($page, \FILTER_VALIDATE_INT, [ + 'flags' => \FILTER_NULL_ON_FAILURE, ]); if ($validatedValue === null || $validatedValue < 1) { diff --git a/src/OptionsResolver/SpacedRepetitionOptionsResolver.php b/src/OptionsResolver/SpacedRepetitionOptionsResolver.php index 20b8f24..ac99c44 100644 --- a/src/OptionsResolver/SpacedRepetitionOptionsResolver.php +++ b/src/OptionsResolver/SpacedRepetitionOptionsResolver.php @@ -1,5 +1,7 @@ userRepository->find($value); if ($user === null) { - throw new InvalidOptionsException("User with id $value was not found"); + throw new InvalidOptionsException("User with id {$value} was not found"); } return $user; diff --git a/src/OptionsResolver/UnitOptionsResolver.php b/src/OptionsResolver/UnitOptionsResolver.php index 9ed6226..a90479e 100644 --- a/src/OptionsResolver/UnitOptionsResolver.php +++ b/src/OptionsResolver/UnitOptionsResolver.php @@ -1,11 +1,13 @@ topicRepository->find($value); if ($topic === null) { - throw new InvalidOptionsException("Topic with id $value was not found"); + throw new InvalidOptionsException("Topic with id {$value} was not found"); } return $topic; diff --git a/src/OptionsResolver/UserOptionsResolver.php b/src/OptionsResolver/UserOptionsResolver.php index e6c634e..56685ad 100644 --- a/src/OptionsResolver/UserOptionsResolver.php +++ b/src/OptionsResolver/UserOptionsResolver.php @@ -1,5 +1,7 @@ @@ -38,7 +40,7 @@ public function findAllWithPagination(int $page, string $sort, string $order, ?U ->setParameter('user', $user); } - $query->orderBy("f.$sort", $order); + $query->orderBy("f.{$sort}", $order); return new Paginator($query, $page); } @@ -48,7 +50,7 @@ public function findByUnitWithPagination(int $page, string $sort, string $order, $query = $this->createQueryBuilder('f') ->where('f.unit = :unit') ->setParameter('unit', $unit) - ->orderBy("f.$sort", $order); + ->orderBy("f.{$sort}", $order); return new Paginator($query, $page); } @@ -131,7 +133,7 @@ public function findFlashcardToReview(User $user, int $cardsToReview) ->orderBy('f.nextReview', 'ASC') ->setMaxResults($cardsToReview) ->setParameter('user', $user) - ->setParameter('today', new \DateTime()) + ->setParameter('today', new \DateTimeImmutable()) ->getQuery() ->getResult(); @@ -155,7 +157,7 @@ public function findFlashcardToReviewBy(Unit|Topic $reviewBy, User $user, int $c $qb->orderBy('f.nextReview', 'ASC') ->setMaxResults($cardsToReview) ->setParameter('user', $user) - ->setParameter('today', (new \DateTime())->format('Y-m-d')) + ->setParameter('today', (new \DateTimeImmutable())->format('Y-m-d')) ->setParameter('reviewBy', $reviewBy); return $qb->getQuery()->getResult(); diff --git a/src/Repository/ReviewRepository.php b/src/Repository/ReviewRepository.php index 09c908a..81b6828 100644 --- a/src/Repository/ReviewRepository.php +++ b/src/Repository/ReviewRepository.php @@ -1,14 +1,16 @@ @@ -25,7 +27,7 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Review::class); } - public function resetAll(User $user) + public function resetAll(User $user): void { $query = $this->createQueryBuilder('r') ->update() diff --git a/src/Repository/TopicRepository.php b/src/Repository/TopicRepository.php index 3cb4925..6298cc0 100644 --- a/src/Repository/TopicRepository.php +++ b/src/Repository/TopicRepository.php @@ -1,12 +1,14 @@ @@ -33,7 +35,7 @@ public function findAllWithPagination(int $page, string $sort, string $order, ?U ->setParameter('user', $user); } - $query->orderBy("t.$sort", $order); + $query->orderBy("t.{$sort}", $order); return new Paginator($query, $page); } diff --git a/src/Repository/UnitRepository.php b/src/Repository/UnitRepository.php index f646339..5cd6bae 100644 --- a/src/Repository/UnitRepository.php +++ b/src/Repository/UnitRepository.php @@ -1,13 +1,15 @@ @@ -35,7 +37,7 @@ public function findAllWithPagination(int $page, string $sort, string $order, ?U ->setParameter('user', $user); } - $query->orderBy("u.$sort", $order); + $query->orderBy("u.{$sort}", $order); return new Paginator($query, $page); } @@ -45,7 +47,7 @@ public function findByTopicWithPagination(int $page, string $sort, string $order $query = $this->createQueryBuilder('u') ->where('u.topic = :topic') ->setParameter('topic', $topic) - ->orderBy("u.$sort", $order); + ->orderBy("u.{$sort}", $order); return new Paginator($query, $page); } diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index f02de27..8c695fd 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -1,15 +1,17 @@ @@ -46,7 +48,7 @@ public function loadUserByIdentifier(string $usernameOrEmail): ?User return $entityManager->createQuery( 'SELECT u - FROM App\Entity\User u + FROM App\\Entity\\User u WHERE u.username = :query OR u.email = :query' ) @@ -56,7 +58,7 @@ public function loadUserByIdentifier(string $usernameOrEmail): ?User public function findAllWithPagination(int $page, string $sort, string $order): Paginator { - $query = $this->createQueryBuilder('u')->orderBy("u.$sort", $order); + $query = $this->createQueryBuilder('u')->orderBy("u.{$sort}", $order); return new Paginator($query, $page); } diff --git a/src/Security/AuthenticationFailureHandler.php b/src/Security/AuthenticationFailureHandler.php index 3b5c2f9..3c0976e 100644 --- a/src/Security/AuthenticationFailureHandler.php +++ b/src/Security/AuthenticationFailureHandler.php @@ -1,11 +1,13 @@ validator->validate($entity, groups: $validationGroups); - if (count($errors) > 0) { + if (\count($errors) > 0) { throw new ValidatorException((string) $errors[0]->getMessage()); } } diff --git a/src/Service/ObjectFactory.php b/src/Service/ObjectFactory.php index 8e10ab3..1563afc 100644 --- a/src/Service/ObjectFactory.php +++ b/src/Service/ObjectFactory.php @@ -1,5 +1,7 @@ newInstanceArgs($constructorArgs); if ($instance === null) { - throw new \InvalidArgumentException("Error while creating the $fqcn object"); + throw new \InvalidArgumentException("Error while creating the {$fqcn} object"); } return $instance; diff --git a/src/Service/RequestPayloadService.php b/src/Service/RequestPayloadService.php index 5911dc0..95d60b2 100644 --- a/src/Service/RequestPayloadService.php +++ b/src/Service/RequestPayloadService.php @@ -1,5 +1,7 @@ getContent(), true); - if (json_last_error() !== JSON_ERROR_NONE) { + if (json_last_error() !== \JSON_ERROR_NONE) { throw new JsonException('The request contains an invalid body that can not be parsed. Please verify the json body of the request.'); } diff --git a/src/Service/ReviewManager.php b/src/Service/ReviewManager.php index 17f148a..f8ae002 100644 --- a/src/Service/ReviewManager.php +++ b/src/Service/ReviewManager.php @@ -1,15 +1,17 @@ reviewRepository->resetBy($flashcard, $user); $this->flashcardRepository->resetBy($flashcard, $user); } - public function resetFlashcards(Unit|Topic $group, User $user) + public function resetFlashcards(Unit|Topic $group, User $user): void { $this->reviewRepository->resetBy($group, $user); $this->flashcardRepository->resetBy($group, $user); } - public function resetAllFlashcards(User $user) + public function resetAllFlashcards(User $user): void { $this->reviewRepository->resetAll($user); $this->flashcardRepository->resetAll($user); diff --git a/src/Service/SortableEntityChecker.php b/src/Service/SortableEntityChecker.php index 06eb85b..0ffdb04 100644 --- a/src/Service/SortableEntityChecker.php +++ b/src/Service/SortableEntityChecker.php @@ -1,5 +1,7 @@ getProperty($field) ->getAttributes(Sortable::class); - return count($sortableAttributes) > 0; + return \count($sortableAttributes) > 0; } public function getSortableFields(string $classname): array { if (!class_exists($classname)) { - throw new \InvalidArgumentException("Unknown class $classname"); + throw new \InvalidArgumentException("Unknown class {$classname}"); } $sortableFields = []; @@ -38,7 +40,7 @@ public function getSortableFields(string $classname): array /** @var \ReflectionProperty $property */ foreach ($reflectionProperties as $property) { - if (count($property->getAttributes(Sortable::class)) > 0) { + if (\count($property->getAttributes(Sortable::class)) > 0) { $sortableFields[] = $property->getName(); } } diff --git a/src/Service/SpacedRepetitionScheduler.php b/src/Service/SpacedRepetitionScheduler.php index 2ec23cf..1f3469e 100644 --- a/src/Service/SpacedRepetitionScheduler.php +++ b/src/Service/SpacedRepetitionScheduler.php @@ -1,11 +1,13 @@ getNextReview() > (new \DateTime())) { + if ($flashcard->getNextReview() > (new \DateTimeImmutable())) { return; } @@ -32,7 +34,7 @@ public function review(Flashcard &$flashcard, GradeType $grade): void } $interval = $this->nextInterval($flashcard); - $flashcard->setNextReview((new \DateTime())->modify("+$interval days")->setTime(0, 0, 0)); + $flashcard->setNextReview((new \DateTimeImmutable())->modify("+{$interval} days")->setTime(0, 0, 0)); $flashcard->refreshPreviousReview(); $flashcard->setState(StateType::Learning); } @@ -61,9 +63,9 @@ private function nextDifficulty(Flashcard $flashcard, GradeType $grade): float private function getRetrievability(Flashcard $flashcard): float { - $elapsedDays = (int) $flashcard->getPreviousReview()->diff(new \DateTime())->format('%a'); + $elapsedDays = (int) $flashcard->getPreviousReview()->diff(new \DateTimeImmutable())->format('%a'); - return pow(1 + ($elapsedDays / (9 * $flashcard->getStability())), -1); + return (1 + ($elapsedDays / (9 * $flashcard->getStability()))) ** (-1); } private function nextInterval(Flashcard $flashcard): int @@ -85,7 +87,7 @@ private function nextRecallStability(Flashcard $flashcard, GradeType $grade): fl $D = $flashcard->getDifficulty(); $R = $this->getRetrievability($flashcard); - return $S * (pow(M_E, self::W[8]) * (11 - $D) * pow($S, -self::W[9]) * (pow(M_E, self::W[10] * (1 - $R)) - 1) * $hardPenalty * $easyPenalty + 1); + return $S * (\M_E ** self::W[8] * (11 - $D) * $S ** (-self::W[9]) * (\M_E ** (self::W[10] * (1 - $R)) - 1) * $hardPenalty * $easyPenalty + 1); } private function nextForgetStability(Flashcard $flashcard): float @@ -94,15 +96,15 @@ private function nextForgetStability(Flashcard $flashcard): float $D = $flashcard->getDifficulty(); $R = $this->getRetrievability($flashcard); - return self::W[11] * pow($D, -self::W[12]) * (pow($S + 1, self::W[13]) - 1) * pow(M_E, self::W[14] * (1 - $R)); + return self::W[11] * $D ** (-self::W[12]) * (($S + 1) ** self::W[13] - 1) * \M_E ** (self::W[14] * (1 - $R)); } private function nextStability(Flashcard $flashcard, GradeType $grade): float { if ($grade->isCorrect()) { return $this->nextRecallStability($flashcard, $grade); - } else { - return $this->nextForgetStability($flashcard); } + + return $this->nextForgetStability($flashcard); } } diff --git a/src/Service/TokenGenerator.php b/src/Service/TokenGenerator.php index a827545..40366e6 100644 --- a/src/Service/TokenGenerator.php +++ b/src/Service/TokenGenerator.php @@ -1,5 +1,7 @@ getPaginationParameter(__Foo__::class, $request); } - public function testValidateEntity() + public function testValidateEntity(): void { /** @var AbstractRestController $abstractController */ $abstractController = self::getContainer()->get(AbstractRestController::class); @@ -63,7 +65,7 @@ public function testValidateEntity() $abstractController->validateEntity($entity); } - public function testValidateEntityWithValidationGroup() + public function testValidateEntityWithValidationGroup(): void { /** @var AbstractRestController $abstractController */ $abstractController = self::getContainer()->get(AbstractRestController::class); diff --git a/tests/Controller/User/SecurityControllerTest.php b/tests/Controller/User/SecurityControllerTest.php index cd88d56..b07ed9a 100644 --- a/tests/Controller/User/SecurityControllerTest.php +++ b/tests/Controller/User/SecurityControllerTest.php @@ -1,13 +1,15 @@ assertArrayHasKey('token', json_decode($client->getResponse()->getContent(), true)); } - public function testLoginWithUsername() + public function testLoginWithUsername(): void { $client = static::createClient(); @@ -45,7 +47,7 @@ public function testLoginWithUsername() $this->assertArrayHasKey('token', json_decode($client->getResponse()->getContent(), true)); } - public function testLoginWithBadPassword() + public function testLoginWithBadPassword(): void { $client = static::createClient(); @@ -62,7 +64,7 @@ public function testLoginWithBadPassword() $this->assertResponseStatusCodeSame(Response::HTTP_BAD_REQUEST); } - public function testLoginWithBadIdentifier() + public function testLoginWithBadIdentifier(): void { $client = static::createClient(); diff --git a/tests/Controller/User/UserControllerTest.php b/tests/Controller/User/UserControllerTest.php index a8233c2..d3ef0c6 100644 --- a/tests/Controller/User/UserControllerTest.php +++ b/tests/Controller/User/UserControllerTest.php @@ -1,13 +1,15 @@ assertJson($client->getResponse()->getContent()); } - public function testGetMeWithoutAuthenticatedUser() + public function testGetMeWithoutAuthenticatedUser(): void { $client = static::createClient(); $client->request('GET', '/api/users/me'); diff --git a/tests/Entity/FlashcardTest.php b/tests/Entity/FlashcardTest.php index 1f6689e..9367e58 100644 --- a/tests/Entity/FlashcardTest.php +++ b/tests/Entity/FlashcardTest.php @@ -1,16 +1,18 @@ assertNull($flashcard->getUnit()); } - public function testId() + public function testId(): void { /** @var Flashcard $flashcard */ $flashcard = self::getContainer()->get(FlashcardRepository::class)->find(1); $this->assertIsInt($flashcard->getId()); } - public function testCreatedAt() + public function testCreatedAt(): void { $flashcard = new Flashcard(); $this->em->persist($flashcard); @@ -53,7 +55,7 @@ public function testCreatedAt() $this->em->detach($flashcard); } - public function testUpdatedAt() + public function testUpdatedAt(): void { $flashcard = new Flashcard(); $this->em->persist($flashcard); @@ -61,7 +63,7 @@ public function testUpdatedAt() $this->em->detach($flashcard); } - public function testFront() + public function testFront(): void { $flashcard = new Flashcard(); @@ -80,7 +82,7 @@ public function testFront() $this->assertSame($front, $flashcard->getFront()); } - public function testBack() + public function testBack(): void { $flashcard = new Flashcard(); @@ -99,7 +101,7 @@ public function testBack() $this->assertSame($back, $flashcard->getBack()); } - public function testDetails() + public function testDetails(): void { $flashcard = new Flashcard(); @@ -113,7 +115,7 @@ public function testDetails() $this->assertSame($details, $flashcard->getDetails()); } - public function testUnit() + public function testUnit(): void { $flashcard = new Flashcard(); diff --git a/tests/Entity/TopicTest.php b/tests/Entity/TopicTest.php index 1b404c3..d73df7d 100644 --- a/tests/Entity/TopicTest.php +++ b/tests/Entity/TopicTest.php @@ -1,18 +1,20 @@ assertEmpty($topic->getUnits()); } - public function testId() + public function testId(): void { /** @var Topic $topic */ $topic = self::getContainer()->get(TopicRepository::class)->find(1); $this->assertIsInt($topic->getId()); } - public function testName() + public function testName(): void { $topic = new Topic(); @@ -65,7 +67,7 @@ public function testName() $this->assertSame($title, $topic->getName()); } - public function testCreatedAt() + public function testCreatedAt(): void { $topic = new Topic(); $this->em->persist($topic); @@ -73,7 +75,7 @@ public function testCreatedAt() $this->em->detach($topic); } - public function testUpdatedAt() + public function testUpdatedAt(): void { $topic = new Topic(); $this->em->persist($topic); @@ -81,7 +83,7 @@ public function testUpdatedAt() $this->em->detach($topic); } - public function testAuthor() + public function testAuthor(): void { $topic = new Topic(); @@ -96,7 +98,7 @@ public function testAuthor() $this->assertSame($user, $topic->getAuthor()); } - public function testUnits() + public function testUnits(): void { $topic = new Topic(); @@ -111,6 +113,6 @@ public function testUnits() $topic->removeUnit($unit); $this->assertNotContains($unit, $topic->getUnits()); - $this->assertSame(null, $unit->getTopic()); + $this->assertNull($unit->getTopic()); } } diff --git a/tests/Entity/UnitTest.php b/tests/Entity/UnitTest.php index 2e2d3ed..5480428 100644 --- a/tests/Entity/UnitTest.php +++ b/tests/Entity/UnitTest.php @@ -1,18 +1,20 @@ assertEmpty($unit->getFlashcards()); } - public function testId() + public function testId(): void { /** @var Unit $unit */ $unit = self::getContainer()->get(UnitRepository::class)->find(1); $this->assertIsInt($unit->getId()); } - public function testName() + public function testName(): void { $unit = new Unit(); @@ -65,7 +67,7 @@ public function testName() $this->assertSame($title, $unit->getName()); } - public function testCreatedAt() + public function testCreatedAt(): void { $unit = new Unit(); $this->em->persist($unit); @@ -73,7 +75,7 @@ public function testCreatedAt() $this->em->detach($unit); } - public function testUpdatedAt() + public function testUpdatedAt(): void { $unit = new Unit(); $this->em->persist($unit); @@ -81,7 +83,7 @@ public function testUpdatedAt() $this->em->detach($unit); } - public function testTopic() + public function testTopic(): void { $unit = new Unit(); @@ -96,7 +98,7 @@ public function testTopic() $this->assertSame($topic, $unit->getTopic()); } - public function testFlashcards() + public function testFlashcards(): void { $unit = new Unit(); @@ -111,6 +113,6 @@ public function testFlashcards() $unit->removeFlashcard($flashcard); $this->assertNotContains($flashcard, $unit->getFlashcards()); - $this->assertSame(null, $flashcard->getUnit()); + $this->assertNull($flashcard->getUnit()); } } diff --git a/tests/Entity/UserTest.php b/tests/Entity/UserTest.php index 0173b87..5cb0cda 100644 --- a/tests/Entity/UserTest.php +++ b/tests/Entity/UserTest.php @@ -1,20 +1,22 @@ validator = self::getContainer()->get('validator'); } - private function assertArrayContainsInstanceOf(string $constraint, ConstraintViolationList $constraintViolations) + private function assertArrayContainsInstanceOf(string $constraint, ConstraintViolationList $constraintViolations): void { foreach ($constraintViolations as $violation) { if ($violation->getConstraint() instanceof $constraint) { @@ -39,7 +41,7 @@ private function assertArrayContainsInstanceOf(string $constraint, ConstraintVio } } - $this->fail("Array does not contain an instance of $constraint"); + $this->fail("Array does not contain an instance of {$constraint}"); } public function testDefaultValues(): void @@ -59,14 +61,14 @@ public function testDefaultValues(): void $this->assertEmpty($user->getTopics()); } - public function testId() + public function testId(): void { /** @var User $user */ $user = self::getContainer()->get(UserRepository::class)->find(1); $this->assertIsInt($user->getId()); } - public function testEmail() + public function testEmail(): void { $user = new User(); @@ -87,7 +89,7 @@ public function testEmail() $this->assertSame($email, $user->getEmail()); } - public function testUsername() + public function testUsername(): void { $user = new User(); @@ -108,7 +110,7 @@ public function testUsername() $this->assertSame($username, $user->getUsername()); } - public function testToken() + public function testToken(): void { $user = new User(); @@ -125,7 +127,7 @@ public function testToken() $this->assertSame($username, $user->getToken()); } - public function testUserIdentifier() + public function testUserIdentifier(): void { $user = new User(); @@ -135,7 +137,7 @@ public function testUserIdentifier() $this->assertSame($username, $user->getUserIdentifier()); } - public function testCreatedAt() + public function testCreatedAt(): void { $user = new User(); $this->em->persist($user); @@ -143,7 +145,7 @@ public function testCreatedAt() $this->em->detach($user); } - public function testUpdatedAt() + public function testUpdatedAt(): void { $user = new User(); $this->em->persist($user); @@ -151,7 +153,7 @@ public function testUpdatedAt() $this->em->detach($user); } - public function testRoles() + public function testRoles(): void { $user = new User(); @@ -167,14 +169,14 @@ public function testRoles() $this->assertContains('ROLE_TEST_2', $user->getRoles()); } - public function testEraseCredentials() + public function testEraseCredentials(): void { $user = new User(); $user->eraseCredentials(); $this->assertTrue(true); } - public function testRawPassword() + public function testRawPassword(): void { $user = new User(); $user->setUsername('username'); @@ -203,7 +205,7 @@ public function testRawPassword() $this->assertSame($password, $user->getRawPassword()); } - public function testTopic() + public function testTopic(): void { $user = new User(); @@ -218,6 +220,6 @@ public function testTopic() $user->removeTopic($topic); $this->assertNotContains($topic, $user->getTopics()); - $this->assertSame(null, $topic->getAuthor()); + $this->assertNull($topic->getAuthor()); } } diff --git a/tests/Logger/ExtraLogProcessorTest.php b/tests/Logger/ExtraLogProcessorTest.php index 7475e2e..1f0ebc7 100644 --- a/tests/Logger/ExtraLogProcessorTest.php +++ b/tests/Logger/ExtraLogProcessorTest.php @@ -1,15 +1,17 @@ assertSame('/example', $logRecord['extra']['url']); } - public function testProcessorHandlesNullRequest() + public function testProcessorHandlesNullRequest(): void { // Create a RequestStack mock and set it up to return null $requestStack = $this->createMock(RequestStack::class); diff --git a/tests/Model/PaginationTest.php b/tests/Model/PaginationTest.php index 9638b80..cd85ec9 100644 --- a/tests/Model/PaginationTest.php +++ b/tests/Model/PaginationTest.php @@ -1,21 +1,23 @@ get('doctrine')->getManager(); $query = $em->createQueryBuilder() ->select('f') - ->from('App\Entity\Flashcard', 'f') + ->from(\App\Entity\Flashcard::class, 'f') ->getQuery(); // Create the Paginator object @@ -69,7 +71,7 @@ public function testHasNextPageWithoutNextPage(): void $em = self::getContainer()->get('doctrine')->getManager(); $query = $em->createQueryBuilder() ->select('f') - ->from('App\Entity\Flashcard', 'f') + ->from(\App\Entity\Flashcard::class, 'f') ->where('f.id = -1') ->getQuery(); @@ -92,7 +94,7 @@ public function testHasPreviousPageWithoutNextPage(): void $em = self::getContainer()->get('doctrine')->getManager(); $query = $em->createQueryBuilder() ->select('f') - ->from('App\Entity\Flashcard', 'f') + ->from(\App\Entity\Flashcard::class, 'f') ->where('f.id = -1') ->getQuery(); diff --git a/tests/OptionsResolver/FlashcardOptionsResolverTest.php b/tests/OptionsResolver/FlashcardOptionsResolverTest.php index 4fcd1b7..973bd2c 100644 --- a/tests/OptionsResolver/FlashcardOptionsResolverTest.php +++ b/tests/OptionsResolver/FlashcardOptionsResolverTest.php @@ -1,10 +1,12 @@ resolve([]); - $this->assertFalse(array_key_exists('front', $result)); + $this->assertFalse(\array_key_exists('front', $result)); } public function testConfigureFrontRequired(): void @@ -67,7 +69,7 @@ public function testConfigureBack(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('back', $result)); + $this->assertFalse(\array_key_exists('back', $result)); } public function testConfigureBackRequired(): void @@ -115,7 +117,7 @@ public function testConfigureDetails(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('details', $result)); + $this->assertFalse(\array_key_exists('details', $result)); } public function testConfigureDetailsRequired(): void @@ -165,7 +167,7 @@ public function testConfigureDetailsNullConversion(): void $result = $resolver->resolve(['details' => $details]); - $this->assertSame(null, $result['details']); + $this->assertNull($result['details']); } public function testConfigureUnit(): void @@ -176,7 +178,7 @@ public function testConfigureUnit(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('unit', $result)); + $this->assertFalse(\array_key_exists('unit', $result)); } public function testConfigureUnitRequired(): void diff --git a/tests/OptionsResolver/PaginationOptionsResolverTest.php b/tests/OptionsResolver/PaginationOptionsResolverTest.php index 7bd7307..7c60f58 100644 --- a/tests/OptionsResolver/PaginationOptionsResolverTest.php +++ b/tests/OptionsResolver/PaginationOptionsResolverTest.php @@ -1,14 +1,16 @@ configurePage(); @@ -20,7 +22,7 @@ public function testConfigurePage() $this->assertSame($page, $result['page']); } - public function testConfigurePageDefault() + public function testConfigurePageDefault(): void { $resolver = new PaginatorOptionsResolver(); $resolver->configurePage(); @@ -30,7 +32,7 @@ public function testConfigurePageDefault() $this->assertSame(1, $result['page']); } - public function testConfigurePageInvalidType() + public function testConfigurePageInvalidType(): void { $resolver = new PaginatorOptionsResolver(); $resolver->configurePage(); @@ -40,7 +42,7 @@ public function testConfigurePageInvalidType() $resolver->resolve(['page' => 'invalid']); } - public function testConfigurePageInvalidValue() + public function testConfigurePageInvalidValue(): void { $resolver = new PaginatorOptionsResolver(); $resolver->configurePage(); @@ -50,7 +52,7 @@ public function testConfigurePageInvalidValue() $resolver->resolve(['page' => 0]); } - public function testConfigureOrder() + public function testConfigureOrder(): void { $resolver = new PaginatorOptionsResolver(); $resolver->configureOrder(); @@ -62,7 +64,7 @@ public function testConfigureOrder() $this->assertSame($order, $result['order']); } - public function testConfigureOrderDefault() + public function testConfigureOrderDefault(): void { $resolver = new PaginatorOptionsResolver(); $resolver->configureOrder(); @@ -72,7 +74,7 @@ public function testConfigureOrderDefault() $this->assertSame('ASC', $result['order']); } - public function testConfigureOrderInvalidType() + public function testConfigureOrderInvalidType(): void { $resolver = new PaginatorOptionsResolver(); $resolver->configureOrder(); @@ -82,7 +84,7 @@ public function testConfigureOrderInvalidType() $resolver->resolve(['order' => 123]); } - public function testConfigureOrderInvalidValue() + public function testConfigureOrderInvalidValue(): void { $resolver = new PaginatorOptionsResolver(); $resolver->configureOrder(); @@ -92,7 +94,7 @@ public function testConfigureOrderInvalidValue() $resolver->resolve(['order' => 'INVALID']); } - public function testConfigureSort() + public function testConfigureSort(): void { $resolver = new PaginatorOptionsResolver(); $sortableFields = ['id', 'name', 'created_at']; @@ -105,7 +107,7 @@ public function testConfigureSort() $this->assertSame($sort, $result['sort']); } - public function testConfigureSortDefault() + public function testConfigureSortDefault(): void { $resolver = new PaginatorOptionsResolver(); $sortableFields = ['id', 'name', 'created_at']; @@ -116,7 +118,7 @@ public function testConfigureSortDefault() $this->assertSame('id', $result['sort']); } - public function testConfigureSortInvalidType() + public function testConfigureSortInvalidType(): void { $resolver = new PaginatorOptionsResolver(); $sortableFields = ['id', 'name', 'created_at']; @@ -127,7 +129,7 @@ public function testConfigureSortInvalidType() $resolver->resolve(['sort' => 123]); } - public function testConfigureSortInvalidValue() + public function testConfigureSortInvalidValue(): void { $resolver = new PaginatorOptionsResolver(); $sortableFields = ['id', 'name', 'created_at']; diff --git a/tests/OptionsResolver/TopicOptionsResolverTest.php b/tests/OptionsResolver/TopicOptionsResolverTest.php index 50d3c34..31fd3ed 100644 --- a/tests/OptionsResolver/TopicOptionsResolverTest.php +++ b/tests/OptionsResolver/TopicOptionsResolverTest.php @@ -1,10 +1,12 @@ resolve([]); - $this->assertFalse(array_key_exists('name', $result)); + $this->assertFalse(\array_key_exists('name', $result)); } public function testConfigureNameRequired(): void @@ -67,7 +69,7 @@ public function testConfigureAuthor(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('author', $result)); + $this->assertFalse(\array_key_exists('author', $result)); } public function testConfigureAuthorRequired(): void diff --git a/tests/OptionsResolver/UnitOptionsResolverTest.php b/tests/OptionsResolver/UnitOptionsResolverTest.php index df40af7..26f8c30 100644 --- a/tests/OptionsResolver/UnitOptionsResolverTest.php +++ b/tests/OptionsResolver/UnitOptionsResolverTest.php @@ -1,10 +1,12 @@ resolve([]); - $this->assertFalse(array_key_exists('name', $result)); + $this->assertFalse(\array_key_exists('name', $result)); } public function testConfigureNameRequired(): void @@ -67,7 +69,7 @@ public function testConfigureTopic(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('topic', $result)); + $this->assertFalse(\array_key_exists('topic', $result)); } public function testConfigureTopicRequired(): void diff --git a/tests/OptionsResolver/UserOptionsResolverTest.php b/tests/OptionsResolver/UserOptionsResolverTest.php index c6e2e1f..5eaaae8 100644 --- a/tests/OptionsResolver/UserOptionsResolverTest.php +++ b/tests/OptionsResolver/UserOptionsResolverTest.php @@ -1,5 +1,7 @@ resolve([]); - $this->assertFalse(array_key_exists('username', $result)); + $this->assertFalse(\array_key_exists('username', $result)); } public function testConfigureUsernameRequired(): void @@ -65,7 +67,7 @@ public function testConfigureEmail(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('email', $result)); + $this->assertFalse(\array_key_exists('email', $result)); } public function testConfigureEmailRequired(): void @@ -113,7 +115,7 @@ public function testConfigurePassword(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('password', $result)); + $this->assertFalse(\array_key_exists('password', $result)); } public function testConfigurePasswordRequired(): void @@ -161,7 +163,7 @@ public function testConfigureRoles(): void $result = $resolver->resolve([]); - $this->assertFalse(array_key_exists('roles', $result)); + $this->assertFalse(\array_key_exists('roles', $result)); } public function testConfigureRolesRequired(): void diff --git a/tests/Pest.php b/tests/Pest.php index 8fc9645..e44fc87 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -1,5 +1,7 @@ loadUserByIdentifier('Hello World!'); - $this->assertSame(null, $resultByUsername); + $this->assertNull($resultByUsername); } public function testUpgradePassword(): void diff --git a/tests/Service/EntityCheckerTest.php b/tests/Service/EntityCheckerTest.php index dd3d010..055a08d 100644 --- a/tests/Service/EntityCheckerTest.php +++ b/tests/Service/EntityCheckerTest.php @@ -1,5 +1,7 @@ get(SortableEntityChecker::class); @@ -25,7 +27,7 @@ public function testIsFieldSortable() $this->assertFalse($checker->isFieldSortable(__Foo__::class, 'notSortable')); } - public function testIsFieldSortableWithUnknownClass() + public function testIsFieldSortableWithUnknownClass(): void { /** @var SortableEntityChecker $service */ $checker = self::getContainer()->get(SortableEntityChecker::class); @@ -35,7 +37,7 @@ public function testIsFieldSortableWithUnknownClass() $checker->isFieldSortable('UnknownClass', 'sortable'); } - public function testIsFieldSortableWithUnknownField() + public function testIsFieldSortableWithUnknownField(): void { /** @var SortableEntityChecker $service */ $checker = self::getContainer()->get(SortableEntityChecker::class); @@ -45,7 +47,7 @@ public function testIsFieldSortableWithUnknownField() $checker->isFieldSortable(__Foo__::class, 'unknownField'); } - public function testGetSortableFields() + public function testGetSortableFields(): void { /** @var SortableEntityChecker $service */ $checker = self::getContainer()->get(SortableEntityChecker::class); @@ -53,7 +55,7 @@ public function testGetSortableFields() $this->assertSame(['sortable'], $checker->getSortableFields(__Foo__::class)); } - public function testGetSortableFieldsWithUnknownClass() + public function testGetSortableFieldsWithUnknownClass(): void { /** @var SortableEntityChecker $service */ $checker = self::getContainer()->get(SortableEntityChecker::class); diff --git a/tests/Service/RequestPayloadServiceTest.php b/tests/Service/RequestPayloadServiceTest.php index 34794cb..08f8e63 100644 --- a/tests/Service/RequestPayloadServiceTest.php +++ b/tests/Service/RequestPayloadServiceTest.php @@ -1,15 +1,17 @@ get(RequestPayloadService::class); @@ -26,7 +28,7 @@ public function testGetRequestPayloadValidJson() $this->assertSame($payload, $result); } - public function testGetRequestPayloadInvalidJson() + public function testGetRequestPayloadInvalidJson(): void { /** @var RequestPayloadService $service */ $service = self::getContainer()->get(RequestPayloadService::class); @@ -35,7 +37,7 @@ public function testGetRequestPayloadInvalidJson() $service->getRequestPayload($request); } - public function testGetQueryPayload() + public function testGetQueryPayload(): void { $service = new RequestPayloadService(); $request = Request::create('/?param1=value1¶m2=value2'); diff --git a/tests/Utility/RegexTest.php b/tests/Utility/RegexTest.php index 8172764..99d55b7 100644 --- a/tests/Utility/RegexTest.php +++ b/tests/Utility/RegexTest.php @@ -1,5 +1,7 @@ assertEquals("\d+", Regex::INTEGER); + $this->assertEquals('\\d+', Regex::INTEGER); } public function testUsername(): void { - $this->assertEquals("^[\w\-\.]*$", Regex::USERNAME); + $this->assertEquals('^[\\w\\-\\.]*$', Regex::USERNAME); } public function testUsernameSlash(): void { - $this->assertEquals("/^[\w\-\.]*$/", Regex::USERNAME_SLASH); + $this->assertEquals('/^[\\w\\-\\.]*$/', Regex::USERNAME_SLASH); } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 1e75e32..56a892d 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,5 +1,7 @@ Date: Wed, 13 Mar 2024 18:56:29 +0000 Subject: [PATCH 15/16] fix(docker) Updated php version to 8.2.16 --- .devcontainer/docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/docker-compose.yaml b/.devcontainer/docker-compose.yaml index 6edc011..5f92903 100644 --- a/.devcontainer/docker-compose.yaml +++ b/.devcontainer/docker-compose.yaml @@ -46,7 +46,7 @@ services: context: . dockerfile: Dockerfile args: - - VARIANT=8.2.8-apache + - VARIANT=8.2.16-apache ports: - 8080:80 volumes: From 69de8e805249884cfeaa89ee1a847dd8f12d4c6c Mon Sep 17 00:00:00 2001 From: MrAnyx <1ptitigre@gmail.com> Date: Sun, 17 Mar 2024 16:34:18 +0000 Subject: [PATCH 16/16] fix(core) Updated devcontainer config --- .devcontainer/Dockerfile | 6 ---- .devcontainer/devcontainer.json | 46 +++++++++++++++++++++++++------ .devcontainer/docker-compose.yaml | 6 ++-- .vscode/extensions.json | 16 ----------- .vscode/settings.json | 13 --------- 5 files changed, 40 insertions(+), 47 deletions(-) delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/settings.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b3b6f91..b0bc36c 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -4,9 +4,6 @@ ARG VARIANT=8.2.8-apache # Pull existing php image FROM php:${VARIANT} -# Install Taskfile -RUN sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin - # Set the working dir WORKDIR /var/www @@ -25,9 +22,6 @@ RUN install-php-extensions opcache RUN install-php-extensions zip # RUN install-php-extensions xdebug -# Retrieve the lastest version of composer -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer - # Copy configuration files COPY apache/vhosts.conf /etc/apache2/sites-available/000-default.conf # COPY xdebug/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index aba7052..c8ed0b5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -16,17 +16,45 @@ "service": "api", "workspaceFolder": "/var/www", "postCreateCommand": "task app:default:config", - // "remoteUser": "vscode", - // "customizations": { - // "vscode": { - // "settings": { - // "php.executablePath": "/usr/local/bin/php" - // } - // } - // }, + "customizations": { + "vscode": { + "settings": { + "php.executablePath": "/usr/local/bin/php", + "php.validate.executablePath": "/usr/local/bin/php", + "php.suggest.basic": false, + "php-cs-fixer.allowRisky": false, + "[php]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "junstyle.php-cs-fixer" + }, + "[yaml][json][jsonc]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + } + }, + "extensions": [ + // "hbenl.vscode-test-explorer", + // "ms-vscode.test-adapter-converter", + // "recca0120.vscode-phpunit", + "esbenp.prettier-vscode", + "MehediDracula.php-namespace-resolver", + "bmewburn.vscode-intelephense-client", + "neilbrayfield.php-docblocker", + "mikestead.dotenv", + "MehediDracula.php-namespace-resolver", + "mikestead.dotenv", + "EditorConfig.EditorConfig", + "junstyle.php-cs-fixer" + ] + } + }, "features": { "ghcr.io/devcontainers/features/github-cli:1": { "version": "latest" - } + }, + "ghcr.io/devcontainers-contrib/features/composer:1": { + "version": "latest" + }, + "ghcr.io/audacioustux/devcontainers/taskfile:1": {} } } diff --git a/.devcontainer/docker-compose.yaml b/.devcontainer/docker-compose.yaml index 5f92903..50aa9c8 100644 --- a/.devcontainer/docker-compose.yaml +++ b/.devcontainer/docker-compose.yaml @@ -18,11 +18,11 @@ services: - dev maildev: - image: maildev/maildev + image: rnwood/smtp4dev container_name: flashcard-mail - command: bin/maildev --web 80 --smtp 25 --hide-extensions STARTTLS ports: - - 8082:80 + - 8082:80 + - 2525:25 networks: - dev diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 47f0e9f..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "recommendations": [ - // "hbenl.vscode-test-explorer", - // "ms-vscode.test-adapter-converter", - // "recca0120.vscode-phpunit", - "esbenp.prettier-vscode", - "MehediDracula.php-namespace-resolver", - "bmewburn.vscode-intelephense-client", - "neilbrayfield.php-docblocker", - "mikestead.dotenv", - "MehediDracula.php-namespace-resolver", - "mikestead.dotenv", - "EditorConfig.EditorConfig", - "junstyle.php-cs-fixer" - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 13c9fb4..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "php.validate.executablePath": "/usr/local/bin/php", - "php.suggest.basic": false, - "php-cs-fixer.allowRisky": false, - "[php]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "junstyle.php-cs-fixer" - }, - "[yaml][json][jsonc]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode" - } -}