<?php declare(strict_types=1);
namespace App\StartPlatz\Bundle\AlphaBundle\Controller;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Feed;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Page;
use App\StartPlatz\Bundle\FeedbackBundle\CallbackService;
use App\StartPlatz\Bundle\MemberBundle\Entity\Member;
use App\StartPlatz\Bundle\MemberBundle\Entity\MemberTeam;
use App\StartPlatz\Bundle\MemberBundle\Entity\Team;
use App\StartPlatz\Bundle\MetaBundle\Entity\Attribute;
use App\StartPlatz\Bundle\StartupBundle\Entity\Application;
use App\StartPlatz\Bundle\StartupBundle\Entity\Startup;
use App\StartPlatz\Bundle\UserBundle\Entity\User;
use DateTime;
use Speicher210\CloudinaryBundle\Cloudinary\Api;
use Symfony\Component\Routing\Annotation\Route;
use App\StartPlatz\Bundle\FeedbackBundle\FeedbackService;
use App\StartPlatz\Bundle\WebsiteBundle\MenuTranslationService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class PageController extends AbstractController
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly SessionInterface $session,
private readonly FeedbackService $feedbackService,
private readonly CallbackService $callbackService,
private readonly MenuTranslationService $menuTranslationService,
private readonly Api $cloudinary)
{
}
#[Route('/x/partners/home', name: 'x_partner_home')]
public function partnerPagesAction(Request $request)
{
return $this->redirectToRoute('connect_partner_index', $request->query->all(), 301);
}
#[Route('/partner', name: 'homepage_partner_home')]
#[Route('/en/partner', name: 'homepage_partner_home_english')]
#[Route('/fr/partenaires', name: 'homepage_partner_home_french')]
public function partnerPagesHomepageAction(Request $request)
{
$redirect = json_decode(base64_decode((string) $request->get('redirect'))) ;
/** @var User $user */
if ($user = $this->getUser()) {
$this->entityManager->getRepository(User::class)->writeActivity($user);
$member = $this->entityManager->getRepository(Member::class)->find($user->getMemberId());
} else {
$member = $this->entityManager->getRepository(Member::class)->setEmptyMemberAccount();
}
$parentPageSlug = "partner";
if (!$parentPage = $this->entityManager->getRepository(Page::class)->findOneBy(['slug'=>$parentPageSlug])) {
$parentPage = new Page();
$parentPage->setTitle('Partner');
$parentPage->setTeaser('A strong ecosystem only works with strong partners.');
$parentPage->setDescription('Page Description');
}
$ajax = $request->get('ajax');
$limit = 128;
if (!$page = $request->get('page')) {
$page = 1;
}
$pageTypes = $this->entityManager->getRepository(Attribute::class)->findBy(['name'=>'page.type','parent'=>'partner']);
$types = array_map(fn ($result) => $result->getCode(), $pageTypes);
if ($topic = $request->get('topic')) {
$criteria = ['partners'=>$types,'tags'=>$topic, 'isActive'=>1, 'status'=>'publish' ];
} else {
$criteria = ['partners'=>$types, 'isActive'=>1, 'status'=>'publish' ];
}
$partners = $this->entityManager->getRepository(Page::class)->findPaginated($criteria, ['partnerAdminRating'=> 'DESC', 'lastModified'=>'DESC'], $page, $limit);
$total = $this->entityManager->getRepository(Page::class)->countByCriteria($criteria);
$path = $request->getPathInfo();
$lang = 'DE';
if (str_starts_with($path, "/en/")) {
$lang = 'EN';
} elseif (str_starts_with($path, "/fr/")) {
$lang = 'FR';
}
$pageTypes = $this->entityManager->getRepository(Page::class)->getPartnerPageTypes();
$view = '@StartPlatzAlphaBundle/Page/index.partners.homepage.html.twig';
$viewFeed = '@StartPlatzAlphaBundle/Page/_feed.partners.homepage.html.twig';
$requiredVisibility = 'public';
$criteriaToFindAllRelatedTags = ['partners'=>$types, 'isActive'=>1, 'status'=>'publish' ];
$tags = $this->entityManager->getRepository(Page::class)->getTagListByFilter($criteriaToFindAllRelatedTags);
$allowedTags = $this->entityManager->getRepository(Attribute::class)->findBy(['name'=>'partner.tags']);
foreach($allowedTags as $key => $tag) {
if($tag->getLabel() == 'Other') {
unset($allowedTags[$key]);
array_push($allowedTags, $tag);
}
}
if ($ajax) {
return $this->render($viewFeed, [
'partners' => $partners,
'pageTypes' => $pageTypes,
'lang' => $lang,
'topic' => $topic,
'requiredVisibility' => $requiredVisibility,
'userMember' => $member,
'maxPages' => ceil($total/$limit),
'thisPage' => $page,
'ajax' => $ajax,
'limit' => $limit,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_partner_home', 'parameters' => []])),
'templateVars' => [],
]);
} else {
return $this->render($view, [
'partners' => $partners,
'pageTypes' => $pageTypes,
'lang' => $lang,
'total' => $total,
'parentPage' => $parentPage,
'topic' => $topic,
'tags' => $tags,
'topics' => $allowedTags,
'requiredVisibility' => $requiredVisibility,
'userMember' => $member,
'maxPages' => ceil($total/$limit),
'thisPage' => $page,
'ajax' => $ajax,
'limit' => $limit,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_partner_home', 'parameters' => []])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
}
#[Route('/x/partner/{slug}', name: 'x_partner_single')]
public function singleAction(Request $request, $slug)
{
return $this->redirectToRoute('connect_partner_detail', ['slug' => $slug] + $request->query->all(), 301);
}
#[Route('/partner/{slug}', name: 'homepage_partner_single')]
#[Route('/en/partner/{slug}', name: 'homepage_partner_single_english')]
#[Route('/fr/partenaires/{slug}', name: 'homepage_partner_single_french')]
public function singleHomepageAction(Request $request, $slug)
{
if (!$redirect = json_decode(base64_decode((string) $request->get('redirect')))) {
$redirect = json_decode(json_encode(['path' => 'homepage_partner_home', 'parameters' => []]));
}
/** @var User $user */
if ($user = $this->getUser()) {
$this->entityManager->getRepository(User::class)->writeActivity($user);
}
$parts = explode('-', (string) $slug, 2);
$id = $parts[0];
$slug = $parts[1] ?? null;
if (!is_numeric($id) || !$slug) {
throw $this->createNotFoundException();
}
/** @var Page $page */
if (!$page = $this->entityManager->getRepository(Page::class)->findOneBy(['id' => $id])) {
if ($id > 3_000_000) {
return $this->redirect($this->generateUrl('extern_startups_single', ['id' => $id, 'slug' => $slug]));
}
throw $this->createNotFoundException();
}
$team = $this->entityManager->getRepository(Team::class)->findOneBy(['id'=>$page->getTeamId()]);
$feedItems = [];
$entities = [];
if ($page->getFeedTags()) {
$feedItems = $this->entityManager->getRepository(Feed::class)->findByFeedTag($page->getFeedTags());
$entities = $this->entityManager->getRepository(Feed::class)->getEntitiesByFeedItems($feedItems);
}
$lang = "DE";
if (str_contains((string) $request->get('_route'), 'english')) {
$lang = "EN";
} elseif (str_contains((string) $request->get('_route'), 'french')) {
$lang = "FR";
}
$memberTypes = [];
$applications = [];
if ($team) {
if ($team->getType() == 'Partner') {
$memberTypes = ['GF', 'AP'];
}
$this->entityManager->getRepository(Member::class)->checkIfDescriptionIsEmptyButMentorProfileIsFilled($team);
$relevantProgramIds = ['1','2','3'];
$applications = $this->entityManager->getRepository(Application::class)->findBy(['teamId'=>$team->getId(),'programId'=>$relevantProgramIds]);
}
$members = $this->entityManager->getRepository(MemberTeam::class)->getTeamMembers($id, $memberTypes);
$allowEdit = false;
$teamMember = false;
if($user) {
$userEmail = $this->getUser()->getEmail();
foreach ($members as $member) {
if ($member['email'] == $userEmail) {
$teamMember = true;
if ($member['type'] == 'AP' || $member['type'] == 'GF') {
$allowEdit = true;
}
}
}
}
$view = "@StartPlatzAlphaBundle/Page/single.partner.homepage.html.twig";
return $this->render($view, [
'members' => $members,
'memberTypes' => $memberTypes,
'allowEdit' => $allowEdit,
'teamMember' => $teamMember,
'id' => $id,
'slug' => $slug,
'item' => $page,
'partner' => $page,
'team' => $team,
'feedItems' => $feedItems,
'entities' => $entities,
'lang' => $lang,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_partner_single', 'parameters' => ['slug'=>$id . '-'. $slug] ])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
public function listServicePages4WordPressAction(Request $request)
{
$redirect = json_decode(base64_decode((string) $request->get('redirect'))) ;
$criteria = ['partners'=>['service-partner', 'partner'],'isActive'=>1, 'status'=>'publish' ];
$servicePartners = $this->entityManager->getRepository(Page::class)->findAllPages($criteria, []);
//$servicePartners = $this->entityManager->getRepository(Page::class)->findBy(['type'=>'service-partner' ,'isActive'=>1, 'status'=>'publish'],['lastModified'=>'DESC']);
return $this->render('@StartPlatzAlphaBundle/Page/listServicePages4WordPress.html.twig', ['servicePartners' => $servicePartners, 'redirectUrl' => base64_encode(json_encode(['path' => 'allmeda_pages_home', 'parameters' => []]))]);
}
#[Route('/x/service-partner/{id}/{slug}', name: 'x_page_service-partner_id')]
public function showPageServicePartnerRedirectAction(Request $request, $id, $slug)
{
return $this->redirectToRoute('connect_partner_service', ['id' => $id, 'slug' => $slug] + $request->query->all(), 301);
}
#[Route('/service-partner/{id}/{slug}', name: 'website_page_service-partner_id')]
public function showPageServicePartnerAction(Request $request, $id, $slug)
{
$templateVars = $this->entityManager->getRepository(Page::class)->getTemplateVars($request);
if (!$redirect = json_decode(base64_decode((string) $request->get('redirect')))) {
$redirect = json_decode(json_encode(['path' => 'homepage_partner_home', 'parameters' => []]));
}
$now = new DateTime();
if ($user = $this->getUser()) {
$this->entityManager->getRepository(User::class)->writeActivity($user);
}
if (!$page = $this->entityManager->getRepository(Page::class)->findOneBy(['id' => $id])) {
$this->session->getFlashBag()->add('notice', 'ERROR 081: no page found');
return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
}
$myTeamIds = $this->entityManager->getRepository(MemberTeam::class)->findMyTeamsByUser($this->getUser());
$team = $this->entityManager->getRepository(Team::class)->findOneBy(['id'=>$page->getTeamId()]);
$view = '@StartPlatzAlphaBundle/Page/show.servicePartner.website.html.twig';
return $this->render($view, [
'page' =>$page,
'servicePartner' => $page,
'id' => $id,
'myTeamIds' => $myTeamIds,
'team' => $team,
'redirectUrl' => base64_encode(json_encode(['path' => 'website_page_service-partner_id', 'parameters' => ['id'=>$id, 'slug' => $slug]])),
'templateVars' => $templateVars,
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
}