dbudwin/RoboHome-Web

View on GitHub
app/Http/Controllers/Web/DevicesController.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Common\Controller;
use App\Http\Globals\FlashMessageLevels;
use App\Http\MQTT\MessagePublisher;
use App\Repositories\IDeviceRepository;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Webpatser\Uuid\Uuid;

class DevicesController extends Controller
{
    private $deviceRepository;
    private $messagePublisher;

    public function __construct(IDeviceRepository $deviceRepository, MessagePublisher $messagePublisher)
    {
        $this->middleware('auth');

        $this->deviceRepository = $deviceRepository;
        $this->messagePublisher = $messagePublisher;
    }

    public function devices(Request $request): View
    {
        $currentUser = $request->user();

        return view('devices', [
            'name' => $currentUser->name,
            'devices' => $currentUser->devices
        ]);
    }

    public function add(Request $request): RedirectResponse
    {
        $properties = $request->all();
        $currentUserId = $request->user()->id;
        $device = $this->deviceRepository->create($properties, $currentUserId);
        $name = $device->name;

        return $this->redirectToDevicesWithMessage($request, FlashMessageLevels::SUCCESS, "Device '$name' was successfully added!");
    }

    public function delete(Request $request, Uuid $publicDeviceId): RedirectResponse
    {
        $deviceId = $this->deviceRepository->getForPublicId($publicDeviceId)->id;

        $userOwnsDevice = $request->user()->ownsDevice($deviceId);

        if (!$userOwnsDevice) {
            return $this->redirectToDevicesWithMessage($request, FlashMessageLevels::DANGER, 'Error deleting device!');
        }

        $name = $this->deviceRepository->name($deviceId);
        $deleted = $this->deviceRepository->delete($deviceId);

        if (!$deleted) {
            return $this->redirectToDevicesWithMessage($request, FlashMessageLevels::DANGER, "Encountered an error while deleting device '$name'!");
        }

        return $this->redirectToDevicesWithMessage($request, FlashMessageLevels::SUCCESS, "Device '$name' was successfully deleted!");
    }

    public function update(Request $request, Uuid $publicDeviceId): RedirectResponse
    {
        $deviceId = $this->deviceRepository->getForPublicId($publicDeviceId)->id;

        $userOwnsDevice = $request->user()->ownsDevice($deviceId);

        if (!$userOwnsDevice) {
            return $this->redirectToDevicesWithMessage($request, FlashMessageLevels::DANGER, 'Error updating device!');
        }

        $properties = $request->all();

        $device = $this->deviceRepository->update($deviceId, $properties);

        return $this->redirectToDevicesWithMessage($request, FlashMessageLevels::SUCCESS, "Device '$device->name' was successfully updated!");
    }

    public function handleControlRequest(Request $request, string $action, Uuid $publicDeviceId): RedirectResponse
    {
        $deviceId = $this->deviceRepository->getForPublicId($publicDeviceId)->id;
        $currentUser = $request->user();
        $userOwnsDevice = $currentUser->ownsDevice($deviceId);

        if (!$userOwnsDevice) {
            return $this->redirectToDevicesWithMessage($request, FlashMessageLevels::DANGER, 'Error controlling device!');
        }

        $this->messagePublisher->publish($action, Uuid::import($currentUser->public_id), Uuid::import($publicDeviceId));

        return redirect()->route('devices');
    }

    private function redirectToDevicesWithMessage(Request $request, string $flashLevel, string $message): RedirectResponse
    {
        $request->session()->flash($flashLevel, $message);

        return redirect()->route('devices');
    }
}