<?php declare(strict_types=1);
namespace App\StartPlatz\Bundle\AlphaBundle\Controller;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Actor;
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 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 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")
* @Route("/partner", name="homepage_partner_home")
* @Route("/en/partner", name="homepage_partner_home_english")
* @Route("/fr/partenaires", name="homepage_partner_home_french")
*/
public function partnerPagesAction(Request $request)
{
$em=$this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string) $request->get('redirect'))) ;
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
$member = $em->getRepository(Member::class)->find($user->getMemberId());
} else {
$member = $em->getRepository(Member::class)->setEmptyMemberAccount();
}
$parentPageSlug = "partner";
if (!$parentPage = $em->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 = $em->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 = $em->getRepository(Page::class)->findPaginated($criteria, ['partnerAdminRating'=> 'DESC', 'lastModified'=>'DESC'], $page, $limit);
$total = $em->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 = $em->getRepository(Page::class)->getPartnerPageTypes();
$route = $request->get('_route');
if ($route == 'x_partner_home') {
$view = '@StartPlatzAlphaBundle/Page/CorporatePartner__index.twig';
$viewFeed = '@StartPlatzAlphaBundle/Page/_feed.partners.sp-connect.html.twig';
$requiredVisibility = 'sp-connect';
} else {
$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 = $em->getRepository(Page::class)->getTagListByFilter($criteriaToFindAllRelatedTags);
$allowedTags = $em->getRepository(Attribute::class)->findBy(['name'=>'partner.tags']);
foreach($allowedTags as $key => $tag) {
if($tag->getLabel() == 'Other') {
unset($allowedTags[$key]);
array_push($allowedTags, $tag);
}
}
//$menuLinksAndPhrases = $this->menuTranslationService->getMenuLinksAndPhrases( $request->server->get('REQUEST_URI') );
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")
* @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 singleAction(Request $request, $slug)
{
$em = $this->getDoctrine()->getManager();
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()) {
$em->getRepository(User::class)->writeActivity($user);
}
$id = explode('-', (string) $slug)[0];
$slug = explode('-', (string) $slug)[1];
/** @var Page $page */
if (!$page = $em->getRepository(Page::class)->findOneBy(['id'=>$id])) {
$receiver = "lorenz.graef@startplatz.de";
$sender = "support@startplatz.de";
$mailSubject = "Error 4711 with Page Controller";
$mailText = "Page {$id} {$slug} called by {$request->getPathInfo()} from referer {$request->headers->get('referer')} does not exist";
$this->callbackService->sendAlertMailPerZapier($receiver, $mailText, $mailSubject, $sender);
if ($id > 3_000_000) {
return $this->redirect($this->generateUrl('extern_startups_single', ['id'=>$id, 'slug'=>$slug]));
}
$this->session->getFlashBag()->add('notice', 'ERROR - item not found');
return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
}
$team = $em->getRepository(Team::class)->findOneBy(['id'=>$page->getTeamId()]);
$feedItems = [];
$entities = [];
if ($page->getFeedTags()) {
$feedItems = $em->getRepository(Feed::class)->findByFeedTag($page->getFeedTags());
$entities = $em->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 = [];
$teamIndustries = [];
$teamIndustryList = "";
$applications = [];
if ($team) {
if ($team->getType() == 'Partner') {
$memberTypes = ['GF', 'AP'];
}
$teamIndustries = $team->getIndustries();
$teamIndustryList = explode("#", (string) $teamIndustries);
// plausibility checks for members of that team
$em->getRepository(Member::class)->checkIfDescriptionIsEmptyButMentorProfileIsFilled($team);
$relevantProgramIds = ['1','2','3'];
$applications = $em->getRepository(Application::class)->findBy(['teamId'=>$team->getId(),'programId'=>$relevantProgramIds]);
}
$members = $em->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;
}
}
}
}
if (str_contains((string) $request->get('_route'), 'x_partner_single')) {
$view = "@StartPlatzAlphaBundle/Page/single.partner.connect.html.twig";
} else {
$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'))) ;
$em=$this->getDoctrine()->getManager();
$criteria = ['partners'=>['service-partner', 'partner'],'isActive'=>1, 'status'=>'publish' ];
$servicePartners = $em->getRepository(Page::class)->findAllPages($criteria, []);
//$servicePartners = $em->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/actorfeed/link/{feedId}", name="meta_actorfeed_link")
*/
public function actorfeedLinkAction(Request $request, $feedId)
{
$em = $this->getDoctrine()->getManager();
$redirectUrl = $request->get('redirect');
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
}
/** @var Actor $actor */
$actor = $em->getRepository(Actor::class)->updateScoreByActorIdAndGetActor($feedId);
switch ($actor->getType()) {
case "startup":
/** @var Startup $startup */
$startup = $em->getRepository(Startup::class)->findOneBy(['id'=>$actor->getExternalId()]);
$targetUrl = $this->generateUrl('x_connect_team_show', ['id'=>$startup->getTeamId(), 'slug'=>$startup->getSlug()]);
break;
}
$targetUrl = $targetUrl . "?redirect=$redirectUrl";
return $this->redirect($targetUrl);
}
/**
* @Route("/x/service-partner/{id}/{slug}", name="x_page_service-partner_id")
* @Route("/service-partner/{id}/{slug}", name="website_page_service-partner_id")
*/
public function showPageServicePartnerAction(Request $request, $id, $slug)
{
$em = $this->getDoctrine()->getManager();
$templateVars = $em->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()) {
$em->getRepository(User::class)->writeActivity($user);
}
if (!$page = $em->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 = $em->getRepository(MemberTeam::class)->findMyTeamsByUser($this->getUser());
$team = $em->getRepository(Team::class)->findOneBy(['id'=>$page->getTeamId()]);
$route = $request->get('_route');
if ($route == 'x_page_service-partner_id') {
$view = '@StartPlatzAlphaBundle/Page/show.servicePartner.sp-connect.html.twig';
} else {
$view = '@StartPlatzAlphaBundle/Page/show.servicePartner.website.html.twig';
}
return $this->render($view, [
'page' =>$page,
'servicePartner' => $page,
//'form' => $form->createView(),
//'edit' => $edit,
'id' => $id,
'myTeamIds' => $myTeamIds,
'team' => $team,
'redirectUrl' => base64_encode(json_encode(['path' => $route, 'parameters' => ['id'=>$id, 'slug' => $slug]])),
'templateVars' => $templateVars,
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
}