Add stage 4: frontend lists view + enforce 100-list cap
API: GET /api/lists is now ordered alphabetically (COLLATE NOCASE) by title with no other option, and TodoListController rejects a create past 100 lists per owner with 409. New TodoListRepository::countForOwner. Frontend: HomeView replaces the placeholder with the user's lists (rendered in API order) and a create form (title + optional description). New Pinia lists store fetches and creates, re-fetching after a create so the new list sorts into place; it is reset on logout. Form disables and explains at 100 lists; create errors surface inline. Neutral .badge with a .badge--warn variant; dropped the unused .facts styles. Tests: alphabetical ordering and the 100-list cap. Suite: 17 passing. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,7 @@ final class TodoListController extends Controller
|
||||
{
|
||||
private const TITLE_MAX = 255;
|
||||
private const DESCRIPTION_MAX = 2000;
|
||||
private const MAX_LISTS_PER_OWNER = 100;
|
||||
|
||||
public function __construct(private readonly TodoListRepository $lists)
|
||||
{
|
||||
@@ -38,12 +39,21 @@ final class TodoListController extends Controller
|
||||
*/
|
||||
public function store(Request $request, Response $response): Response
|
||||
{
|
||||
$ownerId = $this->user($request)['id'];
|
||||
|
||||
$validator = new Validator($this->body($request));
|
||||
$title = $validator->requiredString('title', self::TITLE_MAX);
|
||||
$description = $validator->optionalString('description', self::DESCRIPTION_MAX) ?? '';
|
||||
$validator->assert();
|
||||
|
||||
$list = $this->lists->create($this->user($request)['id'], $title, $description);
|
||||
if ($this->lists->countForOwner($ownerId) >= self::MAX_LISTS_PER_OWNER) {
|
||||
throw new ApiException(
|
||||
sprintf('You have reached the maximum of %d lists.', self::MAX_LISTS_PER_OWNER),
|
||||
409,
|
||||
);
|
||||
}
|
||||
|
||||
$list = $this->lists->create($ownerId, $title, $description);
|
||||
|
||||
return $this->json($response, ['list' => $this->present($list)], 201);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user