HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/ipsremont-demo/app/Repository/Device/DeviceRepository.php
<?php

namespace App\Repository\Device;

use App\Http\Requests\Device\IndexRequest;
use App\Models\Category;
use App\Models\Device;
use App\Models\DevicesSchema;
use App\Models\Schema;
use App\Repository\BaseRepository;
use App\Repository\Schema\SchemaRepository;
use App\Traits\GridTrait;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;

class DeviceRepository extends BaseRepository
{

    use GridTrait;

    /**
     * @return Builder
     */
    public static function getQuery(): Builder
    {
        return Device::query();
    }

    /**
     * @param IndexRequest $request
     *
     * @return mixed
     */
    public function search(IndexRequest $request)
    {
        $query = self::getAvailable();

        $this->makeQueryOrdered(Device::class, $query, $request);

        if (isset($request->id) && !empty($request->id)) {
            $query->where('category_code', 'like', '%' . $request->id . '%');
        }

        if (isset($request->name) && !empty($request->name)) {
            $query->where('name', 'like', '%' . $request->name . '%');
        }

        if (isset($request->external_id) && !empty($request->external_id)) {
            $query->where('external_id', 'like', '%' . $request->external_id . '%');
        }

        $perPage = $request->per_page ?? 20;

        return $query->paginate((int) $perPage)->appends($request->all());
    }

    public function search_specifications(IndexRequest $request)
    {
        $query = self::getAvailable();

        $this->makeQueryOrdered(Device::class, $query, $request);

        if (isset($request->id) && !empty($request->id)) {
            $category = Category::where('code', $request->id)->first();

            $same_categories = Category::where('name', $category->name)->get()->pluck('code')->toArray();
            if ($same_categories) {
                $query->where(function ($query) use ($same_categories) {
                    foreach ($same_categories as $category) {
                        $query->orWhere('category_code', $category);
                    }
                });
            } else {
                $query->where('category_code', $request->id);
            }
        }

        if (isset($request->name) && !empty($request->name)) {
            $query->where('name', 'like', '%' . $request->name . '%');
        }

        if (isset($request->external_id) && !empty($request->external_id)) {
            $query->where('external_id', 'like', '%' . $request->external_id . '%');
        }

        $perPage = $request->per_page ?? 20;

        return $query->paginate((int) $perPage)->appends($request->all());
    }

    public function getDevice($request)
    {
        return Device::where('external_id', $request->id)->first();
    }

    public function searchDevicesAjax($term)
    {
        $query = Device::query();

        $query->where(function ($query) use ($term) {
            $query
                ->where('external_id', 'like', '%' . $term . '%')
                ->orWhere('name', 'like', '%' . $term . '%');
        });

        $query->select("id", DB::raw('concat(external_id, ", ", name) as text'));

        return $query;
    }

    public static function save($data): Device
    {
        $device = Device::query()->where('external_id', $data['external_id'])->withTrashed()->first();
        if (!$device) {
            $device = new Device();
        } else {
            $device->deleted_at = null;
        }
        $device->fill($data);
        $device->save();

        return $device;
    }

    /**
     * @param $data
     * @param Device $device
     *
     * @return Device
     */
    public static function update($data, $device): Device
    {
        $device->deleted_at = null;
        $device->fill($data);
        $device->update();

        return $device;
    }

    public static function delete($data): array
    {
        $device = Device::where('external_id', $data['external_id'])->first();
        if ($device) {
            $ds = DevicesSchema::where('device_id', $device->id)->get();

            DevicesSchema::where('device_id', $device->id)->delete();
            Device::where('external_id', $data['external_id'])->delete();

            foreach ($ds as $item) {
                $check_schema = DevicesSchema::where('schema_id', $item->schema_id)->first();
                if (!$check_schema) {
                    $schema = Schema::where('id', $item->schema_id)->first();
                    SchemaRepository::delete($schema->external_id);
                }
            }

            return ['device_id' => 0, 'result' => 1];
        } else {
            return ['device_id' => 0, 'result' => 0];
        }
    }
}