Commit 108fdd7d authored by Anthony Gautreau's avatar Anthony Gautreau
Browse files

API

parent 941cf9a9
Loading
Loading
Loading
Loading
Loading
+87 −0
Original line number Diff line number Diff line
<?php

use UnicaenMail\Controller\MailApiController;
use UnicaenMail\Controller\MailApiControllerFactory;
use UnicaenMail\Provider\Privilege\MailPrivileges;
use UnicaenMail\Service\Mail\MailService;
use UnicaenMail\Service\Mail\MailServiceFactory;
use UnicaenMail\View\Helper\MailsViewHelper;
use UnicaenMail\View\Helper\MailViewHelper;
use UnicaenPrivilege\Guard\PrivilegeController;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;

return array(
    'bjyauthorize'    => [
        'guards' => [
            PrivilegeController::class => [
                [
                    'controller' => MailApiController::class,
                    'privileges' => [
                        MailPrivileges::MAIL_AFFICHER,
                    ],
                ],
                [
                    'controller' => MailApiController::class,
                    'action'     => [
                        'reenvoi',
                    ],
                    'privileges' => [
                        MailPrivileges::MAIL_REENVOI,
                    ],
                ],
                [
                    'controller' => MailApiController::class,
                    'action'     => [
                        'test',
                    ],
                    'privileges' => [
                        MailPrivileges::MAIL_TEST,
                    ],
                ],
                [
                    'controller' => MailApiController::class,
                    'action'     => [
                        'delete',
                    ],
                    'privileges' => [
                        MailPrivileges::MAIL_SUPPRIMER,
                    ],
                ],

            ],
        ],
    ],
    'router' => [
        'routes' => [
            'mail-api' => [
                'type'    => Segment::class,
                'options' => [
                    'route' => '/mail-api[/:action[/:id]][/:id]',
                    'constraints' => [
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ],
                    'defaults' => [
                        'controller' => MailApiController::class,
                    ],
                ],
            ],
            'mail-vue' => [
                'type' => Literal::class,
                'options' => [
                    'route' => '/mail-vue',
                    'defaults' => [
                        'controller' => MailApiController::class,
                        'action' => 'index-vue',
                    ],
                ],
            ],
        ],
    ],
    'controllers' => [
        'factories' => [
            MailApiController::class => MailApiControllerFactory::class,
        ],
    ],
);
+92 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenMail\Controller;

use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractRestfulController;
use Laminas\Mvc\MvcEvent;
use Laminas\View\Model\JsonModel;
use UnicaenMail\Service\Mail\MailServiceAwareTrait;
use Laminas\View\Model\ViewModel;
use UnicaenVue\View\Model\VueModel;

class MailApiController extends AbstractRestfulController {
    use MailServiceAwareTrait;

    public function indexVueAction() : ViewModel
    {
        $vm = new VueModel([
        ]);
        $vm->setTemplate('mail/main');
        return $vm;
    }

    public function get(mixed $id): JsonModel
    {
        $params = $this->params()->fromQuery();
        $id = $params['id'];

        $mail = $this->getMailService()->getMail($id);

        return new JsonModel($mail->jsonSerialize());
    }

    public function getList(): JsonModel
    {
        $filtre['date'] = '1Y';

        $mails = $this->getMailService()->getMailsWithFiltre($filtre);
        $mailsArray = [];
        foreach ($mails as $mail) {
            $mailsArray[] = $mail->jsonSerialize();
        }

        return new JsonModel($mailsArray);
    }

    public function reenvoiAction() : JsonModel
    {
        $request = $this->getRequest();
        $data = $request->getPost();
        if(!isset($data['id'])) {
            return new JsonModel(['error' => "Mauvais paramètres"]);
        }
        $mail = $this->getMailService()->getMail($data['id']);
        if($mail) {
            $nMail = $this->getMailService()->reenvoi($mail);
        }
        return new JsonModel($nMail->jsonSerialize());
    }

    public function testAction(): JsonModel
    {
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            if(!isset($data['mail-to']) || !filter_var($data['mail-to'], FILTER_VALIDATE_EMAIL)) {
                return new JsonModel(['error' => "L'adresse mail saisie n'est pas valide."]);
            }
            $mail = $this->getMailService()->sendMail($data['mail-to'], 'Mail de test', 'Ceci est un mail de test. <br/> <hr/>Merci de ne pas en tenir compte.');
            if ($mail){
                $mail->setMotsClefs(['TEST']);
                $this->getMailService()->update($mail);
                return new JsonModel($mail->jsonSerialize());
            }
        }
        $this->response->setStatusCode(500);
        return new JsonModel(['error' => 'Une erreur est survenue']);
    }

    public function delete(mixed $id): JsonModel
    {
        if($id && is_numeric($id)) {
            $mail = $this->getMailService()->getMail($id);
            if($mail) {
                $this->getMailService()->delete($mail);
                return new JsonModel(['success' => 'Mail supprimé']);
            }
        }
        $this->response->setStatusCode(400);
        return new JsonModel(['error' => 'Mail non trouvé']);
    }
}
 No newline at end of file
+30 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenMail\Controller;

use Interop\Container\ContainerInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use UnicaenMail\Service\Mail\MailService;

class MailApiControllerFactory
{

    /**
     * @param ContainerInterface $container
     * @return MailApiController
     * @throws ContainerExceptionInterface
     * @throws NotFoundExceptionInterface
     */
    public function __invoke(ContainerInterface $container): MailApiController
    {
        /**
         * @var MailService $mailService
         */
        $mailService = $container->get(MailService::class);

        $controller = new MailApiController();
        $controller->setMailService($mailService);
        return $controller;
    }
}
 No newline at end of file
+17 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ namespace UnicaenMail\Entity\Db;

use DateTime;

class Mail {
class Mail implements \JsonSerializable {

    const PENDING = 'PENDING';
    const SUCCESS = 'SUCCESS';
@@ -131,4 +131,20 @@ class Mail {
        $this->log = $log;
    }

    public function jsonSerialize()
    {
        return [
            'id' => $this->id,
            'destinataires' => $this->destinataires,
            'destinatairesInitials' => $this->destinatairesInitials,
            'copies' => $this->copies,
            'sujet' => $this->sujet,
            'corps' => $this->corps,
            'motsClefs' => $this->motsClefs,
            'dateEnvoi' => $this->dateEnvoi->getTimestamp(),
            'statusEnvoi' => $this->statusEnvoi,
            'log' => $this->log,
        ];
    }

}
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
@@ -14,4 +14,5 @@ class MailPrivileges extends Privileges
    const MAIL_TEST                             = 'mail-mail_test';
    const MAIL_REENVOI                          = 'mail-mail_reenvoi';
    const MAIL_SUPPRIMER                        = 'mail-mail_supprimer';
    const MAIL_API                              = 'mail-mail_api';
}
 No newline at end of file
Loading