gjerokrsteski/reactphp-pimf

View on GitHub
app/Articles/Service/CreateNewArticle.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Articles\Service;

use Articles\Model\Article;
use Pimf\EntityManager;
use Pimf\Param;
use Pimf\Route;
use Pimf\Util\Json;
use Pimf\Util\Validator;
use React\Http\Response as ReactiveResponse;
use React\Http\Request as ReactiveRequest;

final class CreateNewArticle
{
    /**
     * @var EntityManager
     */
    protected $entityManager;

    /**
     * @var ReactiveRequest
     */
    protected $request;

    /**
     * @var ReactiveResponse
     */
    protected $response;

    public function __construct(EntityManager $entityManager, ReactiveRequest $request, ReactiveResponse $response)
    {
        $this->entityManager = $entityManager;
        $this->request = $request;
        $this->response = $response;
    }

    public function __invoke($requestBody = '')
    {
        $this->request->on('data', function ($requestBody) {

            $route = new Route('/articles/:id');

            if($route->init()->matches() === true){
                //method not allowed
                $this->response->writeHead(405);
                return $this->response->end();
            }

            $requestData = [];
            parse_str($requestBody, $requestData);
            $requestData = new Param($requestData);

            $title = $requestData->get('title', false);
            $content = $requestData->get('content', false);

            if (!$title || !$content) {
                //bad request
                $this->response->writeHead(400);
                return $this->response->end();
            }

            $valid = new Validator($requestData);

            if ($valid->length('title', '<', 1) || $valid->length('content', '<', 1)) {
                //bad request
                $this->response->writeHead(400);
                return $this->response->end();
            }

            $newId = $this->entityManager->article->insert(new Article($title, $content));

            if ($newId > 0) {
                $this->response->writeHead(201, ['Content-Type' => 'application/json; charset=utf-8']);

                return $this->response->end(Json::encode(compact('newId')));
            }

            //conflict
            $this->response->writeHead(409);
            return $this->response->end();

        });
    }
}