<?php
namespace App\Controller;
use App\Command\ConfigurationPreparationCommand;
use App\Entity\App\Configuration;
use App\Form\Type\SingleConfigType;
use App\Service\ApiService;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Pobieranie danych konfiguracyjnych
*
* Zwracane są jedynie pola konfiguracyjne, które mają ustawioną flagę **isApiAvailable** na true.
*
* @see Configuration Encja konfiguracyjna
* @see ConfigurationPreparationCommand Uzupełnianie bazy konfiguracyjnej o wymagane dane
* @see \AF\AdminBundle\Controller\ConfigurationController Zarządzanie konfiguracją (CMS)
*/
class ConfigurationController extends AbstractController
{
/**
* Wstrzykiwanie serwisów
*
* @param ManagerRegistry $registry Obsługa bazy danych
*/
public function __construct(private ManagerRegistry $registry)
{
}
/**
* Get list of configurations or return one configuration information
*
* @api {get} /api/v1/public/configurations Lista kategorii
* @apiDescription <a href="#api-Konfiguracja-GetApiV1PublicConfigurationsSlug"> Zobacz szczegóły konfiguracji </a>
* @apiVersion 1.0.0
* @apiGroup Konfiguracja
* @apiSuccess {Integer} id Id
* @apiSuccess {String} name Nazwa kategorii
* @apiSuccess {Integer} type Typ
* @apiSuccess {String} iso Język ("pl" / "en" / "de" )
* @apiError {Array} messages Opisy błędów
* @apiExample Success 200
* HTTP/1.1 200 OK
* [
* {
* "id": 9
* "name": "Relaks i regeneracja",
* "value": "/uploads/general/yoga_schedule_7.pdf",
* "iso": "pl"
* }
* ]
*/
/**
* Pobieranie udostępnionych pól konfiguracyjnych
*
* @api {get} /api/v1/public/configurations/:slug Szczegóły konfiguracji
* @apiDescription <b> Uwaga! </b> Ten endpoint nie zwraca dodatkowych nagłówków. <br/>
* Zwracane są tylko te wartości, które w bazie mają zaznaczone "isApiAvailable" = 1. <br/>
* Zamiast slugu możemy podać nazwę interesującego nas wpisu, np. yoga_schedule <br/>
* Dokumentacja API może wprowadzać w błąd, dlatego dla wyjaśnienia
* @apiSampleRequest /api/v1/public/configurations/
* @apiVersion 1.0.0
* @apiGroup Konfiguracja
* @apiSuccess {Integer} id Id
* @apiSuccess {String} name Nazwa kategorii
* @apiSuccess {Integer} type Typ
* @apiSuccess {String} iso Język ("pl" / "en" / "de" )
* @apiError {Array} messages Opisy błędów
* @apiExample Success 200
* HTTP/1.1 200 OK
* {
* "id": 9
* "name": "Relaks i regeneracja",
* "value": "/uploads/general/yoga_schedule_7.pdf",
* "iso": "pl"
* }
*
* @param ApiService $apiService Obsługa danych zwracanych na front
* @param string|null $slug Zawężenie wyszukiwania do jednej opcji
* @return JsonResponse
*/
public function configurations(ApiService $apiService, string $slug = null): JsonResponse
{
$filters = [
'isApiAvailable' => true,
'iso' => $apiService->getClientLanguage(),
];
if ( $slug !== null ) {
$filters['name'] = $slug;
}
$configurations = $this->registry->getRepository('App\Entity\App\Configuration')->findBy($filters);
if ( $configurations === null || count($configurations) === 0 ) {
return new JsonResponse('Żądany zasób nie został znaleziony.', 400);
}
$resp = [];
foreach ($configurations as $config) {
$resp[] = [
'id' => $config->getId(),
'name' => $config->getName(),
'value' => $config->getValue(),
'iso' => $config->getIso()
];
}
if ($slug !== null && count($resp) === 1) {
return new JsonResponse($resp[0]);
}
return new JsonResponse($resp);
}
/**
* Pobieranie plików
*
* Do każdego pliku dodawany jest timestamp, dlatego nie są one trzymane w cache'u.
* Obsługa została wprowadzona, ponieważ w CMS, podczas aktualizacji pliku, obrazek się podmieniał w bazie
* danych, ale na froncie nadal był wczytywany stary plik.
*
* @see SingleConfigType Nadpisanie funkcji do pobierania plików konfiguracyjnych w paczce AdminBundle
*
* @param string $filename Nazwa pliku
* @return RedirectResponse
*/
public function fileRedirect(string $filename): RedirectResponse
{
$configuration = $this->registry->getRepository('App\Entity\App\Configuration')
->createQueryBuilder('f')
->where('f.valueType = :valueType')
->andWhere('f.value LIKE :name')
->setParameters([
'valueType' => 'file',
'name' => '%'.$filename
])
->getQuery()
->getResult();
if ( count($configuration) === 0 ) {
throw new NotFoundHttpException();
}
return $this->redirect($configuration[0]->getValue().'?v='.(new \DateTime())->getTimestamp());
}
}