<?php
namespace App\Controller\ApiV2\Managers;
use App\Controller\ApiV2\AbstractController;
use App\Entity\Building;
use App\Entity\User;
use App\Repository\BuildingRepository;
use App\Services\BuildingService;
use App\Services\FlatService;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use FOS\RestBundle\Controller\Annotations as Rest;
use Symfony\Component\HttpFoundation\Request;
class BuildingController extends AbstractController
{
private BuildingRepository $buildingRepository;
private BuildingService $buildingService;
private FlatService $flatService;
/**
* @param BuildingRepository $buildingRepository
* @param BuildingService $buildingService
* @param FlatService $flatService
*/
public function __construct(
BuildingRepository $buildingRepository,
BuildingService $buildingService,
FlatService $flatService
) {
parent::__construct($buildingRepository);
$this->buildingRepository = $buildingRepository;
$this->buildingService = $buildingService;
$this->flatService = $flatService;
}
/**
* @Rest\Get("/", name="managers_buildings_index")
* @param Request $request
* @return array<string, mixed>
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function index(Request $request): array
{
$options = $this->getListOptions($request);
/** @var User $user */
$user = $this->getUser();
return $this->buildingService->getBuildingsPaginatedApi($user, $options, 1);
}
/**
* @Rest\Get("/{buildingId}/flats", name="managers_building_flats")
* @param Request $request
* @param int $buildingId
* @return array<string, mixed>
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function show(Request $request, int $buildingId): array
{
/** @var User $user */
$user = $this->getUser();
/** @var Building|null $building */
$building = $this->getBuilding($buildingId, $user);
$options = $this->getListOptions($request);
return [
'building' => $building,
'flats' => $this->flatService->getFlatsByBuildingPaginated($building, $options)
];
}
/**
* @Rest\Put("/{buildingId}/change-status", name="managers_building_change_status")
*/
public function changeBuildingStatus(int $buildingId): Building
{
/** @var User $user */
$user = $this->getUser();
/** @var Building|null $building */
$building = $this->getBuilding($buildingId, $user);
$newStatus = (int) !$building->getActiveStatus();
$building->setActiveStatus($newStatus);
$this->buildingRepository->flush();
return $building;
}
}