diff --git a/app/config/routing.yml b/app/config/routing.yml index 8696989..1da5b74 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -29,3 +29,7 @@ download: revisions: path: /revs/{gist} defaults: {_controller: Gist\Controller\ViewController::revisionsAction, _locale: en} + +api_create: + path: /api/create + defaults: {_controller: Gist\Controller\ApiController::createAction, _locale: en} diff --git a/src/Gist/Controller/ApiController.php b/src/Gist/Controller/ApiController.php new file mode 100644 index 0000000..0748b61 --- /dev/null +++ b/src/Gist/Controller/ApiController.php @@ -0,0 +1,74 @@ + + */ +class ApiController extends Controller +{ + public function createAction(Request $request, Application $app) + { + if (false === $request->isMethod('post')) { + return $this->invalidMethodResponse('POST method is required.'); + } + + $form = new ApiCreateGistForm( + $app['form.factory'], + $app['translator'], + [], + ['csrf_protection' => false] + ); + + $form = $form->build()->getForm(); + + $form->submit($request); + + if ($form->isValid()) { + $gist = $app['gist']->create(new Gist(), $form->getData()); + $gist->setCipher(false)->save(); + + $history = $app['gist']->getHistory($gist); + + return new JsonResponse(array( + 'url' => $request->getSchemeAndHttpHost().$app['url_generator']->generate( + 'view', + array( + 'gist' => $gist->getFile(), + 'commit' => array_pop($history)['commit'], + ) + ), + 'gist' => $gist->toArray(), + )); + } + + return $this->invalidRequestResponse('Invalid field(s)'); + } + + protected function invalidMethodResponse($message = null) + { + $data = [ + 'error' => 'Method Not Allowed', + 'message' => $message, + ]; + + return new JsonResponse($data, 405); + } + + protected function invalidRequestResponse($message = null) + { + $data = [ + 'error' => 'Bad request', + 'message' => $message, + ]; + + return new JsonResponse($data, 400); + } +} diff --git a/src/Gist/Form/AbstractForm.php b/src/Gist/Form/AbstractForm.php index 93d7721..b437487 100644 --- a/src/Gist/Form/AbstractForm.php +++ b/src/Gist/Form/AbstractForm.php @@ -15,11 +15,11 @@ abstract class AbstractForm protected $translator; - public function __construct(FormFactory $formFactory, Translator $translator, array $data = array()) + public function __construct(FormFactory $formFactory, Translator $translator, array $data = array(), $formFactoryOptions = array()) { $this->translator = $translator; - $this->builder = $formFactory->createBuilder('form', $data); + $this->builder = $formFactory->createBuilder('form', $data, $formFactoryOptions); } public function getForm() diff --git a/src/Gist/Form/ApiCreateGistForm.php b/src/Gist/Form/ApiCreateGistForm.php new file mode 100644 index 0000000..27963f5 --- /dev/null +++ b/src/Gist/Form/ApiCreateGistForm.php @@ -0,0 +1,19 @@ + + */ +class ApiCreateGistForm extends CreateGistForm +{ + public function build(array $options = array()) + { + parent::build($options); + + $this->builder->remove('cipher'); + + return $this->builder; + } +}