<?php declare(strict_types=1); namespace Lewisdale\App\Controllers; use Doctrine\Persistence\ObjectRepository; use Lewisdale\App\Models\Repositories\FeedRepository; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; use Slim\Views\Twig; class FeedController { public function __construct( private readonly Twig $view, private readonly LoggerInterface $logger, private readonly FeedRepository $feedRepository ) {} public function get(ServerRequestInterface $request, ResponseInterface $response) { $this->logger->info("FeedController::get() called"); $feeds = $this->feedRepository->findBy([], ['title' => 'ASC']); return $this->view->render($response, 'feed/index.twig.html', ['feeds' => $feeds]); } public function get_feed(ServerRequestInterface $request, ResponseInterface $response) { $this->logger->info("FeedController::get_feed() called"); $feed = $this->feedRepository->find($request->getAttribute('id')); if (empty($feed)) { return $response->withStatus(404); } $filtered = $feed->get_filtered_feed(); $body = $response->getBody(); $body->write($filtered->asXML()); $this->feedRepository->save($feed); return $response->withHeader('Content-Type', 'application/rss+xml') ->withBody($body) ->withStatus(200); } public function create(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface { $this->logger->info("FeedController::create() called"); $body = $request->getParsedBody(); return $this->view->render($response, 'create.twig.html'); } public function delete(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface { $this->logger->info("FeedController::delete() called"); $feed = $this->feedRepository->find($request->getAttribute('id')); if (empty($feed)) { return $response->withStatus(404); } $this->feedRepository->delete($feed); return $response->withStatus(201)->withHeader('Location', '/feed'); } }