Sistema web para crear proyecto web nuevo
This commit is contained in:
62
common/Controller/API/Create.php
Normal file
62
common/Controller/API/Create.php
Normal file
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
namespace ProVM\Projects\Common\Controller\API;
|
||||
|
||||
use Psr\Http\Message\RequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use ProVM\Common\Define\Controller\Json;
|
||||
use ProVM\Projects\Common\Service\Projects;
|
||||
|
||||
class Create {
|
||||
use Json;
|
||||
|
||||
public function createFolder(Request $request, Response $response, Projects $service, $project): Response {
|
||||
$estado = $service->createFolder($project);
|
||||
$output = [
|
||||
'project' => $project,
|
||||
'estado' => $estado
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
public function createSubfolders(Request $request, Response $response, Projects $service, $project): Response {
|
||||
$estado = $service->createSubfolders($project);
|
||||
$output = [
|
||||
'project' => $project,
|
||||
'estado' => $estado
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
public function gitInit(Request $request, Response $response, Projects $service, $project): Response {
|
||||
$estado = $service->gitInit($project);
|
||||
$output = [
|
||||
'project' => $project,
|
||||
'estado' => $estado
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
public function addComposer(Request $request, Response $response, Projects $service, $project): Response {
|
||||
$post = $request->getParsedBody();
|
||||
$estado = $service->addComposer($project, $post['composer']);
|
||||
$output = [
|
||||
'project' => $project,
|
||||
'estado' => $estado
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
public function addFiles(Request $request, Response $response, Projects $service, $project): Response {
|
||||
$estado = $service->addFiles($project);
|
||||
$output = [
|
||||
'project' => $project,
|
||||
'estado' => $estado
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
public function gitPush(Request $request, Response $response, Projects $service, $project): Response {
|
||||
$estado = $service->gitPush($project);
|
||||
$output = [
|
||||
'project' => $project,
|
||||
'estado' => $estado['estado'],
|
||||
'error' => $estado['error']
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
}
|
37
common/Controller/API/Dependencies.php
Normal file
37
common/Controller/API/Dependencies.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
namespace ProVM\Projects\Common\Controller\API;
|
||||
|
||||
use Psr\Container\ContainerInterface as Container;
|
||||
use Psr\Http\Message\RequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use ProVM\Common\Define\Controller\Json;
|
||||
use ProVM\Common\Service\Composer;
|
||||
|
||||
class Dependencies {
|
||||
use Json;
|
||||
|
||||
public function search(Request $request, Response $response, Composer $composer): Response {
|
||||
$get = $request->getQueryParams();
|
||||
$query = $get['query'];
|
||||
if (strlen($query) < 3) {
|
||||
$output = [
|
||||
'success' => false,
|
||||
'results' => []
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
$results = $composer->search($query);
|
||||
$output = [
|
||||
'success' => (count($results) > 0),
|
||||
'results' => []
|
||||
];
|
||||
foreach ($results as $result) {
|
||||
$output['results'] []= [
|
||||
'value' => $result->name,
|
||||
'name' => implode(': ', (array) $result),
|
||||
'text' => $result->name
|
||||
];
|
||||
}
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
}
|
75
common/Controller/Web/Create.php
Normal file
75
common/Controller/Web/Create.php
Normal file
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
namespace ProVM\Projects\Common\Controller\Web;
|
||||
|
||||
use Psr\Http\Message\RequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use ProVM\Common\Alias\View;
|
||||
use ProVM\Common\Service\Composer;
|
||||
use ProVM\Projects\Common\Service\Projects;
|
||||
|
||||
class Create {
|
||||
/**
|
||||
* Step 1
|
||||
* Formulario de datos
|
||||
*/
|
||||
public function __invoke(Request $request, Response $response, View $view): Response {
|
||||
$defaults = (object) [
|
||||
'require' => [
|
||||
'slim/slim',
|
||||
'nyholm/psr7',
|
||||
'nyholm/psr7-server',
|
||||
'php-di/slim-bridge',
|
||||
'rubellum/slim-blade-view',
|
||||
'nesbot/carbon'
|
||||
],
|
||||
'require-dev' => [
|
||||
'phpunit/phpunit',
|
||||
'kint-php/kint'
|
||||
]
|
||||
];
|
||||
return $view->render($response, 'create.step1', compact('defaults'));
|
||||
}
|
||||
/**
|
||||
* Step 2
|
||||
* Revision y confirmacion de datos
|
||||
*/
|
||||
public function step2(Request $request, Response $response, Composer $composer, Projects $service, View $view): Response {
|
||||
$post = $request->getParsedBody();
|
||||
$name = $post['nombre'];
|
||||
$exists = $service->exists($name);
|
||||
$require = explode(',', $post['dependencias'][0]);
|
||||
$require = $composer->getLatest($require, Composer::MAYOR);
|
||||
$require_dev = explode(',', $post['dependencias-dev'][0]);
|
||||
$require_dev = $composer->getLatest($require_dev, Composer::MAYOR);
|
||||
$json = json_encode([
|
||||
'name' => implode('/', ['provm', $name]),
|
||||
'descripcion' => $post['descripcion'],
|
||||
'type' => 'project',
|
||||
'require' => $require,
|
||||
'require-dev' => $require_dev,
|
||||
'authors' => [
|
||||
[
|
||||
'name' => 'Aldarien',
|
||||
'email' => 'aldarien85@gmail.com'
|
||||
]
|
||||
],
|
||||
'autoload' => [
|
||||
'psr-4' => [
|
||||
implode("\\", [
|
||||
'ProVM',
|
||||
ucwords($post['nombre']),
|
||||
'Common'
|
||||
]) . "\\" => 'common'
|
||||
]
|
||||
]
|
||||
], \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE);
|
||||
return $view->render($response, 'create.step2', ['step' => 2, 'exists' => $exists, 'composer' => $json]);
|
||||
}
|
||||
public function step3(Request $request, Response $response, Projects $service, View $view): Response {
|
||||
$post = $request->getParsedBody();
|
||||
$name = explode('/', json_decode($post['composer'])->name)[1];
|
||||
$composer = $post['composer'];
|
||||
$step = 3;
|
||||
return $view->render($response, 'create.step3', compact('step', 'name', 'composer'));
|
||||
}
|
||||
}
|
14
common/Controller/Web/Home.php
Normal file
14
common/Controller/Web/Home.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
namespace ProVM\Projects\Common\Controller\Web;
|
||||
|
||||
use Psr\Http\Message\RequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use ProVM\Common\Alias\View;
|
||||
use ProVM\Projects\Common\Service\Projects;
|
||||
|
||||
class Home {
|
||||
public function __invoke(Request $request, Response $response, Projects $service, View $view): Response {
|
||||
$projects = $service->list();
|
||||
return $view->render($response, 'home', compact('projects'));
|
||||
}
|
||||
}
|
181
common/Controller/Web/Project.php
Normal file
181
common/Controller/Web/Project.php
Normal file
@ -0,0 +1,181 @@
|
||||
<?php
|
||||
namespace ProVM\Projects\Common\Controller\Web;
|
||||
|
||||
use Psr\Container\ContainerInterface as Container;
|
||||
use Psr\Http\Message\RequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use ProVM\Common\Alias\View;
|
||||
use ProVM\Common\Define\Controller\Redirect;
|
||||
use ProVM\Projects\Common\Service\Projects;
|
||||
use ProVM\Projects\Common\Factory\Project as Factory;
|
||||
|
||||
class Project {
|
||||
use Redirect;
|
||||
|
||||
public function __invoke(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
||||
$p = $service->get($project);
|
||||
$p->config = $this->reduceFiles($p->config, '/setup', '', '/');
|
||||
$p->controllers = $this->reduceFiles($p->controllers, ['/common', 'ProVM/' . ucwords($project) . '/Common'], '.php', '/');
|
||||
foreach ($p->routes as $space => $routes) {
|
||||
$p->routes->$space = $this->reduceFiles($routes, '/resources/routes', '', '/');
|
||||
}
|
||||
$p->views = $this->reduceFiles($p->views, '/resources/views/', '.blade.php', '.');
|
||||
return $view->render($response, 'projects.show', ['project' => $p]);
|
||||
}
|
||||
protected function reduceFiles($array, $prefix, $suffix, $glue) {
|
||||
if (!is_array($prefix)) {
|
||||
$prefix = [$prefix];
|
||||
}
|
||||
if (!is_array($suffix)) {
|
||||
$suffix = [$suffix];
|
||||
}
|
||||
$arr = [];
|
||||
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array), \RecursiveIteratorIterator::SELF_FIRST);
|
||||
$pk = '';
|
||||
foreach ($it as $k => $v) {
|
||||
if (is_array($v)) {
|
||||
$pk = str_replace($prefix[0], $prefix[1] ?? '', $k);
|
||||
continue;
|
||||
}
|
||||
$arr []= str_replace($suffix[0], $suffix[1] ?? '', implode($glue, [$pk, $v]));
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
public function addView(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
||||
$folder = implode(DIRECTORY_SEPARATOR, [
|
||||
$service->getFolder($project),
|
||||
'resources',
|
||||
'views'
|
||||
]);
|
||||
$files = new \DirectoryIterator($folder);
|
||||
$subfolders = [];
|
||||
foreach ($files as $file) {
|
||||
if (!$file->isDir() or $file->isDot()) {
|
||||
continue;
|
||||
}
|
||||
$subfolders []= $file->getBasename();
|
||||
}
|
||||
$factory = new Factory();
|
||||
$p = $factory->find($service->getFolder($project))->getViews()->build();
|
||||
$views = [];
|
||||
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
|
||||
$pk = '';
|
||||
foreach ($it as $k => $v) {
|
||||
if (is_array($v)) {
|
||||
$pk = str_replace('/resources/views/', '', $k);
|
||||
continue;
|
||||
}
|
||||
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
|
||||
}
|
||||
$project = $p;
|
||||
return $view->render($response, 'projects.views.add', compact('project', 'subfolders', 'views'));
|
||||
}
|
||||
public function doAddView(Request $request, Response $response, Container $container, Projects $service, $project): Response {
|
||||
$post = $request->getParsedBody();
|
||||
$options = [];
|
||||
if (trim($post['extends']) != '') {
|
||||
$options['extends'] = $post['extends'];
|
||||
}
|
||||
if (trim($post['seccion']) != '') {
|
||||
$options['section'] = $post['seccion'];
|
||||
}
|
||||
$location = $post['location'];
|
||||
$status = $service->addView($project, $post['name'], $location, $options);
|
||||
return $this->withRedirect($response, implode('/', [
|
||||
$container->get('urls')->base,
|
||||
'project',
|
||||
$project
|
||||
]));
|
||||
}
|
||||
public function addController(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
||||
$folder = implode(DIRECTORY_SEPARATOR, [
|
||||
$service->getFolder($project),
|
||||
'common',
|
||||
'Controller'
|
||||
]);
|
||||
$files = new \DirectoryIterator($folder);
|
||||
$subfolders = [];
|
||||
foreach ($files as $file) {
|
||||
if (!$file->isDir() or $file->isDot()) {
|
||||
continue;
|
||||
}
|
||||
$subfolders []= $file->getBasename();
|
||||
}
|
||||
$factory = new Factory();
|
||||
$p = $factory->find($service->getFolder($project))->getViews()->build();
|
||||
$views = [];
|
||||
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
|
||||
$pk = '';
|
||||
foreach ($it as $k => $v) {
|
||||
if (is_array($v)) {
|
||||
$pk = str_replace('/resources/views/', '', $k);
|
||||
continue;
|
||||
}
|
||||
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
|
||||
}
|
||||
$project = $p;
|
||||
return $view->render($response, 'projects.controllers.add', compact('project', 'subfolders', 'views'));
|
||||
}
|
||||
public function doAddController(Request $request, Response $response, Container $container, Projects $service, $project): Response {
|
||||
$post = $request->getParsedBody();
|
||||
$name = str_replace(' ', '', ucwords($post['name']));
|
||||
$status = $service->addController($project, $post['space'], $name, $post['template']);
|
||||
return $this->withRedirect($response, implode('/', [
|
||||
$container->get('urls')->base,
|
||||
'project',
|
||||
$project
|
||||
]));
|
||||
}
|
||||
public function addRoute(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
||||
$folder = implode(DIRECTORY_SEPARATOR, [
|
||||
$service->getFolder($project),
|
||||
'resources',
|
||||
'routes'
|
||||
]);
|
||||
$files = new \DirectoryIterator($folder);
|
||||
$subfolders = [];
|
||||
foreach ($files as $file) {
|
||||
if (!$file->isDir() or $file->isDot()) {
|
||||
continue;
|
||||
}
|
||||
$subfolders []= $file->getBasename();
|
||||
}
|
||||
$factory = new Factory();
|
||||
$p = $factory->find($service->getFolder($project))->getViews()->getControllers()->build();
|
||||
$views = [];
|
||||
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
|
||||
$pk = '';
|
||||
foreach ($it as $k => $v) {
|
||||
if (is_array($v)) {
|
||||
$pk = str_replace('/resources/views/', '', $k);
|
||||
continue;
|
||||
}
|
||||
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
|
||||
}
|
||||
$controllers = [];
|
||||
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->controllers), \RecursiveIteratorIterator::SELF_FIRST);
|
||||
$pk = '';
|
||||
foreach ($it as $k => $v) {
|
||||
if (is_array($v)) {
|
||||
$pk = str_replace('/common', 'ProVM/Projects/Common', $k);
|
||||
continue;
|
||||
}
|
||||
$controllers []= str_replace(['/', '.php'], ["\\", ''], implode('/', [$pk, $v]));
|
||||
}
|
||||
$project = $p;
|
||||
return $view->render($response, 'projects.routes.add', compact('project', 'subfolders', 'views', 'controllers'));
|
||||
}
|
||||
public function doAddRoute(Request $request, Response $response, Container $container, Projects $service, $project): Response {
|
||||
$post = $request->getParsedBody();
|
||||
$space = $post['space'];
|
||||
$name = $post['group'];
|
||||
$route = $post['name'];
|
||||
$callback = $post['controller'] . '::class';
|
||||
$service->addRoute($project, $space, $name, $route, $callback);
|
||||
return $this->withRedirect($response, implode('/', [
|
||||
$container->get('urls')->base,
|
||||
'project',
|
||||
$project
|
||||
]));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user