ClassPackageService.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. namespace App\Services;
  3. use App\Models\ClassPackage;
  4. use App\Models\Unit;
  5. use Illuminate\Database\Eloquent\Collection;
  6. class ClassPackageService
  7. {
  8. public function getAll(): Collection
  9. {
  10. return ClassPackage::orderBy('created_at', 'desc')->get();
  11. }
  12. public function findById(int $id): ?ClassPackage
  13. {
  14. return ClassPackage::with('units')->find($id);
  15. }
  16. public function create(array $data): ClassPackage
  17. {
  18. $unitVisibilities = $data['unit_visibilities'] ?? [];
  19. unset($data['unit_visibilities']);
  20. $package = ClassPackage::create($data);
  21. $this->syncUnitVisibilities($package, $unitVisibilities);
  22. return $package->load('units');
  23. }
  24. public function update(int $id, array $data): ?ClassPackage
  25. {
  26. $package = $this->findById($id);
  27. if (!$package) return null;
  28. $unitVisibilities = $data['unit_visibilities'] ?? null;
  29. unset($data['unit_visibilities']);
  30. $package->update($data);
  31. if ($unitVisibilities !== null) {
  32. $this->syncUnitVisibilities($package, $unitVisibilities);
  33. }
  34. return $package->fresh('units');
  35. }
  36. public function delete(int $id): bool
  37. {
  38. $package = ClassPackage::find($id);
  39. if (!$package) return false;
  40. return $package->delete();
  41. }
  42. public function getAllUnitsWithVisibility(int $packageId): \Illuminate\Support\Collection
  43. {
  44. $allUnits = Unit::orderBy('fantasy_name')->get(['id', 'fantasy_name']);
  45. $package = ClassPackage::with('units')->find($packageId);
  46. $visibilityMap = $package
  47. ? $package->units->keyBy('id')
  48. : collect();
  49. return $allUnits->map(fn($unit) => [
  50. 'id' => $unit->id,
  51. 'fantasy_name' => $unit->fantasy_name,
  52. 'visible' => $visibilityMap->has($unit->id)
  53. ? (bool) $visibilityMap[$unit->id]->pivot->visible
  54. : true,
  55. ]);
  56. }
  57. private function syncUnitVisibilities(ClassPackage $package, array $unitVisibilities): void
  58. {
  59. $syncData = [];
  60. foreach ($unitVisibilities as $uv) {
  61. $syncData[$uv['unit_id']] = ['visible' => $uv['visible']];
  62. }
  63. $package->units()->sync($syncData);
  64. }
  65. }