|
|
@@ -3,48 +3,82 @@
|
|
|
namespace App\Services;
|
|
|
|
|
|
use App\Models\ClassPackage;
|
|
|
+use App\Models\Unit;
|
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
|
|
|
|
class ClassPackageService
|
|
|
{
|
|
|
public function getAll(): Collection
|
|
|
{
|
|
|
- return ClassPackage::orderBy('created_at', 'desc')
|
|
|
- ->get();
|
|
|
+ return ClassPackage::orderBy('created_at', 'desc')->get();
|
|
|
}
|
|
|
|
|
|
public function findById(int $id): ?ClassPackage
|
|
|
{
|
|
|
- return ClassPackage::find($id);
|
|
|
+ return ClassPackage::with('units')->find($id);
|
|
|
}
|
|
|
|
|
|
public function create(array $data): ClassPackage
|
|
|
{
|
|
|
- return ClassPackage::create($data);
|
|
|
+ $unitVisibilities = $data['unit_visibilities'] ?? [];
|
|
|
+ unset($data['unit_visibilities']);
|
|
|
+
|
|
|
+ $package = ClassPackage::create($data);
|
|
|
+
|
|
|
+ $this->syncUnitVisibilities($package, $unitVisibilities);
|
|
|
+
|
|
|
+ return $package->load('units');
|
|
|
}
|
|
|
|
|
|
public function update(int $id, array $data): ?ClassPackage
|
|
|
{
|
|
|
- $model = $this->findById($id);
|
|
|
+ $package = $this->findById($id);
|
|
|
+ if (!$package) return null;
|
|
|
+
|
|
|
+ $unitVisibilities = $data['unit_visibilities'] ?? null;
|
|
|
+ unset($data['unit_visibilities']);
|
|
|
|
|
|
- if (!$model) {
|
|
|
- return null;
|
|
|
+ $package->update($data);
|
|
|
+
|
|
|
+ if ($unitVisibilities !== null) {
|
|
|
+ $this->syncUnitVisibilities($package, $unitVisibilities);
|
|
|
}
|
|
|
|
|
|
- $model->update($data);
|
|
|
- return $model->fresh();
|
|
|
+ return $package->fresh('units');
|
|
|
}
|
|
|
|
|
|
public function delete(int $id): bool
|
|
|
{
|
|
|
- $model = $this->findById($id);
|
|
|
+ $package = ClassPackage::find($id);
|
|
|
+ if (!$package) return false;
|
|
|
|
|
|
- if (!$model) {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ return $package->delete();
|
|
|
+ }
|
|
|
|
|
|
- return $model->delete();
|
|
|
+ public function getAllUnitsWithVisibility(int $packageId): \Illuminate\Support\Collection
|
|
|
+ {
|
|
|
+ $allUnits = Unit::orderBy('fantasy_name')->get(['id', 'fantasy_name']);
|
|
|
+ $package = ClassPackage::with('units')->find($packageId);
|
|
|
+
|
|
|
+ $visibilityMap = $package
|
|
|
+ ? $package->units->keyBy('id')
|
|
|
+ : collect();
|
|
|
+
|
|
|
+ return $allUnits->map(fn($unit) => [
|
|
|
+ 'id' => $unit->id,
|
|
|
+ 'fantasy_name' => $unit->fantasy_name,
|
|
|
+ 'visible' => $visibilityMap->has($unit->id)
|
|
|
+ ? (bool) $visibilityMap[$unit->id]->pivot->visible
|
|
|
+ : true,
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
- // Add custom business logic methods here
|
|
|
+ private function syncUnitVisibilities(ClassPackage $package, array $unitVisibilities): void
|
|
|
+ {
|
|
|
+ $syncData = [];
|
|
|
+ foreach ($unitVisibilities as $uv) {
|
|
|
+ $syncData[$uv['unit_id']] = ['visible' => $uv['visible']];
|
|
|
+ }
|
|
|
+ $package->units()->sync($syncData);
|
|
|
+ }
|
|
|
}
|