AJenbo/agcms

View on GitHub
application/inc/Http/Controllers/Admin/NewsletterController.php

Summary

Maintainability
A
0 mins
Test Coverage
A
95%
<?php

namespace App\Http\Controllers\Admin;

use App\Exceptions\InvalidInput;
use App\Http\Request;
use App\Models\Newsletter;
use App\Services\ConfigService;
use App\Services\OrmService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;

class NewsletterController extends AbstractAdminController
{
    /**
     * Index page for newsletters.
     */
    public function index(Request $request): Response
    {
        $data = $this->basicPageData($request);
        $data['newsletters'] = app(OrmService::class)->getByQuery(
            Newsletter::class,
            'SELECT * FROM newsmails ORDER BY sendt, id DESC'
        );

        return $this->render('admin/emaillist', $data);
    }

    /**
     * Page for editing or creating a newsletter.
     */
    public function editNewsletter(Request $request, ?int $id = null): Response
    {
        $newsletter = null;
        if (null !== $id) {
            $newsletter = app(OrmService::class)->getOne(Newsletter::class, $id);
            if (!$newsletter) {
                throw new InvalidInput(_('Newsletter not found.'), Response::HTTP_NOT_FOUND);
            }
        }

        $data = [
            'newsletter'     => $newsletter,
            'recipientCount' => $newsletter ? $newsletter->countRecipients() : 0,
            'interests'      => ConfigService::getArray('interests'),
            'textWidth'      => ConfigService::getInt('text_width'),
            'emails'         => array_keys(ConfigService::getEmailConfigs()),
        ] + $this->basicPageData($request);

        return $this->render('admin/viewemail', $data);
    }

    /**
     * Creating a mewsletter.
     */
    public function create(Request $request): JsonResponse
    {
        $html = purifyHTML($request->getRequestString('html') ?? '');
        $newsletter = new Newsletter([
            'from'       => $request->getRequestString('from'),
            'subject'    => $request->getRequestString('subject'),
            'html'       => $html,
            'interests'  => $request->request->all('interests'),
        ]);
        $newsletter->save();

        return new JsonResponse(['id' => $newsletter->getId()]);
    }

    public function update(Request $request, int $id): JsonResponse
    {
        $newsletter = app(OrmService::class)->getOne(Newsletter::class, $id);
        if (!$newsletter) {
            throw new InvalidInput(_('Newsletter not found.'), Response::HTTP_NOT_FOUND);
        }

        if ($newsletter->isSent()) {
            throw new InvalidInput(_('The newsletter has already been sent.'), Response::HTTP_LOCKED);
        }

        $html = purifyHTML($request->getRequestString('html') ?? '');

        $interests = $request->request->all('interests');
        if (!is_array($interests)) {
            $interests = [];
        }

        $newsletter->setFrom($request->getRequestString('from') ?? '')
            ->setHtml($html)
            ->setSubject($request->getRequestString('subject') ?? '')
            ->setInterests($interests)
            ->save();

        if ($request->request->getBoolean('send')) {
            $newsletter->send();
        }

        return new JsonResponse([]);
    }

    /**
     * Count recipients for given interests.
     */
    public function countRecipients(Request $request): JsonResponse
    {
        $newsletter = new Newsletter();
        $interests = $request->query->all('interests');
        if (is_array($interests)) {
            $newsletter->setInterests($interests);
        }

        return new JsonResponse(['count' => $newsletter->countRecipients()]);
    }
}