From 375642a6b4bcdaa2c6d785e846cae5647a27980e Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 19 Aug 2024 18:55:30 +0300 Subject: [PATCH] feat(recipe): Trying to fix restapi method call --- .../reporitories/recipe_repository.dart | 33 +++++++++- .../recipes/services/recipe_service.dart | 17 ++++- .../recipes/services/recipe_service.g.dart | 64 ++++++++++++++++++- lib/locator_service.dart | 4 ++ 4 files changed, 114 insertions(+), 4 deletions(-) diff --git a/lib/features/recipes/reporitories/recipe_repository.dart b/lib/features/recipes/reporitories/recipe_repository.dart index 8d2bc57b..e27013c7 100644 --- a/lib/features/recipes/reporitories/recipe_repository.dart +++ b/lib/features/recipes/reporitories/recipe_repository.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:eatvio_app/features/recipes/models/recipe_model.dart'; import 'package:eatvio_app/features/recipes/services/recipe_service.dart'; @@ -19,7 +20,37 @@ class RecipeRepository { Future publishRecipe(RecipeModel recipe) async { try { - return await recipeService.publishRecipe(jsonDecode(jsonEncode(recipe))); + final File file = File(recipe.image ?? ''); + + List> ingredientsMap = recipe.ingredients?.map((ingredient) { + return { + 'name': ingredient!.name, + 'unit': ingredient.unit, + 'portion': ingredient.portion, + }; + }).toList() ?? + []; + + List> stepsMap = recipe.steps?.map((step) { + return { + 'image': File(step?.image ?? ""), + 'description': step?.description ?? "", + }; + }).toList() ?? + []; + print(ingredientsMap); + print(stepsMap); + return await recipeService.publishRecipe( + recipe.type, + recipe.state, + recipe.title, + recipe.description, + recipe.video_url, + ingredientsMap, + stepsMap, + recipe.cooking_time, + file, + ); } catch (e) { rethrow; } diff --git a/lib/features/recipes/services/recipe_service.dart b/lib/features/recipes/services/recipe_service.dart index d68a4e33..38cabc12 100644 --- a/lib/features/recipes/services/recipe_service.dart +++ b/lib/features/recipes/services/recipe_service.dart @@ -1,5 +1,10 @@ +import 'dart:convert'; +import 'dart:io'; + import 'package:dio/dio.dart'; +import 'package:eatvio_app/features/recipes/models/ingredient.dart'; import 'package:eatvio_app/features/recipes/models/recipe_model.dart'; +import 'package:eatvio_app/features/recipes/models/step.dart'; import 'package:retrofit/retrofit.dart'; import 'package:eatvio_app/features/diary/models/product.dart'; @@ -16,7 +21,17 @@ abstract class RecipeService { Future>> getInputProduct(@Query('name') String name); @POST('/api/recipes/create') - Future publishRecipe(@Part() Map recipe); + Future publishRecipe( + @Part() String? type, + @Part() String? state, + @Part() String? title, + @Part() String? description, + @Part() String? video_url, + @Part() List> ingredients, + @Part() List> steps, + @Part() int? cooking_time, + @Part() File image, + ); @POST('/api/recipes/update/{id}') Future editRecipe(@Part() Map recipe, String id); diff --git a/lib/features/recipes/services/recipe_service.g.dart b/lib/features/recipes/services/recipe_service.g.dart index de85e17d..a1fb1eb5 100644 --- a/lib/features/recipes/services/recipe_service.g.dart +++ b/lib/features/recipes/services/recipe_service.g.dart @@ -77,11 +77,71 @@ class _RecipeService implements RecipeService { } @override - Future publishRecipe(Map recipe) async { + Future publishRecipe( + String? type, + String? state, + String? title, + String? description, + String? video_url, + List> ingredients, + List> steps, + int? cooking_time, + File image, + ) async { final _extra = {}; final queryParameters = {}; + queryParameters.removeWhere((k, v) => v == null); final _headers = {}; - final _data = FormData.fromMap(recipe); + final _data = FormData(); + if (type != null) { + _data.fields.add(MapEntry( + 'type', + type, + )); + } + if (state != null) { + _data.fields.add(MapEntry( + 'state', + state, + )); + } + if (title != null) { + _data.fields.add(MapEntry( + 'title', + title, + )); + } + if (description != null) { + _data.fields.add(MapEntry( + 'description', + description, + )); + } + if (video_url != null) { + _data.fields.add(MapEntry( + 'video_url', + video_url, + )); + } + ingredients.forEach((i) { + _data.fields.add(MapEntry('ingredients', jsonEncode(i))); + }); + steps.forEach((i) { + _data.fields.add(MapEntry('steps', jsonEncode(i))); + }); + if (cooking_time != null) { + _data.fields.add(MapEntry( + 'cooking_time', + cooking_time.toString(), + )); + } + _data.files.add(MapEntry( + 'image', + MultipartFile.fromFileSync( + image.path, + filename: image.path.split(Platform.pathSeparator).last, + ), + )); final _result = await _dio .fetch>(_setStreamType(Options( method: 'POST', diff --git a/lib/locator_service.dart b/lib/locator_service.dart index e580c725..1e99c3c9 100644 --- a/lib/locator_service.dart +++ b/lib/locator_service.dart @@ -69,6 +69,10 @@ Future init() async { () => Dio( BaseOptions( baseUrl: baseUrl, + headers: { + 'accept': 'application/json', + 'content-type': 'application/json', + }, ), ), );