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"
- }
-}