diff --git a/api/app/Helpers/NutrictionCalculator.php b/api/app/Helpers/NutrictionCalculator.php index cfdeefc..846b424 100644 --- a/api/app/Helpers/NutrictionCalculator.php +++ b/api/app/Helpers/NutrictionCalculator.php @@ -4,7 +4,7 @@ namespace App\Helpers; class NutritionCalculator { - public static function calculateNutritionForRecipe(object $ingredients) + public static function calculateNutritionForProducts($products) { $nutrition = [ 'kcal' => 0, @@ -13,10 +13,10 @@ class NutritionCalculator 'fat' => 0, ]; - foreach($ingredients as $ingredient) + foreach($products as $product) { foreach(array_keys($nutrition) as $nutritionValue) { - $nutrition[$nutritionValue] += $ingredient['weight'] / 100 * $ingredient['product'][$nutritionValue]; + $nutrition[$nutritionValue] += $product['weight'] / 100 * $product['product'][$nutritionValue]; } } diff --git a/api/app/Http/Controllers/ProductsController.php b/api/app/Http/Controllers/ProductsController.php index f9a79ba..4a6ca48 100644 --- a/api/app/Http/Controllers/ProductsController.php +++ b/api/app/Http/Controllers/ProductsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Helpers\NutritionCalculator; use App\Http\Requests\AddProductRequest; use App\Repositories\ProductsRepositoryInterface; use Illuminate\Http\Request; @@ -29,4 +30,12 @@ class ProductsController extends Controller return response()->json(['success' => true, 'data' => ['products' => $products]], 200); } + + public function calculate(Request $request) + { + $products = $this->productsRepository->fillProductsInfo($request->input('products')); + $nutrition = NutritionCalculator::calculateNutritionForProducts($products); + + return response()->json(['success' => true, 'data' => ['nutrition' => $nutrition]]); + } } diff --git a/api/app/Http/Controllers/UsersController.php b/api/app/Http/Controllers/UsersController.php index 2fb983f..e6d91c9 100644 --- a/api/app/Http/Controllers/UsersController.php +++ b/api/app/Http/Controllers/UsersController.php @@ -82,7 +82,6 @@ class UsersController extends Controller auth()->invalidate($request->input('token')); return response()->json(['success' => true, 'message' => "You have successfully logged out."]); } catch (JWTException $e) { - // something went wrong whilst attempting to encode the token return response()->json(['success' => false, 'error' => 'Failed to logout, please try again.'], 500); } } @@ -97,4 +96,18 @@ class UsersController extends Controller ]); } + public function saveRecipe(Request $request) + { + $userID = auth()->id(); + $recipeID = $request->input('recipeID'); + + $savedRecipe = $this->usersRepository->saveRecipe($userID, $recipeID); + + if (!$savedRecipe) { + return response()->json(['success' => false, 'error' => 'Failed to save recipe, please try again.'], 400); + } + + return response()->json(['success' => true, 'message' => 'Recipe saved successfully in history']); + } + } diff --git a/api/app/Models/Recipe.php b/api/app/Models/Recipe.php index 31ea75f..95bd8f4 100644 --- a/api/app/Models/Recipe.php +++ b/api/app/Models/Recipe.php @@ -27,6 +27,6 @@ class Recipe extends Model public function getNutritionAttribute() { - return NutritionCalculator::calculateNutritionForRecipe($this->ingredients); + return NutritionCalculator::calculateNutritionForProducts($this->ingredients); } } diff --git a/api/app/Models/UsersRecipes.php b/api/app/Models/UsersRecipes.php new file mode 100644 index 0000000..31efa36 --- /dev/null +++ b/api/app/Models/UsersRecipes.php @@ -0,0 +1,10 @@ +paginate($filters['limit']); } + + public function fillProductsInfo(array $products) + { + foreach ($products as $k => $product){ + $products[$k]['product'] = Product::find($product['id']); + } + + return $products; + } } diff --git a/api/app/Repositories/ProductsRepositoryInterface.php b/api/app/Repositories/ProductsRepositoryInterface.php index e9407c9..7464201 100644 --- a/api/app/Repositories/ProductsRepositoryInterface.php +++ b/api/app/Repositories/ProductsRepositoryInterface.php @@ -7,4 +7,5 @@ interface ProductsRepositoryInterface { public function create($data); public function paginate(array $filters); + public function fillProductsInfo(array $products); } diff --git a/api/app/Repositories/UsersRepository.php b/api/app/Repositories/UsersRepository.php index e39b9c5..b4d4863 100644 --- a/api/app/Repositories/UsersRepository.php +++ b/api/app/Repositories/UsersRepository.php @@ -5,6 +5,7 @@ namespace App\Repositories; use App\Models\User; +use App\UsersRecipes; class UsersRepository implements UsersRepositoryInterface { @@ -39,4 +40,9 @@ class UsersRepository implements UsersRepositoryInterface { return User::where($field, $actual); } + + public function saveRecipe(int $userID, int $recipeID) + { + return UsersRecipes::create(['user_id' => $userID, 'recipe_id' => $recipeID]); + } } diff --git a/api/app/Repositories/UsersRepositoryInterface.php b/api/app/Repositories/UsersRepositoryInterface.php index 64c293d..4c443f8 100644 --- a/api/app/Repositories/UsersRepositoryInterface.php +++ b/api/app/Repositories/UsersRepositoryInterface.php @@ -7,45 +7,17 @@ use Illuminate\Database\Eloquent\Collection; interface UsersRepositoryInterface { - /** - * Get all Users. - * @return User[]|Collection - */ public function getAll(); - /** - * Paginate Users, chunkSize is the size of one page. - * @param $chunkSize - * @return mixed - */ public function paginate($chunkSize); - /** - * Create user with given data. - * @param $data - * @return mixed - */ public function create($data); - /** - * Delete user with given id. - * @param $id - * @return mixed - */ public function delete($id); - /** - * Get user by id. - * @param $userId - * @return mixed - */ public function getById($userId); - /** - * Get the users where $field is equal to $actual. - * @param $field - * @param $actual - * @return mixed - */ public function getWhereEquals($field, $actual); + + public function saveRecipe(int $userID, int $recipeID); } diff --git a/api/database/migrations/2020_01_07_183453_create_users_recipes_table.php b/api/database/migrations/2020_01_07_183453_create_users_recipes_table.php new file mode 100644 index 0000000..d4b0d94 --- /dev/null +++ b/api/database/migrations/2020_01_07_183453_create_users_recipes_table.php @@ -0,0 +1,43 @@ +bigIncrements('id'); + $table->unsignedInteger('user_id'); + $table->unsignedInteger('recipe_id'); + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onUpdate('cascade') + ->onDelete('cascade'); + $table->foreign('recipe_id') + ->references('id') + ->on('recipes') + ->onUpdate('cascade') + ->onDelete('cascade'); + $table->timestamp('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users_recipes'); + } +} diff --git a/api/routes/api.php b/api/routes/api.php index f900ea6..9c37508 100644 --- a/api/routes/api.php +++ b/api/routes/api.php @@ -6,6 +6,7 @@ Route::group(['prefix' => 'user', 'middleware' => ['assign.guard:users']], funct Route::post('/register', 'UsersController@register'); Route::post('/login', 'UsersController@login'); Route::get('/me', 'UsersController@me'); + Route::post('/save-recipe', 'UsersController@saveRecipe'); }); Route::prefix('product')->group(function () { @@ -17,3 +18,5 @@ Route::prefix('recipe')->group(function () { Route::post('/', 'RecipesController@add')->middleware(['jwt.auth']); Route::get('/', 'RecipesController@index'); }); + +Route::post('calculate', 'ProductsController@calculate');