Multiple implementations of the same back-end application. The aim is to provide quick, side-by-side comparisons of different technologies (languages, frameworks, libraries) while preserving consistent business logic across all implementations.
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

<?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);
}
}
}