You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.8 KiB
112 lines
3.8 KiB
<?php |
|
|
|
declare(strict_types=1); |
|
|
|
namespace AutoStore\WebApi\Controllers; |
|
|
|
use AutoStore\Application\Exceptions\ApplicationException; |
|
use AutoStore\Application\Commands\AddItem; |
|
use AutoStore\Application\Commands\DeleteItem; |
|
use AutoStore\Application\Queries\GetItem; |
|
use AutoStore\Application\Queries\ListItems; |
|
use Psr\Http\Message\ResponseInterface as Response; |
|
use Psr\Http\Message\ServerRequestInterface as Request; |
|
|
|
class StoreController extends BaseController |
|
{ |
|
private AddItem $addItem; |
|
private GetItem $getItem; |
|
private ListItems $listItems; |
|
private DeleteItem $deleteItem; |
|
|
|
public function __construct( |
|
AddItem $addItem, |
|
GetItem $getItem, |
|
ListItems $listItems, |
|
DeleteItem $deleteItem |
|
) { |
|
$this->addItem = $addItem; |
|
$this->getItem = $getItem; |
|
$this->listItems = $listItems; |
|
$this->deleteItem = $deleteItem; |
|
} |
|
|
|
public function addItem(Request $request, Response $response): Response |
|
{ |
|
try { |
|
$userId = $request->getAttribute('userId'); |
|
$data = $request->getParsedBody(); |
|
|
|
if (!isset($data['name'], $data['expirationDate'], $data['orderUrl'])) { |
|
return $this->createErrorResponse($response, 'Missing required fields', 400); |
|
} |
|
|
|
$itemId = $this->addItem->execute( |
|
$data['name'], |
|
$data['expirationDate'], |
|
$data['orderUrl'], |
|
$userId |
|
); |
|
|
|
return $this->createSuccessResponse($response, ['id' => $itemId], 201); |
|
} catch (ApplicationException $e) { |
|
return $this->createErrorResponse($response, $e->getMessage(), 400); |
|
} catch (\Exception $e) { |
|
return $this->createErrorResponse($response, 'Internal server error', 500); |
|
} |
|
} |
|
|
|
public function getItem(Request $request, Response $response, array $args): Response |
|
{ |
|
try { |
|
$userId = $request->getAttribute('userId'); |
|
$itemId = $args['id'] ?? ''; |
|
|
|
if (empty($itemId)) { |
|
return $this->createErrorResponse($response, 'Item ID is required', 400); |
|
} |
|
|
|
$itemData = $this->getItem->execute($itemId, $userId); |
|
|
|
return $this->createSuccessResponse($response, $itemData); |
|
} catch (ApplicationException $e) { |
|
return $this->createErrorResponse($response, $e->getMessage(), 404); |
|
} catch (\Exception $e) { |
|
return $this->createErrorResponse($response, 'Internal server error', 500); |
|
} |
|
} |
|
|
|
public function listItems(Request $request, Response $response): Response |
|
{ |
|
try { |
|
$userId = $request->getAttribute('userId'); |
|
$items = $this->listItems->execute($userId); |
|
|
|
return $this->createSuccessResponse($response, $items); |
|
} catch (ApplicationException $e) { |
|
return $this->createErrorResponse($response, $e->getMessage(), 400); |
|
} catch (\Exception $e) { |
|
return $this->createErrorResponse($response, 'Internal server error', 500); |
|
} |
|
} |
|
|
|
public function deleteItem(Request $request, Response $response, array $args): Response |
|
{ |
|
try { |
|
$userId = $request->getAttribute('userId'); |
|
$itemId = $args['id'] ?? ''; |
|
|
|
if (empty($itemId)) { |
|
return $this->createErrorResponse($response, 'Item ID is required', 400); |
|
} |
|
|
|
$this->deleteItem->execute($itemId, $userId); |
|
|
|
return $this->createSuccessResponse($response, null, 204); |
|
} catch (ApplicationException $e) { |
|
return $this->createErrorResponse($response, $e->getMessage(), 404); |
|
} catch (\Exception $e) { |
|
return $this->createErrorResponse($response, 'Internal server error', 500); |
|
} |
|
} |
|
} |