From 5dd27a4b7b121baf93ac2ead10f2a167404de1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Gangloff?= Date: Wed, 14 Aug 2024 23:23:32 +0200 Subject: [PATCH] feat: add watchlist patch with limitations --- assets/utils/api/watchlist.ts | 14 +++++- src/Controller/WatchListController.php | 63 +++++++++++++++++++------- src/Entity/WatchList.php | 33 ++++++++------ src/Entity/WatchListTrigger.php | 4 +- 4 files changed, 82 insertions(+), 32 deletions(-) diff --git a/assets/utils/api/watchlist.ts b/assets/utils/api/watchlist.ts index db97e23..d05baf3 100644 --- a/assets/utils/api/watchlist.ts +++ b/assets/utils/api/watchlist.ts @@ -1,4 +1,4 @@ -import {Event, request, Watchlist} from "./index"; +import {request, Watchlist} from "./index"; export async function getWatchlists() { const response = await request({ @@ -32,3 +32,15 @@ export async function deleteWatchlist(token: string): Promise { url: 'watchlists/' + token }) } + +export async function patchWatchlist(watchlist: Partial & { token: string }) { + const response = await request({ + method: 'PATCH', + url: 'watchlists/' + watchlist.token, + data: watchlist, + headers: { + "Content-Type": 'application/merge-patch+json' + } + }) + return response.data +} diff --git a/src/Controller/WatchListController.php b/src/Controller/WatchListController.php index dbc5237..f10e915 100644 --- a/src/Controller/WatchListController.php +++ b/src/Controller/WatchListController.php @@ -44,22 +44,8 @@ class WatchListController extends AbstractController ) { } - /** - * @throws \Exception - */ - #[Route( - path: '/api/watchlists', - name: 'watchlist_create', - defaults: [ - '_api_resource_class' => WatchList::class, - '_api_operation_name' => 'create', - ], - methods: ['POST'] - )] - public function createWatchList(Request $request): WatchList + public function verifyLimitations(WatchList $watchList) { - $watchList = $this->serializer->deserialize($request->getContent(), WatchList::class, 'json', ['groups' => 'watchlist:create']); - /** @var User $user */ $user = $this->getUser(); $watchList->setUser($user); @@ -99,8 +85,53 @@ class WatchListController extends AbstractController } } } + } - $this->logger->info('User {username} register a Watchlist ({token}).', [ + /** + * @throws \Exception + */ + #[Route( + path: '/api/watchlists', + name: 'watchlist_create', + defaults: [ + '_api_resource_class' => WatchList::class, + '_api_operation_name' => 'create', + ], + methods: ['POST'] + )] + public function createWatchList(Request $request): WatchList + { + $watchList = $this->serializer->deserialize($request->getContent(), WatchList::class, 'json', ['groups' => 'watchlist:create']); + $this->verifyLimitations($watchList); + + $user = $this->getUser(); + $this->logger->info('User {username} registers a Watchlist ({token}).', [ + 'username' => $user->getUserIdentifier(), + 'token' => $watchList->getToken(), + ]); + + $this->em->persist($watchList); + $this->em->flush(); + + return $watchList; + } + + #[Route( + path: '/api/watchlists/{token}', + name: 'watchlist_update', + defaults: [ + '_api_resource_class' => WatchList::class, + '_api_operation_name' => 'update', + ], + methods: ['PATCH'] + )] + public function patchWatchList(Request $request): WatchList + { + $watchList = $this->serializer->deserialize($request->getContent(), WatchList::class, 'json', ['groups' => 'watchlist:create']); + $this->verifyLimitations($watchList); + + $user = $this->getUser(); + $this->logger->info('User {username} updates a Watchlist ({token}).', [ 'username' => $user->getUserIdentifier(), 'token' => $watchList->getToken(), ]); diff --git a/src/Entity/WatchList.php b/src/Entity/WatchList.php index 48b4e60..1bd921c 100644 --- a/src/Entity/WatchList.php +++ b/src/Entity/WatchList.php @@ -27,7 +27,16 @@ use Symfony\Component\Uid\Uuid; name: 'get_all_mine', ), new Get( - normalizationContext: ['groups' => 'watchlist:item'], + normalizationContext: ['groups' => [ + 'watchlist:item', + 'domain:item', + 'event:list', + 'domain-entity:entity', + 'nameserver-entity:nameserver', + 'nameserver-entity:entity', + 'tld:item', + ], + ], security: 'object.user == user' ), new Get( @@ -58,26 +67,24 @@ use Symfony\Component\Uid\Uuid; denormalizationContext: ['groups' => 'watchlist:create'], name: 'create' ), - /* new Patch( + routeName: 'watchlist_update', normalizationContext: ['groups' => 'watchlist:item'], - denormalizationContext: ['groups' => 'watchlist:update'] + denormalizationContext: ['groups' => 'watchlist:create'], + name: 'update' ), - */ new Delete(), ], )] class WatchList { + #[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'watchLists')] + #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')] + public ?User $user = null; #[ORM\Id] #[ORM\Column(type: 'uuid')] #[Groups(['watchlist:item', 'watchlist:list'])] private string $token; - - #[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'watchLists')] - #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')] - public ?User $user = null; - /** * @var Collection */ @@ -85,23 +92,23 @@ class WatchList #[ORM\JoinTable(name: 'watch_lists_domains', joinColumns: [new ORM\JoinColumn(name: 'watch_list_token', referencedColumnName: 'token', onDelete: 'CASCADE')], inverseJoinColumns: [new ORM\JoinColumn(name: 'domain_ldh_name', referencedColumnName: 'ldh_name', onDelete: 'CASCADE')])] - #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])] + #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create'])] private Collection $domains; /** * @var Collection */ #[ORM\OneToMany(targetEntity: WatchListTrigger::class, mappedBy: 'watchList', cascade: ['persist'], orphanRemoval: true)] - #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])] + #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create'])] #[SerializedName('triggers')] private Collection $watchListTriggers; #[ORM\ManyToOne(inversedBy: 'watchLists')] - #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])] + #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create'])] private ?Connector $connector = null; #[ORM\Column(length: 255, nullable: true)] - #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])] + #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create'])] private ?string $name = null; #[ORM\Column] diff --git a/src/Entity/WatchListTrigger.php b/src/Entity/WatchListTrigger.php index d40b265..ce92512 100644 --- a/src/Entity/WatchListTrigger.php +++ b/src/Entity/WatchListTrigger.php @@ -12,7 +12,7 @@ class WatchListTrigger { #[ORM\Id] #[ORM\Column(length: 255)] - #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])] + #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create'])] private ?string $event = null; #[ORM\Id] @@ -22,7 +22,7 @@ class WatchListTrigger #[ORM\Id] #[ORM\Column(enumType: TriggerAction::class)] - #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])] + #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create'])] private ?TriggerAction $action = null; public function getEvent(): ?string