<?php
/*
* Author: Dominik Piekarski <code@dompie.de>
* Created at: 2021/08/26 11:46
*/
declare(strict_types=1);
namespace App\Controller\User;
use App\Form\GuestbookEntryForm;
use App\Security\ApiUser;
use App\Service\Client\GuestbookService;
use App\Service\Client\Media\MemberMediaService;
use App\Service\Client\User\LikeService;
use App\Service\Client\User\MemberPropertyService;
use App\Service\Client\User\MemberService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/user/profile/gaestebuch")
*/
class GuestbookController extends AbstractController
{
protected MemberService $memberService;
protected MemberPropertyService $mpService;
protected GuestbookService $guestbookService;
protected MemberMediaService $memberMediaService;
protected LikeService $likeService;
public function __construct(MemberService $memberService, MemberPropertyService $mpService,
GuestbookService $guestbookService, MemberMediaService $mmService,
LikeService $likeService)
{
$this->memberService = $memberService;
$this->mpService = $mpService;
$this->guestbookService = $guestbookService;
$this->memberMediaService = $mmService;
$this->likeService = $likeService;
}
public function index(Request $request, string $username, int $page): Response
{
$member = $this->memberService->getMemberDetailByUsername($username);
if ($this->mpService->isGuestbookDisabled($member['id'])) {
$this->addFlash('info', $username . ' hat das Gästebuch deaktiviert.');
return $this->redirectToRoute('app_user_profile_detail', ['username' => $username]);
}
if (!is_array($member) || $member['is_active'] === false) {
$this->addFlash('info', 'Den Nutzer gibt es nicht mehr.');
return $this->redirectToRoute('app_user_profile_detail', ['username' => $username]);
}
$guestbookEntryForm = $this->createForm(GuestbookEntryForm::class, null, ['username' => $username]);
$guestbookEntryForm->handleRequest($request);
if ($guestbookEntryForm->isSubmitted() && $guestbookEntryForm->isValid()) {
/** @var ApiUser $user */
$user = $this->getUser();
$data = $guestbookEntryForm->getData();
$this->guestbookService->createEntry($user->getMemberId(), $member['id'], $data['entry']);
$this->guestbookService->dispatchCreatedEvent($username);
$this->addFlash('success', "Vielen Dank für Deinen Eintrag. Er wird nach einer manuellen Prüfung durch $username freigeschaltet.");
return $this->redirectToRoute('app_user_profile_guestbook', ['username' => $username, 'page' => $page]);
}
return $this->render('user/profile/guestbook.html.twig', [
'member' => $member,
'profilePhotos' => $this->memberMediaService->getProfilePhotos($member['id'], 3),
'page' => $page,
'guestbook' => $this->guestbookService->getGuestbookForMember($member['id'], $page, 10),
'guestbookForm' => $guestbookEntryForm->createView(),
'existingLike' => $this->getUser() ? $this->likeService->getExistingMemberLikeForIssuer($member['id']) : null
]);
}
/**
* @param Request $request
* @return Response
* @Route("/comment", methods={"POST"})
*/
public function comment(Request $request)
{
/** @var ApiUser $uesr */
$user = $this->getUser();
if (!$user instanceof ApiUser || $user->getMemberId() <= 0) {
$msg = 'Bitte melden Sie sich an.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_UNAUTHORIZED);
}
if (!$this->isCsrfTokenValid('guestbook-manage', $request->request->get('token', null))) {
$msg = 'Die Änderung wurde nicht verarbeitet.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_BAD_REQUEST);
}
$comment = $request->request->get('comment', null);
if (!$comment || mb_strlen($comment) > 1000) {
$msg = 'Der Kommentar fehlt oder ist zu lang.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_BAD_REQUEST);
}
if ($this->guestbookService->commentOnEntry($user->getMemberId(), $request->request->getInt('entryId', 0), $comment)) {
$this->guestbookService->dispatchCommentedEvent($user->getUsername());
$msg = 'Dein Kommentar wurde hinzugefügt.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_OK);
}
return new JsonResponse('', Response::HTTP_OK);
}
/**
* @param Request $request
* @return Response
* @Route("/approve", methods={"POST"})
*/
public function approve(Request $request): Response
{
/** @var ApiUser $uesr */
$user = $this->getUser();
if (!$user instanceof ApiUser || $user->getMemberId() <= 0) {
$msg = 'Bitte melden Sie sich an.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_UNAUTHORIZED);
}
if (!$this->isCsrfTokenValid('guestbook-manage', $request->request->get('token', null))) {
$msg = 'Die Änderung wurde nicht verarbeitet.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_BAD_REQUEST);
}
$entryId = $request->request->getInt('entryId', 0);
$entryOwner = $this->memberService->getMemberDetailByUsername($request->request->get('entryOwner', $user->getUsername()));
if ($this->guestbookService->approveEntry($entryOwner['id'], $entryId)) {
$this->guestbookService->dispatchApprovedEvent($user->getUsername());
$msg = 'Der Eintrag wurde veröffentlicht.';
$this->addFlash('success', $msg);
return new JsonResponse($msg);
}
$msg = 'Bitte nochmal probieren oder Support kontaktieren.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_INTERNAL_SERVER_ERROR);
}
/**
* @param Request $request
* @return Response
* @Route("/delete", methods={"POST"})
*/
public function delete(Request $request): Response
{
/** @var ApiUser $uesr */
$user = $this->getUser();
if (!$user instanceof ApiUser || $user->getMemberId() <= 0) {
$msg = 'Bitte melden Sie sich an.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_UNAUTHORIZED);
}
if (!$this->isCsrfTokenValid('guestbook-manage', $request->request->get('token', null))) {
$msg = 'Die Änderung wurde nicht verarbeitet.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_BAD_REQUEST);
}
$entryId = $request->request->getInt('entryId', 0);
$recipientUsername = $request->request->get('entryOwner');
$recipientMember = $this->memberService->getMemberDetailByUsername($recipientUsername);
if ($this->guestbookService->deleteEntry($user->getMemberId(), $entryId, $recipientMember['id'])) {
$this->guestbookService->dispatchApprovedEvent($recipientMember['username'] ?? $user->getUsername());
$msg = 'Der Eintrag wurde im Gästebuch gelöscht.';
$this->addFlash('success', $msg);
return new JsonResponse($msg);
}
$msg = 'Bitte nochmal probieren oder Support kontaktieren.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_INTERNAL_SERVER_ERROR);
}
/**
* @param Request $request
* @return Response
* @Route("/spam", methods={"POST"})
*/
public function markAsSpam(Request $request): Response
{
/** @var ApiUser $uesr */
$user = $this->getUser();
if (!$user instanceof ApiUser || $user->getMemberId() <= 0) {
$msg = 'Bitte melden Sie sich an.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_UNAUTHORIZED);
}
if (!$this->isCsrfTokenValid('guestbook-manage', $request->request->get('token', null))) {
$msg = 'Die Änderung wurde nicht verarbeitet.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_BAD_REQUEST);
}
$entryId = $request->request->getInt('entryId', 0);
if ($this->guestbookService->markAsSpam($user->getMemberId(), $entryId)) {
$this->guestbookService->dispatchApprovedEvent($user->getUsername());
$msg = 'Eintrag als spam markiert.';
$this->addFlash('success', $msg);
return new JsonResponse($msg);
}
$msg = 'Bitte nochmal probieren oder Support kontaktieren.';
$this->addFlash('info', $msg);
return new JsonResponse($msg, Response::HTTP_INTERNAL_SERVER_ERROR);
}
}