<?php
namespace App\Controller;
use App\Service\CategoryConfigurationService;
use App\Service\SAGEApiService;
use App\Service\LocationService;
use App\Helper\StoryblokHelper;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpFoundation\Response;
use Storyblok;
class WebController extends AbstractController
{
private $storyblok;
private $logger;
private $requestStack;
private $categoryConfigurationService;
private $locationService;
private $defaultLocale;
private $countryLanguageMapping;
private $storyblokHelper;
private $micrositeNameMap;
private $aimsUseNewComponentsLanguages;
private $aimsUseNewComponentsLanguagesEditMode;
private $sageApiService;
private $backendUrlAWS;
public function __construct(
string $defaultLocale,
array $countryLanguageMapping,
array $micrositeNameMap,
array $aimsUseNewComponentsLanguages,
array $aimsUseNewComponentsLanguagesEditMode,
string $backendUrlAWS,
Storyblok\Client $storyblok,
CategoryConfigurationService $categoryConfigurationService,
LoggerInterface $logger,
RequestStack $requestStack,
LocationService $locationService,
StoryblokHelper $storyblokHelper,
SAGEApiService $sageApiService
) {
$this->storyblok = $storyblok;
$this->logger = $logger;
$this->requestStack = $requestStack;
$this->categoryConfigurationService = $categoryConfigurationService;
$this->locationService = $locationService;
$this->defaultLocale = $defaultLocale;
$this->countryLanguageMapping = $countryLanguageMapping;
$this->storyblokHelper = $storyblokHelper;
$this->micrositeNameMap = $micrositeNameMap;
$this->aimsUseNewComponentsLanguages = $aimsUseNewComponentsLanguages;
$this->aimsUseNewComponentsLanguagesEditMode = $aimsUseNewComponentsLanguagesEditMode;
$this->sageApiService = $sageApiService;
$this->backendUrlAWS = $backendUrlAWS;
}
public function home()
{
try {
$currentLocation = $this->locationService->getCurrentLocation();
$countryCode = $currentLocation;
if (isset($this->countryLanguageMapping[$countryCode])) {
$locale = $this->countryLanguageMapping[$countryCode];
} else {
$locale = $this->defaultLocale;
}
if ($this->requestStack->getCurrentRequest()->headers->has('X-Microsite')) {
$microsite = $this->requestStack->getCurrentRequest()->headers->get('X-Microsite');
if ($microsite === 'activationcode') {
$locale = 'en_global';
}
}
$queryParams = [
"_locale" => $locale,
"redirect" => "true"
];
$acQueryParam = $this->requestStack->getCurrentRequest()->query->get('ac');
if ($acQueryParam) {
$queryParams['ac'] = $acQueryParam;
}
return $this->redirectToRoute("lang", $queryParams);
} catch (\Exception $e) {
return $this->redirectToRoute("lang", [
"_locale" => 'en_global',
"redirect" => "true"
]);
}
}
public function shortlink($slug)
{
$client = new \GuzzleHttp\Client();
$res = $client->request(
'GET',
$this->backendUrlAWS . '/short-url' . $slug,
[
'headers' => ['X-Site-ID' => 'DENT'],
]
);
$redirectUrl = $res->getBody()->getContents();
if ($redirectUrl) {
return $this->redirect($redirectUrl);
}
throw new NotFoundHttpException('Shortlink ' . $slug . ' not found');
}
public function footcontrol()
{
return $this->forward("App\\Controller\\WebController::langSlug", [
"_locale" => "en_global",
"slug" => "dental-newsroom/foot-control"
]);
}
public function downloadcentreOem(string $_locale, string $partner)
{
$data = [];
$data['oemPartner'] = $partner;
return $this->langSlug($_locale, 'dental-service/downloadcentre-oem', $data);
}
public function lang($_locale)
{
return $this->langSlug($_locale, '');
}
public function slugIdGenerator()
{
if ($this->storyblokHelper->isEditmode() || $_SERVER['APP_ENV'] === "dev") {
try {
$story = $this->storyblok->getStoryBySlug('slug-id-generator')
->getBody()['story'];
} catch (\Exception $e) {
$this->logger->error($e);
throw new NotFoundHttpException("Story slug-id-generator does not exist.", $e);
}
try {
return $this->render('slug_id_generator.twig');
} catch (\Exception $e) {
$this->logger->error($e);
throw new HttpException(500, "Twig render failed.", $e);
}
} else {
throw new HttpException(403, "Forbidden");
}
}
public function langSlugMicrosite($_locale, $microsite, $slug = "")
{
$fullSlug = null;
$categoryData = null;
$story = null;
try {
$name = isset($this->micrositeNameMap[$microsite]) ? $this->micrositeNameMap[$microsite] : $microsite;
$slug = 'microsites/' . $name . '/' . str_replace($microsite . '/', "", $slug);
} catch (\Exception $e) {
$this->logger->error($e);
throw new HttpException(500, "Twig render failed.", $e);
}
try {
$fullSlug = $this->categoryConfigurationService->getSlugByLocaleAndUrlPart($_locale, $slug);
$categoryData = $this->categoryConfigurationService->getBySlug($fullSlug);
} catch (\Exception $e) {
$this->logger->error($e);
throw new NotFoundHttpException("Wasn't able to fetch config for $_locale/$slug.", $e);
}
try {
$story = $this->storyblok->getStoryBySlug($fullSlug)
->getBody()['story'];
} catch (\Exception $e) {
$this->logger->error($e);
throw new NotFoundHttpException("Story $fullSlug does not exist.", $e);
}
try {
$newPostfix = '';
$useNewAimsComponents = false;
if (
$name === 'aims' && (in_array($_locale, $this->aimsUseNewComponentsLanguages) ||
(in_array($_locale, $this->aimsUseNewComponentsLanguagesEditMode) && ($_SERVER['APP_ENV'] === "test" || $_SERVER['APP_ENV'] === "dev")))
) {
$newPostfix = '-new';
$useNewAimsComponents = true;
}
return $this->render('microsites/' . $name . '/' . $categoryData['template'] . $newPostfix . '.twig', [
"story" => $story,
"category" => $categoryData,
"useNewAimsComponents" => $useNewAimsComponents
]);
} catch (\Exception $e) {
$this->logger->error($e);
throw new HttpException(500, "Twig render failed.", $e);
}
}
public function langSlug($_locale, $slug, $data = null)
{
if ($this->shouldRedirectForFinland()) {
return $this->redirect('/se_nordic/kontakt/vi-pa-whfinland/');
}
if ($this->requestStack->getCurrentRequest()->headers->has('X-Microsite')) {
try {
$microsite = $this->requestStack->getCurrentRequest()->headers->get('X-Microsite');
return $this->langSlugMicrosite($_locale, $microsite, $slug);
} catch (\Exception $e) {
$this->logger->error($e);
throw new HttpException(500, "Twig render failed.", $e);
}
}
$fullSlug = null;
$categoryData = null;
$story = null;
try {
$fullSlug = $this->categoryConfigurationService->getSlugByLocaleAndUrlPart($_locale, $slug);
$categoryData = $this->categoryConfigurationService->getBySlug($fullSlug);
} catch (\Exception $e) {
$this->logger->error($e);
throw new NotFoundHttpException("Wasn't able to fetch config for $_locale/$slug.", $e);
}
try {
$story = $this->storyblok->getStoryBySlug($fullSlug)
->getBody()['story'];
} catch (\Exception $e) {
$this->logger->error($e);
throw new NotFoundHttpException("Story $fullSlug does not exist.", $e);
}
try {
return $this->render($categoryData['template'] . '.twig', [
"story" => $story,
"category" => $categoryData,
"data" => $data
]);
} catch (\Exception $e) {
$this->logger->error($e);
throw new HttpException(500, "Twig render failed.", $e);
}
}
public function phpInfo()
{
phpInfo();
return new Response(
'phpInfo',
Response::HTTP_OK
);
}
public function shouldRedirectForFinland()
{
$isUserFromFinland = $this->requestStack->getCurrentRequest()->attributes->get('HTTP_CLOUDFRONT_VIEWER_COUNTRY') === 'fi';
$hasUserNotBeenRedirected = !isset($_COOKIE['finland_redirected']);
if ($isUserFromFinland && $hasUserNotBeenRedirected) {
setcookie('finland_redirected', true, time() + (10 * 365 * 24 * 60 * 60), '/');
}
return $isUserFromFinland && $hasUserNotBeenRedirected;
}
public function robots(): Response
{
$content = $this->renderView('robots.twig');
return new Response($content, 200, array('content-type' => 'text/plain'));
}
public function jobDetail($_locale, $job_id)
{
if (empty($job_id)) {
try {
$categoryData = $this->categoryConfigurationService->getByFamilyId($_locale, '/career/openpositions');
$fullSlug = $categoryData['seo_url'];
$story = $this->storyblok->getStoryBySlug($fullSlug)
->getBody()['story'];
return $this->render($categoryData['template'] . '.twig', [
"category" => $categoryData,
"story" => $story
]);
} catch (\Exception $e) {
$this->logger->error($e);
throw new NotFoundHttpException("Could not load job overview", $e);
}
}
$categoryData = null;
try {
$categoryData = $this->categoryConfigurationService->getByFamilyId($_locale, '/career/openpositions/detail');
$story = $this->storyblok->getStoryBySlug($categoryData['seo_url'])
->getBody()['story'];
$job = $this->sageApiService->getJobById($job_id);
} catch (\Exception $e) {
$this->logger->error($e);
throw new NotFoundHttpException("Job $job_id could not be found.", $e);
}
try {
return $this->render($categoryData['template'] . '.twig', [
"job" => $job,
"category" => $categoryData,
"story" => $story
]);
} catch (\Exception $e) {
$this->logger->error($e);
throw new HttpException(500, "Twig render failed.", $e);
}
}
}