From bbaff07d206b3ce9d737ec402d4a2518a3227903 Mon Sep 17 00:00:00 2001 From: Thiago Franco Date: Mon, 7 Jan 2019 15:01:47 -0200 Subject: [PATCH 1/8] =?UTF-8?q?In=C3=ADcio=20do=20Projeto=20com=20script?= =?UTF-8?q?=20SQL=20e=20DER?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DER/DER.jpg | Bin 0 -> 51678 bytes SQL/desafiofullstack.sql | 107 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 DER/DER.jpg create mode 100644 SQL/desafiofullstack.sql diff --git a/DER/DER.jpg b/DER/DER.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9194c7b7adfdb5e0827d5312edd825c1cc2365cd GIT binary patch literal 51678 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

D{cGwv9q2FtCSie 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 literal 0 HcmV?d00001 diff --git a/SQL/desafiofullstack.sql b/SQL/desafiofullstack.sql new file mode 100644 index 000000000..b10833762 --- /dev/null +++ b/SQL/desafiofullstack.sql @@ -0,0 +1,107 @@ +/* +MySQL - 10.1.21-MariaDB : Database - celsolisboa +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`celsolisboa` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */; + +USE `celsolisboa`; + +/*Table structure for table `curso` */ + +DROP TABLE IF EXISTS `curso`; + +CREATE TABLE `curso` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `disciplina_id` int(11) NOT NULL, + `horario_inicio` time NOT NULL, + `horario_fim` time NOT NULL, + PRIMARY KEY (`id`), + KEY `disciplina_id` (`disciplina_id`), + CONSTRAINT `curso_ibfk_1` FOREIGN KEY (`disciplina_id`) REFERENCES `disciplina` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/*Table structure for table `curso_professor` */ + +DROP TABLE IF EXISTS `curso_professor`; + +CREATE TABLE `curso_professor` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `curso_id` int(11) NOT NULL, + `professor_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `aula_id` (`curso_id`), + KEY `professor_id` (`professor_id`), + CONSTRAINT `curso_professor_ibfk_1` FOREIGN KEY (`curso_id`) REFERENCES `curso` (`id`), + CONSTRAINT `curso_professor_ibfk_2` FOREIGN KEY (`professor_id`) REFERENCES `professor` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +/*Table structure for table `curso_sala` */ + +DROP TABLE IF EXISTS `curso_sala`; + +CREATE TABLE `curso_sala` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `curso_id` int(11) NOT NULL, + `sala_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `curso_id` (`curso_id`), + KEY `sala_id` (`sala_id`), + CONSTRAINT `curso_sala_ibfk_1` FOREIGN KEY (`curso_id`) REFERENCES `curso` (`id`), + CONSTRAINT `curso_sala_ibfk_2` FOREIGN KEY (`sala_id`) REFERENCES `sala` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `disciplina` */ + +DROP TABLE IF EXISTS `disciplina`; + +CREATE TABLE `disciplina` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `nome` char(255) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +/*Table structure for table `professor` */ + +DROP TABLE IF EXISTS `professor`; + +CREATE TABLE `professor` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `nome` char(255) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +/*Table structure for table `sala` */ + +DROP TABLE IF EXISTS `sala`; + +CREATE TABLE `sala` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `numero` char(255) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +/*Table structure for table `usuario` */ + +DROP TABLE IF EXISTS `usuario`; + +CREATE TABLE `usuario` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `email` char(255) COLLATE utf8_unicode_ci NOT NULL, + `senha` char(255) COLLATE utf8_unicode_ci NOT NULL, + `token` char(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; From 67df22b712da1de981c0d4e555be3b5dcc0c5710 Mon Sep 17 00:00:00 2001 From: Thiago Franco Date: Mon, 7 Jan 2019 15:14:36 -0200 Subject: [PATCH 2/8] =?UTF-8?q?Cria=C3=A7=C3=A3o=20dos=20Models,=20Service?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/.gitignore | 1 + api/app/dependencies.php | 93 ++ api/app/middleware.php | 48 + api/app/routes.php | 7 + api/app/settings.php | 48 + api/app/src/Action/HomeAction.php | 32 + api/app/src/Action/UsuarioLogar.php | 47 + api/app/src/Controller/UsuarioController.php | 50 + api/app/src/Entity/Curso.php | 130 ++ api/app/src/Entity/CursoProfessor.php | 102 ++ api/app/src/Entity/CursoSala.php | 102 ++ api/app/src/Entity/Disciplina.php | 65 + api/app/src/Entity/Professor.php | 65 + api/app/src/Entity/Sala.php | 65 + api/app/src/Entity/Usuario.php | 127 ++ api/app/src/Helper/FuncoesHelper.php | 21 + api/app/src/Service/UsuarioService.php | 68 + api/app/templates/home.twig | 13 + ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 1618 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 1618 bytes api/cache/twig/.keepme | 0 ...d7842bd3ac5ba2abd71439d4ab2aaf0b27afda.php | 74 + ...b9cc3dfd524dd94bb51e06b534a374a578dbf0.php | 74 + api/composer.json | 11 + api/composer.lock | 1372 +++++++++++++++++ api/config/cli-config.php | 21 + api/log/.keepme | 0 api/log/app.log | 30 + api/public/.htaccess | 16 + api/public/css/style.css | 18 + api/public/index.php | 27 + api/src/App/Entity/Produto.php | 49 + api/src/App/Entity/Usuario.php | 39 + 33 files changed, 2815 insertions(+) create mode 100644 api/.gitignore create mode 100644 api/app/dependencies.php create mode 100644 api/app/middleware.php create mode 100644 api/app/routes.php create mode 100644 api/app/settings.php create mode 100644 api/app/src/Action/HomeAction.php create mode 100644 api/app/src/Action/UsuarioLogar.php create mode 100644 api/app/src/Controller/UsuarioController.php create mode 100644 api/app/src/Entity/Curso.php create mode 100644 api/app/src/Entity/CursoProfessor.php create mode 100644 api/app/src/Entity/CursoSala.php create mode 100644 api/app/src/Entity/Disciplina.php create mode 100644 api/app/src/Entity/Professor.php create mode 100644 api/app/src/Entity/Sala.php create mode 100644 api/app/src/Entity/Usuario.php create mode 100644 api/app/src/Helper/FuncoesHelper.php create mode 100644 api/app/src/Service/UsuarioService.php create mode 100644 api/app/templates/home.twig create mode 100644 api/app/var/doctrine/d6/5b5c4170705c456e746974795c5573756172696f24434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/d8/5b4170705c456e746974795c5573756172696f24434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/cache/twig/.keepme create mode 100644 api/cache/twig/81/818e26bad1f44cc5bec623ce17d7842bd3ac5ba2abd71439d4ab2aaf0b27afda.php create mode 100644 api/cache/twig/a8/a8e1b2577448d349a17cb310a3b9cc3dfd524dd94bb51e06b534a374a578dbf0.php create mode 100644 api/composer.json create mode 100644 api/composer.lock create mode 100644 api/config/cli-config.php create mode 100644 api/log/.keepme create mode 100644 api/log/app.log create mode 100644 api/public/.htaccess create mode 100644 api/public/css/style.css create mode 100644 api/public/index.php create mode 100644 api/src/App/Entity/Produto.php create mode 100644 api/src/App/Entity/Usuario.php diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 000000000..a725465ae --- /dev/null +++ b/api/.gitignore @@ -0,0 +1 @@ +vendor/ \ No newline at end of file diff --git a/api/app/dependencies.php b/api/app/dependencies.php new file mode 100644 index 000000000..7e358f7b7 --- /dev/null +++ b/api/app/dependencies.php @@ -0,0 +1,93 @@ +getContainer(); + +// ----------------------------------------------------------------------------- +// Service providers +// ----------------------------------------------------------------------------- + +// Twig +$container['view'] = function ($c) { + $settings = $c->get('settings'); + $view = new Slim\Views\Twig($settings['view']['template_path'], $settings['view']['twig']); + + // Add extensions + $view->addExtension(new Slim\Views\TwigExtension($c->get('router'), $c->get('request')->getUri())); + $view->addExtension(new Twig_Extension_Debug()); + + return $view; +}; + +// Flash messages +$container['flash'] = function ($c) { + return new Slim\Flash\Messages; +}; + +// ----------------------------------------------------------------------------- +// Service factories +// ----------------------------------------------------------------------------- + +// monolog +$container['logger'] = function ($c) { + $settings = $c->get('settings'); + $logger = new Monolog\Logger($settings['logger']['name']); + $logger->pushProcessor(new Monolog\Processor\UidProcessor()); + $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['logger']['path'], Monolog\Logger::DEBUG)); + return $logger; +}; + +$container[EntityManager::class] = function ($c): EntityManager { + $container = $c; + $config = Setup::createAnnotationMetadataConfiguration( + $container['settings']['doctrine']['metadata_dirs'], + $container['settings']['doctrine']['dev_mode'] + ); + + $config->setMetadataDriverImpl( + new AnnotationDriver( + new AnnotationReader, + $container['settings']['doctrine']['metadata_dirs'] + ) + ); + + $config->setMetadataCacheImpl( + new FilesystemCache( + $container['settings']['doctrine']['cache_dir'] + ) + ); + + return EntityManager::create( + $container['settings']['doctrine']['connection'], + $config + ); +}; + +// ----------------------------------------------------------------------------- +// Action factories +// ----------------------------------------------------------------------------- + + +$container[AutenticacaoTokenMiddleware::class] = function ($c) { + return new AutenticacaoTokenMiddleware($c->get(EntityManager::class)); +}; + +$container[App\Action\HomeAction::class] = function ($c) { + return new App\Action\HomeAction( $c->get(EntityManager::class)); +}; + + +$container[App\Action\UsuarioLogar::class] = function ($c) { + return new App\Action\UsuarioLogar($c->get(EntityManager::class)); +}; + + diff --git a/api/app/middleware.php b/api/app/middleware.php new file mode 100644 index 000000000..5c5a872bb --- /dev/null +++ b/api/app/middleware.php @@ -0,0 +1,48 @@ +em = $em; + } + + public function __invoke($request, $response, $next) + { + try{ + $tokenHeader = $request->getHeader('token_auth'); + $emailHeader = $request->getHeader('email_auth'); + + $usuario = new Usuario(); + $usuario->setEmail($emailHeader); + $usuario->setToken($tokenHeader); + + $uS = new UsuarioService( $usuario, $this->em ); + $verificado = $uS->verificarToken(); + + $status = $response->getStatusCode(); + + }catch( \Exception $e ){ + $msg = $e->getMessage(); + die( FuncoesHelper::formatarSaidaJson(401,"Requisição não autorizada! Token Inválido!",[],1)); + } + + return $next($request, $response); + } +} \ No newline at end of file diff --git a/api/app/routes.php b/api/app/routes.php new file mode 100644 index 000000000..704affa9e --- /dev/null +++ b/api/app/routes.php @@ -0,0 +1,7 @@ +get('/usuario/logar', App\Action\UsuarioLogar::class); + + +$app->get('/usuario/logar2', function(){})->add( AutenticacaoTokenMiddleware::class ); diff --git a/api/app/settings.php b/api/app/settings.php new file mode 100644 index 000000000..39cc6f327 --- /dev/null +++ b/api/app/settings.php @@ -0,0 +1,48 @@ + [ + // Slim Settings + 'determineRouteBeforeAppMiddleware' => false, + 'displayErrorDetails' => true, + + // View settings + 'view' => [ + 'template_path' => __DIR__ . '/templates', + 'twig' => [ + 'cache' => __DIR__ . '/../cache/twig', + 'debug' => true, + 'auto_reload' => true, + ], + ], + + // monolog settings + 'logger' => [ + 'name' => 'app', + 'path' => __DIR__ . '/../log/app.log', + ], + + 'doctrine' => [ + 'meta' => [ + 'entity_path' => [ + 'app/src/Entity/' + ], + 'auto_generate_proxies' => true, + 'proxy_dir' => __DIR__.'/../cache/proxies', + 'cache' => null, + ], + // path where the compiled metadata info will be cached + // make sure the path exists and it is writable + 'cache_dir' => __DIR__ . '/var/doctrine', + 'dev_mode' => true, + // you should add any other path containing annotated entity classes + 'metadata_dirs' => [__DIR__ . '/src/Domain'], + 'connection' => [ + 'driver' => 'pdo_mysql', + 'host' => 'localhost', + 'dbname' => 'celsolisboa', + 'user' => 'root', + 'password' => '', + ] + ] + ], +]; diff --git a/api/app/src/Action/HomeAction.php b/api/app/src/Action/HomeAction.php new file mode 100644 index 000000000..d717af12e --- /dev/null +++ b/api/app/src/Action/HomeAction.php @@ -0,0 +1,32 @@ +em = $em; + } + + public function __invoke(Request $request, Response $response, $args) + { + $usuario = new Usuario(); + $usuario->setEmail('thiago.boo@gmail.com'); + $usuario->setSenha('1234567'); + + $us = new \App\Service\UsuarioService($usuario, $this->em); + var_dump( $us->logar() ); + + + + return $response; + } +} diff --git a/api/app/src/Action/UsuarioLogar.php b/api/app/src/Action/UsuarioLogar.php new file mode 100644 index 000000000..e35d1798e --- /dev/null +++ b/api/app/src/Action/UsuarioLogar.php @@ -0,0 +1,47 @@ +em = $em; + } + + public function __invoke(Request $request, Response $response, $args) + { + try{ + $usuario = new Usuario(); + $usuario->setEmail('thiago.boo@gmail.com'); + $usuario->setSenha('123456'); + + $us = new \App\Service\UsuarioService( $usuario, $this->em ); + $token = $us->logar(); + + + if( $token ){ + $erro = 0; + $msg = "Usuário Logado com Sucesso!"; + $dados = ['token'=>$token]; + } + + }catch( \Exception $e ){ + $erro = 1; + $msg = $e->getMessage(); + $dados = []; + } + + $status = $response->getStatusCode(); + + return FuncoesHelper::formatarSaidaJson($status, $msg, $dados, $erro); + } +} diff --git a/api/app/src/Controller/UsuarioController.php b/api/app/src/Controller/UsuarioController.php new file mode 100644 index 000000000..8c2037eef --- /dev/null +++ b/api/app/src/Controller/UsuarioController.php @@ -0,0 +1,50 @@ +setEmail('thiago.boo@gmail.com'); + $usuario->setSenha('1234567'); + + $us = new \App\Service\UsuarioService($usuario, $this->em); + var_dump( $us->logar() ); + + + + return $response; + } + + public static function logar(Request $request, Response $response, $args){ + + /* + $email = $request->getAttribute('email'); + $senha = $request->getAttribute('senha'); + */ + + $usuario = new Usuario(); + $usuario->setEmail('thiago.boo@gmail.com'); + $usuario->setSenha('1234567'); + + $us = new \App\Service\UsuarioService($usuario, self::$em); + var_dump( $us->logar() ); + } +} diff --git a/api/app/src/Entity/Curso.php b/api/app/src/Entity/Curso.php new file mode 100644 index 000000000..35bbe8862 --- /dev/null +++ b/api/app/src/Entity/Curso.php @@ -0,0 +1,130 @@ +id; + } + + /** + * Set horarioInicio. + * + * @param \DateTime $horarioInicio + * + * @return Curso + */ + public function setHorarioInicio($horarioInicio) + { + $this->horarioInicio = $horarioInicio; + + return $this; + } + + /** + * Get horarioInicio. + * + * @return \DateTime + */ + public function getHorarioInicio() + { + return $this->horarioInicio; + } + + /** + * Set horarioFim. + * + * @param \DateTime $horarioFim + * + * @return Curso + */ + public function setHorarioFim($horarioFim) + { + $this->horarioFim = $horarioFim; + + return $this; + } + + /** + * Get horarioFim. + * + * @return \DateTime + */ + public function getHorarioFim() + { + return $this->horarioFim; + } + + /** + * Set disciplina. + * + * @param \App\Entity\Disciplina|null $disciplina + * + * @return Curso + */ + public function setDisciplina(\App\Entity\Disciplina $disciplina = null) + { + $this->disciplina = $disciplina; + + return $this; + } + + /** + * Get disciplina. + * + * @return \App\Entity\Disciplina|null + */ + public function getDisciplina() + { + return $this->disciplina; + } +} diff --git a/api/app/src/Entity/CursoProfessor.php b/api/app/src/Entity/CursoProfessor.php new file mode 100644 index 000000000..18d6e1134 --- /dev/null +++ b/api/app/src/Entity/CursoProfessor.php @@ -0,0 +1,102 @@ +id; + } + + /** + * Set curso. + * + * @param \App\Entity\Curso|null $curso + * + * @return CursoProfessor + */ + public function setCurso(\App\Entity\Curso $curso = null) + { + $this->curso = $curso; + + return $this; + } + + /** + * Get curso. + * + * @return \App\Entity\Curso|null + */ + public function getCurso() + { + return $this->curso; + } + + /** + * Set professor. + * + * @param \App\Entity\Professor|null $professor + * + * @return CursoProfessor + */ + public function setProfessor(\App\Entity\Professor $professor = null) + { + $this->professor = $professor; + + return $this; + } + + /** + * Get professor. + * + * @return \App\Entity\Professor|null + */ + public function getProfessor() + { + return $this->professor; + } +} diff --git a/api/app/src/Entity/CursoSala.php b/api/app/src/Entity/CursoSala.php new file mode 100644 index 000000000..128da4c98 --- /dev/null +++ b/api/app/src/Entity/CursoSala.php @@ -0,0 +1,102 @@ +id; + } + + /** + * Set curso. + * + * @param \App\Entity\Curso|null $curso + * + * @return CursoSala + */ + public function setCurso(\App\Entity\Curso $curso = null) + { + $this->curso = $curso; + + return $this; + } + + /** + * Get curso. + * + * @return \App\Entity\Curso|null + */ + public function getCurso() + { + return $this->curso; + } + + /** + * Set sala. + * + * @param \App\Entity\Sala|null $sala + * + * @return CursoSala + */ + public function setSala(\App\Entity\Sala $sala = null) + { + $this->sala = $sala; + + return $this; + } + + /** + * Get sala. + * + * @return \App\Entity\Sala|null + */ + public function getSala() + { + return $this->sala; + } +} diff --git a/api/app/src/Entity/Disciplina.php b/api/app/src/Entity/Disciplina.php new file mode 100644 index 000000000..e0ff4befb --- /dev/null +++ b/api/app/src/Entity/Disciplina.php @@ -0,0 +1,65 @@ +id; + } + + /** + * Set nome. + * + * @param string $nome + * + * @return Disciplina + */ + public function setNome($nome) + { + $this->nome = $nome; + + return $this; + } + + /** + * Get nome. + * + * @return string + */ + public function getNome() + { + return $this->nome; + } +} diff --git a/api/app/src/Entity/Professor.php b/api/app/src/Entity/Professor.php new file mode 100644 index 000000000..e64beaf44 --- /dev/null +++ b/api/app/src/Entity/Professor.php @@ -0,0 +1,65 @@ +id; + } + + /** + * Set nome. + * + * @param string $nome + * + * @return Professor + */ + public function setNome($nome) + { + $this->nome = $nome; + + return $this; + } + + /** + * Get nome. + * + * @return string + */ + public function getNome() + { + return $this->nome; + } +} diff --git a/api/app/src/Entity/Sala.php b/api/app/src/Entity/Sala.php new file mode 100644 index 000000000..7f084b2de --- /dev/null +++ b/api/app/src/Entity/Sala.php @@ -0,0 +1,65 @@ +id; + } + + /** + * Set numero. + * + * @param string $numero + * + * @return Sala + */ + public function setNumero($numero) + { + $this->numero = $numero; + + return $this; + } + + /** + * Get numero. + * + * @return string + */ + public function getNumero() + { + return $this->numero; + } +} diff --git a/api/app/src/Entity/Usuario.php b/api/app/src/Entity/Usuario.php new file mode 100644 index 000000000..f61d3348e --- /dev/null +++ b/api/app/src/Entity/Usuario.php @@ -0,0 +1,127 @@ +id; + } + + /** + * Set email. + * + * @param string $email + * + * @return Usuario + */ + public function setEmail($email) + { + $this->email = $email; + + return $this; + } + + /** + * Get email. + * + * @return string + */ + public function getEmail() + { + return $this->email; + } + + /** + * Set senha. + * + * @param string $senha + * + * @return Usuario + */ + public function setSenha($senha) + { + $this->senha = $senha; + + return $this; + } + + /** + * Get senha. + * + * @return string + */ + public function getSenha() + { + return $this->senha; + } + + /** + * Set token. + * + * @param string|null $token + * + * @return Usuario + */ + public function setToken($token = null) + { + $this->token = $token; + + return $this; + } + + /** + * Get token. + * + * @return string|null + */ + public function getToken() + { + return $this->token; + } +} diff --git a/api/app/src/Helper/FuncoesHelper.php b/api/app/src/Helper/FuncoesHelper.php new file mode 100644 index 000000000..c8339eeb4 --- /dev/null +++ b/api/app/src/Helper/FuncoesHelper.php @@ -0,0 +1,21 @@ + $status, "msg" => $msg, "dados" => $dados, "erro" => $erro)); + if( json_last_error() > 0 ){ + throw new \Exception('Erro na formação do JSON'); + } + + return $retorno; + } + +} \ No newline at end of file diff --git a/api/app/src/Service/UsuarioService.php b/api/app/src/Service/UsuarioService.php new file mode 100644 index 000000000..b1a07e337 --- /dev/null +++ b/api/app/src/Service/UsuarioService.php @@ -0,0 +1,68 @@ +usuario = $usuario; + $this->em = $em; + } + + private static function gerarToken(Usuario $usuario) : string{ + $id = $usuario->getId(); + $data = date("YmdHis"); + + if( $id == null ){ + throw new \Exception('Usuário inválido'); + } + + return md5($id.$data); + } + + public function verificarToken() : bool{ + + $email = $this->usuario->getEmail(); + $token = $this->usuario->getToken(); + + $verificado = $this->em->getRepository('\App\Entity\Usuario')->findOneBy(array('email' => $email, 'token'=> $token)); + + $retorno = false; + if( $verificado ){ + $retorno = true; + }else{ + throw new \Exception("Requisição não autorizada! Token Inválido!"); + } + + return $retorno; + + } + + public function logar() : string{ + + $email = $this->usuario->getEmail(); + $senha = md5( $this->usuario->getSenha() ); + + $usuario = $this->em->getRepository('\App\Entity\Usuario')->findOneBy(array('email' => $email, 'senha'=> $senha)); + + $retorno = ""; + if( $usuario ){ + $token = self::gerarToken($usuario); + + //gravar token na tabela + $this->usuario->setToken($token); + $this->em->persist($this->usuario); + $this->em->flush(); + $retorno = $this->usuario->getToken(); + }else{ + throw new \Exception("Os dados de email e/ou senha são inválidos!"); + } + + return $retorno; + } +} \ No newline at end of file diff --git a/api/app/templates/home.twig b/api/app/templates/home.twig new file mode 100644 index 000000000..3a769addf --- /dev/null +++ b/api/app/templates/home.twig @@ -0,0 +1,13 @@ + + + + Slim 3 + + + + +

Slim

+
a microframework for PHP
+ + + diff --git a/api/app/var/doctrine/d6/5b5c4170705c456e746974795c5573756172696f24434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/d6/5b5c4170705c456e746974795c5573756172696f24434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..3873c91b613457c5de2f56cca703ee079421d861 GIT binary patch literal 1618 zcmdT^%Wm8-49qz|e?nid-bdTery?zi9CiZ~?addh#W+O0l4{977D4{K)WeT$vj~u) z1$vVyTAUe@^XBpvR%;L+P3=3884FrE^>KQb{ib6f1aiP+WoFu&GIU zGCJovQA$|A;}a(oAZpY02fdRAj2G+h;}QfZQO*t<5O|Q(hTtz}hx%UT`26h6chota z&!OZB#2sO)=4j?cC0qpv3_Yd=U?)ge0e`eH_Ksm{j}3N1`C7JoL$F|&Z$Y%E8-Fj# zUHa@b{pk6AAMf9T(0$v=efTAXxTx*0CdX&1$OBxhyKKPDxn z%)Ed;Swe&nH+6WIweN?wf{a|UGsdSfgHfF?9^97HXVln9Z884FrE^>KQb{ib6f1aiP+WoFu&GIU zGCJovQA$|A;}a(oAZpY02fdRAj2G+h;}QfZQO*t<5O|Q(hTtz}hx%UT`26h6chota z&!OZB#2sO)=4j?cC0qpv3_Yd=U?)ge0e`eH_Ksm{j}3N1`C7JoL$F|&Z$Y%E8-Fj# zUHa@b{pk6AAMf9T(0$v=efTAXxTx*0CdX&1$OBxhyKKPDxn z%)Ed;Swe&nH+6WIweN?wf{a|UGsdSfgHfF?9^97HXVln9Zsource = $this->getSourceContext(); + + $this->parent = false; + + $this->blocks = array( + ); + } + + protected function doDisplay(array $context, array $blocks = array()) + { + // line 1 + echo " + + + Slim 3 + + baseUrl(), "html", null, true); + echo "/css/style.css' rel='stylesheet' type='text/css'> + + +

Slim

+
a microframework for PHP
+ + + +"; + } + + public function getTemplateName() + { + return "home.twig"; + } + + public function isTraitable() + { + return false; + } + + public function getDebugInfo() + { + return array ( 30 => 6, 23 => 1,); + } + + public function getSourceContext() + { + return new Twig_Source(" + + + Slim 3 + + + + +

Slim

+
a microframework for PHP
+ + + +", "home.twig", "C:\\xampp7\\htdocs\\celsolisboa\\app\\templates\\home.twig"); + } +} diff --git a/api/cache/twig/a8/a8e1b2577448d349a17cb310a3b9cc3dfd524dd94bb51e06b534a374a578dbf0.php b/api/cache/twig/a8/a8e1b2577448d349a17cb310a3b9cc3dfd524dd94bb51e06b534a374a578dbf0.php new file mode 100644 index 000000000..69ed0e0db --- /dev/null +++ b/api/cache/twig/a8/a8e1b2577448d349a17cb310a3b9cc3dfd524dd94bb51e06b534a374a578dbf0.php @@ -0,0 +1,74 @@ +source = $this->getSourceContext(); + + $this->parent = false; + + $this->blocks = array( + ); + } + + protected function doDisplay(array $context, array $blocks = array()) + { + // line 1 + echo " + + + Slim 3 + + baseUrl(), "html", null, true); + echo "/css/style.css' rel='stylesheet' type='text/css'> + + +

Slim

+
a microframework for PHP
+ + + +"; + } + + public function getTemplateName() + { + return "home.twig"; + } + + public function isTraitable() + { + return false; + } + + public function getDebugInfo() + { + return array ( 30 => 6, 23 => 1,); + } + + public function getSourceContext() + { + return new Twig_Source(" + + + Slim 3 + + + + +

Slim

+
a microframework for PHP
+ + + +", "home.twig", "C:\\xampp7\\htdocs\\slim-doctrine\\app\\templates\\home.twig"); + } +} diff --git a/api/composer.json b/api/composer.json new file mode 100644 index 000000000..622e821f6 --- /dev/null +++ b/api/composer.json @@ -0,0 +1,11 @@ +{ + "autoload": { + "psr-4": { + "App\\": "app/src" + } + }, + "require": { + "slim/slim": "^3.0", + "doctrine/orm": "^2.6" + } +} diff --git a/api/composer.lock b/api/composer.lock new file mode 100644 index 000000000..9c299cccc --- /dev/null +++ b/api/composer.lock @@ -0,0 +1,1372 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "97d88edb930aa33f313139a05858c9b7", + "packages": [ + { + "name": "container-interop/container-interop", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/container-interop/container-interop.git", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "shasum": "" + }, + "require": { + "psr/container": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Interop\\Container\\": "src/Interop/Container/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", + "time": "2017-02-14T19:40:03+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2017-12-06T07:11:42+00:00" + }, + { + "name": "doctrine/cache", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57", + "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^4.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2018-08-21T18:01:43+00:00" + }, + { + "name": "doctrine/collections", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf", + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2017-07-22T10:37:32+00:00" + }, + { + "name": "doctrine/common", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "30e33f60f64deec87df728c02b107f82cdafad9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d", + "reference": "30e33f60f64deec87df728c02b107f82cdafad9d", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/inflector": "^1.0", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.1", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.3", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "time": "2018-11-21T01:24:55+00:00" + }, + { + "name": "doctrine/dbal", + "version": "v2.9.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9", + "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "jetbrains/phpstorm-stubs": "^2018.1.2", + "phpstan/phpstan": "^0.10.1", + "phpunit/phpunit": "^7.4", + "symfony/console": "^2.0.5|^3.0|^4.0", + "symfony/phpunit-bridge": "^3.4.5|^4.0.5" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9.x-dev", + "dev-develop": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "dbal", + "mysql", + "persistence", + "pgsql", + "php", + "queryobject" + ], + "time": "2018-12-31T03:27:51+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3", + "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Doctrine Event Manager component", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "eventdispatcher", + "eventmanager" + ], + "time": "2018-06-11T11:59:03+00:00" + }, + { + "name": "doctrine/inflector", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2018-01-09T20:05:19+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "^6.2.3", + "squizlabs/php_codesniffer": "^3.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2017-07-22T11:58:36+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "doctrine/orm", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "434820973cadf2da2d66e7184be370084cc32ca8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8", + "reference": "434820973cadf2da2d66e7184be370084cc32ca8", + "shasum": "" + }, + "require": { + "doctrine/annotations": "~1.5", + "doctrine/cache": "~1.6", + "doctrine/collections": "^1.4", + "doctrine/common": "^2.7.1", + "doctrine/dbal": "^2.6", + "doctrine/instantiator": "~1.1", + "ext-pdo": "*", + "php": "^7.1", + "symfony/console": "~3.0|~4.0" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.5", + "squizlabs/php_codesniffer": "^3.2", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm" + ], + "time": "2018-11-20T23:46:46+00:00" + }, + { + "name": "doctrine/persistence", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38", + "reference": "c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpstan/phpstan": "^0.8", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "time": "2018-11-21T00:33:13+00:00" + }, + { + "name": "doctrine/reflection", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/reflection.git", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "doctrine/common": "^2.8", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Doctrine Reflection component", + "homepage": "https://www.doctrine-project.org/projects/reflection.html", + "keywords": [ + "reflection" + ], + "time": "2018-06-14T14:45:07+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "FastRoute\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.2.3", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2018-01-21T07:42:36+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "slim/slim", + "version": "3.11.0", + "source": { + "type": "git", + "url": "https://github.com/slimphp/Slim.git", + "reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/d378e70431e78ee92ee32ddde61ecc72edf5dc0a", + "reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a", + "shasum": "" + }, + "require": { + "container-interop/container-interop": "^1.2", + "nikic/fast-route": "^1.0", + "php": ">=5.5.0", + "pimple/pimple": "^3.0", + "psr/container": "^1.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0", + "squizlabs/php_codesniffer": "^2.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Slim\\": "Slim" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rob Allen", + "email": "rob@akrabat.com", + "homepage": "http://akrabat.com" + }, + { + "name": "Josh Lockhart", + "email": "hello@joshlockhart.com", + "homepage": "https://joshlockhart.com" + }, + { + "name": "Gabriel Manricks", + "email": "gmanricks@me.com", + "homepage": "http://gabrielmanricks.com" + }, + { + "name": "Andrew Smith", + "email": "a.smith@silentworks.co.uk", + "homepage": "http://silentworks.co.uk" + } + ], + "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", + "homepage": "https://slimframework.com", + "keywords": [ + "api", + "framework", + "micro", + "router" + ], + "time": "2018-09-16T10:54:21+00:00" + }, + { + "name": "symfony/console", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2019-01-04T15:13:53+00:00" + }, + { + "name": "symfony/contracts", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05T08:06:11+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-09-21T13:07:52+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/api/config/cli-config.php b/api/config/cli-config.php new file mode 100644 index 000000000..03cfee2af --- /dev/null +++ b/api/config/cli-config.php @@ -0,0 +1,21 @@ +setProxyNamespace('App\Entity'); + +$em = \Doctrine\ORM\EntityManager::create($settings['connection'], $config); + +return ConsoleRunner::createHelperSet($em); \ No newline at end of file diff --git a/api/log/.keepme b/api/log/.keepme new file mode 100644 index 000000000..e69de29bb diff --git a/api/log/app.log b/api/log/app.log new file mode 100644 index 000000000..15ac4afc8 --- /dev/null +++ b/api/log/app.log @@ -0,0 +1,30 @@ +[2019-01-04 17:32:04] app.INFO: Home page action dispatched [] {"uid":"d426af2"} +[2019-01-07 12:56:24] app.INFO: Home page action dispatched [] {"uid":"14ab347"} +[2019-01-07 13:05:22] app.INFO: Home page action dispatched [] {"uid":"d0aa455"} +[2019-01-07 13:05:42] app.INFO: Home page action dispatched [] {"uid":"b4e2955"} +[2019-01-07 13:05:43] app.INFO: Home page action dispatched [] {"uid":"7884220"} +[2019-01-07 13:05:56] app.INFO: Home page action dispatched [] {"uid":"63b0162"} +[2019-01-07 13:11:26] app.INFO: Home page action dispatched [] {"uid":"593a24c"} +[2019-01-07 13:19:12] app.INFO: Home page action dispatched [] {"uid":"efd3d04"} +[2019-01-07 13:19:12] app.INFO: Home page action dispatched [] {"uid":"530f9e8"} +[2019-01-07 14:21:45] app.INFO: Home page action dispatched [] {"uid":"29953f9"} +[2019-01-07 14:22:26] app.INFO: Home page action dispatched [] {"uid":"f141788"} +[2019-01-07 14:23:12] app.INFO: Home page action dispatched [] {"uid":"ce0358a"} +[2019-01-07 14:25:43] app.INFO: Home page action dispatched [] {"uid":"e404257"} +[2019-01-07 14:26:01] app.INFO: Home page action dispatched [] {"uid":"7cc187a"} +[2019-01-07 14:26:26] app.INFO: Home page action dispatched [] {"uid":"5c40f7a"} +[2019-01-07 14:29:31] app.INFO: Home page action dispatched [] {"uid":"e5488fa"} +[2019-01-07 14:30:01] app.INFO: Home page action dispatched [] {"uid":"4665dab"} +[2019-01-07 14:30:13] app.INFO: Home page action dispatched [] {"uid":"3adf80d"} +[2019-01-07 14:44:25] app.INFO: Home page action dispatched [] {"uid":"b84a9f5"} +[2019-01-07 14:45:01] app.INFO: Home page action dispatched [] {"uid":"11e5c3e"} +[2019-01-07 14:45:01] app.INFO: Home page action dispatched [] {"uid":"9134fc3"} +[2019-01-07 14:45:03] app.INFO: Home page action dispatched [] {"uid":"c8ca916"} +[2019-01-07 14:45:04] app.INFO: Home page action dispatched [] {"uid":"a8627ac"} +[2019-01-07 14:49:52] app.INFO: Home page action dispatched [] {"uid":"e5b2a05"} +[2019-01-07 14:49:59] app.INFO: Home page action dispatched [] {"uid":"9d2e9c6"} +[2019-01-07 14:50:29] app.INFO: Home page action dispatched [] {"uid":"1698252"} +[2019-01-07 14:51:17] app.INFO: Home page action dispatched [] {"uid":"44386fb"} +[2019-01-07 14:52:21] app.INFO: Home page action dispatched [] {"uid":"9d435e9"} +[2019-01-07 14:52:42] app.INFO: Home page action dispatched [] {"uid":"a6221b4"} +[2019-01-07 14:53:07] app.INFO: Home page action dispatched [] {"uid":"9196d8c"} diff --git a/api/public/.htaccess b/api/public/.htaccess new file mode 100644 index 000000000..00715327a --- /dev/null +++ b/api/public/.htaccess @@ -0,0 +1,16 @@ +# For production, put your rewrite rules directly into your VirtualHost +# directive and turn off AllowOverride. + + + RewriteEngine On + + RewriteCond %{REQUEST_FILENAME} -s [OR] + RewriteCond %{REQUEST_FILENAME} -l [OR] + RewriteCond %{REQUEST_FILENAME} -d + RewriteRule ^.*$ - [NC,L] + + + RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ + RewriteRule ^(.*) - [E=BASE:%1] + RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] + diff --git a/api/public/css/style.css b/api/public/css/style.css new file mode 100644 index 000000000..322b3bf28 --- /dev/null +++ b/api/public/css/style.css @@ -0,0 +1,18 @@ +body { + margin: 50px 0 0 0; + padding: 0; + width: 100%; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + text-align: center; + color: #aaa; + font-size: 18px; +} + +h1 { + color: #719e40; + letter-spacing: -3px; + font-family: 'Lato', sans-serif; + font-size: 100px; + font-weight: 200; + margin-bottom: 0; +} diff --git a/api/public/index.php b/api/public/index.php new file mode 100644 index 000000000..8643d9910 --- /dev/null +++ b/api/public/index.php @@ -0,0 +1,27 @@ +run(); diff --git a/api/src/App/Entity/Produto.php b/api/src/App/Entity/Produto.php new file mode 100644 index 000000000..4fce041e3 --- /dev/null +++ b/api/src/App/Entity/Produto.php @@ -0,0 +1,49 @@ + Date: Mon, 7 Jan 2019 17:48:12 -0200 Subject: [PATCH 3/8] =?UTF-8?q?In=C3=ADcio=20do=20front-end=20-=20tela=20d?= =?UTF-8?q?e=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + api/.gitignore | 1 - api/app/src/Action/UsuarioLogar.php | 9 ++-- api/app/src/Controller/UsuarioController.php | 7 ++- api/app/src/Service/UsuarioService.php | 6 +-- api/src/App/Entity/Produto.php | 49 -------------------- api/src/App/Entity/Usuario.php | 39 ---------------- desafio-fullstack.clpprj | 3 ++ front-end/footer.php | 3 ++ front-end/header.php | 9 ++++ front-end/login.php | 22 +++++++++ front-end/package-lock.json | 15 ++++++ 12 files changed, 68 insertions(+), 97 deletions(-) create mode 100644 .gitignore delete mode 100644 api/.gitignore delete mode 100644 api/src/App/Entity/Produto.php delete mode 100644 api/src/App/Entity/Usuario.php create mode 100644 desafio-fullstack.clpprj create mode 100644 front-end/footer.php create mode 100644 front-end/header.php create mode 100644 front-end/login.php create mode 100644 front-end/package-lock.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ff87634e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +vendor/ +node_modules/ \ No newline at end of file diff --git a/api/.gitignore b/api/.gitignore deleted file mode 100644 index a725465ae..000000000 --- a/api/.gitignore +++ /dev/null @@ -1 +0,0 @@ -vendor/ \ No newline at end of file diff --git a/api/app/src/Action/UsuarioLogar.php b/api/app/src/Action/UsuarioLogar.php index e35d1798e..3bce8eb78 100644 --- a/api/app/src/Action/UsuarioLogar.php +++ b/api/app/src/Action/UsuarioLogar.php @@ -20,9 +20,12 @@ public function __construct(EntityManager $em) public function __invoke(Request $request, Response $response, $args) { try{ - $usuario = new Usuario(); - $usuario->setEmail('thiago.boo@gmail.com'); - $usuario->setSenha('123456'); + $email = $request->getParam("email"); + $senha = $request->getParam("senha"); + + $usuario = new Usuario(); + $usuario->setEmail($email); + $usuario->setSenha($senha); $us = new \App\Service\UsuarioService( $usuario, $this->em ); $token = $us->logar(); diff --git a/api/app/src/Controller/UsuarioController.php b/api/app/src/Controller/UsuarioController.php index 8c2037eef..04b7bd1cd 100644 --- a/api/app/src/Controller/UsuarioController.php +++ b/api/app/src/Controller/UsuarioController.php @@ -21,9 +21,12 @@ public function __construct( EntityManager $em ) public function __invoke(Request $request, Response $response, $args) { + $email = $request->getAttribute("email"); + $senha = md5( $request->getAttribute("senha") ); + $usuario = new Usuario(); - $usuario->setEmail('thiago.boo@gmail.com'); - $usuario->setSenha('1234567'); + $usuario->setEmail($email); + $usuario->setSenha($senha); $us = new \App\Service\UsuarioService($usuario, $this->em); var_dump( $us->logar() ); diff --git a/api/app/src/Service/UsuarioService.php b/api/app/src/Service/UsuarioService.php index b1a07e337..693ce8190 100644 --- a/api/app/src/Service/UsuarioService.php +++ b/api/app/src/Service/UsuarioService.php @@ -55,10 +55,10 @@ public function logar() : string{ $token = self::gerarToken($usuario); //gravar token na tabela - $this->usuario->setToken($token); - $this->em->persist($this->usuario); + $usuario->setToken($token); + $this->em->merge($usuario); $this->em->flush(); - $retorno = $this->usuario->getToken(); + $retorno = $usuario->getToken(); }else{ throw new \Exception("Os dados de email e/ou senha são inválidos!"); } diff --git a/api/src/App/Entity/Produto.php b/api/src/App/Entity/Produto.php deleted file mode 100644 index 4fce041e3..000000000 --- a/api/src/App/Entity/Produto.php +++ /dev/null @@ -1,49 +0,0 @@ - + + diff --git a/front-end/footer.php b/front-end/footer.php new file mode 100644 index 000000000..15c5adc7f --- /dev/null +++ b/front-end/footer.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/front-end/header.php b/front-end/header.php new file mode 100644 index 000000000..60603c48f --- /dev/null +++ b/front-end/header.php @@ -0,0 +1,9 @@ + + + + + Desafio FullStack + + + + \ No newline at end of file diff --git a/front-end/login.php b/front-end/login.php new file mode 100644 index 000000000..4c1606b26 --- /dev/null +++ b/front-end/login.php @@ -0,0 +1,22 @@ + + +
+
+

LOGIN

+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + \ No newline at end of file diff --git a/front-end/package-lock.json b/front-end/package-lock.json new file mode 100644 index 000000000..8462c8b79 --- /dev/null +++ b/front-end/package-lock.json @@ -0,0 +1,15 @@ +{ + "lockfileVersion": 1, + "dependencies": { + "bootstrap": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.2.1.tgz", + "integrity": "sha512-tt/7vIv3Gm2mnd/WeDx36nfGGHleil0Wg8IeB7eMrVkY0fZ5iTaBisSh8oNANc2IBsCc6vCgCNTIM/IEN0+50Q==" + }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + } + } +} From 1cc5f425bc3d6efe74aa4880f06a264744bd84c6 Mon Sep 17 00:00:00 2001 From: Thiago Franco Date: Tue, 8 Jan 2019 17:59:08 -0200 Subject: [PATCH 4/8] =?UTF-8?q?Altera=C3=A7=C3=A3o=20na=20implementa=C3=A7?= =?UTF-8?q?=C3=A3o=20das=20Entities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQL/desafiofullstack.sql | 5 +- api/.htaccess | 16 + api/app/dependencies.php | 78 +- api/app/routes.php | 2 +- api/app/settings.php | 35 +- api/app/src/Action/CursoListar.php | 42 + api/app/src/Action/UsuarioLogar.php | 10 +- .../{HomeAction.php => VerificaToken.php} | 0 api/app/src/Entity/Curso.php | 113 +- api/app/src/Entity/Curso.php~ | 49 + api/app/src/Entity/CursoProfessor.php | 29 +- api/app/src/Entity/CursoProfessor.php~ | 45 + api/app/src/Entity/CursoSala.php | 82 +- api/app/src/Entity/CursoSala.php~ | 45 + api/app/src/Entity/Disciplina.php | 47 +- api/app/src/Entity/Disciplina.php~ | 32 + api/app/src/Entity/Professor.php | 43 +- api/app/src/Entity/Professor.php~ | 32 + api/app/src/Entity/Sala.php | 31 +- api/app/src/Entity/Sala.php~ | 32 + api/app/src/Entity/Usuario.php | 92 +- api/app/src/Entity/Usuario.php~ | 46 + api/app/src/Service/CursoService.php | 38 + api/app/src/Service/UsuarioService.php | 29 +- ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 2485 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 2485 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 2276 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 1071 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 1067 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 2566 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 2566 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 2276 bytes ...d455441444154415d5b315d.doctrinecache.data | Bin 0 -> 1066 bytes api/composer.json | 2 +- api/composer.lock | 953 +- api/index.php | 27 + api/public/.htaccess | 2 +- desafio-fullstack.clpprj | 1692 +- desafio-fullstack_clcs.csprj | 19394 ++++++++++++++++ front-end/assets/js/autenticacao.js | 26 + front-end/assets/js/geral.js | 20 + front-end/footer.php | 5 +- front-end/header.php | 7 +- front-end/login.php | 42 +- front-end/package-lock.json | 5 + front-end/painel/cursos.php | 36 + front-end/painel/footer_painel.php | 2 + front-end/painel/header_painel.php | 24 + 48 files changed, 22046 insertions(+), 1164 deletions(-) create mode 100644 api/.htaccess create mode 100644 api/app/src/Action/CursoListar.php rename api/app/src/Action/{HomeAction.php => VerificaToken.php} (100%) create mode 100644 api/app/src/Entity/Curso.php~ create mode 100644 api/app/src/Entity/CursoProfessor.php~ create mode 100644 api/app/src/Entity/CursoSala.php~ create mode 100644 api/app/src/Entity/Disciplina.php~ create mode 100644 api/app/src/Entity/Professor.php~ create mode 100644 api/app/src/Entity/Sala.php~ create mode 100644 api/app/src/Entity/Usuario.php~ create mode 100644 api/app/src/Service/CursoService.php create mode 100644 api/app/var/doctrine/49/5b4170705c456e746974795c437572736f53616c6124434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/5b/5b5c4170705c456e746974795c437572736f53616c6124434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/68/5b4170705c456e746974795c437572736f24434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/ad/5b4170705c456e746974795c4469736369706c696e6124434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/af/5b4170705c456e746974795c50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/c5/5b4170705c456e746974795c437572736f50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/d9/5b5c4170705c456e746974795c437572736f50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/df/5b5c4170705c456e746974795c437572736f24434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/app/var/doctrine/e8/5b4170705c456e746974795c53616c6124434c4153534d455441444154415d5b315d.doctrinecache.data create mode 100644 api/index.php create mode 100644 desafio-fullstack_clcs.csprj create mode 100644 front-end/assets/js/autenticacao.js create mode 100644 front-end/assets/js/geral.js create mode 100644 front-end/painel/cursos.php create mode 100644 front-end/painel/footer_painel.php create mode 100644 front-end/painel/header_painel.php diff --git a/SQL/desafiofullstack.sql b/SQL/desafiofullstack.sql index b10833762..0dc7872b0 100644 --- a/SQL/desafiofullstack.sql +++ b/SQL/desafiofullstack.sql @@ -1,7 +1,8 @@ /* MySQL - 10.1.21-MariaDB : Database - celsolisboa ********************************************************************* -*/ +*/ + /*!40101 SET NAMES utf8 */; @@ -38,7 +39,7 @@ CREATE TABLE `curso_professor` ( `curso_id` int(11) NOT NULL, `professor_id` int(11) NOT NULL, PRIMARY KEY (`id`), - KEY `aula_id` (`curso_id`), + KEY `curso_id` (`curso_id`), KEY `professor_id` (`professor_id`), CONSTRAINT `curso_professor_ibfk_1` FOREIGN KEY (`curso_id`) REFERENCES `curso` (`id`), CONSTRAINT `curso_professor_ibfk_2` FOREIGN KEY (`professor_id`) REFERENCES `professor` (`id`) diff --git a/api/.htaccess b/api/.htaccess new file mode 100644 index 000000000..889b428aa --- /dev/null +++ b/api/.htaccess @@ -0,0 +1,16 @@ +# For production, put your rewrite rules directly into your VirtualHost +# directive and turn off AllowOverride. + + + RewriteEngine On + + RewriteCond %{REQUEST_FILENAME} -s [OR] + RewriteCond %{REQUEST_FILENAME} -l [OR] + RewriteCond %{REQUEST_FILENAME} -d + RewriteRule ^.*$ - [NC,L] + + + RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ + RewriteRule ^(.*) - [E=BASE:%1] + RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] + \ No newline at end of file diff --git a/api/app/dependencies.php b/api/app/dependencies.php index 7e358f7b7..d7f3f6f1f 100644 --- a/api/app/dependencies.php +++ b/api/app/dependencies.php @@ -15,79 +15,33 @@ // ----------------------------------------------------------------------------- // Service providers // ----------------------------------------------------------------------------- +// Service factory for the ORM +$container['db'] = function ($container) { + $capsule = new \Illuminate\Database\Capsule\Manager; + $capsule->addConnection($container['settings']['db']); -// Twig -$container['view'] = function ($c) { - $settings = $c->get('settings'); - $view = new Slim\Views\Twig($settings['view']['template_path'], $settings['view']['twig']); + $capsule->setAsGlobal(); + $capsule->bootEloquent(); - // Add extensions - $view->addExtension(new Slim\Views\TwigExtension($c->get('router'), $c->get('request')->getUri())); - $view->addExtension(new Twig_Extension_Debug()); - - return $view; -}; - -// Flash messages -$container['flash'] = function ($c) { - return new Slim\Flash\Messages; -}; - -// ----------------------------------------------------------------------------- -// Service factories -// ----------------------------------------------------------------------------- - -// monolog -$container['logger'] = function ($c) { - $settings = $c->get('settings'); - $logger = new Monolog\Logger($settings['logger']['name']); - $logger->pushProcessor(new Monolog\Processor\UidProcessor()); - $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['logger']['path'], Monolog\Logger::DEBUG)); - return $logger; -}; - -$container[EntityManager::class] = function ($c): EntityManager { - $container = $c; - $config = Setup::createAnnotationMetadataConfiguration( - $container['settings']['doctrine']['metadata_dirs'], - $container['settings']['doctrine']['dev_mode'] - ); - - $config->setMetadataDriverImpl( - new AnnotationDriver( - new AnnotationReader, - $container['settings']['doctrine']['metadata_dirs'] - ) - ); - - $config->setMetadataCacheImpl( - new FilesystemCache( - $container['settings']['doctrine']['cache_dir'] - ) - ); - - return EntityManager::create( - $container['settings']['doctrine']['connection'], - $config - ); + return $capsule; }; - + // ----------------------------------------------------------------------------- // Action factories // ----------------------------------------------------------------------------- -$container[AutenticacaoTokenMiddleware::class] = function ($c) { - return new AutenticacaoTokenMiddleware($c->get(EntityManager::class)); -}; +$container[AutenticacaoTokenMiddleware::class] = function ($container) { + return new AutenticacaoTokenMiddleware($container['db']); +}; + -$container[App\Action\HomeAction::class] = function ($c) { - return new App\Action\HomeAction( $c->get(EntityManager::class)); +$container[App\Action\UsuarioLogar::class] = function ($container) { + return new App\Action\UsuarioLogar($container['db']); }; - -$container[App\Action\UsuarioLogar::class] = function ($c) { - return new App\Action\UsuarioLogar($c->get(EntityManager::class)); +$container[App\Action\CursoListar::class] = function ($container) { + return new App\Action\CursoListar($container['db']); }; diff --git a/api/app/routes.php b/api/app/routes.php index 704affa9e..db12f42b5 100644 --- a/api/app/routes.php +++ b/api/app/routes.php @@ -4,4 +4,4 @@ $app->get('/usuario/logar', App\Action\UsuarioLogar::class); -$app->get('/usuario/logar2', function(){})->add( AutenticacaoTokenMiddleware::class ); +$app->get('/curso/listar', App\Action\CursoListar::class)/*->add( AutenticacaoTokenMiddleware::class )*/; diff --git a/api/app/settings.php b/api/app/settings.php index 39cc6f327..a6723b2bd 100644 --- a/api/app/settings.php +++ b/api/app/settings.php @@ -21,28 +21,17 @@ 'path' => __DIR__ . '/../log/app.log', ], - 'doctrine' => [ - 'meta' => [ - 'entity_path' => [ - 'app/src/Entity/' - ], - 'auto_generate_proxies' => true, - 'proxy_dir' => __DIR__.'/../cache/proxies', - 'cache' => null, - ], - // path where the compiled metadata info will be cached - // make sure the path exists and it is writable - 'cache_dir' => __DIR__ . '/var/doctrine', - 'dev_mode' => true, - // you should add any other path containing annotated entity classes - 'metadata_dirs' => [__DIR__ . '/src/Domain'], - 'connection' => [ - 'driver' => 'pdo_mysql', - 'host' => 'localhost', - 'dbname' => 'celsolisboa', - 'user' => 'root', - 'password' => '', - ] - ] + 'db' => [ + 'driver' => 'mysql', + 'host' => 'localhost', + 'database' => 'celsolisboa', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + 'collation' => 'utf8_unicode_ci', + 'prefix' => '', + ] + + ], ]; diff --git a/api/app/src/Action/CursoListar.php b/api/app/src/Action/CursoListar.php new file mode 100644 index 000000000..a08d1d8f0 --- /dev/null +++ b/api/app/src/Action/CursoListar.php @@ -0,0 +1,42 @@ +toArray(); + $listaCursos['curso']['professores'] = $curso->professores->toArray(); + $listaCursos['curso']['salas'] = $curso->salas->toArray(); + } + + $erro = 0; + $msg = "Lista de Cursos"; + $dados = $listaCursos; + + }catch( \Exception $e ){ + $erro = 1; + $msg = $e->getMessage(); + $dados = []; + } + + $status = $response->getStatusCode(); + + return FuncoesHelper::formatarSaidaJson($status, $msg, $dados, $erro); + } +} diff --git a/api/app/src/Action/UsuarioLogar.php b/api/app/src/Action/UsuarioLogar.php index 3bce8eb78..9f4a727fd 100644 --- a/api/app/src/Action/UsuarioLogar.php +++ b/api/app/src/Action/UsuarioLogar.php @@ -10,12 +10,8 @@ class UsuarioLogar { - private $em; - - public function __construct(EntityManager $em) - { - $this->em = $em; - } + + public function __invoke(Request $request, Response $response, $args) { @@ -27,7 +23,7 @@ public function __invoke(Request $request, Response $response, $args) $usuario->setEmail($email); $usuario->setSenha($senha); - $us = new \App\Service\UsuarioService( $usuario, $this->em ); + $us = new \App\Service\UsuarioService( $usuario ); $token = $us->logar(); diff --git a/api/app/src/Action/HomeAction.php b/api/app/src/Action/VerificaToken.php similarity index 100% rename from api/app/src/Action/HomeAction.php rename to api/app/src/Action/VerificaToken.php diff --git a/api/app/src/Entity/Curso.php b/api/app/src/Entity/Curso.php index 35bbe8862..7c276c254 100644 --- a/api/app/src/Entity/Curso.php +++ b/api/app/src/Entity/Curso.php @@ -2,67 +2,30 @@ namespace App\Entity; -use Doctrine\ORM\Mapping as ORM; - +use Illuminate\Database\Eloquent\Model as Model; /** * Curso * * @ORM\Table(name="curso", indexes={@ORM\Index(name="disciplina_id", columns={"disciplina_id"})}) * @ORM\Entity */ -class Curso +class Curso extends Model { - /** - * @var int - * - * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false) - * @ORM\Id - * @ORM\GeneratedValue(strategy="IDENTITY") - */ - private $id; - - /** - * @var \DateTime - * - * @ORM\Column(name="horario_inicio", type="time", precision=0, scale=0, nullable=false, unique=false) - */ - private $horarioInicio; - - /** - * @var \DateTime - * - * @ORM\Column(name="horario_fim", type="time", precision=0, scale=0, nullable=false, unique=false) - */ - private $horarioFim; - - /** - * @var \App\Entity\Disciplina - * - * @ORM\ManyToOne(targetEntity="App\Entity\Disciplina") - * @ORM\JoinColumns({ - * @ORM\JoinColumn(name="disciplina_id", referencedColumnName="id", nullable=true) - * }) - */ + protected $table = "curso"; + + private $id; + private $horarioInicio; + private $horarioFim; private $disciplina; - - - /** - * Get id. - * - * @return int - */ + private $professores; + + public function getId() { return $this->id; } - /** - * Set horarioInicio. - * - * @param \DateTime $horarioInicio - * - * @return Curso - */ + public function setHorarioInicio($horarioInicio) { $this->horarioInicio = $horarioInicio; @@ -70,23 +33,13 @@ public function setHorarioInicio($horarioInicio) return $this; } - /** - * Get horarioInicio. - * - * @return \DateTime - */ + public function getHorarioInicio() { return $this->horarioInicio; } - /** - * Set horarioFim. - * - * @param \DateTime $horarioFim - * - * @return Curso - */ + public function setHorarioFim($horarioFim) { $this->horarioFim = $horarioFim; @@ -94,37 +47,41 @@ public function setHorarioFim($horarioFim) return $this; } - /** - * Get horarioFim. - * - * @return \DateTime - */ + public function getHorarioFim() { return $this->horarioFim; } - /** - * Set disciplina. - * - * @param \App\Entity\Disciplina|null $disciplina - * - * @return Curso - */ + public function setDisciplina(\App\Entity\Disciplina $disciplina = null) { $this->disciplina = $disciplina; return $this; } - - /** - * Get disciplina. - * - * @return \App\Entity\Disciplina|null - */ + public function getDisciplina() { return $this->disciplina; } + + public function setProfessores($professores){ + $this->professores = $professores; + } + + public function getProfessores() + { + return $this->professores; + } + + public function professores() + { + return $this->belongsToMany('\App\Entity\Professor'); + } + + public function salas() + { + return $this->belongsToMany('\App\Entity\Sala'); + } } diff --git a/api/app/src/Entity/Curso.php~ b/api/app/src/Entity/Curso.php~ new file mode 100644 index 000000000..f778bf777 --- /dev/null +++ b/api/app/src/Entity/Curso.php~ @@ -0,0 +1,49 @@ +id; } - - /** - * Set curso. - * - * @param \App\Entity\Curso|null $curso - * - * @return CursoSala - */ + public function setCurso(\App\Entity\Curso $curso = null) { $this->curso = $curso; return $this; } - - /** - * Get curso. - * - * @return \App\Entity\Curso|null - */ + public function getCurso() { return $this->curso; } - - /** - * Set sala. - * - * @param \App\Entity\Sala|null $sala - * - * @return CursoSala - */ + public function setSala(\App\Entity\Sala $sala = null) { $this->sala = $sala; return $this; } - - /** - * Get sala. - * - * @return \App\Entity\Sala|null - */ + public function getSala() { return $this->sala; diff --git a/api/app/src/Entity/CursoSala.php~ b/api/app/src/Entity/CursoSala.php~ new file mode 100644 index 000000000..ab8f3c451 --- /dev/null +++ b/api/app/src/Entity/CursoSala.php~ @@ -0,0 +1,45 @@ +id; } - /** - * Set nome. - * - * @param string $nome - * - * @return Disciplina - */ + public function setNome($nome) { $this->nome = $nome; @@ -53,11 +26,7 @@ public function setNome($nome) return $this; } - /** - * Get nome. - * - * @return string - */ + public function getNome() { return $this->nome; diff --git a/api/app/src/Entity/Disciplina.php~ b/api/app/src/Entity/Disciplina.php~ new file mode 100644 index 000000000..b33914964 --- /dev/null +++ b/api/app/src/Entity/Disciplina.php~ @@ -0,0 +1,32 @@ +id; @@ -62,4 +41,10 @@ public function getNome() { return $this->nome; } + + + public function cursos() + { + return $this->belongsToMany('\App\Entity\Curso'); + } } diff --git a/api/app/src/Entity/Professor.php~ b/api/app/src/Entity/Professor.php~ new file mode 100644 index 000000000..e8ad9eae9 --- /dev/null +++ b/api/app/src/Entity/Professor.php~ @@ -0,0 +1,32 @@ +numero; } + + + public function cursos() + { + return $this->belongsToMany('\App\Entity\Curso'); + } } diff --git a/api/app/src/Entity/Sala.php~ b/api/app/src/Entity/Sala.php~ new file mode 100644 index 000000000..526a7f113 --- /dev/null +++ b/api/app/src/Entity/Sala.php~ @@ -0,0 +1,32 @@ +id; } - /** - * Set email. - * - * @param string $email - * - * @return Usuario - */ + public function setEmail($email) { $this->email = $email; return $this; } - - /** - * Get email. - * - * @return string - */ + public function getEmail() { return $this->email; } - /** - * Set senha. - * - * @param string $senha - * - * @return Usuario - */ + public function setSenha($senha) { $this->senha = $senha; return $this; } - - /** - * Get senha. - * - * @return string - */ + public function getSenha() { return $this->senha; } - - /** - * Set token. - * - * @param string|null $token - * - * @return Usuario - */ + public function setToken($token = null) { $this->token = $token; return $this; } - - /** - * Get token. - * - * @return string|null - */ + public function getToken() { return $this->token; diff --git a/api/app/src/Entity/Usuario.php~ b/api/app/src/Entity/Usuario.php~ new file mode 100644 index 000000000..a1c560966 --- /dev/null +++ b/api/app/src/Entity/Usuario.php~ @@ -0,0 +1,46 @@ +curso = $curso; + } + + public function getProfessores( Curso $curso ) : Curso{ + //$lista = $this->em->getRepository('\App\Entity\CursoProfessor')->findBy( array('curso' => $curso->getId() ) ); + + $lista = CursoProfessor::where('curso_id' ,$curso->getId())->get(); + $curso->setProfessores( $lista ); + return $curso; + } + + public function getSalas( Curso $curso ) : Curso{ + //$lista = $this->em->getRepository('\App\Entity\CursoSala')->findBy( array('curso' => $curso->getId() ) ); + $lista = CursoSala::where('curso_id' ,$curso->getId())->get(); + $curso->setSalas($lista); + return $curso; + } + + public function listar($id = null) { + if( $id ){ + return Curso::find($id); + }else{ + return Curso::All(); + + } + } + +} \ No newline at end of file diff --git a/api/app/src/Service/UsuarioService.php b/api/app/src/Service/UsuarioService.php index 693ce8190..94ffe9c4c 100644 --- a/api/app/src/Service/UsuarioService.php +++ b/api/app/src/Service/UsuarioService.php @@ -1,21 +1,18 @@ usuario = $usuario; - $this->em = $em; + public function __construct( Usuario $usuario ){ + $this->usuario = $usuario; } private static function gerarToken(Usuario $usuario) : string{ - $id = $usuario->getId(); + $id = $usuario->id; $data = date("YmdHis"); if( $id == null ){ @@ -30,10 +27,10 @@ public function verificarToken() : bool{ $email = $this->usuario->getEmail(); $token = $this->usuario->getToken(); - $verificado = $this->em->getRepository('\App\Entity\Usuario')->findOneBy(array('email' => $email, 'token'=> $token)); + $verificado = Usuario::where(array('email' => $email, 'token'=> $token))->count(); $retorno = false; - if( $verificado ){ + if( $verificado > 0 ){ $retorno = true; }else{ throw new \Exception("Requisição não autorizada! Token Inválido!"); @@ -48,16 +45,18 @@ public function logar() : string{ $email = $this->usuario->getEmail(); $senha = md5( $this->usuario->getSenha() ); - $usuario = $this->em->getRepository('\App\Entity\Usuario')->findOneBy(array('email' => $email, 'senha'=> $senha)); + $usuario = Usuario::where(array('email' => $email, 'senha'=> $senha))->first(); + + $retorno = ""; - if( $usuario ){ - $token = self::gerarToken($usuario); + if( $usuario ){ + $token = self::gerarToken($usuario); + //gravar token na tabela $usuario->setToken($token); - $this->em->merge($usuario); - $this->em->flush(); + $usuario->save(); $retorno = $usuario->getToken(); }else{ throw new \Exception("Os dados de email e/ou senha são inválidos!"); diff --git a/api/app/var/doctrine/49/5b4170705c456e746974795c437572736f53616c6124434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/49/5b4170705c456e746974795c437572736f53616c6124434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..c409f26d9802152918b3322be110345e486adf7a GIT binary patch literal 2485 zcmeHJ%We}f6lIOXPs|r|(o(=#K?0~kX;GVHq{^AONsT7^%lFKTH@+dNTN)>sCE+NRFRRmvCS}Cm< zLOdCrh|JQ8Ea`&E7*7-NNM!7Dzjxvt^rb6g34>CchzH1Ws49I=)=~LsmmERIOS>lj zS$pLnjm|&T^&(0ZlbEKEkQMpjE*mQ`!aZR2yBZGSCva_0k)dtnu6}70=|*uROTlP! z_;hA#3+j9_tV5qSvXUVl)JnNYgmXNh2Ef)REt^rh*vrk5UR4%!IS zWACw2b8{22_ZRQU-GMQ#{i(=|t?#4`36xa?g%bu968+R1v=?CI1!I5?WV`?F6rd4$ z9oaM^r2mH?wBL~-7}ov;GcZ)_f4z7D4wRo70GwL0Yl??B?98yDmG-nIo7e{Hnkj)abJE7l30ZZi8NAG|jZWkUWbg;mWs}8R2@dFeDYK=*>+%o(zn&hOGUrCdd-XQgO yGND}uPo|4<5wq@h-9@etcmPOWJ$w0;BRpmB^oS8%jyY6#SvPLy=|ylh-v0sAj41s8 literal 0 HcmV?d00001 diff --git a/api/app/var/doctrine/5b/5b5c4170705c456e746974795c437572736f53616c6124434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/5b/5b5c4170705c456e746974795c437572736f53616c6124434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..c409f26d9802152918b3322be110345e486adf7a GIT binary patch literal 2485 zcmeHJ%We}f6lIOXPs|r|(o(=#K?0~kX;GVHq{^AONsT7^%lFKTH@+dNTN)>sCE+NRFRRmvCS}Cm< zLOdCrh|JQ8Ea`&E7*7-NNM!7Dzjxvt^rb6g34>CchzH1Ws49I=)=~LsmmERIOS>lj zS$pLnjm|&T^&(0ZlbEKEkQMpjE*mQ`!aZR2yBZGSCva_0k)dtnu6}70=|*uROTlP! z_;hA#3+j9_tV5qSvXUVl)JnNYgmXNh2Ef)REt^rh*vrk5UR4%!IS zWACw2b8{22_ZRQU-GMQ#{i(=|t?#4`36xa?g%bu968+R1v=?CI1!I5?WV`?F6rd4$ z9oaM^r2mH?wBL~-7}ov;GcZ)_f4z7D4wRo70GwL0Yl??B?98yDmG-nIo7e{Hnkj)abJE7l30ZZi8NAG|jZWkUWbg;mWs}8R2@dFeDYK=*>+%o(zn&hOGUrCdd-XQgO yGND}uPo|4<5wq@h-9@etcmPOWJ$w0;BRpmB^oS8%jyY6#SvPLy=|ylh-v0sAj41s8 literal 0 HcmV?d00001 diff --git a/api/app/var/doctrine/68/5b4170705c456e746974795c437572736f24434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/68/5b4170705c456e746974795c437572736f24434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..3a9893d060221532d699cfce1523bf13545abb5e GIT binary patch literal 2276 zcmcgu+iu%14DIuP{e-`uNxN=Up0;EiiXrXLY*CL16oT)7C^pdgx{OsvL(o@+l%VucH)zT!7tj^*3 zN?agMldLbgQ69MvmscuV8UDS3{~4^D`UHbjS?XCCM7=1oW<(`J={ z0xG`rkzq}9s>$S3#H>>GeU(Yfmlvl#!d|;v7jUT6x!OP`;MhDv}={ ztMTk1b*c}@pQ~ybCDT!-Zccqb#mMJR*??6a%7E|J6{5s{0d9##?FL|X|Hq(rKUvb5 zDS_NWU}sl#PTRnOx)XS~s+|p8K~Q$Xi06Tp_BptbVv0%o^aIe?`Bdngw+EWnOF&Y-wx!j?}riF}DzC+v?n zMMEW@*u07T8ESbXpCS#e3}$zdyTLU^cXK$uZAMa=K+7-+Y&WP7F3 zSP7d$EJusl!6iRAuB|r%C1aC%m3k_m_L_PM(Vkjod&Hk_4(EV+4Vd;Q{Fn7diV+8D zufcJYQr!Z_4{Iio(MMX&s3@@6<;=yQ>um3Wu%(e4s2na^BwxcYc#zf2?zUAM+GS-O z%UOvl3@NwQ>cqAMy+y@UI)_ETSJ8yx4__GYyz_-|TTEl+{CcYxzaK7< c-Pxdv=mWM`X)FS}-^Ltxi6x4n*WXOlKMX+_nBo+4E@q;Tw8)``8F zuu;{TR`hfRpd!`!{y4b39&El?%fmG(HmY8Hpsw?Sm9zO%2sWf1+4g41y`<1|BZLr= zVN&K--gFB2>^+LQWIH15`!{r+dW$(|Wu84;$!}50Yul ztdbU^VUPU7BDTrF?^b8cXNeA-m^1m8=uyxP2WyNqdHTxyOoIh-Hr6FZ3FN5>8cUE< zo1tKh>En1m!*2Z$eB?9-D0(jg1MJ5Tnopoir{<1h%b{ndrO^mla53l>Z;Q2O@DxQV zqmh-AcqeLUgjw)OZ%}#kK9y?o(Ed$>tP-2g*4a@f56f6qEXRvwy*Ev9n@-O_=?wHB f(W_U%SJ7hRU2BV^y$q_XV0S6|HSZGBb$$K`J;_(^ literal 0 HcmV?d00001 diff --git a/api/app/var/doctrine/af/5b4170705c456e746974795c50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/af/5b4170705c456e746974795c50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..9ec4785ee51fc9eb6fa6817a8faa4d2612758dba GIT binary patch literal 1067 zcmbtTL2lbH5X`wiKfxDRcHB0rQ;`%!4t9#7M_p)Xtq_n%R-}O%f&boFQf8bMZGiSB zk;~bco!Pf<9%yw<>dv)sGM1Z%ubXD0y*IXRZU-I0hNJFu)QYMVJq4<6Na5JEMn~i9 zTpLuaX+cjX6jY>IHylR0)gz~ir951cGM%a~KG4^?k>#v>3c!lg-tf>}VqZdNx)DGS zNoCUJSKN5?>Fhn4+Q>amQn4l#T0P*#&;tMONDXZJ_^9e_{ykXp{eb&jy8i%zhhfk= zd6JLN)KA=+0PSa(YH_Lf1(jL!j;b2UipoDIDEF!KtN|>8nA5)^!O(KO{tp?LmGk0h z@~n~(V_NS_J!rR>&?-USnjfx`D37yy3szWD^mcx=8*ZqG<|iVA#|vfy=#r&-x^?d(L% z$w)-9yEAf1NkNmrpzY*b%&kgd|3X04$aJ6C@}#41!lGg^UM%W;*JP#f_*^Jc0U5Y? d^=k1|V8q?FoEdE;q_Tefx$U>KM~1HJ(@#l}R}KIG literal 0 HcmV?d00001 diff --git a/api/app/var/doctrine/c5/5b4170705c456e746974795c437572736f50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/c5/5b4170705c456e746974795c437572736f50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..316c5cecc99b303b352667256ddca8d9c4fd89b3 GIT binary patch literal 2566 zcmeHJ-EPw`6y7xwFOer`x-r1Lf)>z(x=mXzD@|^4+8L#Gh@C+-_1*c7ojA?fZS)d} zyX5%%|9$7}n=5g8CX$KCT%|P4uWqLEsVqySSMzZpt(}sSxpXoS>8W_MBK;^5kWHqf zQ${zuHW^7V$)i9qVS|Nkc^&CK@Ox#5K>5G-qwVcN-GW_ zybK2-sc15TH=PwVkeBy4lLwc62Zqt50K^>}LYx-v^b2`ldu7?d4{m~Loo9=twIC?_jET_ZeYU7PIQ+YK!%vhY6? zB1HgEZc0c(eAzWNL1%H$L1+k};QY+YeB!>-rr#F6#J;(j7HI2Y1y`@@qpxkdwGFi= z+3O{gkgbPu&CIP&;Q{N7xhKlF0Zv6?s`6fHpFmlJpzwm;FS~3%HxYd<=sRL6xaiTu zKRX&+znwPibtrn~|9Je>cpU15BWC1~_&)9EX*sCkxsl;%LidLq&HJ|-;W&O>NUX(U z%PtH7Krql)L0H)m6Nta35ENC#RqHpq(vDW-*CLt@Tb_}G!N{XcL3-t|uNX&O10NRg zQ%#w&9%F(UhKepW-oMe6=7U!`0}XRV*nBw&@RimJ%5&frLw3m74mRZk41zL5h7}a> zHCpC+BIC+lM7FV6m&Pgv&9I!2rWS=?1r&tMytb4XwLp|K4W8~W5JU}u|US&S9gxd(WOmORR R#61NotJdtSIWf*g+dtqIOQZk* literal 0 HcmV?d00001 diff --git a/api/app/var/doctrine/d9/5b5c4170705c456e746974795c437572736f50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/d9/5b5c4170705c456e746974795c437572736f50726f666573736f7224434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..316c5cecc99b303b352667256ddca8d9c4fd89b3 GIT binary patch literal 2566 zcmeHJ-EPw`6y7xwFOer`x-r1Lf)>z(x=mXzD@|^4+8L#Gh@C+-_1*c7ojA?fZS)d} zyX5%%|9$7}n=5g8CX$KCT%|P4uWqLEsVqySSMzZpt(}sSxpXoS>8W_MBK;^5kWHqf zQ${zuHW^7V$)i9qVS|Nkc^&CK@Ox#5K>5G-qwVcN-GW_ zybK2-sc15TH=PwVkeBy4lLwc62Zqt50K^>}LYx-v^b2`ldu7?d4{m~Loo9=twIC?_jET_ZeYU7PIQ+YK!%vhY6? zB1HgEZc0c(eAzWNL1%H$L1+k};QY+YeB!>-rr#F6#J;(j7HI2Y1y`@@qpxkdwGFi= z+3O{gkgbPu&CIP&;Q{N7xhKlF0Zv6?s`6fHpFmlJpzwm;FS~3%HxYd<=sRL6xaiTu zKRX&+znwPibtrn~|9Je>cpU15BWC1~_&)9EX*sCkxsl;%LidLq&HJ|-;W&O>NUX(U z%PtH7Krql)L0H)m6Nta35ENC#RqHpq(vDW-*CLt@Tb_}G!N{XcL3-t|uNX&O10NRg zQ%#w&9%F(UhKepW-oMe6=7U!`0}XRV*nBw&@RimJ%5&frLw3m74mRZk41zL5h7}a> zHCpC+BIC+lM7FV6m&Pgv&9I!2rWS=?1r&tMytb4XwLp|K4W8~W5JU}u|US&S9gxd(WOmORR R#61NotJdtSIWf*g+dtqIOQZk* literal 0 HcmV?d00001 diff --git a/api/app/var/doctrine/df/5b5c4170705c456e746974795c437572736f24434c4153534d455441444154415d5b315d.doctrinecache.data b/api/app/var/doctrine/df/5b5c4170705c456e746974795c437572736f24434c4153534d455441444154415d5b315d.doctrinecache.data new file mode 100644 index 0000000000000000000000000000000000000000..3a9893d060221532d699cfce1523bf13545abb5e GIT binary patch literal 2276 zcmcgu+iu%14DIuP{e-`uNxN=Up0;EiiXrXLY*CL16oT)7C^pdgx{OsvL(o@+l%VucH)zT!7tj^*3 zN?agMldLbgQ69MvmscuV8UDS3{~4^D`UHbjS?XCCM7=1oW<(`J={ z0xG`rkzq}9s>$S3#H>>GeU(Yfmlvl#!d|;v7jUT6x!OP`;MhDv}={ ztMTk1b*c}@pQ~ybCDT!-Zccqb#mMJR*??6a%7E|J6{5s{0d9##?FL|X|Hq(rKUvb5 zDS_NWU}sl#PTRnOx)XS~s+|p8K~Q$Xi06Tp_BptbVv0%o^aIe?`Bdngw+EWnOF&Y-wx!j?}riF}DzC+v?n zMMEW@*u07T8ESbXpCS#e3}$zdyTLU^cXK$uZAMa=K+7-+Y&WP7F3 zSP7d$EJusl!6iRAuB|r%C1aC%m3k_m_L_PM(Vkjod&Hk_4(EV+4Vd;Q{Fn7diV+8D zufcJYQr!Z_4{Iio(MMX&s3@@6<;=yQ>um3Wu%(e4s2na^BwxcYc#zf2?zUAM+GS-O z%UOvl3@NwQ>cqAMy+y@UI)_ETSJ8yx4__GYyz_-|TTEl+{CcYxzaK7< c-Pxdv)sGM1ai@0(_$y*IXRZU-I0hNJFu)QYMVJqN08Na5PGMn~i9 zj18*Rw4moB02Qg$4g1k<^~mXADL*brnNHQk$0t&DKl0?{wm3+U6{#n~Ls!->%V@fh zqG%?;gzBO;G{u8Ycb`FQBlkQBVofTvdccdJMdlsY_VJghxB0lY=Jy`&yY&7=nj8kb zlV9=`Nd3gE3DAEkQ!Pr>7p=^~cU09-R_J^~LxBiX=)iptllpgL7+S8^{~-nQa$dYm z-c>SY4DHGMVc0jTcrCZ+`X~ls9%pC%H3XpLamQW9UCLrk(;PDpn2v2Upncmc{7&;m@n ddKY{Z7)iG+=VrE&PuaZwMEf(XkfH1P_!lwzR;mC1 literal 0 HcmV?d00001 diff --git a/api/composer.json b/api/composer.json index 622e821f6..d6953808a 100644 --- a/api/composer.json +++ b/api/composer.json @@ -6,6 +6,6 @@ }, "require": { "slim/slim": "^3.0", - "doctrine/orm": "^2.6" + "illuminate/database": "^5.1" } } diff --git a/api/composer.lock b/api/composer.lock index 9c299cccc..34fa0989d 100644 --- a/api/composer.lock +++ b/api/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "97d88edb930aa33f313139a05858c9b7", + "content-hash": "5efd6fad78392418761bccb3976f5c49", "packages": [ { "name": "container-interop/container-interop", @@ -37,453 +37,6 @@ "homepage": "https://github.com/container-interop/container-interop", "time": "2017-02-14T19:40:03+00:00" }, - { - "name": "doctrine/annotations", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", - "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "php": "^7.1" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2017-12-06T07:11:42+00:00" - }, - { - "name": "doctrine/cache", - "version": "v1.8.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57", - "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57", - "shasum": "" - }, - "require": { - "php": "~7.1" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^4.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "cache", - "caching" - ], - "time": "2018-08-21T18:01:43+00:00" - }, - { - "name": "doctrine/collections", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf", - "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "~0.1@dev", - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Collections\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Collections Abstraction library", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "array", - "collections", - "iterator" - ], - "time": "2017-07-22T10:37:32+00:00" - }, - { - "name": "doctrine/common", - "version": "v2.10.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "30e33f60f64deec87df728c02b107f82cdafad9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d", - "reference": "30e33f60f64deec87df728c02b107f82cdafad9d", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/inflector": "^1.0", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.1", - "doctrine/reflection": "^1.0", - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpunit/phpunit": "^6.3", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.10.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "time": "2018-11-21T01:24:55+00:00" - }, - { - "name": "doctrine/dbal", - "version": "v2.9.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9", - "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.0", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "jetbrains/phpstorm-stubs": "^2018.1.2", - "phpstan/phpstan": "^0.10.1", - "phpunit/phpunit": "^7.4", - "symfony/console": "^2.0.5|^3.0|^4.0", - "symfony/phpunit-bridge": "^3.4.5|^4.0.5" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.9.x-dev", - "dev-develop": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "dbal", - "mysql", - "persistence", - "pgsql", - "php", - "queryobject" - ], - "time": "2018-12-31T03:27:51+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3", - "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^4.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Doctrine Event Manager component", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "eventdispatcher", - "eventmanager" - ], - "time": "2018-06-11T11:59:03+00:00" - }, { "name": "doctrine/inflector", "version": "v1.3.0", @@ -552,38 +105,34 @@ "time": "2018-01-09T20:05:19+00:00" }, { - "name": "doctrine/instantiator", - "version": "1.1.0", + "name": "illuminate/container", + "version": "v5.7.20", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + "url": "https://github.com/illuminate/container.git", + "reference": "53a0991e918efaace42cde526a04fdb832128a03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "url": "https://api.github.com/repos/illuminate/container/zipball/53a0991e918efaace42cde526a04fdb832128a03", + "reference": "53a0991e918efaace42cde526a04fdb832128a03", "shasum": "" }, "require": { - "php": "^7.1" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "^6.2.3", - "squizlabs/php_codesniffer": "^3.0.2" + "illuminate/contracts": "5.7.*", + "illuminate/support": "5.7.*", + "php": "^7.1.3", + "psr/container": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "5.7-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "Illuminate\\Container\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -592,45 +141,42 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2017-07-22T11:58:36+00:00" + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "time": "2018-12-18T14:00:02+00:00" }, { - "name": "doctrine/lexer", - "version": "v1.0.1", + "name": "illuminate/contracts", + "version": "v5.7.20", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + "url": "https://github.com/illuminate/contracts.git", + "reference": "758927e5e925c1d442a1faaa1356675ceba0194c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/758927e5e925c1d442a1faaa1356675ceba0194c", + "reference": "758927e5e925c1d442a1faaa1356675ceba0194c", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.1.3", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "5.7-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" + "psr-4": { + "Illuminate\\Contracts\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -639,72 +185,51 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "lexer", - "parser" - ], - "time": "2014-09-09T13:34:57+00:00" + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "time": "2018-11-15T13:49:08+00:00" }, { - "name": "doctrine/orm", - "version": "v2.6.3", + "name": "illuminate/database", + "version": "v5.7.20", "source": { "type": "git", - "url": "https://github.com/doctrine/orm.git", - "reference": "434820973cadf2da2d66e7184be370084cc32ca8" + "url": "https://github.com/illuminate/database.git", + "reference": "784247326e93c4db6a70a635d01399a8a28e308f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8", - "reference": "434820973cadf2da2d66e7184be370084cc32ca8", + "url": "https://api.github.com/repos/illuminate/database/zipball/784247326e93c4db6a70a635d01399a8a28e308f", + "reference": "784247326e93c4db6a70a635d01399a8a28e308f", "shasum": "" }, "require": { - "doctrine/annotations": "~1.5", - "doctrine/cache": "~1.6", - "doctrine/collections": "^1.4", - "doctrine/common": "^2.7.1", - "doctrine/dbal": "^2.6", - "doctrine/instantiator": "~1.1", - "ext-pdo": "*", - "php": "^7.1", - "symfony/console": "~3.0|~4.0" - }, - "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpunit/phpunit": "^6.5", - "squizlabs/php_codesniffer": "^3.2", - "symfony/yaml": "~3.4|~4.0" + "illuminate/container": "5.7.*", + "illuminate/contracts": "5.7.*", + "illuminate/support": "5.7.*", + "php": "^7.1.3" }, "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", + "illuminate/console": "Required to use the database commands (5.7.*).", + "illuminate/events": "Required to use the observers with Eloquent (5.7.*).", + "illuminate/filesystem": "Required to use the migrations (5.7.*).", + "illuminate/pagination": "Required to paginate the result set (5.7.*)." }, - "bin": [ - "bin/doctrine" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6.x-dev" + "dev-master": "5.7-dev" } }, "autoload": { "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" + "Illuminate\\Database\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -713,74 +238,64 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "http://www.doctrine-project.org", + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", "keywords": [ "database", - "orm" + "laravel", + "orm", + "sql" ], - "time": "2018-11-20T23:46:46+00:00" + "time": "2019-01-06T17:57:30+00:00" }, { - "name": "doctrine/persistence", - "version": "v1.1.0", + "name": "illuminate/support", + "version": "v5.7.20", "source": { "type": "git", - "url": "https://github.com/doctrine/persistence.git", - "reference": "c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38" + "url": "https://github.com/illuminate/support.git", + "reference": "ea3f30dd824bba52bcff4290dc7431b0ffb478e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38", - "reference": "c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38", + "url": "https://api.github.com/repos/illuminate/support/zipball/ea3f30dd824bba52bcff4290dc7431b0ffb478e1", + "reference": "ea3f30dd824bba52bcff4290dc7431b0ffb478e1", "shasum": "" }, "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.0", - "php": "^7.1" + "doctrine/inflector": "^1.1", + "ext-mbstring": "*", + "illuminate/contracts": "5.7.*", + "nesbot/carbon": "^1.26.3", + "php": "^7.1.3" }, "conflict": { - "doctrine/common": "<2.10@dev" + "tightenco/collect": "<5.5.33" }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "phpstan/phpstan": "^0.8", - "phpunit/phpunit": "^7.0" + "suggest": { + "illuminate/filesystem": "Required to use the composer class (5.7.*).", + "moontoast/math": "Required to use ordered UUIDs (^1.1).", + "ramsey/uuid": "Required to use Str::uuid() (^3.7).", + "symfony/process": "Required to use the composer class (^4.1).", + "symfony/var-dumper": "Required to use the dd function (^4.1)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "5.7-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -788,77 +303,50 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://doctrine-project.org/projects/persistence.html", - "keywords": [ - "mapper", - "object", - "odm", - "orm", - "persistence" - ], - "time": "2018-11-21T00:33:13+00:00" + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "time": "2019-01-07T13:39:07+00:00" }, { - "name": "doctrine/reflection", - "version": "v1.0.0", + "name": "nesbot/carbon", + "version": "1.36.2", "source": { "type": "git", - "url": "https://github.com/doctrine/reflection.git", - "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", - "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9", + "reference": "cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9", "shasum": "" }, "require": { - "doctrine/annotations": "^1.0", - "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=5.3.9", + "symfony/translation": "~2.6 || ~3.0 || ~4.0" }, "require-dev": { - "doctrine/coding-standard": "^4.0", - "doctrine/common": "^2.8", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-phpunit": "^0.9.4", - "phpunit/phpunit": "^7.0", - "squizlabs/php_codesniffer": "^3.0" + "phpunit/phpunit": "^4.8.35 || ^5.7" + }, + "suggest": { + "friendsofphp/php-cs-fixer": "Needed for the `composer phpcs` command. Allow to automatically fix code style.", + "phpstan/phpstan": "Needed for the `composer phpstan` command. Allow to detect potential errors." }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] } }, "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" + "": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -867,36 +355,19 @@ ], "authors": [ { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" } ], - "description": "Doctrine Reflection component", - "homepage": "https://www.doctrine-project.org/projects/reflection.html", + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", "keywords": [ - "reflection" + "date", + "datetime", + "time" ], - "time": "2018-06-14T14:45:07+00:00" + "time": "2018-12-28T10:07:33+00:00" }, { "name": "nikic/fast-route", @@ -1093,6 +564,54 @@ ], "time": "2016-08-06T14:39:51+00:00" }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, { "name": "slim/slim", "version": "3.11.0", @@ -1164,75 +683,6 @@ ], "time": "2018-09-16T10:54:21+00:00" }, - { - "name": "symfony/console", - "version": "v4.2.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", - "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/contracts": "^1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.4|~4.0" - }, - "suggest": { - "psr/log-implementation": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2019-01-04T15:13:53+00:00" - }, { "name": "symfony/contracts", "version": "v1.0.2", @@ -1359,6 +809,79 @@ "shim" ], "time": "2018-09-21T13:07:52+00:00" + }, + { + "name": "symfony/translation", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "939fb792d73f2ce80e6ae9019d205fc480f1c9a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/939fb792d73f2ce80e6ae9019d205fc480f1c9a0", + "reference": "939fb792d73f2ce80e6ae9019d205fc480f1c9a0", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "symfony/translation-contracts-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/intl": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2019-01-03T09:07:35+00:00" } ], "packages-dev": [], diff --git a/api/index.php b/api/index.php new file mode 100644 index 000000000..91cd5fca4 --- /dev/null +++ b/api/index.php @@ -0,0 +1,27 @@ +run(); diff --git a/api/public/.htaccess b/api/public/.htaccess index 00715327a..889b428aa 100644 --- a/api/public/.htaccess +++ b/api/public/.htaccess @@ -13,4 +13,4 @@ RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] - + \ No newline at end of file diff --git a/desafio-fullstack.clpprj b/desafio-fullstack.clpprj index d08b530f9..d80758f02 100644 --- a/desafio-fullstack.clpprj +++ b/desafio-fullstack.clpprj @@ -1,3 +1,1693 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/desafio-fullstack_clcs.csprj b/desafio-fullstack_clcs.csprj new file mode 100644 index 000000000..8fd344df3 --- /dev/null +++ b/desafio-fullstack_clcs.csprj @@ -0,0 +1,19394 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/front-end/assets/js/autenticacao.js b/front-end/assets/js/autenticacao.js new file mode 100644 index 000000000..4373e2cc1 --- /dev/null +++ b/front-end/assets/js/autenticacao.js @@ -0,0 +1,26 @@ +$(document).ready( function(){ + /* + $.ajax({ + accepts: "application/json", + contentType: 'application/json; charset=UTF-8', + dataType: 'json', + headers :{ "email": localStorage.getItem('email'), "token": localStorage.getItem('token') }, + data:{}, + method: 'GET', + url: localStorage.getItem("base_url") + "/api/verificaToken", + beforeSend: function(){ + + }, + success: function(resposta){ + + if( resposta.status == 'erro' ){ + alert( resposta.msg + " - Arquivo gerencia-rotas.js" ); + //location.href = localStorage.getItem('base_url') + "/admin/erro" + } + }, + error: function(resposta) { + //location.href = localStorage.getItem('base_url') + "/erro" + } + }); + */ +}); \ No newline at end of file diff --git a/front-end/assets/js/geral.js b/front-end/assets/js/geral.js new file mode 100644 index 000000000..9956a2bad --- /dev/null +++ b/front-end/assets/js/geral.js @@ -0,0 +1,20 @@ + +//gera modal +function gera_modal(titulo, texto, classe){ + var html = ""; + + $(html).modal(); + +} \ No newline at end of file diff --git a/front-end/footer.php b/front-end/footer.php index 15c5adc7f..4d4a7e528 100644 --- a/front-end/footer.php +++ b/front-end/footer.php @@ -1,3 +1,2 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/front-end/header.php b/front-end/header.php index 60603c48f..23fe2446f 100644 --- a/front-end/header.php +++ b/front-end/header.php @@ -4,6 +4,9 @@ Desafio FullStack - + + + - \ No newline at end of file + + \ No newline at end of file diff --git a/front-end/login.php b/front-end/login.php index 4c1606b26..cdd300052 100644 --- a/front-end/login.php +++ b/front-end/login.php @@ -3,14 +3,14 @@

LOGIN

-
+
- +
- +
@@ -19,4 +19,38 @@
- \ No newline at end of file + + + + + diff --git a/front-end/package-lock.json b/front-end/package-lock.json index 8462c8b79..aae0e04da 100644 --- a/front-end/package-lock.json +++ b/front-end/package-lock.json @@ -1,6 +1,11 @@ { "lockfileVersion": 1, "dependencies": { + "@fortawesome/fontawesome-free": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.6.3.tgz", + "integrity": "sha512-s5PLdI9NYgjBvfrv6rhirPHlAHWx+Sfo/IjsAeiXYfmemC/GSjwsyz1wLnGPazbLPXWfk62ks980o9AmsxYUEQ==" + }, "bootstrap": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.2.1.tgz", diff --git a/front-end/painel/cursos.php b/front-end/painel/cursos.php new file mode 100644 index 000000000..3c91ef885 --- /dev/null +++ b/front-end/painel/cursos.php @@ -0,0 +1,36 @@ + + +
+
+
+
+
+
+ Nome do curso + +
+
+
+

+ Professor: +
+ Sala: +

+
+
+

+
+ Hórário: +

+
+
+ +
+
+
+
+
+ \ No newline at end of file diff --git a/front-end/painel/footer_painel.php b/front-end/painel/footer_painel.php new file mode 100644 index 000000000..4d4a7e528 --- /dev/null +++ b/front-end/painel/footer_painel.php @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/front-end/painel/header_painel.php b/front-end/painel/header_painel.php new file mode 100644 index 000000000..eb420fa56 --- /dev/null +++ b/front-end/painel/header_painel.php @@ -0,0 +1,24 @@ + + + + + Painel - Desafio FullStack + + + + + + + + + +
+
+
+

+ + +

+
+
+
\ No newline at end of file From e036f05760c7bbc07ed415710b836c0daa1b2998 Mon Sep 17 00:00:00 2001 From: Thiago Franco Date: Wed, 9 Jan 2019 17:50:34 -0200 Subject: [PATCH 5/8] =?UTF-8?q?Cria=C3=A7=C3=A3o=20da=20Tela=20de=20Cursos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/dependencies.php | 3 + api/app/middleware.php | 19 +- api/app/routes.php | 5 +- api/app/src/Action/CursoListar.php | 17 +- api/app/src/Action/UsuarioLogar.php | 8 +- api/app/src/Action/VerificaToken.php | 32 - api/app/src/Action/VerificarToken.php | 45 + api/app/src/Entity/Curso.php | 63 +- api/app/src/Entity/CursoProfessor.php | 1 + api/app/src/Entity/CursoSala.php | 1 + api/app/src/Entity/Disciplina.php | 26 +- api/app/src/Entity/Professor.php | 1 + api/app/src/Entity/Sala.php | 1 + api/app/src/Entity/Usuario.php | 43 +- api/app/src/Service/CursoService.php | 4 +- api/app/src/Service/UsuarioService.php | 29 +- assets/css/style.css | 4 + assets/js/autenticacao.js | 27 + {front-end/assets => assets}/js/geral.js | 16 +- desafio-fullstack.clpprj | 2376 +-- desafio-fullstack_clcs.csprj | 17454 ++++++++++++---- front-end/footer.php => footer.php | 0 front-end/assets/js/autenticacao.js | 26 - front-end/painel/cursos.php | 36 - front-end/header.php => header.php | 3 +- front-end/login.php => index.php | 6 +- .../package-lock.json => package-lock.json | 0 painel/curso.php | 94 + painel/cursos.php | 109 + .../painel => painel}/footer_painel.php | 0 .../painel => painel}/header_painel.php | 12 +- {DER => scripts/DER}/DER.jpg | Bin {SQL => scripts/SQL}/desafiofullstack.sql | 216 +- .../wireframe}/1-login-mobile.png | Bin .../wireframe}/2-login-desktop.png | Bin .../wireframe}/3-cursos-mobile.png | Bin .../wireframe}/4-cursos-desktop.png | Bin .../wireframe}/5-detalhe-mobile.png | Bin .../wireframe}/6-detalhe-desktop.png | Bin 39 files changed, 14176 insertions(+), 6501 deletions(-) delete mode 100644 api/app/src/Action/VerificaToken.php create mode 100644 api/app/src/Action/VerificarToken.php create mode 100644 assets/css/style.css create mode 100644 assets/js/autenticacao.js rename {front-end/assets => assets}/js/geral.js (60%) rename front-end/footer.php => footer.php (100%) delete mode 100644 front-end/assets/js/autenticacao.js delete mode 100644 front-end/painel/cursos.php rename front-end/header.php => header.php (81%) rename front-end/login.php => index.php (92%) rename front-end/package-lock.json => package-lock.json (100%) create mode 100644 painel/curso.php create mode 100644 painel/cursos.php rename {front-end/painel => painel}/footer_painel.php (100%) rename {front-end/painel => painel}/header_painel.php (63%) rename {DER => scripts/DER}/DER.jpg (100%) rename {SQL => scripts/SQL}/desafiofullstack.sql (97%) rename {wireframe => scripts/wireframe}/1-login-mobile.png (100%) rename {wireframe => scripts/wireframe}/2-login-desktop.png (100%) rename {wireframe => scripts/wireframe}/3-cursos-mobile.png (100%) rename {wireframe => scripts/wireframe}/4-cursos-desktop.png (100%) rename {wireframe => scripts/wireframe}/5-detalhe-mobile.png (100%) rename {wireframe => scripts/wireframe}/6-detalhe-desktop.png (100%) diff --git a/api/app/dependencies.php b/api/app/dependencies.php index d7f3f6f1f..e15ef56cb 100644 --- a/api/app/dependencies.php +++ b/api/app/dependencies.php @@ -44,4 +44,7 @@ return new App\Action\CursoListar($container['db']); }; +$container[App\Action\VerificarToken::class] = function ($container) { + return new App\Action\VerificarToken($container['db']); +}; diff --git a/api/app/middleware.php b/api/app/middleware.php index 5c5a872bb..56710bf7d 100644 --- a/api/app/middleware.php +++ b/api/app/middleware.php @@ -2,8 +2,7 @@ use App\Entity\Usuario; use App\Service\UsuarioService; -use App\Helper\FuncoesHelper; -use Doctrine\ORM\EntityManager; +use App\Helper\FuncoesHelper; class AutenticacaoTokenMiddleware { @@ -16,24 +15,20 @@ class AutenticacaoTokenMiddleware * * @return \Psr\Http\Message\ResponseInterface */ - private $em; - - public function __construct(EntityManager $em) - { - $this->em = $em; - } + public function __invoke($request, $response, $next) { try{ - $tokenHeader = $request->getHeader('token_auth'); - $emailHeader = $request->getHeader('email_auth'); + $tokenHeader = $request->getHeader('token'); + $emailHeader = $request->getHeader('email'); $usuario = new Usuario(); $usuario->setEmail($emailHeader); - $usuario->setToken($tokenHeader); + $usuario->setToken($tokenHeader); + - $uS = new UsuarioService( $usuario, $this->em ); + $uS = new UsuarioService( $usuario ); $verificado = $uS->verificarToken(); $status = $response->getStatusCode(); diff --git a/api/app/routes.php b/api/app/routes.php index db12f42b5..b189e92aa 100644 --- a/api/app/routes.php +++ b/api/app/routes.php @@ -2,6 +2,5 @@ // Routes $app->get('/usuario/logar', App\Action\UsuarioLogar::class); - - -$app->get('/curso/listar', App\Action\CursoListar::class)/*->add( AutenticacaoTokenMiddleware::class )*/; +$app->get('/usuario/verificarToken', App\Action\VerificarToken::class); +$app->get('/curso/listar[/{id}]', App\Action\CursoListar::class)->add( AutenticacaoTokenMiddleware::class ); diff --git a/api/app/src/Action/CursoListar.php b/api/app/src/Action/CursoListar.php index a08d1d8f0..5278ea7d8 100644 --- a/api/app/src/Action/CursoListar.php +++ b/api/app/src/Action/CursoListar.php @@ -15,14 +15,21 @@ class CursoListar public function __invoke(Request $request, Response $response, $args) { - try{ - $cursos = Curso::all(); + try{ + + $id = isset($args['id']) ? $args['id'] : null; + $curso = new Curso(); + + $cursoService = new CursoService($curso); + $cursos = $cursoService->listar($id); $listaCursos = []; foreach($cursos as $curso){ - $listaCursos['curso'] = $curso->toArray(); - $listaCursos['curso']['professores'] = $curso->professores->toArray(); - $listaCursos['curso']['salas'] = $curso->salas->toArray(); + $listaCursos[] = array( + 'curso' => $curso->toArray(), + 'professores' => $curso->professores->toArray(), + 'salas' => $curso->salas->toArray() + ); } $erro = 0; diff --git a/api/app/src/Action/UsuarioLogar.php b/api/app/src/Action/UsuarioLogar.php index 9f4a727fd..fa2650dcc 100644 --- a/api/app/src/Action/UsuarioLogar.php +++ b/api/app/src/Action/UsuarioLogar.php @@ -3,15 +3,13 @@ use Slim\Http\Request; use Slim\Http\Response; -use Doctrine\ORM\EntityManager; +use Illuminate\Database\Query\Builder; use \App\Entity\Usuario; use \App\Service\UsuarioService; use \App\Helper\FuncoesHelper; class UsuarioLogar -{ - - +{ public function __invoke(Request $request, Response $response, $args) { @@ -23,7 +21,7 @@ public function __invoke(Request $request, Response $response, $args) $usuario->setEmail($email); $usuario->setSenha($senha); - $us = new \App\Service\UsuarioService( $usuario ); + $us = new UsuarioService( $usuario ); $token = $us->logar(); diff --git a/api/app/src/Action/VerificaToken.php b/api/app/src/Action/VerificaToken.php deleted file mode 100644 index d717af12e..000000000 --- a/api/app/src/Action/VerificaToken.php +++ /dev/null @@ -1,32 +0,0 @@ -em = $em; - } - - public function __invoke(Request $request, Response $response, $args) - { - $usuario = new Usuario(); - $usuario->setEmail('thiago.boo@gmail.com'); - $usuario->setSenha('1234567'); - - $us = new \App\Service\UsuarioService($usuario, $this->em); - var_dump( $us->logar() ); - - - - return $response; - } -} diff --git a/api/app/src/Action/VerificarToken.php b/api/app/src/Action/VerificarToken.php new file mode 100644 index 000000000..de14a4e7d --- /dev/null +++ b/api/app/src/Action/VerificarToken.php @@ -0,0 +1,45 @@ +getHeader("email")[0] ) ? $request->getHeader("email")[0] : ''; + $token = isset( $request->getHeader("token")[0] ) ? $request->getHeader("token")[0] : ''; + + + $usuario = new Usuario(); + $usuario->setEmail($email); + $usuario->setToken($token); + + $usuarioService = new UsuarioService( $usuario ); + + $verificado = $usuarioService->verificarToken(); + + $erro = 0; + $msg = "Usuário Verificado"; + $dados = []; + + + }catch( \Exception $e ){ + $erro = 1; + $msg = $e->getMessage(); + $dados = []; + } + + $status = $response->getStatusCode(); + + return FuncoesHelper::formatarSaidaJson($status, $msg, $dados, $erro); + } +} diff --git a/api/app/src/Entity/Curso.php b/api/app/src/Entity/Curso.php index 7c276c254..1b7f8cb7f 100644 --- a/api/app/src/Entity/Curso.php +++ b/api/app/src/Entity/Curso.php @@ -12,68 +12,13 @@ class Curso extends Model { protected $table = "curso"; + public $timestamps = false; - private $id; - private $horarioInicio; - private $horarioFim; - private $disciplina; - private $professores; - - public function getId() + public function disciplina() { - return $this->id; - } - - - public function setHorarioInicio($horarioInicio) - { - $this->horarioInicio = $horarioInicio; - - return $this; - } - - - public function getHorarioInicio() - { - return $this->horarioInicio; - } - - - public function setHorarioFim($horarioFim) - { - $this->horarioFim = $horarioFim; - - return $this; - } - - - public function getHorarioFim() - { - return $this->horarioFim; - } - - - public function setDisciplina(\App\Entity\Disciplina $disciplina = null) - { - $this->disciplina = $disciplina; - - return $this; - } - - public function getDisciplina() - { - return $this->disciplina; - } - - public function setProfessores($professores){ - $this->professores = $professores; - } - - public function getProfessores() - { - return $this->professores; - } + return $this->belongsTo('\App\Entity\Disciplina'); + } public function professores() { diff --git a/api/app/src/Entity/CursoProfessor.php b/api/app/src/Entity/CursoProfessor.php index a2255dc0f..e42cd7eea 100644 --- a/api/app/src/Entity/CursoProfessor.php +++ b/api/app/src/Entity/CursoProfessor.php @@ -14,6 +14,7 @@ class CursoProfessor extends Model { protected $table = "curso_professor"; + public $timestamps = false; private $id; diff --git a/api/app/src/Entity/CursoSala.php b/api/app/src/Entity/CursoSala.php index 2a713afd2..ad9688136 100644 --- a/api/app/src/Entity/CursoSala.php +++ b/api/app/src/Entity/CursoSala.php @@ -12,6 +12,7 @@ class CursoSala extends Model private $id; private $curso; private $sala; + public $timestamps = false; public function getId() { diff --git a/api/app/src/Entity/Disciplina.php b/api/app/src/Entity/Disciplina.php index 0d9359616..922f0fb93 100644 --- a/api/app/src/Entity/Disciplina.php +++ b/api/app/src/Entity/Disciplina.php @@ -7,28 +7,6 @@ class Disciplina extends Model { - protected $table = "disciplina"; - private $id; - - private $nome; - - - public function getId() - { - return $this->id; - } - - - public function setNome($nome) - { - $this->nome = $nome; - - return $this; - } - - - public function getNome() - { - return $this->nome; - } + protected $table = "disciplina"; + public $timestamps = false; } diff --git a/api/app/src/Entity/Professor.php b/api/app/src/Entity/Professor.php index f20b84b75..2dd0eb9bc 100644 --- a/api/app/src/Entity/Professor.php +++ b/api/app/src/Entity/Professor.php @@ -9,6 +9,7 @@ class Professor extends Model { protected $table = "professor"; protected $hidden = array('pivot'); + public $timestamps = false; private $id; private $nome; diff --git a/api/app/src/Entity/Sala.php b/api/app/src/Entity/Sala.php index 8355bdd42..150a0a603 100644 --- a/api/app/src/Entity/Sala.php +++ b/api/app/src/Entity/Sala.php @@ -8,6 +8,7 @@ class Sala extends Model { protected $table = "sala"; protected $hidden = array('pivot'); + public $timestamps = false; private $id; diff --git a/api/app/src/Entity/Usuario.php b/api/app/src/Entity/Usuario.php index 9253f8a1e..dc5c36292 100644 --- a/api/app/src/Entity/Usuario.php +++ b/api/app/src/Entity/Usuario.php @@ -7,55 +7,70 @@ class Usuario extends Model { protected $table = "usuario"; - private $id; - + public $timestamps = false; + + private $id; private $email; - - private $senha; - private $token; - - - + public function getId() { return $this->id; } - + public function setEmail($email) { $this->email = $email; - return $this; } + /** + * Get email. + * + * @return string + */ public function getEmail() { return $this->email; } - + /** + * Set senha. + * + * @param string $senha + * + * @return Usuario + */ public function setSenha($senha) { $this->senha = $senha; - return $this; } + /** + * Get senha. + * + * @return string + */ public function getSenha() { return $this->senha; } + /** + * Set token. + * + * @param string|null $token + * + * @return Usuario + */ public function setToken($token = null) { $this->token = $token; - return $this; } - public function getToken() { return $this->token; diff --git a/api/app/src/Service/CursoService.php b/api/app/src/Service/CursoService.php index 8bc58ef63..79575ce79 100644 --- a/api/app/src/Service/CursoService.php +++ b/api/app/src/Service/CursoService.php @@ -28,9 +28,9 @@ public function getSalas( Curso $curso ) : Curso{ public function listar($id = null) { if( $id ){ - return Curso::find($id); + return Curso::where('id',$id)->get(); }else{ - return Curso::All(); + return Curso::with("Disciplina")->get(); } } diff --git a/api/app/src/Service/UsuarioService.php b/api/app/src/Service/UsuarioService.php index 94ffe9c4c..049c5aec8 100644 --- a/api/app/src/Service/UsuarioService.php +++ b/api/app/src/Service/UsuarioService.php @@ -22,15 +22,15 @@ private static function gerarToken(Usuario $usuario) : string{ return md5($id.$data); } - public function verificarToken() : bool{ - + public function verificarToken() : bool{ + $email = $this->usuario->getEmail(); - $token = $this->usuario->getToken(); - - $verificado = Usuario::where(array('email' => $email, 'token'=> $token))->count(); - + $token = $this->usuario->getToken(); + + $usuario = $this->usuario->where('email',$email)->where('token',$token)->first(); + $retorno = false; - if( $verificado > 0 ){ + if( $usuario ){ $retorno = true; }else{ throw new \Exception("Requisição não autorizada! Token Inválido!"); @@ -46,18 +46,17 @@ public function logar() : string{ $senha = md5( $this->usuario->getSenha() ); $usuario = Usuario::where(array('email' => $email, 'senha'=> $senha))->first(); - - + $retorno = ""; if( $usuario ){ - $token = self::gerarToken($usuario); + $token = self::gerarToken($usuario); + + //gravar token na tabela + $usuario->token = $token; + $salvou = $usuario->save(); - - //gravar token na tabela - $usuario->setToken($token); - $usuario->save(); - $retorno = $usuario->getToken(); + $retorno = $token; }else{ throw new \Exception("Os dados de email e/ou senha são inválidos!"); } diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 000000000..9eef581fa --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,4 @@ +.boxCurso{ display: none; } +.boxCursoCp {margin-bottom: 20px;} +.topo{ margin-bottom: 40px;} +#iconeTopo{margin-top: 8px;} \ No newline at end of file diff --git a/assets/js/autenticacao.js b/assets/js/autenticacao.js new file mode 100644 index 000000000..ae6a2091b --- /dev/null +++ b/assets/js/autenticacao.js @@ -0,0 +1,27 @@ +$(document).ready( function(){ + + var email = localStorage.getItem('email'); + var token = localStorage.getItem('token'); + + if( email != '' && token != '' ){ + $.ajax({ + accepts: "application/json", + contentType: 'application/json; charset=UTF-8', + dataType: 'json', + headers :{ "email": email, "token": token }, + data:{}, + method: 'GET', + url: localStorage.getItem("base_url") + "/api/usuario/verificarToken", + success: function(resposta){ + if( resposta.erro == 1 ){ + location.href = localStorage.getItem("base_url"); + } + } + }); + }else{ + + location.href = localStorage.getItem("base_url"); + } + + +}); \ No newline at end of file diff --git a/front-end/assets/js/geral.js b/assets/js/geral.js similarity index 60% rename from front-end/assets/js/geral.js rename to assets/js/geral.js index 9956a2bad..616789fde 100644 --- a/front-end/assets/js/geral.js +++ b/assets/js/geral.js @@ -1,4 +1,8 @@ - +var url = location.protocol + "//" + location.hostname + "/desafio-fullstack"; +localStorage.setItem("base_url", url); + + + //gera modal function gera_modal(titulo, texto, classe){ var html = "