AJenbo/agcms

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

Summary

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

namespace App\Http\Controllers\Admin;

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

class AddressbookController extends AbstractAdminController
{
    /**
     * Index page for the addressbook.
     */
    public function index(Request $request): Response
    {
        $data = $this->basicPageData($request);
        $order = $request->get('order');
        if (!in_array($order, ['email', 'tlf1', 'tlf2', 'post', 'adresse'], true)) {
            $order = 'navn';
        }
        $data['contacts'] = app(OrmService::class)->getByQuery(Contact::class, 'SELECT * FROM email ORDER BY ' . $order);

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

    /**
     * Page for editing or creating a contact.
     */
    public function editContact(Request $request, ?int $id = null): Response
    {
        $data = $this->basicPageData($request);
        $data['contact'] = $id ? app(OrmService::class)->getOne(Contact::class, $id) : null;
        $data['interests'] = ConfigService::getArray('interests');

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

    /**
     * Creating a contact.
     */
    public function create(Request $request): JsonResponse
    {
        $contact = new Contact([
            'name'       => $request->getRequestString('name') ?? '',
            'email'      => $request->getRequestString('email') ?? '',
            'address'    => $request->getRequestString('address') ?? '',
            'country'    => $request->getRequestString('country') ?? '',
            'postcode'   => $request->getRequestString('postcode') ?? '',
            'city'       => $request->getRequestString('city') ?? '',
            'phone1'     => $request->request->getAlnum('phone1'),
            'phone2'     => $request->request->getAlnum('phone2'),
            'subscribed' => $request->request->getBoolean('newsletter'),
            'interests'  => $request->request->all('interests'),
            'ip'         => $request->getClientIp(),
        ]);
        $contact->save();

        return new JsonResponse([]);
    }

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

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

        $contact->setName($request->getRequestString('name') ?? '')
            ->setEmail($request->getRequestString('email') ?? '')
            ->setAddress($request->getRequestString('address') ?? '')
            ->setCountry($request->getRequestString('country') ?? '')
            ->setPostcode($request->getRequestString('postcode') ?? '')
            ->setCity($request->getRequestString('city') ?? '')
            ->setPhone1($request->request->getAlnum('phone1'))
            ->setPhone2($request->request->getAlnum('phone2'))
            ->setSubscribed($request->request->getBoolean('newsletter'))
            ->setInterests($interests)
            ->save();

        return new JsonResponse([]);
    }

    /**
     * Delete a contact.
     */
    public function delete(Request $request, int $id): JsonResponse
    {
        $contact = app(OrmService::class)->getOne(Contact::class, $id);
        if ($contact) {
            $contact->delete();
        }

        return new JsonResponse(['id' => 'contact' . $id]);
    }

    /**
     * Check if an email is valid.
     */
    public function isValidEmail(Request $request): JsonResponse
    {
        $email = $request->get('email');
        if (!is_string($email)) {
            $email = '';
        }

        $isValid = app(EmailService::class)->valideMail($email);

        return new JsonResponse(['isValid' => $isValid]);
    }
}