<?php
namespace App\Controller\API;
use App\Entity\Admin\Dashboard;
use App\Entity\Admin\User;
use App\Entity\Admin\UserDashboard;
use App\Entity\Admin\Header;
use App\Entity\Admin\DashboardHeader;
use App\Manager\Admin\DashboardManager;
use App\Manager\Admin\UserDashboardManager;
use App\Manager\Admin\HeaderManager;
use App\Manager\Admin\DashboardHeaderManager;
use App\Manager\Admin\UserManager;
use App\Manager\Admin\ProduitManager;
use App\Manager\Admin\SearchManager;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* @Route ("/api/dashboard", name="api_dashboard_")
*/
class DashboardController
{
public function __construct(
private readonly DashboardManager $dashboardManager,
private readonly UserDashboardManager $userDashboardManager,
private readonly HeaderManager $headerManager,
private readonly DashboardHeaderManager $dashboardHeaderManager,
private readonly UserManager $userManager,
private readonly ProduitManager $produitManager,
private readonly SearchManager $searchManager
) {
}
/**
* @Route ("/getpu/{produitname}/{username}", name="get_product_user")
*/
function getDashboardsByProductAndUser(string $produitname, string $username): ?JsonResponse
{
$user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
$produit = $this->produitManager->getRepository()->findOneBy(['name' => $produitname]);
if ($user && $produit) {
$dashboards = $this->dashboardManager->getRepository()->getDashboardsByProductsAndUser($produit, $user);
if ($dashboards) {
$datas = [];
foreach ($dashboards as $dashboard) {
$datas[] = $this->dashboardManager->formatDashboardDatas($dashboard, $user);
}
return new JsonResponse(['message' => 'ok', 'datas' => $datas]);
}
return new JsonResponse(['message' => 'Aucun dashboard'], 500);
}
return new JsonResponse(['message' => 'Utilisateur ou produit inexistant'], 500);
}
/**
* @Route ("/getdu/{dashboard}/{username}", name="get_dashboard_user")
*/
function getDashboardByIdAndUser(Dashboard $dashboard, string $username): ?JsonResponse
{
$datas = [];
$user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
if ($dashboard && $user) {
$datas[] = $this->dashboardManager->formatDashboardDatas($dashboard, $user);
return new JsonResponse(['message' => 'ok', 'datas' => $datas]);
}
return new JsonResponse(['message' => 'Dashboard ou user inexistant'], 500);
}
/**
* @Route ("/getheader/{produitname}", name="get_header_product")
*/
function getHeadersByProduct(string $produitname): ?JsonResponse
{
$produit = $this->produitManager->getRepository()->findOneBy(['name' => $produitname]);
if ($produit) {
$headers = $this->headerManager->getRepository()->findBy(['produit' => $produit]);
if ($headers) {
$datas = [];
foreach ($headers as $header) {
$datas[] = [
'id' => $header->getId(),
'name' => $header->getName(),
'label' => $header->getLabel(),
'produit' => $produit->getName(),
];
}
return new JsonResponse(['message' => 'ok', 'datas' => $datas]);
}
return new JsonResponse(['message' => 'Aucun dashboard'], 500);
}
return new JsonResponse(['message' => 'Utilisateur ou produit inexistant'], 500);
}
/**
* @Route ("/manage", name="manage")
*/
function manageDashboard(Request $request): ?JsonResponse
{
$errors = [];
$requestContent = json_decode($request->getContent(), true);
if (!isset($requestContent['codeGestionnaire']) || empty($requestContent['codeGestionnaire'])) {
return new JsonResponse(['message' => 'Code gestionnaire manquant'], 500);
}
if (!isset($requestContent['produit']) || empty($requestContent['produit'])) {
return new JsonResponse(['message' => 'Produit'], 500);
}
if (!isset($requestContent['dashboard']) || empty($requestContent['dashboard'])) {
return new JsonResponse(['message' => 'Dashboard manquant'], 500);
}
if (!isset($requestContent['dashboard']['headers']) || empty($requestContent['dashboard']['headers'])) {
return new JsonResponse(['message' => 'Headers manquant'], 500);
}
$user = $this->userManager->getRepository()->findOneBy(['username' => $requestContent['codeGestionnaire'], 'deletedAt' => null]);
if (!$user) {
return new JsonResponse(['message' => 'Utilisateur inexistant'], 500);
}
$produit = $this->produitManager->getRepository()->findOneBy(['name' => $requestContent['produit']]);
if (!$produit) {
return new JsonResponse(['message' => 'Produit inexistant'], 500);
}
if (isset($requestContent['dashboard']['id']) && $requestContent['dashboard']['id'] > 0) {
$dashboard = $this->dashboardManager->getRepository()->find($requestContent['dashboard']['id']);
if (!$dashboard) {
return new JsonResponse(['message' => 'Dashboard inexistant'], 500);
}
} else {
$dashboard = new Dashboard();
}
$dashboard->setProduit($produit);
$dashboard->setName($requestContent['dashboard']['name']);
$dashboard->setAuthor($requestContent['dashboard']['author']);
$dashboard->setIsPrivate($requestContent['dashboard']['isPrivate']);
if (isset($requestContent['dashboard']['ordre'])) {
$dashboard->setOrdre($requestContent['dashboard']['ordre']);
}
$dashboard = $this->dashboardManager->update($dashboard);
$userDashboard = $this->userDashboardManager->getRepository()->findOneBy(['dashboard' => $dashboard, 'user' => $user]);
if (!$userDashboard) {
$userDashboard = new UserDashboard();
$userDashboard->setUser($user);
$userDashboard->setDashboard($dashboard);
}
if (isset($requestContent['dashboard']['searchId']) && $requestContent['dashboard']['searchId'] > 0) {
$search = $this->searchManager->getRepository()->find($requestContent['dashboard']['searchId']);
if ($search) {
$userDashboard->setSearchId($search->getId());
} else {
$errors[] = "Le search id #{$requestContent['dashboard']['searchId']} n'existe pas, liaison impossible.";
}
}
$userDashboard->setIconColor($requestContent['dashboard']['iconColor']);
$userDashboard->setPictogramme($requestContent['dashboard']['pictogramme']);
$userDashboard->setPrincipal($requestContent['dashboard']['principal']);
$userDashboard->setIsDefault($requestContent['dashboard']['isDefault']);
$userDashboard = $this->userDashboardManager->update($userDashboard);
if ($requestContent['dashboard']['isDefault']) {
$userDashboards = $this->userDashboardManager->getRepository()->findBy(['user' => $user]);
foreach ($userDashboards as $userDashboardTmp) {
if ($userDashboardTmp->getIsDefault() && $userDashboardTmp->getId() != $userDashboard->getId()) {
$userDashboardTmp->setIsDefault(0);
$this->userDashboardManager->update($userDashboardTmp);
}
}
}
$headerIds = [];
foreach ($requestContent['dashboard']['headers'] as $headerTmp) {
if (isset($headerTmp['id']) && $headerTmp['id'] > 0) {
$header = $this->headerManager->getRepository()->find($headerTmp['id']);
if (!$header) {
$errors[] = "Les headers id #{$headerTmp['id']} n'existe pas, création d'une correspondance.";
$header = new Header();
$header->setProduit($produit);
}
} else {
$header = new Header();
$header->setProduit($produit);
}
$header->setName($headerTmp['name']);
$header->setLabel($headerTmp['label']);
$header = $this->headerManager->update($header);
$headerIds[] = $header->getId();
$dashboardHeader = $this->dashboardHeaderManager->getRepository()->findOneBy(['header' => $header, 'dashboard' => $dashboard]);
if (!$dashboardHeader) {
$dashboardHeader = new DashboardHeader();
$dashboardHeader->setHeader($header);
$dashboardHeader->setDashboard($dashboard);
}
$dashboardHeader->setOrdre($headerTmp['ordre']);
$dashboardHeader = $this->dashboardHeaderManager->update($dashboardHeader);
}
$dashboardHeaders = $this->dashboardHeaderManager->getRepository()->findBy(['dashboard' => $dashboard]);
if ($dashboardHeaders) {
foreach ($dashboardHeaders as $dashboardHeader) {
if (!in_array($dashboardHeader->getHeader()->getId(), $headerIds)) {
$this->dashboardHeaderManager->delete($dashboardHeader);
}
}
}
return new JsonResponse(['message' => 'ok', 'errors' => $errors, 'datas' => [$this->dashboardManager->formatDashboardDatas($dashboard, $user)]]);
}
/**
* @Route ("/delete/{gesCode}/{dashboardId}", name="delete")
*/
public function deleteDashboard(string $gesCode, int $dashboardId): ?JsonResponse
{
/** @var User $user */
$user = $this->userManager->getRepository()->findOneBy(['username' => $gesCode, 'deletedAt' => null]);
/** @var UserDashboard $userDashboard */
$userDashboard = $this->userDashboardManager->getRepository()->findOneBy(['user' => $user, 'dashboard' => $dashboardId]);
if ($userDashboard) {
$this->userDashboardManager->delete($userDashboard);
return new JsonResponse(['message' => 'ok', 'errors' => []]);
}
return new JsonResponse(['message' => 'ko', 'errors' => ['Aucun dashboard correspondant trouvé.']], 500);
}
}