ProductController.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Egg;
  4. use App\Models\Location;
  5. use App\Models\Node;
  6. use App\Models\Product;
  7. use Illuminate\Database\Eloquent\Builder;
  8. use Illuminate\Http\JsonResponse;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Collection;
  11. class ProductController extends Controller
  12. {
  13. /**
  14. * @description get product locations based on selected egg
  15. * @param Request $request
  16. * @param Egg $egg
  17. * @return Collection|JsonResponse
  18. */
  19. public function getNodesBasedOnEgg(Request $request, Egg $egg)
  20. {
  21. if (is_null($egg->id)) return response()->json('Egg ID is required', '400');
  22. #get products that include this egg
  23. $products = Product::query()
  24. ->with('nodes')
  25. ->where('disabled', '=', false)
  26. ->whereHas('eggs', function (Builder $builder) use ($egg) {
  27. $builder->where('id', '=', $egg->id);
  28. })->get();
  29. $nodes = collect();
  30. #filter unique nodes
  31. $products->each(function (Product $product) use ($nodes) {
  32. $product->nodes->each(function (Node $node) use ($nodes) {
  33. if (!$nodes->contains('id', $node->id) && !$node->disabled) {
  34. $nodes->add($node);
  35. }
  36. });
  37. });
  38. return $nodes;
  39. }
  40. /**
  41. * @description get product locations based on selected egg
  42. * @param Request $request
  43. * @param Egg $egg
  44. * @return Collection|JsonResponse
  45. */
  46. public function getLocationsBasedOnEgg(Request $request, Egg $egg)
  47. {
  48. $nodes = $this->getNodesBasedOnEgg($request, $egg);
  49. $locations = collect();
  50. //locations
  51. $nodes->each(function (Node $node) use ($nodes, $locations) {
  52. /** @var Location $location */
  53. $location = $node->location;
  54. if (!$locations->contains('id', $location->id)) {
  55. $nodeIds = $nodes->map(function ($node) {
  56. return $node->id;
  57. });
  58. $location->nodes = $location->nodes()
  59. ->whereIn('id', $nodeIds)
  60. ->get();
  61. $locations->add($location);
  62. }
  63. });
  64. return $locations;
  65. }
  66. /**
  67. * @param Node $node
  68. * @param Egg $egg
  69. * @return Collection|JsonResponse
  70. */
  71. public function getProductsBasedOnNode(Egg $egg, Node $node)
  72. {
  73. if (is_null($egg->id) || is_null($node->id)) return response()->json('node and egg id is required', '400');
  74. return Product::query()
  75. ->where('disabled', '=', false)
  76. ->whereHas('nodes', function (Builder $builder) use ($node) {
  77. $builder->where('id', '=', $node->id);
  78. })
  79. ->whereHas('eggs', function (Builder $builder) use ($egg) {
  80. $builder->where('id', '=', $egg->id);
  81. })
  82. ->get();
  83. }
  84. }