load('units'); } public function getAll(): Collection { return User::with(['state', 'units', 'userType'])->orderBy('name')->get(); } public function getAllByUnit(): Collection { $unitId = Auth::user()->units->first()?->id; if (!$unitId) { return User::with(['state', 'units', 'userType'])->whereNull('id')->get(); } return User::with(['state', 'units', 'userType']) ->whereHas('units', fn($q) => $q->where('units.id', $unitId)) ->orderBy('name') ->get(); } public function findById(int $id): ?User { return User::with(['state', 'units', 'userType'])->find($id); } public function create(array $data): User { $unitId = $data['unit_id'] ?? Auth::user()->units->first()?->id; unset($data['unit_id']); $data = $this->handleAvatar($data); $user = User::create($data); if ($unitId) { UnitUser::create([ 'unit_id' => $unitId, 'user_id' => $user->id, ]); } return $user->load('state'); } public function update(int $id, array $data): ?User { $model = $this->findById($id); if (!$model) { return null; } $hasUnitId = array_key_exists('unit_id', $data); $unitId = $data['unit_id'] ?? null; unset($data['unit_id']); $data = $this->handleAvatar($data, $model->avatar_url); $model->update($data); if ($hasUnitId) { $model->units()->sync($unitId ? [$unitId] : []); } return $model->fresh(['state', 'units']); } public function delete(int $id): bool { $model = $this->findById($id); if (!$model) { return false; } if ($model->avatar_url) { Storage::delete($model->avatar_url); } return $model->delete(); } public function getUserTypes(): \Illuminate\Database\Eloquent\Collection { return \App\Models\UserType::orderBy('label')->get(); } private function handleAvatar(array $data, ?string $oldAvatarPath = null): array { if (!isset($data['avatar'])) { return $data; } if ($data['avatar'] instanceof UploadedFile) { if ($oldAvatarPath) { Storage::delete($oldAvatarPath); } $data['avatar_url'] = $data['avatar']->store('users/avatars'); } elseif (is_null($data['avatar'])) { if ($oldAvatarPath) { Storage::delete($oldAvatarPath); } $data['avatar_url'] = null; } unset($data['avatar']); return $data; } }