1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-08-01 17:38:38 +00:00

Migrate to Symfony attributes

This commit is contained in:
Yassine Guedidi 2025-04-05 15:06:57 +02:00
parent 6a3780ce81
commit 2a60d8473d
46 changed files with 143 additions and 256 deletions

View file

@ -42,7 +42,6 @@ $config
'shipmonk/composer-dependency-analyser',
'symfony/asset',
'symfony/css-selector',
'symfony/doctrine-bridge',
'symfony/google-mailer',
'symfony/intl',
'symfony/phpunit-bridge',

View file

@ -15,7 +15,7 @@ return RectorConfig::configure()
])
->withRootFiles()
->withImportNames(importShortClasses: false)
->withAttributesSets(doctrine: true)
->withAttributesSets(symfony: true, doctrine: true)
->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [
'inline_public' => true,
])

View file

@ -7,7 +7,6 @@ use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Wallabag\Entity\Entry;
use Wallabag\Entity\Tag;
use Wallabag\Event\EntrySavedEvent;
use Wallabag\Import\AbstractImport;
use Wallabag\Repository\UserRepository;

View file

@ -32,11 +32,10 @@ class AnnotationController extends AbstractFOSRestController
*
* @see Api\WallabagRestController
*
* @Route("/annotations/{entry}.{_format}", name="annotations_get_annotations", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("LIST_ANNOTATIONS", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/annotations/{entry}.{_format}', name: 'annotations_get_annotations', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getAnnotationsAction(Entry $entry, AnnotationRepository $annotationRepository)
{
$annotationRows = $annotationRepository->findByEntryIdAndUserId($entry->getId(), $this->getUser()->getId());
@ -54,11 +53,10 @@ class AnnotationController extends AbstractFOSRestController
*
* @see Api\WallabagRestController
*
* @Route("/annotations/{entry}.{_format}", name="annotations_post_annotation", methods={"POST"}, defaults={"_format": "json"})
* @IsGranted("CREATE_ANNOTATIONS", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/annotations/{entry}.{_format}', name: 'annotations_post_annotation', methods: ['POST'], defaults: ['_format' => 'json'])]
public function postAnnotationAction(Request $request, Entry $entry)
{
$data = json_decode($request->getContent(), true);
@ -89,11 +87,10 @@ class AnnotationController extends AbstractFOSRestController
*
* @see Api\WallabagRestController
*
* @Route("/annotations/{annotation}.{_format}", name="annotations_put_annotation", methods={"PUT"}, defaults={"_format": "json"})
* @IsGranted("EDIT", subject="annotation")
*
* @return JsonResponse
*/
#[Route(path: '/annotations/{annotation}.{_format}', name: 'annotations_put_annotation', methods: ['PUT'], defaults: ['_format' => 'json'])]
public function putAnnotationAction(Request $request, Annotation $annotation)
{
try {
@ -125,11 +122,10 @@ class AnnotationController extends AbstractFOSRestController
*
* @see Api\WallabagRestController
*
* @Route("/annotations/{annotation}.{_format}", name="annotations_delete_annotation", methods={"DELETE"}, defaults={"_format": "json"})
* @IsGranted("DELETE", subject="annotation")
*
* @return JsonResponse
*/
#[Route(path: '/annotations/{annotation}.{_format}', name: 'annotations_delete_annotation', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteAnnotationAction(Annotation $annotation)
{
try {

View file

@ -34,12 +34,11 @@ class AnnotationRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/annotations/{entry}.{_format}", name="api_get_annotations", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("LIST_ANNOTATIONS", subject="entry")
*
* @return Response
*/
#[Route(path: '/api/annotations/{entry}.{_format}', name: 'api_get_annotations', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getAnnotationsAction(Entry $entry)
{
return $this->forward('Wallabag\Controller\AnnotationController::getAnnotationsAction', [
@ -100,11 +99,11 @@ class AnnotationRestController extends WallabagRestController
* )
* )
*
* @Route("/api/annotations/{entry}.{_format}", name="api_post_annotation", methods={"POST"}, defaults={"_format": "json"})
* @IsGranted("CREATE_ANNOTATIONS", subject="entry")
*
* @return Response
*/
#[Route(path: '/api/annotations/{entry}.{_format}', name: 'api_post_annotation', methods: ['POST'], defaults: ['_format' => 'json'])]
public function postAnnotationAction(Request $request, Entry $entry)
{
return $this->forward('Wallabag\Controller\AnnotationController::postAnnotationAction', [
@ -134,12 +133,11 @@ class AnnotationRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/annotations/{annotation}.{_format}", name="api_put_annotation", methods={"PUT"}, defaults={"_format": "json"})
* @IsGranted("EDIT", subject="annotation")
*
* @return Response
*/
#[Route(path: '/api/annotations/{annotation}.{_format}', name: 'api_put_annotation', methods: ['PUT'], defaults: ['_format' => 'json'])]
public function putAnnotationAction(Annotation $annotation, Request $request)
{
return $this->forward('Wallabag\Controller\AnnotationController::putAnnotationAction', [
@ -169,12 +167,11 @@ class AnnotationRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/annotations/{annotation}.{_format}", name="api_delete_annotation", methods={"DELETE"}, defaults={"_format": "json"})
* @IsGranted("DELETE", subject="annotation")
*
* @return Response
*/
#[Route(path: '/api/annotations/{annotation}.{_format}', name: 'api_delete_annotation', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteAnnotationAction(Annotation $annotation)
{
return $this->forward('Wallabag\Controller\AnnotationController::deleteAnnotationAction', [

View file

@ -23,10 +23,9 @@ class ConfigRestController extends WallabagRestController
* )
* )
*
* @Route("/api/config.{_format}", name="api_get_config", methods={"GET"}, defaults={"_format": "json"})
*
* @return JsonResponse
*/
#[Route(path: '/api/config.{_format}', name: 'api_get_config', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getConfigAction(SerializerInterface $serializer)
{
$this->validateAuthentication();

View file

@ -18,10 +18,9 @@ class DeveloperController extends AbstractController
/**
* List all clients and link to create a new one.
*
* @Route("/developer", name="developer", methods={"GET"})
*
* @return Response
*/
#[Route(path: '/developer', name: 'developer', methods: ['GET'])]
public function indexAction(ClientRepository $repo)
{
$clients = $repo->findByUser($this->getUser()->getId());
@ -34,10 +33,9 @@ class DeveloperController extends AbstractController
/**
* Create a client (an app).
*
* @Route("/developer/client/create", name="developer_create_client", methods={"GET", "POST"})
*
* @return Response
*/
#[Route(path: '/developer/client/create', name: 'developer_create_client', methods: ['GET', 'POST'])]
public function createClientAction(Request $request, EntityManagerInterface $entityManager, TranslatorInterface $translator)
{
$client = new Client($this->getUser());
@ -69,10 +67,9 @@ class DeveloperController extends AbstractController
/**
* Remove a client.
*
* @Route("/developer/client/delete/{id}", name="developer_delete_client", methods={"POST"}, requirements={"id" = "\d+"})
*
* @return RedirectResponse
*/
#[Route(path: '/developer/client/delete/{id}', name: 'developer_delete_client', methods: ['POST'], requirements: ['id' => '\d+'])]
public function deleteClientAction(Request $request, Client $client, EntityManagerInterface $entityManager, TranslatorInterface $translator)
{
if (!$this->isCsrfTokenValid('delete-client', $request->request->get('token'))) {
@ -97,10 +94,9 @@ class DeveloperController extends AbstractController
/**
* Display developer how to use an existing app.
*
* @Route("/developer/howto/first-app", name="developer_howto_firstapp", methods={"GET"})
*
* @return Response
*/
#[Route(path: '/developer/howto/first-app', name: 'developer_howto_firstapp', methods: ['GET'])]
public function howtoFirstAppAction()
{
return $this->render('Developer/howto_app.html.twig');

View file

@ -85,11 +85,11 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries/exists.{_format}", name="api_get_entries_exists", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("LIST_ENTRIES")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/exists.{_format}', name: 'api_get_entries_exists', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getEntriesExistsAction(Request $request, EntryRepository $entryRepository)
{
$returnId = (null === $request->query->get('return_id')) ? false : (bool) $request->query->get('return_id');
@ -297,11 +297,11 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries.{_format}", name="api_get_entries", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("LIST_ENTRIES")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries.{_format}', name: 'api_get_entries', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getEntriesAction(Request $request, EntryRepository $entryRepository)
{
$isArchived = (null === $request->query->get('archive')) ? null : (bool) $request->query->get('archive');
@ -387,12 +387,11 @@ class EntryRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/entries/{entry}.{_format}", name="api_get_entry", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("VIEW", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/{entry}.{_format}', name: 'api_get_entry', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getEntryAction(Entry $entry)
{
return $this->sendResponse($entry);
@ -430,11 +429,11 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries/{entry}/export.{_format}", name="api_get_entry_export", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("VIEW", subject="entry")
*
* @return Response
*/
#[Route(path: '/api/entries/{entry}/export.{_format}', name: 'api_get_entry_export', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getEntryExportAction(Entry $entry, Request $request, EntriesExport $entriesExport)
{
return $entriesExport
@ -462,12 +461,11 @@ class EntryRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/entries/list.{_format}", name="api_delete_entries_list", methods={"DELETE"}, defaults={"_format": "json"})
* @IsGranted("DELETE_ENTRIES")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/list.{_format}', name: 'api_delete_entries_list', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteEntriesListAction(Request $request, EntryRepository $entryRepository, EventDispatcherInterface $eventDispatcher)
{
$urls = json_decode($request->query->get('urls', '[]'));
@ -520,13 +518,13 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries/lists.{_format}", name="api_post_entries_list", methods={"POST"}, defaults={"_format": "json"})
* @IsGranted("CREATE_ENTRIES")
*
* @throws HttpException When limit is reached
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/lists.{_format}', name: 'api_post_entries_list', methods: ['POST'], defaults: ['_format' => 'json'])]
public function postEntriesListAction(Request $request, EntryRepository $entryRepository, EventDispatcherInterface $eventDispatcher, ContentProxy $contentProxy)
{
$urls = json_decode($request->query->get('urls', '[]'));
@ -704,11 +702,11 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries.{_format}", name="api_post_entries", methods={"POST"}, defaults={"_format": "json"})
* @IsGranted("CREATE_ENTRIES")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries.{_format}', name: 'api_post_entries', methods: ['POST'], defaults: ['_format' => 'json'])]
public function postEntriesAction(
Request $request,
EntryRepository $entryRepository,
@ -928,11 +926,11 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries/{entry}.{_format}", name="api_patch_entries", methods={"PATCH"}, defaults={"_format": "json"})
* @IsGranted("EDIT", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/{entry}.{_format}', name: 'api_patch_entries', methods: ['PATCH'], defaults: ['_format' => 'json'])]
public function patchEntriesAction(Entry $entry, Request $request, ContentProxy $contentProxy, LoggerInterface $logger, TagsAssigner $tagsAssigner, EventDispatcherInterface $eventDispatcher)
{
$data = $this->retrieveValueFromRequest($request);
@ -1042,12 +1040,11 @@ class EntryRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/entries/{entry}/reload.{_format}", name="api_patch_entries_reload", methods={"PATCH"}, defaults={"_format": "json"})
* @IsGranted("RELOAD", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/{entry}/reload.{_format}', name: 'api_patch_entries_reload', methods: ['PATCH'], defaults: ['_format' => 'json'])]
public function patchEntriesReloadAction(Entry $entry, ContentProxy $contentProxy, LoggerInterface $logger, EventDispatcherInterface $eventDispatcher)
{
try {
@ -1097,12 +1094,11 @@ class EntryRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/entries/{entry}.{_format}", name="api_delete_entries", methods={"DELETE"}, defaults={"_format": "json"})
* @IsGranted("DELETE", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/{entry}.{_format}', name: 'api_delete_entries', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteEntriesAction(Entry $entry, Request $request, EventDispatcherInterface $eventDispatcher)
{
$expect = $request->query->get('expect', 'entry');
@ -1149,12 +1145,11 @@ class EntryRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/entries/{entry}/tags.{_format}", name="api_get_entries_tags", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("LIST_TAGS", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/{entry}/tags.{_format}', name: 'api_get_entries_tags', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getEntriesTagsAction(Entry $entry)
{
return $this->sendResponse($entry->getTags());
@ -1192,11 +1187,11 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries/{entry}/tags.{_format}", name="api_post_entries_tags", methods={"POST"}, defaults={"_format": "json"})
* @IsGranted("TAG", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/{entry}/tags.{_format}', name: 'api_post_entries_tags', methods: ['POST'], defaults: ['_format' => 'json'])]
public function postEntriesTagsAction(Request $request, Entry $entry, TagsAssigner $tagsAssigner)
{
$tags = $request->request->get('tags', '');
@ -1242,11 +1237,11 @@ class EntryRestController extends WallabagRestController
* )
* )
*
* @Route("/api/entries/{entry}/tags/{tag}.{_format}", name="api_delete_entries_tags", methods={"DELETE"}, defaults={"_format": "json"})
* @IsGranted("UNTAG", subject="entry")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/{entry}/tags/{tag}.{_format}', name: 'api_delete_entries_tags', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteEntriesTagsAction(Entry $entry, Tag $tag)
{
$entry->removeTag($tag);
@ -1275,12 +1270,11 @@ class EntryRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/entries/tags/list.{_format}", name="api_delete_entries_tags_list", methods={"DELETE"}, defaults={"_format": "json"})
* @IsGranted("DELETE_TAGS")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/tags/list.{_format}', name: 'api_delete_entries_tags_list', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteEntriesTagsListAction(Request $request, TagRepository $tagRepository, EntryRepository $entryRepository)
{
$list = json_decode($request->query->get('list', '[]'));
@ -1341,12 +1335,11 @@ class EntryRestController extends WallabagRestController
* description="Returned when successful"
* )
* )
*
* @Route("/api/entries/tags/lists.{_format}", name="api_post_entries_tags_list", methods={"POST"}, defaults={"_format": "json"})
* @IsGranted("CREATE_TAGS")
*
* @return JsonResponse
*/
#[Route(path: '/api/entries/tags/lists.{_format}', name: 'api_post_entries_tags_list', methods: ['POST'], defaults: ['_format' => 'json'])]
public function postEntriesTagsListAction(Request $request, EntryRepository $entryRepository, TagsAssigner $tagsAssigner)
{
$list = json_decode($request->query->get('list', '[]'));

View file

@ -55,11 +55,11 @@ class SearchRestController extends WallabagRestController
* )
* )
*
* @Route("/api/search.{_format}", name="api_get_search", methods={"GET"}, defaults={"_format": "json"})
* @IsGranted("LIST_ENTRIES")
*
* @return JsonResponse
*/
#[Route(path: '/api/search.{_format}', name: 'api_get_search', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getSearchAction(Request $request, EntryRepository $entryRepository)
{
$term = $request->query->get('term');

View file

@ -26,10 +26,9 @@ class TagRestController extends WallabagRestController
* )
* )
*
* @Route("/api/tags.{_format}", name="api_get_tags", methods={"GET"}, defaults={"_format": "json"})
*
* @return JsonResponse
*/
#[Route(path: '/api/tags.{_format}', name: 'api_get_tags', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getTagsAction(TagRepository $tagRepository)
{
$this->validateAuthentication();
@ -63,10 +62,9 @@ class TagRestController extends WallabagRestController
* )
* )
*
* @Route("/api/tag/label.{_format}", name="api_delete_tag_label", methods={"DELETE"}, defaults={"_format": "json"})
*
* @return JsonResponse
*/
#[Route(path: '/api/tag/label.{_format}', name: 'api_delete_tag_label', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteTagLabelAction(Request $request, TagRepository $tagRepository, EntryRepository $entryRepository)
{
$this->validateAuthentication();
@ -111,10 +109,9 @@ class TagRestController extends WallabagRestController
* )
* )
*
* @Route("/api/tags/label.{_format}", name="api_delete_tags_label", methods={"DELETE"}, defaults={"_format": "json"})
*
* @return JsonResponse
*/
#[Route(path: '/api/tags/label.{_format}', name: 'api_delete_tags_label', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteTagsLabelAction(Request $request, TagRepository $tagRepository, EntryRepository $entryRepository)
{
$this->validateAuthentication();
@ -158,10 +155,9 @@ class TagRestController extends WallabagRestController
* )
* )
*
* @Route("/api/tags/{tag}.{_format}", name="api_delete_tag", methods={"DELETE"}, defaults={"_format": "json"})
*
* @return JsonResponse
*/
#[Route(path: '/api/tags/{tag}.{_format}', name: 'api_delete_tag', methods: ['DELETE'], defaults: ['_format' => 'json'])]
public function deleteTagAction(Tag $tag, TagRepository $tagRepository, EntryRepository $entryRepository)
{
$this->validateAuthentication();

View file

@ -23,10 +23,9 @@ class TaggingRuleRestController extends WallabagRestController
* )
* )
*
* @Route("/api/taggingrule/export.{_format}", name="api_get_taggingrule_export", methods={"GET"}, defaults={"_format": "json"})
*
* @return Response
*/
#[Route(path: '/api/taggingrule/export.{_format}', name: 'api_get_taggingrule_export', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getTaggingruleExportAction()
{
$this->validateAuthentication();

View file

@ -50,10 +50,9 @@ class WallabagRestController extends AbstractFOSRestController
*
* @deprecated Should use info endpoint instead
*
* @Route("/api/version.{_format}", name="api_get_version", methods={"GET"}, defaults={"_format": "json"})
*
* @return JsonResponse
*/
#[Route(path: '/api/version.{_format}', name: 'api_get_version', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getVersionAction()
{
$version = $this->getParameter('wallabag.version');
@ -73,10 +72,9 @@ class WallabagRestController extends AbstractFOSRestController
* )
* )
*
* @Route("/api/info.{_format}", name="api_get_info", methods={"GET"}, defaults={"_format": "json"})
*
* @return JsonResponse
*/
#[Route(path: '/api/info.{_format}', name: 'api_get_info', methods: ['GET'], defaults: ['_format' => 'json'])]
public function getInfoAction(Config $craueConfig)
{
$info = new ApplicationInfo(

View file

@ -57,9 +57,9 @@ class ConfigController extends AbstractController
}
/**
* @Route("/config", name="config", methods={"GET", "POST"})
* @IsGranted("EDIT_CONFIG")
*/
#[Route(path: '/config', name: 'config', methods: ['GET', 'POST'])]
public function indexAction(Request $request, Config $craueConfig, TaggingRuleRepository $taggingRuleRepository, IgnoreOriginUserRuleRepository $ignoreOriginUserRuleRepository, UserRepository $userRepository)
{
$config = $this->getConfig();
@ -250,9 +250,9 @@ class ConfigController extends AbstractController
/**
* Disable 2FA using email.
*
* @Route("/config/otp/email/disable", name="disable_otp_email", methods={"POST"})
* @IsGranted("EDIT_CONFIG")
*/
#[Route(path: '/config/otp/email/disable', name: 'disable_otp_email', methods: ['POST'])]
public function disableOtpEmailAction(Request $request)
{
if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) {
@ -276,9 +276,9 @@ class ConfigController extends AbstractController
/**
* Enable 2FA using email.
*
* @Route("/config/otp/email", name="config_otp_email", methods={"POST"})
* @IsGranted("EDIT_CONFIG")
*/
#[Route(path: '/config/otp/email', name: 'config_otp_email', methods: ['POST'])]
public function otpEmailAction(Request $request)
{
if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) {
@ -305,9 +305,9 @@ class ConfigController extends AbstractController
/**
* Disable 2FA using OTP app.
*
* @Route("/config/otp/app/disable", name="disable_otp_app", methods={"POST"})
* @IsGranted("EDIT_CONFIG")
*/
#[Route(path: '/config/otp/app/disable', name: 'disable_otp_app', methods: ['POST'])]
public function disableOtpAppAction(Request $request)
{
if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) {
@ -333,9 +333,9 @@ class ConfigController extends AbstractController
/**
* Enable 2FA using OTP app, user will need to confirm the generated code from the app.
*
* @Route("/config/otp/app", name="config_otp_app", methods={"POST"})
* @IsGranted("EDIT_CONFIG")
*/
#[Route(path: '/config/otp/app', name: 'config_otp_app', methods: ['POST'])]
public function otpAppAction(Request $request, GoogleAuthenticatorInterface $googleAuthenticator)
{
if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) {
@ -393,9 +393,9 @@ class ConfigController extends AbstractController
/**
* Validate OTP code.
*
* @Route("/config/otp/app/check", name="config_otp_app_check", methods={"POST"})
* @IsGranted("EDIT_CONFIG")
*/
#[Route(path: '/config/otp/app/check', name: 'config_otp_app_check', methods: ['POST'])]
public function otpAppCheckAction(Request $request, GoogleAuthenticatorInterface $googleAuthenticator)
{
if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) {
@ -430,11 +430,10 @@ class ConfigController extends AbstractController
}
/**
* @Route("/generate-token", name="generate_token", methods={"GET"})
* @IsGranted("EDIT_CONFIG")
*
* @return RedirectResponse|JsonResponse
*/
#[Route(path: '/generate-token', name: 'generate_token', methods: ['GET'])]
public function generateTokenAction(Request $request)
{
$config = $this->getConfig();
@ -456,11 +455,10 @@ class ConfigController extends AbstractController
}
/**
* @Route("/revoke-token", name="revoke_token", methods={"GET"})
* @IsGranted("EDIT_CONFIG")
*
* @return RedirectResponse|JsonResponse
*/
#[Route(path: '/revoke-token', name: 'revoke_token', methods: ['GET'])]
public function revokeTokenAction(Request $request)
{
$config = $this->getConfig();
@ -484,11 +482,10 @@ class ConfigController extends AbstractController
/**
* Deletes a tagging rule and redirect to the config homepage.
*
* @Route("/tagging-rule/delete/{taggingRule}", name="delete_tagging_rule", methods={"GET"}, requirements={"taggingRule" = "\d+"})
* @IsGranted("DELETE", subject="taggingRule")
*
* @return RedirectResponse
*/
#[Route(path: '/tagging-rule/delete/{taggingRule}', name: 'delete_tagging_rule', methods: ['GET'], requirements: ['taggingRule' => '\d+'])]
public function deleteTaggingRuleAction(TaggingRule $taggingRule)
{
$this->entityManager->remove($taggingRule);
@ -505,11 +502,10 @@ class ConfigController extends AbstractController
/**
* Edit a tagging rule.
*
* @Route("/tagging-rule/edit/{taggingRule}", name="edit_tagging_rule", methods={"GET"}, requirements={"taggingRule" = "\d+"})
* @IsGranted("EDIT", subject="taggingRule")
*
* @return RedirectResponse
*/
#[Route(path: '/tagging-rule/edit/{taggingRule}', name: 'edit_tagging_rule', methods: ['GET'], requirements: ['taggingRule' => '\d+'])]
public function editTaggingRuleAction(TaggingRule $taggingRule)
{
return $this->redirect($this->generateUrl('config') . '?tagging-rule=' . $taggingRule->getId() . '#set5');
@ -518,11 +514,10 @@ class ConfigController extends AbstractController
/**
* Deletes an ignore origin rule and redirect to the config homepage.
*
* @Route("/ignore-origin-user-rule/delete/{ignoreOriginUserRule}", name="delete_ignore_origin_rule", methods={"GET"}, requirements={"ignoreOriginUserRule" = "\d+"})
* @IsGranted("DELETE", subject="ignoreOriginUserRule")
*
* @return RedirectResponse
*/
#[Route(path: '/ignore-origin-user-rule/delete/{ignoreOriginUserRule}', name: 'delete_ignore_origin_rule', methods: ['GET'], requirements: ['ignoreOriginUserRule' => '\d+'])]
public function deleteIgnoreOriginRuleAction(IgnoreOriginUserRule $ignoreOriginUserRule)
{
$this->entityManager->remove($ignoreOriginUserRule);
@ -539,11 +534,10 @@ class ConfigController extends AbstractController
/**
* Edit an ignore origin rule.
*
* @Route("/ignore-origin-user-rule/edit/{ignoreOriginUserRule}", name="edit_ignore_origin_rule", methods={"GET"}, requirements={"ignoreOriginUserRule" = "\d+"})
* @IsGranted("EDIT", subject="ignoreOriginUserRule")
*
* @return RedirectResponse
*/
#[Route(path: '/ignore-origin-user-rule/edit/{ignoreOriginUserRule}', name: 'edit_ignore_origin_rule', methods: ['GET'], requirements: ['ignoreOriginUserRule' => '\d+'])]
public function editIgnoreOriginRuleAction(IgnoreOriginUserRule $ignoreOriginUserRule)
{
return $this->redirect($this->generateUrl('config') . '?ignore-origin-user-rule=' . $ignoreOriginUserRule->getId() . '#set6');
@ -552,11 +546,10 @@ class ConfigController extends AbstractController
/**
* Remove all annotations OR tags OR entries for the current user.
*
* @Route("/reset/{type}", name="config_reset", methods={"POST"}, requirements={"id" = "annotations|tags|entries|tagging_rules"})
* @IsGranted("EDIT_CONFIG")
*
* @return RedirectResponse
*/
#[Route(path: '/reset/{type}', name: 'config_reset', methods: ['POST'], requirements: ['id' => 'annotations|tags|entries|tagging_rules'])]
public function resetAction(Request $request, string $type, AnnotationRepository $annotationRepository, EntryRepository $entryRepository, TaggingRuleRepository $taggingRuleRepository)
{
if (!$this->isCsrfTokenValid('reset-area', $request->request->get('token'))) {
@ -608,13 +601,12 @@ class ConfigController extends AbstractController
/**
* Delete account for current user.
*
* @Route("/account/delete", name="delete_account", methods={"POST"})
* @IsGranted("EDIT_CONFIG")
*
* @throws AccessDeniedHttpException
*
* @return RedirectResponse
*/
#[Route(path: '/account/delete', name: 'delete_account', methods: ['POST'])]
public function deleteAccountAction(Request $request, UserRepository $userRepository, TokenStorageInterface $tokenStorage)
{
if (!$this->isCsrfTokenValid('delete-account', $request->request->get('token'))) {
@ -641,11 +633,10 @@ class ConfigController extends AbstractController
/**
* Switch view mode for current user.
*
* @Route("/config/view-mode", name="switch_view_mode", methods={"GET"})
* @IsGranted("EDIT_CONFIG")
*
* @return RedirectResponse
*/
#[Route(path: '/config/view-mode', name: 'switch_view_mode', methods: ['GET'])]
public function changeViewModeAction(Request $request)
{
$user = $this->getUser();
@ -664,11 +655,10 @@ class ConfigController extends AbstractController
*
* @param string $language
*
* @Route("/locale/{language}", name="changeLocale", methods={"GET"})
* @IsGranted("PUBLIC_ACCESS")
*
* @return RedirectResponse
*/
#[Route(path: '/locale/{language}', name: 'changeLocale', methods: ['GET'])]
public function setLocaleAction(Request $request, ValidatorInterface $validator, $language = null)
{
$errors = $validator->validate($language, new LocaleConstraint(['canonicalize' => true]));
@ -683,11 +673,10 @@ class ConfigController extends AbstractController
/**
* Export tagging rules for the logged in user.
*
* @Route("/tagging-rule/export", name="export_tagging_rule", methods={"GET"})
* @IsGranted("EDIT_CONFIG")
*
* @return Response
*/
#[Route(path: '/tagging-rule/export', name: 'export_tagging_rule', methods: ['GET'])]
public function exportTaggingRulesAction()
{
$data = SerializerBuilder::create()->build()->serialize(

View file

@ -46,11 +46,10 @@ class EntryController extends AbstractController
}
/**
* @Route("/mass", name="mass_action", methods={"POST"})
* @IsGranted("EDIT_ENTRIES")
*
* @return Response
*/
#[Route(path: '/mass', name: 'mass_action', methods: ['POST'])]
public function massAction(Request $request, TagRepository $tagRepository)
{
$values = $request->request->all();
@ -132,14 +131,13 @@ class EntryController extends AbstractController
/**
* @param int $page
*
* @Route("/search/{page}", name="search", methods={"GET", "POST"}, defaults={"page" = 1})
* @IsGranted("LIST_ENTRIES")
*
* Default parameter for page is hardcoded (in duplication of the defaults from the Route)
* because this controller is also called inside the layout template without any page as argument
*
* @return Response
*/
#[Route(path: '/search/{page}', name: 'search', methods: ['GET', 'POST'], defaults: ['page' => 1])]
public function searchFormAction(Request $request, $page = 1, $currentRoute = null)
{
// fallback to retrieve currentRoute from query parameter instead of injected one (when using inside a template)
@ -162,11 +160,10 @@ class EntryController extends AbstractController
}
/**
* @Route("/new-entry", name="new_entry", methods={"GET", "POST"})
* @IsGranted("CREATE_ENTRIES")
*
* @return Response
*/
#[Route(path: '/new-entry', name: 'new_entry', methods: ['GET', 'POST'])]
public function addEntryFormAction(Request $request, TranslatorInterface $translator)
{
$entry = new Entry($this->getUser());
@ -206,11 +203,10 @@ class EntryController extends AbstractController
}
/**
* @Route("/bookmarklet", name="bookmarklet", methods={"GET"})
* @IsGranted("CREATE_ENTRIES")
*
* @return Response
*/
#[Route(path: '/bookmarklet', name: 'bookmarklet', methods: ['GET'])]
public function addEntryViaBookmarkletAction(Request $request)
{
$entry = new Entry($this->getUser());
@ -230,11 +226,10 @@ class EntryController extends AbstractController
}
/**
* @Route("/new", name="new", methods={"GET"})
* @IsGranted("CREATE_ENTRIES")
*
* @return Response
*/
#[Route(path: '/new', name: 'new', methods: ['GET'])]
public function addEntryAction()
{
return $this->render('Entry/new.html.twig');
@ -243,11 +238,10 @@ class EntryController extends AbstractController
/**
* Edit an entry content.
*
* @Route("/edit/{id}", name="edit", methods={"GET", "POST"}, requirements={"id" = "\d+"})
* @IsGranted("EDIT", subject="entry")
*
* @return Response
*/
#[Route(path: '/edit/{id}', name: 'edit', methods: ['GET', 'POST'], requirements: ['id' => '\d+'])]
public function editEntryAction(Request $request, Entry $entry)
{
$form = $this->createForm(EditEntryType::class, $entry);
@ -276,11 +270,10 @@ class EntryController extends AbstractController
*
* @param int $page
*
* @Route("/all/list/{page}", name="all", methods={"GET"}, defaults={"page" = "1"})
* @IsGranted("LIST_ENTRIES")
*
* @return Response
*/
#[Route(path: '/all/list/{page}', name: 'all', methods: ['GET'], defaults: ['page' => '1'])]
public function showAllAction(Request $request, $page)
{
return $this->showEntries('all', $request, $page);
@ -291,11 +284,10 @@ class EntryController extends AbstractController
*
* @param int $page
*
* @Route("/unread/list/{page}", name="unread", methods={"GET"}, defaults={"page" = "1"})
* @IsGranted("LIST_ENTRIES")
*
* @return Response
*/
#[Route(path: '/unread/list/{page}', name: 'unread', methods: ['GET'], defaults: ['page' => '1'])]
public function showUnreadAction(Request $request, $page)
{
// load the quickstart if no entry in database
@ -311,11 +303,10 @@ class EntryController extends AbstractController
*
* @param int $page
*
* @Route("/archive/list/{page}", name="archive", methods={"GET"}, defaults={"page" = "1"})
* @IsGranted("LIST_ENTRIES")
*
* @return Response
*/
#[Route(path: '/archive/list/{page}', name: 'archive', methods: ['GET'], defaults: ['page' => '1'])]
public function showArchiveAction(Request $request, $page)
{
return $this->showEntries('archive', $request, $page);
@ -326,11 +317,10 @@ class EntryController extends AbstractController
*
* @param int $page
*
* @Route("/starred/list/{page}", name="starred", methods={"GET"}, defaults={"page" = "1"})
* @IsGranted("LIST_ENTRIES")
*
* @return Response
*/
#[Route(path: '/starred/list/{page}', name: 'starred', methods: ['GET'], defaults: ['page' => '1'])]
public function showStarredAction(Request $request, $page)
{
return $this->showEntries('starred', $request, $page);
@ -341,11 +331,10 @@ class EntryController extends AbstractController
*
* @param int $page
*
* @Route("/untagged/list/{page}", name="untagged", methods={"GET"}, defaults={"page" = "1"})
* @IsGranted("LIST_ENTRIES")
*
* @return Response
*/
#[Route(path: '/untagged/list/{page}', name: 'untagged', methods: ['GET'], defaults: ['page' => '1'])]
public function showUntaggedEntriesAction(Request $request, $page)
{
return $this->showEntries('untagged', $request, $page);
@ -356,11 +345,10 @@ class EntryController extends AbstractController
*
* @param int $page
*
* @Route("/annotated/list/{page}", name="annotated", methods={"GET"}, defaults={"page" = "1"})
* @IsGranted("LIST_ENTRIES")
*
* @return Response
*/
#[Route(path: '/annotated/list/{page}', name: 'annotated', methods: ['GET'], defaults: ['page' => '1'])]
public function showWithAnnotationsEntriesAction(Request $request, $page)
{
return $this->showEntries('annotated', $request, $page);
@ -369,11 +357,10 @@ class EntryController extends AbstractController
/**
* Shows random entry depending on the given type.
*
* @Route("/{type}/random", name="random_entry", methods={"GET"}, requirements={"type": "unread|starred|archive|untagged|annotated|all"})
* @IsGranted("LIST_ENTRIES")
*
* @return RedirectResponse
*/
#[Route(path: '/{type}/random', name: 'random_entry', methods: ['GET'], requirements: ['type' => 'unread|starred|archive|untagged|annotated|all'])]
public function redirectRandomEntryAction(string $type = 'all')
{
try {
@ -391,11 +378,10 @@ class EntryController extends AbstractController
/**
* Shows entry content.
*
* @Route("/view/{id}", name="view", methods={"GET"}, requirements={"id" = "\d+"})
* @IsGranted("VIEW", subject="entry")
*
* @return Response
*/
#[Route(path: '/view/{id}', name: 'view', methods: ['GET'], requirements: ['id' => '\d+'])]
public function viewAction(Entry $entry)
{
return $this->render(
@ -408,11 +394,10 @@ class EntryController extends AbstractController
* Reload an entry.
* Refetch content from the website and make it readable again.
*
* @Route("/reload/{id}", name="reload_entry", methods={"GET"}, requirements={"id" = "\d+"})
* @IsGranted("RELOAD", subject="entry")
*
* @return RedirectResponse
*/
#[Route(path: '/reload/{id}', name: 'reload_entry', methods: ['GET'], requirements: ['id' => '\d+'])]
public function reloadAction(Entry $entry)
{
$this->updateEntry($entry, 'entry_reloaded');
@ -436,11 +421,10 @@ class EntryController extends AbstractController
/**
* Changes read status for an entry.
*
* @Route("/archive/{id}", name="archive_entry", methods={"GET"}, requirements={"id" = "\d+"})
* @IsGranted("ARCHIVE", subject="entry")
*
* @return RedirectResponse
*/
#[Route(path: '/archive/{id}', name: 'archive_entry', methods: ['GET'], requirements: ['id' => '\d+'])]
public function toggleArchiveAction(Request $request, Entry $entry)
{
$entry->toggleArchive();
@ -464,11 +448,10 @@ class EntryController extends AbstractController
/**
* Changes starred status for an entry.
*
* @Route("/star/{id}", name="star_entry", methods={"GET"}, requirements={"id" = "\d+"})
* @IsGranted("STAR", subject="entry")
*
* @return RedirectResponse
*/
#[Route(path: '/star/{id}', name: 'star_entry', methods: ['GET'], requirements: ['id' => '\d+'])]
public function toggleStarAction(Request $request, Entry $entry)
{
$entry->toggleStar();
@ -493,11 +476,10 @@ class EntryController extends AbstractController
/**
* Deletes entry and redirect to the homepage or the last viewed page.
*
* @Route("/delete/{id}", name="delete_entry", methods={"GET"}, requirements={"id" = "\d+"})
* @IsGranted("DELETE", subject="entry")
*
* @return RedirectResponse
*/
#[Route(path: '/delete/{id}', name: 'delete_entry', methods: ['GET'], requirements: ['id' => '\d+'])]
public function deleteEntryAction(Request $request, Entry $entry)
{
// generates the view url for this entry to check for redirection later
@ -530,11 +512,10 @@ class EntryController extends AbstractController
/**
* Get public URL for entry (and generate it if necessary).
*
* @Route("/share/{id}", name="share", methods={"GET"}, requirements={"id" = "\d+"})
* @IsGranted("SHARE", subject="entry")
*
* @return Response
*/
#[Route(path: '/share/{id}', name: 'share', methods: ['GET'], requirements: ['id' => '\d+'])]
public function shareAction(Entry $entry)
{
if (null === $entry->getUid()) {
@ -552,11 +533,10 @@ class EntryController extends AbstractController
/**
* Disable public sharing for an entry.
*
* @Route("/share/delete/{id}", name="delete_share", methods={"GET"}, requirements={"id" = "\d+"})
* @IsGranted("UNSHARE", subject="entry")
*
* @return Response
*/
#[Route(path: '/share/delete/{id}', name: 'delete_share', methods: ['GET'], requirements: ['id' => '\d+'])]
public function deleteShareAction(Entry $entry)
{
$entry->cleanUid();
@ -572,12 +552,11 @@ class EntryController extends AbstractController
/**
* Ability to view a content publicly.
*
* @Route("/share/{uid}", name="share_entry", methods={"GET"}, requirements={"uid" = ".+"})
* @Cache(maxage="25200", smaxage="25200", public=true)
* @IsGranted("PUBLIC_ACCESS")
*
* @return Response
*/
#[Route(path: '/share/{uid}', name: 'share_entry', methods: ['GET'], requirements: ['uid' => '.+'])]
public function shareEntryAction(Entry $entry, Config $craueConfig)
{
if (!$craueConfig->get('share_public')) {
@ -595,11 +574,10 @@ class EntryController extends AbstractController
*
* @param int $page
*
* @Route("/domain/{id}/{page}", name="same_domain", methods={"GET"}, requirements={"id" = "\d+"}, defaults={"page" = 1})
* @IsGranted("LIST_ENTRIES")
*
* @return Response
*/
#[Route(path: '/domain/{id}/{page}', name: 'same_domain', methods: ['GET'], requirements: ['id' => '\d+'], defaults: ['page' => 1])]
public function getSameDomainEntries(Request $request, $page = 1)
{
return $this->showEntries('same-domain', $request, $page);

View file

@ -21,14 +21,10 @@ class ExportController extends AbstractController
/**
* Gets one entry content.
*
* @Route("/export/{entry}.{format}", name="export_entry", methods={"GET"}, requirements={
* "format": "epub|pdf|json|xml|txt|csv|md",
* "entry": "\d+"
* })
* @IsGranted("EXPORT", subject="entry")
*
* @return Response
*/
#[Route(path: '/export/{entry}.{format}', name: 'export_entry', methods: ['GET'], requirements: ['format' => 'epub|pdf|json|xml|txt|csv|md', 'entry' => '\d+'])]
public function downloadEntryAction(Request $request, EntryRepository $entryRepository, EntriesExport $entriesExport, string $format, Entry $entry)
{
try {
@ -45,14 +41,10 @@ class ExportController extends AbstractController
/**
* Export all entries for current user.
*
* @Route("/export/{category}.{format}", name="export_entries", methods={"GET"}, requirements={
* "format": "epub|pdf|json|xml|txt|csv|md",
* "category": "all|unread|starred|archive|tag_entries|untagged|search|annotated|same_domain"
* })
* @IsGranted("EXPORT_ENTRIES")
*
* @return Response
*/
#[Route(path: '/export/{category}.{format}', name: 'export_entries', methods: ['GET'], requirements: ['format' => 'epub|pdf|json|xml|txt|csv|md', 'category' => 'all|unread|starred|archive|tag_entries|untagged|search|annotated|same_domain'])]
public function downloadEntriesAction(Request $request, EntryRepository $entryRepository, TagRepository $tagRepository, EntriesExport $entriesExport, string $format, string $category, int $entry = 0)
{
$method = ucfirst($category);

View file

@ -28,13 +28,12 @@ class FeedController extends AbstractController
/**
* Shows unread entries for current user.
*
* @Route("/feed/{username}/{token}/unread/{page}", name="unread_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"})
* @IsGranted("PUBLIC_ACCESS")
*
* @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter")
*
* @return Response
*/
#[Route(path: '/feed/{username}/{token}/unread/{page}', name: 'unread_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])]
public function showUnreadFeedAction(User $user, $page)
{
return $this->showEntries('unread', $user, $page);
@ -43,13 +42,12 @@ class FeedController extends AbstractController
/**
* Shows read entries for current user.
*
* @Route("/feed/{username}/{token}/archive/{page}", name="archive_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"})
* @IsGranted("PUBLIC_ACCESS")
*
* @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter")
*
* @return Response
*/
#[Route(path: '/feed/{username}/{token}/archive/{page}', name: 'archive_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])]
public function showArchiveFeedAction(User $user, $page)
{
return $this->showEntries('archive', $user, $page);
@ -58,13 +56,12 @@ class FeedController extends AbstractController
/**
* Shows starred entries for current user.
*
* @Route("/feed/{username}/{token}/starred/{page}", name="starred_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"})
* @IsGranted("PUBLIC_ACCESS")
*
* @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter")
*
* @return Response
*/
#[Route(path: '/feed/{username}/{token}/starred/{page}', name: 'starred_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])]
public function showStarredFeedAction(User $user, $page)
{
return $this->showEntries('starred', $user, $page);
@ -73,13 +70,12 @@ class FeedController extends AbstractController
/**
* Shows all entries for current user.
*
* @Route("/feed/{username}/{token}/all/{page}", name="all_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"})
* @IsGranted("PUBLIC_ACCESS")
*
* @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter")
*
* @return Response
*/
#[Route(path: '/feed/{username}/{token}/all/{page}', name: 'all_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])]
public function showAllFeedAction(User $user, $page)
{
return $this->showEntries('all', $user, $page);
@ -88,14 +84,13 @@ class FeedController extends AbstractController
/**
* Shows entries associated to a tag for current user.
*
* @Route("/feed/{username}/{token}/tags/{slug}/{page}", name="tag_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"})
* @IsGranted("PUBLIC_ACCESS")
*
* @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter")
* @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
*
* @return Response
*/
#[Route(path: '/feed/{username}/{token}/tags/{slug}/{page}', name: 'tag_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])]
public function showTagsFeedAction(Request $request, User $user, Tag $tag, PreparePagerForEntries $preparePagerForEntries, $page)
{
$sort = $request->query->get('sort', 'created');

View file

@ -29,9 +29,9 @@ class IgnoreOriginInstanceRuleController extends AbstractController
/**
* Lists all IgnoreOriginInstanceRule entities.
*
* @Route("/ignore-origin-instance-rules", name="ignore_origin_instance_rules_index", methods={"GET"})
* @IsGranted("LIST_IGNORE_ORIGIN_INSTANCE_RULES")
*/
#[Route(path: '/ignore-origin-instance-rules', name: 'ignore_origin_instance_rules_index', methods: ['GET'])]
public function indexAction(IgnoreOriginInstanceRuleRepository $repository)
{
$rules = $repository->findAll();
@ -44,11 +44,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController
/**
* Creates a new ignore origin instance rule entity.
*
* @Route("/ignore-origin-instance-rules/new", name="ignore_origin_instance_rules_new", methods={"GET", "POST"})
* @IsGranted("CREATE_IGNORE_ORIGIN_INSTANCE_RULES")
*
* @return Response
*/
#[Route(path: '/ignore-origin-instance-rules/new', name: 'ignore_origin_instance_rules_new', methods: ['GET', 'POST'])]
public function newAction(Request $request)
{
$ignoreOriginInstanceRule = new IgnoreOriginInstanceRule();
@ -77,11 +76,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController
/**
* Displays a form to edit an existing ignore origin instance rule entity.
*
* @Route("/ignore-origin-instance-rules/{id}/edit", name="ignore_origin_instance_rules_edit", methods={"GET", "POST"})
* @IsGranted("EDIT", subject="ignoreOriginInstanceRule")
*
* @return Response
*/
#[Route(path: '/ignore-origin-instance-rules/{id}/edit', name: 'ignore_origin_instance_rules_edit', methods: ['GET', 'POST'])]
public function editAction(Request $request, IgnoreOriginInstanceRule $ignoreOriginInstanceRule)
{
$deleteForm = $this->createDeleteForm($ignoreOriginInstanceRule);
@ -110,11 +108,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController
/**
* Deletes a site credential entity.
*
* @Route("/ignore-origin-instance-rules/{id}", name="ignore_origin_instance_rules_delete", methods={"DELETE"})
* @IsGranted("DELETE", subject="ignoreOriginInstanceRule")
*
* @return RedirectResponse
*/
#[Route(path: '/ignore-origin-instance-rules/{id}', name: 'ignore_origin_instance_rules_delete', methods: ['DELETE'])]
public function deleteAction(Request $request, IgnoreOriginInstanceRule $ignoreOriginInstanceRule)
{
$form = $this->createDeleteForm($ignoreOriginInstanceRule);

View file

@ -14,11 +14,10 @@ use Wallabag\Import\ImportInterface;
abstract class BrowserController extends AbstractController
{
/**
* @Route("/import/browser", name="import_browser", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*
* @return Response
*/
#[Route(path: '/import/browser', name: 'import_browser', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
$form = $this->createForm(UploadImportType::class);

View file

@ -22,9 +22,9 @@ class ChromeController extends BrowserController
}
/**
* @Route("/import/chrome", name="import_chrome", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/chrome', name: 'import_chrome', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
return parent::indexAction($request, $translator);

View file

@ -22,9 +22,9 @@ class DeliciousController extends AbstractController
}
/**
* @Route("/import/delicious", name="import_delicious", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/delicious', name: 'import_delicious', methods: ['GET', 'POST'])]
public function indexAction(Request $request, DeliciousImport $delicious, Config $craueConfig, TranslatorInterface $translator)
{
$form = $this->createForm(UploadImportType::class);

View file

@ -22,9 +22,9 @@ class ElcuratorController extends WallabagController
}
/**
* @Route("/import/elcurator", name="import_elcurator", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/elcurator', name: 'import_elcurator', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
return parent::indexAction($request, $translator);

View file

@ -22,9 +22,9 @@ class FirefoxController extends BrowserController
}
/**
* @Route("/import/firefox", name="import_firefox", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/firefox', name: 'import_firefox', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
return parent::indexAction($request, $translator);

View file

@ -14,11 +14,10 @@ use Wallabag\Import\ImportInterface;
abstract class HtmlController extends AbstractController
{
/**
* @Route("/import/html", name="import_html", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*
* @return Response
*/
#[Route(path: '/import/html', name: 'import_html', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
$form = $this->createForm(UploadImportType::class);

View file

@ -20,9 +20,9 @@ class ImportController extends AbstractController
}
/**
* @Route("/import/", name="import", methods={"GET"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/', name: 'import', methods: ['GET'])]
public function importAction(ImportChain $importChain)
{
return $this->render('Import/index.html.twig', [

View file

@ -22,9 +22,9 @@ class InstapaperController extends AbstractController
}
/**
* @Route("/import/instapaper", name="import_instapaper", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/instapaper', name: 'import_instapaper', methods: ['GET', 'POST'])]
public function indexAction(Request $request, InstapaperImport $instapaper, Config $craueConfig, TranslatorInterface $translator)
{
$form = $this->createForm(UploadImportType::class);

View file

@ -22,9 +22,9 @@ class OmnivoreController extends AbstractController
}
/**
* @Route("/import/omnivore", name="import_omnivore", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/omnivore', name: 'import_omnivore', methods: ['GET', 'POST'])]
public function indexAction(Request $request, OmnivoreImport $omnivore, Config $craueConfig, TranslatorInterface $translator)
{
$form = $this->createForm(UploadImportType::class);

View file

@ -22,9 +22,9 @@ class PinboardController extends AbstractController
}
/**
* @Route("/import/pinboard", name="import_pinboard", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/pinboard', name: 'import_pinboard', methods: ['GET', 'POST'])]
public function indexAction(Request $request, PinboardImport $pinboard, Config $craueConfig, TranslatorInterface $translator)
{
$form = $this->createForm(UploadImportType::class);

View file

@ -26,9 +26,9 @@ class PocketController extends AbstractController
}
/**
* @Route("/import/pocket", name="import_pocket", methods={"GET"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/pocket', name: 'import_pocket', methods: ['GET'])]
public function indexAction(PocketImport $pocketImport)
{
$pocket = $this->getPocketImportService($pocketImport);
@ -48,9 +48,9 @@ class PocketController extends AbstractController
}
/**
* @Route("/import/pocket/auth", name="import_pocket_auth", methods={"POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/pocket/auth', name: 'import_pocket_auth', methods: ['POST'])]
public function authAction(Request $request, PocketImport $pocketImport)
{
$requestToken = $this->getPocketImportService($pocketImport)
@ -79,9 +79,9 @@ class PocketController extends AbstractController
}
/**
* @Route("/import/pocket/callback", name="import_pocket_callback", methods={"GET"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/pocket/callback', name: 'import_pocket_callback', methods: ['GET'])]
public function callbackAction(PocketImport $pocketImport, TranslatorInterface $translator)
{
$message = 'flashes.import.notice.failed';

View file

@ -22,9 +22,9 @@ class PocketHtmlController extends HtmlController
}
/**
* @Route("/import/pocket_html", name="import_pocket_html", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/pocket_html', name: 'import_pocket_html', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
return parent::indexAction($request, $translator);

View file

@ -22,9 +22,9 @@ class ReadabilityController extends AbstractController
}
/**
* @Route("/import/readability", name="import_readability", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/readability', name: 'import_readability', methods: ['GET', 'POST'])]
public function indexAction(Request $request, ReadabilityImport $readability, Config $craueConfig, TranslatorInterface $translator)
{
$form = $this->createForm(UploadImportType::class);

View file

@ -22,9 +22,9 @@ class ShaarliController extends HtmlController
}
/**
* @Route("/import/shaarli", name="import_shaarli", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/shaarli', name: 'import_shaarli', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
return parent::indexAction($request, $translator);

View file

@ -22,9 +22,9 @@ class WallabagV1Controller extends WallabagController
}
/**
* @Route("/import/wallabag-v1", name="import_wallabag_v1", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/wallabag-v1', name: 'import_wallabag_v1', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
return parent::indexAction($request, $translator);

View file

@ -22,9 +22,9 @@ class WallabagV2Controller extends WallabagController
}
/**
* @Route("/import/wallabag-v2", name="import_wallabag_v2", methods={"GET", "POST"})
* @IsGranted("IMPORT_ENTRIES")
*/
#[Route(path: '/import/wallabag-v2', name: 'import_wallabag_v2', methods: ['GET', 'POST'])]
public function indexAction(Request $request, TranslatorInterface $translator)
{
return parent::indexAction($request, $translator);

View file

@ -34,9 +34,9 @@ class SiteCredentialController extends AbstractController
/**
* Lists all User entities.
*
* @Route("/site-credentials", name="site_credentials_index", methods={"GET"})
* @IsGranted("LIST_SITE_CREDENTIALS")
*/
#[Route(path: '/site-credentials', name: 'site_credentials_index', methods: ['GET'])]
public function indexAction(SiteCredentialRepository $repository)
{
$this->isSiteCredentialsEnabled();
@ -51,11 +51,10 @@ class SiteCredentialController extends AbstractController
/**
* Creates a new site credential entity.
*
* @Route("/site-credentials/new", name="site_credentials_new", methods={"GET", "POST"})
* @IsGranted("CREATE_SITE_CREDENTIALS")
*
* @return Response
*/
#[Route(path: '/site-credentials/new', name: 'site_credentials_new', methods: ['GET', 'POST'])]
public function newAction(Request $request)
{
$this->isSiteCredentialsEnabled();
@ -89,11 +88,10 @@ class SiteCredentialController extends AbstractController
/**
* Displays a form to edit an existing site credential entity.
*
* @Route("/site-credentials/{id}/edit", name="site_credentials_edit", methods={"GET", "POST"})
* @IsGranted("EDIT", subject="siteCredential")
*
* @return Response
*/
#[Route(path: '/site-credentials/{id}/edit', name: 'site_credentials_edit', methods: ['GET', 'POST'])]
public function editAction(Request $request, SiteCredential $siteCredential)
{
$this->isSiteCredentialsEnabled();
@ -127,11 +125,10 @@ class SiteCredentialController extends AbstractController
/**
* Deletes a site credential entity.
*
* @Route("/site-credentials/{id}", name="site_credentials_delete", methods={"DELETE"})
* @IsGranted("DELETE", subject="siteCredential")
*
* @return RedirectResponse
*/
#[Route(path: '/site-credentials/{id}', name: 'site_credentials_delete', methods: ['DELETE'])]
public function deleteAction(Request $request, SiteCredential $siteCredential)
{
$this->isSiteCredentialsEnabled();

View file

@ -8,9 +8,9 @@ use Symfony\Component\Routing\Annotation\Route;
class StaticController extends AbstractController
{
/**
* @Route("/howto", name="howto", methods={"GET"})
* @IsGranted("IS_AUTHENTICATED_FULLY")
*/
#[Route(path: '/howto', name: 'howto', methods: ['GET'])]
public function howtoAction()
{
$addonsUrl = $this->getParameter('addons_url');
@ -24,9 +24,9 @@ class StaticController extends AbstractController
}
/**
* @Route("/about", name="about", methods={"GET"})
* @IsGranted("IS_AUTHENTICATED_FULLY")
*/
#[Route(path: '/about', name: 'about', methods: ['GET'])]
public function aboutAction()
{
return $this->render(
@ -39,9 +39,9 @@ class StaticController extends AbstractController
}
/**
* @Route("/quickstart", name="quickstart", methods={"GET"})
* @IsGranted("IS_AUTHENTICATED_FULLY")
*/
#[Route(path: '/quickstart', name: 'quickstart', methods: ['GET'])]
public function quickstartAction()
{
return $this->render(

View file

@ -34,11 +34,10 @@ class TagController extends AbstractController
}
/**
* @Route("/new-tag/{entry}", name="new_tag", methods={"POST"}, requirements={"entry" = "\d+"})
* @IsGranted("TAG", subject="entry")
*
* @return Response
*/
#[Route(path: '/new-tag/{entry}', name: 'new_tag', methods: ['POST'], requirements: ['entry' => '\d+'])]
public function addTagFormAction(Request $request, Entry $entry, TranslatorInterface $translator)
{
$form = $this->createForm(NewTagType::class, new Tag());
@ -84,11 +83,10 @@ class TagController extends AbstractController
/**
* Removes tag from entry.
*
* @Route("/remove-tag/{entry}/{tag}", name="remove_tag", methods={"GET"}, requirements={"entry" = "\d+", "tag" = "\d+"})
* @IsGranted("UNTAG", subject="entry")
*
* @return Response
*/
#[Route(path: '/remove-tag/{entry}/{tag}', name: 'remove_tag', methods: ['GET'], requirements: ['entry' => '\d+', 'tag' => '\d+'])]
public function removeTagFromEntry(Request $request, Entry $entry, Tag $tag)
{
$entry->removeTag($tag);
@ -108,11 +106,10 @@ class TagController extends AbstractController
/**
* Shows tags for current user.
*
* @Route("/tag/list", name="tag", methods={"GET"})
* @IsGranted("LIST_TAGS")
*
* @return Response
*/
#[Route(path: '/tag/list', name: 'tag', methods: ['GET'])]
public function showTagAction(TagRepository $tagRepository, EntryRepository $entryRepository)
{
$allTagsWithNbEntries = $tagRepository->findAllTagsWithNbEntries($this->getUser()->getId());
@ -133,13 +130,12 @@ class TagController extends AbstractController
/**
* @param int $page
*
* @Route("/tag/list/{slug}/{page}", name="tag_entries", methods={"GET"}, defaults={"page" = "1"})
* @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
* @IsGranted("LIST_ENTRIES")
* @IsGranted("VIEW", subject="tag")
*
* @return Response
*/
#[Route(path: '/tag/list/{slug}/{page}', name: 'tag_entries', methods: ['GET'], defaults: ['page' => '1'])]
public function showEntriesForTagAction(Tag $tag, EntryRepository $entryRepository, PreparePagerForEntries $preparePagerForEntries, $page, Request $request)
{
$entriesByTag = $entryRepository->findAllByTagId(
@ -174,12 +170,11 @@ class TagController extends AbstractController
* Rename a given tag with a new label
* Create a new tag with the new name and drop the old one.
*
* @Route("/tag/rename/{slug}", name="tag_rename", methods={"POST"})
* @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
* @IsGranted("EDIT", subject="tag")
*
* @return Response
*/
#[Route(path: '/tag/rename/{slug}', name: 'tag_rename', methods: ['POST'])]
public function renameTagAction(Tag $tag, Request $request, TagRepository $tagRepository, EntryRepository $entryRepository)
{
$form = $this->createForm(RenameTagType::class, new Tag());
@ -228,11 +223,10 @@ class TagController extends AbstractController
/**
* Tag search results with the current search term.
*
* @Route("/tag/search/{filter}", name="tag_this_search", methods={"GET"})
* @IsGranted("CREATE_TAGS")
*
* @return Response
*/
#[Route(path: '/tag/search/{filter}', name: 'tag_this_search', methods: ['GET'])]
public function tagThisSearchAction($filter, Request $request, EntryRepository $entryRepository)
{
$currentRoute = $request->query->has('currentRoute') ? $request->query->get('currentRoute') : '';
@ -264,12 +258,11 @@ class TagController extends AbstractController
/**
* Delete a given tag for the current user.
*
* @Route("/tag/delete/{slug}", name="tag_delete", methods={"GET"})
* @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
* @IsGranted("DELETE", subject="tag")
*
* @return Response
*/
#[Route(path: '/tag/delete/{slug}', name: 'tag_delete', methods: ['GET'])]
public function removeTagAction(Tag $tag, Request $request, EntryRepository $entryRepository)
{
foreach ($tag->getEntriesByUserId($this->getUser()->getId()) as $entry) {

View file

@ -38,9 +38,9 @@ class UserController extends AbstractController
/**
* Creates a new User entity.
*
* @Route("/users/new", name="user_new", methods={"GET", "POST"})
* @IsGranted("CREATE_USERS")
*/
#[Route(path: '/users/new', name: 'user_new', methods: ['GET', 'POST'])]
public function newAction(Request $request, UserManagerInterface $userManager, EventDispatcherInterface $eventDispatcher)
{
$user = $userManager->createUser();
@ -75,9 +75,9 @@ class UserController extends AbstractController
/**
* Displays a form to edit an existing User entity.
*
* @Route("/users/{id}/edit", name="user_edit", methods={"GET", "POST"})
* @IsGranted("EDIT", subject="user")
*/
#[Route(path: '/users/{id}/edit', name: 'user_edit', methods: ['GET', 'POST'])]
public function editAction(Request $request, User $user, UserManagerInterface $userManager, GoogleAuthenticatorInterface $googleAuthenticator)
{
$deleteForm = $this->createDeleteForm($user);
@ -118,9 +118,9 @@ class UserController extends AbstractController
/**
* Deletes a User entity.
*
* @Route("/users/{id}", name="user_delete", methods={"DELETE"})
* @IsGranted("DELETE", subject="user")
*/
#[Route(path: '/users/{id}', name: 'user_delete', methods: ['DELETE'])]
public function deleteAction(Request $request, User $user)
{
$form = $this->createDeleteForm($user);
@ -142,14 +142,13 @@ class UserController extends AbstractController
/**
* @param int $page
*
* @Route("/users/list/{page}", name="user_index", methods={"GET"}, defaults={"page" = 1})
* @IsGranted("LIST_USERS")
*
* Default parameter for page is hardcoded (in duplication of the defaults from the Route)
* because this controller is also called inside the layout template without any page as argument
*
* @return Response
*/
#[Route(path: '/users/list/{page}', name: 'user_index', methods: ['GET'], defaults: ['page' => 1])]
public function searchFormAction(Request $request, UserRepository $userRepository, $page = 1)
{
$qb = $userRepository->createQueryBuilder('u');

View file

@ -55,14 +55,10 @@ class Annotation
/**
* @var string
*
* @Assert\Length(
* max = 10000,
* maxMessage = "validator.quote_length_too_high"
* )
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'quote', type: 'text')]
#[Assert\Length(max: 10000, maxMessage: 'validator.quote_length_too_high')]
private $quote;
/**

View file

@ -32,26 +32,20 @@ class Config
/**
* @var int
*
* @Assert\NotBlank()
* @Assert\Range(
* min = 1,
* max = 100000,
* maxMessage = "validator.item_per_page_too_high"
* )
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'items_per_page', type: 'integer', nullable: false)]
#[Assert\NotBlank]
#[Assert\Range(min: 1, max: 100000, maxMessage: 'validator.item_per_page_too_high')]
private $itemsPerPage;
/**
* @var string
*
* @Assert\NotBlank()
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'language', type: 'string', nullable: false)]
#[Assert\NotBlank]
private $language;
/**
@ -65,14 +59,10 @@ class Config
/**
* @var int|null
*
* @Assert\Range(
* min = 1,
* max = 100000,
* maxMessage = "validator.feed_limit_too_high"
* )
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'feed_limit', type: 'integer', nullable: true)]
#[Assert\Range(min: 1, max: 100000, maxMessage: 'validator.feed_limit_too_high')]
private $feedLimit;
/**

View file

@ -68,14 +68,11 @@ class Entry
*
* @var string|null
*
* @Assert\NotBlank()
* @Assert\Url(
* message = "The url '{{ value }}' is not a valid url",
* )
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'url', type: 'text', nullable: true)]
#[Assert\NotBlank]
#[Assert\Url(message: "The url '{{ value }}' is not a valid url")]
private $url;
/**

View file

@ -25,14 +25,14 @@ class IgnoreOriginInstanceRule implements IgnoreOriginRuleInterface, RuleInterfa
/**
* @var string
*
* @Assert\NotBlank()
* @Assert\Length(max=255)
* @RulerZAssert\ValidRule(
* allowed_variables={"host","_all"},
* allowed_operators={"=","~"}
* )
*/
#[ORM\Column(name: 'rule', type: 'string', nullable: false)]
#[Assert\NotBlank]
#[Assert\Length(max: 255)]
private $rule;
/**

View file

@ -25,14 +25,14 @@ class IgnoreOriginUserRule implements IgnoreOriginRuleInterface, RuleInterface
/**
* @var string
*
* @Assert\NotBlank()
* @Assert\Length(max=255)
* @RulerZAssert\ValidRule(
* allowed_variables={"host","_all"},
* allowed_operators={"=","~"}
* )
*/
#[ORM\Column(name: 'rule', type: 'string', nullable: false)]
#[Assert\NotBlank]
#[Assert\Length(max: 255)]
private $rule;
#[ORM\JoinColumn(nullable: false)]

View file

@ -27,27 +27,24 @@ class SiteCredential
/**
* @var string
*
* @Assert\NotBlank()
* @Assert\Length(max=255)
*/
#[ORM\Column(name: 'host', type: 'string', length: 255)]
#[Assert\NotBlank]
#[Assert\Length(max: 255)]
private $host;
/**
* @var string
*
* @Assert\NotBlank()
*/
#[ORM\Column(name: 'username', type: 'text')]
#[Assert\NotBlank]
private $username;
/**
* @var string
*
* @Assert\NotBlank()
*/
#[ORM\Column(name: 'password', type: 'text')]
#[Assert\NotBlank]
private $password;
/**

View file

@ -30,8 +30,6 @@ class TaggingRule implements RuleInterface
/**
* @var string
*
* @Assert\NotBlank()
* @Assert\Length(max=255)
* @RulerZAssert\ValidRule(
* allowed_variables={"title", "url", "isArchived", "isStarred", "content", "language", "mimetype", "readingTime", "domainName"},
* allowed_operators={">", "<", ">=", "<=", "=", "is", "!=", "and", "not", "or", "matches", "notmatches"}
@ -40,16 +38,17 @@ class TaggingRule implements RuleInterface
* @Groups({"export_tagging_rule"})
*/
#[ORM\Column(name: 'rule', type: 'string', nullable: false)]
#[Assert\NotBlank]
#[Assert\Length(max: 255)]
private $rule;
/**
* @var array<string>
*
* @Assert\NotBlank()
*
* @Groups({"export_tagging_rule"})
*/
#[ORM\Column(name: 'tags', type: 'simple_array', nullable: false)]
#[Assert\NotBlank]
private $tags = [];
/**

View file

@ -22,13 +22,12 @@ use Wallabag\Repository\UserRepository;
* User.
*
* @XmlRoot("user")
*
* @UniqueEntity("email")
* @UniqueEntity("username")
*/
#[ORM\Table(name: '`user`')]
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\HasLifecycleCallbacks]
#[UniqueEntity('email')]
#[UniqueEntity('username')]
class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorInterface, BackupCodeInterface
{
use EntityTimestampsTrait;

View file

@ -7,7 +7,6 @@ use OldSound\RabbitMqBundle\RabbitMq\ProducerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Wallabag\Entity\Entry;
use Wallabag\Entity\Tag;
use Wallabag\Entity\User;
use Wallabag\Event\EntrySavedEvent;
use Wallabag\Helper\ContentProxy;