Sistema web para crear proyecto web nuevo

This commit is contained in:
2020-07-03 17:21:55 -04:00
parent af3507bda5
commit ad3952501f
53 changed files with 2437 additions and 0 deletions

View 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);
}
}

View 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);
}
}

View 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'));
}
}

View 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'));
}
}

View 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
]));
}
}