ProductController.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Pterodactyl\Egg;
  4. use App\Models\Pterodactyl\Location;
  5. use App\Models\Pterodactyl\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. *
  16. * @param Request $request
  17. * @param Egg $egg
  18. * @return Collection|JsonResponse
  19. */
  20. public function getNodesBasedOnEgg(Request $request, Egg $egg)
  21. {
  22. if (is_null($egg->id)) {
  23. return response()->json('Egg ID is required', '400');
  24. }
  25. //get products that include this egg
  26. $products = Product::query()
  27. ->with('nodes')
  28. ->where('disabled', '=', false)
  29. ->whereHas('eggs', function (Builder $builder) use ($egg) {
  30. $builder->where('id', '=', $egg->id);
  31. })->get();
  32. $nodes = collect();
  33. //filter unique nodes
  34. $products->each(function (Product $product) use ($nodes) {
  35. $product->nodes->each(function (Node $node) use ($nodes) {
  36. if (! $nodes->contains('id', $node->id) && ! $node->disabled) {
  37. $nodes->add($node);
  38. }
  39. });
  40. });
  41. return $nodes;
  42. }
  43. /**
  44. * @description get product locations based on selected egg
  45. *
  46. * @param Request $request
  47. * @param Egg $egg
  48. * @return Collection|JsonResponse
  49. */
  50. public function getLocationsBasedOnEgg(Request $request, Egg $egg)
  51. {
  52. $nodes = $this->getNodesBasedOnEgg($request, $egg);
  53. foreach ($nodes as $key => $node) {
  54. $pteroNode = $this->pterodactyl->getNode($node->id);
  55. if ($pteroNode['allocated_resources']['memory'] >= ($pteroNode['memory'] * ($pteroNode['memory_overallocate'] + 100) / 100) || $pteroNode['allocated_resources']['disk'] >= ($pteroNode['disk'] * ($pteroNode['disk_overallocate'] + 100) / 100)) {
  56. $nodes->forget($key);
  57. }
  58. }
  59. $locations = collect();
  60. //locations
  61. $nodes->each(function (Node $node) use ($nodes, $locations) {
  62. /** @var Location $location */
  63. $location = $node->location;
  64. if (! $locations->contains('id', $location->id)) {
  65. $nodeIds = $nodes->map(function ($node) {
  66. return $node->id;
  67. });
  68. $location->nodes = $location->nodes()
  69. ->whereIn('id', $nodeIds)
  70. ->get();
  71. $locations->add($location);
  72. }
  73. });
  74. return $locations;
  75. }
  76. /**
  77. * @param Node $node
  78. * @param Egg $egg
  79. * @return Collection|JsonResponse
  80. */
  81. public function getProductsBasedOnNode(Egg $egg, Node $node)
  82. {
  83. if (is_null($egg->id) || is_null($node->id)) {
  84. return response()->json('node and egg id is required', '400');
  85. }
  86. $products = Product::query()
  87. ->where('disabled', '=', false)
  88. ->whereHas('nodes', function (Builder $builder) use ($node) {
  89. $builder->where('id', '=', $node->id);
  90. })
  91. ->whereHas('eggs', function (Builder $builder) use ($egg) {
  92. $builder->where('id', '=', $egg->id);
  93. })
  94. ->get();
  95. $pteroNode = $this->pterodactyl->getNode($node->id);
  96. foreach ($products as $key => $product) {
  97. if ($product->memory > ($pteroNode['memory'] * ($pteroNode['memory_overallocate'] + 100) / 100) - $pteroNode['allocated_resources']['memory'] || $product->disk > ($pteroNode['disk'] * ($pteroNode['disk_overallocate'] + 100) / 100) - $pteroNode['allocated_resources']['disk']) {
  98. $product->doesNotFit = true;
  99. }
  100. }
  101. return $products;
  102. }
  103. }