diff --git a/app/Text/TextController.php b/app/Text/TextController.php new file mode 100644 index 0000000..500986e --- /dev/null +++ b/app/Text/TextController.php @@ -0,0 +1,53 @@ +textRepository->getAll(); + + $data = array_map(fn($text) => [ + 'id' => $text->getId(), + 'name' => $text->getName(), + ], $texts); + + $response->getBody()->write(json_encode($data)); + return $response->withHeader('Content-Type', 'application/json'); + } + + public function createText( + Request $request, + Response $response, + CreateText $createTextUseCase, + ): Response { + $data = $request->getParsedBody(); + $name = $data['name'] ?? ''; + + if (!empty($name)) { + $text = $createTextUseCase->execute(new CreateTextRequest( + name: $name, + )); + + $response->getBody()->write(json_encode([ + 'id' => $text->getId(), + 'name' => $text->getName(), + ])); + return $response->withHeader('Content-Type', 'application/json'); + } + + $response->getBody()->write(json_encode(['error' => 'Name is required'])); + return $response->withStatus(400); + } +} diff --git a/app/View/ViewController.php b/app/View/ViewController.php index e6c6196..0ee00ea 100644 --- a/app/View/ViewController.php +++ b/app/View/ViewController.php @@ -2,19 +2,10 @@ namespace App\View; -use App\Text\CreateTextDto; -use App\Text\TextRepository; -use App\Text\UseCases\CreateText; -use App\Text\UseCases\CreateTextRequest; use Psr\Http\Message\ResponseInterface as Response; -use Psr\Http\Message\ServerRequestInterface as Request; class ViewController { - public function __construct( - private TextRepository $textRepository, - ) {} - public function admin(Response $response): Response { $html = file_get_contents(__DIR__.'/../../views/templates/admin.php', true); @@ -25,34 +16,9 @@ class ViewController public function texts(Response $response): Response { - $texts = $this->textRepository->getAll(); - - $textsList = ''; - foreach ($texts as $text) { - $textsList .= '
  • ' . htmlspecialchars($text->getName()) . '
  • '; - } - $html = file_get_contents(__DIR__.'/../../views/templates/texts.php', true); - $html = str_replace('{{texts}}', $textsList, $html); $response->getBody()->write($html); return $response; } - - public function createText( - Request $request, - Response $response, - CreateText $createTextUseCase, - ): Response { - $data = $request->getParsedBody(); - $name = $data['name'] ?? ''; - - if (!empty($name)) { - $createTextUseCase->execute(new CreateTextRequest( - name: $name, - )); - } - - return $response->withHeader('Location', '/admin/texts')->withStatus(302); - } } diff --git a/bootstrap/app.php b/bootstrap/app.php index 3299b05..ddc3dcd 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -4,6 +4,7 @@ use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use DI\Bridge\Slim\Bridge; use App\View\ViewController; +use App\Text\TextController; $container = require __DIR__.'/container.php'; $app = Bridge::create($container); @@ -13,6 +14,8 @@ $app->addErrorMiddleware(true, true, true); $app->get('/admin', [ViewController::class, 'admin']); $app->get('/admin/texts', [ViewController::class, 'texts']); -$app->post('/admin/texts', [ViewController::class, 'createText']); + +$app->get('/api/texts', [TextController::class, 'getTexts']); +$app->post('/api/texts', [TextController::class, 'createText']); return $app; diff --git a/public/js/texts.js b/public/js/texts.js new file mode 100644 index 0000000..9421c20 --- /dev/null +++ b/public/js/texts.js @@ -0,0 +1,28 @@ +document.addEventListener('DOMContentLoaded', () => { + const textsList = document.getElementById('texts-list'); + const form = document.getElementById('texts-form'); + + async function loadTexts() { + const res = await fetch('/api/texts'); + const texts = await res.json(); + textsList.innerHTML = texts.map(text => '
  • ' + text.name + '
  • ').join(''); + } + + form.addEventListener('submit', async (e) => { + e.preventDefault(); + const formData = new FormData(form); + const res = await fetch('/api/texts', { + method: 'POST', + body: formData, + }); + if (res.ok) { + const text = await res.json(); + const li = document.createElement('li'); + li.textContent = text.name; + textsList.appendChild(li); + form.reset(); + } + }); + + loadTexts(); +}); diff --git a/views/templates/texts.php b/views/templates/texts.php index 24c2c92..f8e8d7d 100644 --- a/views/templates/texts.php +++ b/views/templates/texts.php @@ -7,11 +7,11 @@

    Texts

    Back to Admin -
    +
    + - + \ No newline at end of file