f19c157e8f
Test Suite / test (24.15.0) (push) Has been cancelled
- Implemented a new PATCH endpoint in ProductsController to update the category of a user's product. - Added corresponding service method in ProductsService to handle business logic and validation. - Created UpdateCategoryMineDto for request validation. - Enhanced error handling for forbidden actions and not found resources. - Updated API error mapping in Flutter to handle specific forbidden messages. - Modified ProductPickerField to allow product creation directly from the picker. - Added tests for the new endpoint and service method to ensure proper functionality and error handling.
129 lines
5.5 KiB
Dart
129 lines
5.5 KiB
Dart
class AuthApiPaths {
|
|
static const login = '/auth/login';
|
|
}
|
|
|
|
class ProductApiPaths {
|
|
static const list = '/products';
|
|
static const mine = '/products/mine';
|
|
static const createPrivate = '/products/private';
|
|
static const privateList = '/products/private';
|
|
static String promotePrivate(int id) => '/products/private/$id/promote';
|
|
static const pending = '/products/pending';
|
|
static const aiCategorizeBulk = '/products/ai-categorize-bulk';
|
|
static const deleted = '/products/deleted';
|
|
static const merge = '/products/merge';
|
|
static const mergePrivate = '/products/private/merge';
|
|
static String updateMineCategory(int id) => '/products/mine/$id/category';
|
|
static String mergePreview(int sourceProductId, int targetProductId) =>
|
|
'/products/merge-preview?sourceProductId=$sourceProductId&targetProductId=$targetProductId';
|
|
static String setStatus(int id) => '/products/$id/status';
|
|
static String update(int id) => '/products/$id';
|
|
static String canonicalName(int id) => '/products/$id/canonical-name';
|
|
static String canonicalNamePrivate(int id) => '/products/private/$id/canonical-name';
|
|
static String remove(int id) => '/products/$id';
|
|
static String restore(int id) => '/products/$id/restore';
|
|
static const bulkUpdate = '/products/bulk-update';
|
|
}
|
|
|
|
class AiApiPaths {
|
|
static const models = '/ai/models';
|
|
}
|
|
|
|
class CategoryApiPaths {
|
|
static const tree = '/categories/tree';
|
|
}
|
|
|
|
class ReceiptImportApiPaths {
|
|
static const refreshCategories = '/receipt-import/refresh-categories';
|
|
static const unitMappings = '/receipt-import/unit-mappings';
|
|
}
|
|
|
|
class ReceiptAliasApiPaths {
|
|
static const list = '/receipt-aliases';
|
|
static String remove(int id) => '/receipt-aliases/$id';
|
|
}
|
|
|
|
class RecipeApiPaths {
|
|
static const list = '/recipes';
|
|
static String detail(int id) => '/recipes/$id';
|
|
static String update(int id) => '/recipes/$id';
|
|
static String remove(int id) => '/recipes/$id';
|
|
static String setVisibility(int id) => '/recipes/$id/visibility';
|
|
static String share(int id) => '/recipes/$id/share';
|
|
static String unshare(int id, String username) => '/recipes/$id/share/${Uri.encodeComponent(username)}';
|
|
static String inventoryPreview(int id) => '/recipes/$id/inventory-preview';
|
|
static String analysis(int id) => '/recipes/$id/analysis';
|
|
static String rematch(int id) => '/recipes/$id/rematch';
|
|
static const parseMarkdown = '/recipes/parse-markdown';
|
|
static const aiSuggestions = '/recipes/ai-suggestions';
|
|
}
|
|
|
|
class InventoryApiPaths {
|
|
static const list = '/inventory';
|
|
static const mergeMany = '/inventory/merge-many';
|
|
static const bulkDelete = '/inventory/bulk-delete';
|
|
static String update(int id) => '/inventory/$id';
|
|
static String remove(int id) => '/inventory/$id';
|
|
static String moveToPantry(int id) => '/inventory/$id/move-to-pantry';
|
|
static String moveToPantryAdmin(int id) => '/inventory/admin/$id/move-to-pantry';
|
|
static String consume(int id) => '/inventory/$id/consume';
|
|
static String consumptionHistory(int id) => '/inventory/$id/consumption-history';
|
|
}
|
|
|
|
class AdminInventoryApiPaths {
|
|
static const list = '/inventory/admin';
|
|
static String withFilters({int? userId, String? sort}) {
|
|
final params = <String, String>{};
|
|
if (userId != null) params['userId'] = '$userId';
|
|
if (sort != null && sort.isNotEmpty) params['sort'] = sort;
|
|
if (params.isEmpty) return list;
|
|
final query = params.entries
|
|
.map((e) => '${Uri.encodeQueryComponent(e.key)}=${Uri.encodeQueryComponent(e.value)}')
|
|
.join('&');
|
|
return '$list?$query';
|
|
}
|
|
static String update(int id) => '/inventory/admin/$id';
|
|
static String remove(int id) => '/inventory/admin/$id';
|
|
static String moveToPantry(int id) => '/inventory/admin/$id/move-to-pantry';
|
|
static const merge = '/inventory/admin/merge';
|
|
static String mergePreview(int sourceInventoryId, int targetInventoryId) =>
|
|
'/inventory/admin/merge-preview?sourceInventoryId=$sourceInventoryId&targetInventoryId=$targetInventoryId';
|
|
}
|
|
|
|
class PantryApiPaths {
|
|
static const list = '/pantry';
|
|
static String remove(int id) => '/pantry/$id';
|
|
static String moveToInventory(int id) => '/pantry/$id/move-to-inventory';
|
|
static String moveToInventoryAdmin(int id) => '/pantry/admin/$id/move-to-inventory';
|
|
static const adminList = '/pantry/admin';
|
|
static const adminCreate = '/pantry/admin';
|
|
static String adminUpdate(int id) => '/pantry/admin/$id';
|
|
static String adminRemove(int id) => '/pantry/admin/$id';
|
|
}
|
|
|
|
class UserApiPaths {
|
|
static const me = '/users/me';
|
|
static const list = '/users';
|
|
static String setRole(int id) => '/users/$id/role';
|
|
static String setPremium(int id) => '/users/$id/premium';
|
|
static String setRecipeSharing(int id) => '/users/$id/recipe-sharing';
|
|
static String updateEmail(int id) => '/users/$id/email';
|
|
static String delete(int id) => '/users/$id';
|
|
static String resetPassword(int id) => '/users/$id/reset-password';
|
|
}
|
|
|
|
class MealPlanApiPaths {
|
|
static const list = '/meal-plan';
|
|
|
|
static String listByRange(String from, String to) =>
|
|
'$list?from=${Uri.encodeQueryComponent(from)}&to=${Uri.encodeQueryComponent(to)}';
|
|
|
|
static String shoppingList(String from, String to) =>
|
|
'$list/shopping-list?from=${Uri.encodeQueryComponent(from)}&to=${Uri.encodeQueryComponent(to)}';
|
|
|
|
static String inventoryCompare(String from, String to) =>
|
|
'$list/inventory-compare?from=${Uri.encodeQueryComponent(from)}&to=${Uri.encodeQueryComponent(to)}';
|
|
|
|
static String removeByDate(String date) =>
|
|
'$list/${Uri.encodeComponent(date)}';
|
|
} |