diff --git a/mnemo_cards_admin/src/components/PackCardsManager.tsx b/mnemo_cards_admin/src/components/PackCardsManager.tsx index 0a47f27..efed9a9 100644 --- a/mnemo_cards_admin/src/components/PackCardsManager.tsx +++ b/mnemo_cards_admin/src/components/PackCardsManager.tsx @@ -31,8 +31,8 @@ export function PackCardsManager({ // Load all cards with search const { data: cardsData, isLoading } = useQuery({ - queryKey: ['cards', 1, 1000, search], // Large limit to get all cards - queryFn: () => cardsApi.getCards({ page: 1, limit: 1000, search }), + queryKey: ['cards', 1, 100, search], // Limit to 100 (backend max) + queryFn: () => cardsApi.getCards({ page: 1, limit: 100, search }), enabled: !disabled, }) diff --git a/mnemo_cards_backend/lib/api/v2/admin_cards_api_v2.dart b/mnemo_cards_backend/lib/api/v2/admin_cards_api_v2.dart index 844d4b1..6bfe9aa 100644 --- a/mnemo_cards_backend/lib/api/v2/admin_cards_api_v2.dart +++ b/mnemo_cards_backend/lib/api/v2/admin_cards_api_v2.dart @@ -58,17 +58,8 @@ class AdminCardsApiV2 { headers: {'Content-Type': 'application/json'}, ); } - if (limit < 1 || limit > 100) { - return Response.badRequest( - body: json.encode({ - 'error': 'Invalid limit parameter', - 'message': 'Limit must be between 1 and 100. Received: $limit', - 'field': 'limit', - 'details': 'The maximum number of items per page is 100. Please use a value between 1 and 100.', - }), - headers: {'Content-Type': 'application/json'}, - ); - } + // Limit validation: if limit is invalid, set to default; if > 100, cap at 100 + final validatedLimit = limit < 1 ? 20 : (limit > 100 ? 100 : limit); // Get all cards final allCards = await _db.packDao.getAllCards(); @@ -87,9 +78,9 @@ class AdminCardsApiV2 { // Calculate pagination final total = filteredCards.length; - final totalPages = (total / limit).ceil(); - final offset = (page - 1) * limit; - final paginatedCards = filteredCards.skip(offset).take(limit).toList(); + final totalPages = (total / validatedLimit).ceil(); + final offset = (page - 1) * validatedLimit; + final paginatedCards = filteredCards.skip(offset).take(validatedLimit).toList(); // Получить паки для всех карточек (для packId) final cardsWithPacks = >[]; @@ -116,7 +107,7 @@ class AdminCardsApiV2 { 'items': cardsWithPacks, 'total': total, 'page': page, - 'limit': limit, + 'limit': validatedLimit, 'totalPages': totalPages, }), headers: {'Content-Type': 'application/json'}, diff --git a/mnemo_cards_backend/lib/api/v2/admin_packs_api_v2.dart b/mnemo_cards_backend/lib/api/v2/admin_packs_api_v2.dart index 8af4a78..0f6b9c8 100644 --- a/mnemo_cards_backend/lib/api/v2/admin_packs_api_v2.dart +++ b/mnemo_cards_backend/lib/api/v2/admin_packs_api_v2.dart @@ -76,17 +76,8 @@ class AdminPacksApiV2 { statusCode: 400, ); } - if (limit < 1 || limit > 100) { - return _json( - { - 'error': 'Invalid limit parameter', - 'message': 'Limit must be between 1 and 100. Received: $limit', - 'field': 'limit', - 'details': 'The maximum number of items per page is 100. Please use a value between 1 and 100.', - }, - statusCode: 400, - ); - } + // Limit validation: if limit is invalid, set to default; if > 100, cap at 100 + final validatedLimit = limit < 1 ? 20 : (limit > 100 ? 100 : limit); // Get all packs final allPacks = await _db.packDao.getAllPacks( @@ -124,15 +115,15 @@ class AdminPacksApiV2 { // Calculate pagination final total = previewDtos.length; - final totalPages = (total / limit).ceil(); - final offset = (page - 1) * limit; - final paginatedPacks = previewDtos.skip(offset).take(limit).toList(); + final totalPages = (total / validatedLimit).ceil(); + final offset = (page - 1) * validatedLimit; + final paginatedPacks = previewDtos.skip(offset).take(validatedLimit).toList(); return _json({ 'items': paginatedPacks, 'total': total, 'page': page, - 'limit': limit, + 'limit': validatedLimit, 'totalPages': totalPages, }); } catch (e, s) { diff --git a/mnemo_cards_backend/lib/api/v2/tests_api_v2.dart b/mnemo_cards_backend/lib/api/v2/tests_api_v2.dart index 4287d19..f50cfaf 100644 --- a/mnemo_cards_backend/lib/api/v2/tests_api_v2.dart +++ b/mnemo_cards_backend/lib/api/v2/tests_api_v2.dart @@ -170,9 +170,8 @@ class TestsApiV2 { if (page < 1) { return _badRequest('Page must be greater than 0'); } - if (limit < 1 || limit > 100) { - return _badRequest('Limit must be between 1 and 100'); - } + // Limit validation: if limit is invalid, set to default; if > 100, cap at 100 + final validatedLimit = limit < 1 ? 20 : (limit > 100 ? 100 : limit); if (user.id == null) { return _unauthorized('User ID is required'); @@ -186,7 +185,7 @@ class TestsApiV2 { 'items': [], 'total': 0, 'page': page, - 'limit': limit, + 'limit': validatedLimit, 'totalPages': 0, }); } @@ -213,15 +212,15 @@ class TestsApiV2 { // Apply pagination final total = attempts.length; - final totalPages = (total / limit).ceil(); - final offset = (page - 1) * limit; - final paginatedAttempts = attempts.skip(offset).take(limit).toList(); + final totalPages = (total / validatedLimit).ceil(); + final offset = (page - 1) * validatedLimit; + final paginatedAttempts = attempts.skip(offset).take(validatedLimit).toList(); return _ok({ 'items': paginatedAttempts, 'total': total, 'page': page, - 'limit': limit, + 'limit': validatedLimit, 'totalPages': totalPages, }); } catch (e, s) {