From eca13a481c092a79077a166778bff7a127475cc5 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Mon, 18 Feb 2019 13:03:11 -0300 Subject: [PATCH 01/21] Create project Config project Build API MySQL version --- .env.dist | 52 + .gitignore | 20 + README.md | 19 + bin/console | 38 + cli/deploy | 7 + composer.lock | 3012 +++++++++++++++++ config/bootstrap.php | 21 + config/bundles.php | 9 + config/packages/cache.yaml | 19 + config/packages/dev/routing.yaml | 3 + config/packages/doctrine.yaml | 29 + config/packages/doctrine_migrations.yaml | 6 + config/packages/framework.yaml | 17 + config/packages/prod/doctrine.yaml | 32 + config/packages/routing.yaml | 4 + config/packages/sensio_framework_extra.yaml | 3 + config/packages/test/framework.yaml | 4 + config/packages/test/routing.yaml | 3 + config/routes.yaml | 9 + config/routes/annotations.yaml | 3 + config/services.yaml | 42 + docker-compose.yml | 58 + public/index.php | 27 + src/Controller/.gitignore | 0 src/Controller/AbstractController.php | 38 + src/Controller/UserController.php | 85 + src/Entity/.gitignore | 0 src/Entity/User.php | 153 + src/Kernel.php | 48 + src/Migrations/.gitignore | 0 .../2019/02/Version20190215003733.php | 40 + src/Repository/.gitignore | 0 src/Repository/UserRepository.php | 59 + src/Service/UserImporter.php | 120 + symfony.lock | 185 + 35 files changed, 4165 insertions(+) create mode 100644 .env.dist create mode 100644 .gitignore create mode 100755 bin/console create mode 100755 cli/deploy create mode 100644 composer.lock create mode 100644 config/bootstrap.php create mode 100644 config/bundles.php create mode 100644 config/packages/cache.yaml create mode 100644 config/packages/dev/routing.yaml create mode 100644 config/packages/doctrine.yaml create mode 100644 config/packages/doctrine_migrations.yaml create mode 100644 config/packages/framework.yaml create mode 100644 config/packages/prod/doctrine.yaml create mode 100644 config/packages/routing.yaml create mode 100644 config/packages/sensio_framework_extra.yaml create mode 100644 config/packages/test/framework.yaml create mode 100644 config/packages/test/routing.yaml create mode 100644 config/routes.yaml create mode 100644 config/routes/annotations.yaml create mode 100644 config/services.yaml create mode 100644 docker-compose.yml create mode 100644 public/index.php create mode 100644 src/Controller/.gitignore create mode 100644 src/Controller/AbstractController.php create mode 100644 src/Controller/UserController.php create mode 100644 src/Entity/.gitignore create mode 100644 src/Entity/User.php create mode 100644 src/Kernel.php create mode 100644 src/Migrations/.gitignore create mode 100644 src/Migrations/2019/02/Version20190215003733.php create mode 100644 src/Repository/.gitignore create mode 100644 src/Repository/UserRepository.php create mode 100644 src/Service/UserImporter.php create mode 100644 symfony.lock diff --git a/.env.dist b/.env.dist new file mode 100644 index 000000000..bd75fcc35 --- /dev/null +++ b/.env.dist @@ -0,0 +1,52 @@ +# In all environments, the following files are loaded if they exist, +# the later taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration + +###> symfony/framework-bundle ### +APP_ENV=prod +APP_SECRET=ebfb6dfbab639815bc1da66e6bf7509e +#TRUSTED_PROXIES=127.0.0.1,127.0.0.2 +#TRUSTED_HOSTS='^localhost|example\.com$' +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" +# Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls +#Example: DATABASE_URL=mysql://user:userpass00@db:3306/picpay?charset=utf8mb4&serverVersion=5.7 + +DATABASE_URL=mysql://:db:3306/?charset=utf8mb4&serverVersion=5.7 +###< doctrine/doctrine-bundle ### + +# Configuration of the mysql docker container +#Example: +#MYSQL_ROOT_PASSWORD=rootpass00 +#MYSQL_DATABASE=picpay +#MYSQL_USER=user +#MYSQL_PASSWORD=userpass00 + +MYSQL_ROOT_PASSWORD= +MYSQL_DATABASE= +MYSQL_USER= +MYSQL_PASSWORD= + +# Data files +#Example: +#USERS_FILE_PATH=var/data/users.csv +#PRIORITY1_FILE_PATH=lista_relevancia_1.txt +#PRIORITY2_FILE_PATH=lista_relevancia_2.txt + +USERS_FILE_PATH=var/data/users.csv +PRIORITY1_FILE_PATH=lista_relevancia_1.txt +PRIORITY2_FILE_PATH=lista_relevancia_2.txt \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..34f1ea04c --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +### Composer ### +composer.phar +composer.json +### Composer ### + +### Data ### +/data/ +### Data ### + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/public/bundles/ +/var/ +/vendor/ +/.idea/ +###< symfony/framework-bundle ### + +.env \ No newline at end of file diff --git a/README.md b/README.md index 6fcb5a302..5a9a343a6 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,22 @@ Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu n - Ter um desempenho elevado num conjunto de dados muito grande - Utilizar o Docker +# Solução + +### Autor +- Nome: Rodrigo Alves Sarmento +- E-mail: rasarmento@gmail.com + +### Configuração +- Criar o arquivo ***.env*** a partir do ***.env.dist*** +- No arquivo ***.env*** preencher os dados de configuração do container docker ***mysql*** +- No arquivo ***.env*** preencher os dados da URL de conexão do doctrine +- No arquivo ***.env*** preencher os locais dos arquivos com os dados de usuários + +- Obs: Para cada configuração será fornecido um exemplo + +### Instalação +- Construir containers: ```docker-compose up``` +- Instalar dependências PHP: ```docker-compose run --rm api php composer.phar install``` +- Construir base de dados: ```docker-compose run --rm api php bin/console doctrine:migrations:migrate``` +- carregar base de dados MySQL: http://localhost:8080/api/user/import \ No newline at end of file diff --git a/bin/console b/bin/console new file mode 100755 index 000000000..52fd3989f --- /dev/null +++ b/bin/console @@ -0,0 +1,38 @@ +#!/usr/bin/env php +getParameterOption(['--env', '-e'], null, true)) { + putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); +} + +if ($input->hasParameterOption('--no-debug', true)) { + putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); +} + +require dirname(__DIR__).'/config/bootstrap.php'; + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } +} + +$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$application = new Application($kernel); +$application->run($input); diff --git a/cli/deploy b/cli/deploy new file mode 100755 index 000000000..9e7508349 --- /dev/null +++ b/cli/deploy @@ -0,0 +1,7 @@ +#!/bin/bash + +# Cria tabela do doctrine migrations +#docker-compose run --rm api php bin/console doctrine:migrations:status + +# Cria as tabelas do banco de dados +#docker exec "$CONTAINER_WEB_NAME" bin/console doctrine:migrations:migrate -vvv --allow-no-migration --no-interaction \ No newline at end of file diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..9e9fe1771 --- /dev/null +++ b/composer.lock @@ -0,0 +1,3012 @@ +{ + "_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": "f0fbd1fb9db75a6d9d8879c6ea12da9d", + "packages": [ + { + "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/doctrine-bundle", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "1f99e6645030542079c57d4680601a4a8778a1bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/1f99e6645030542079c57d4680601a4a8778a1bd", + "reference": "1f99e6645030542079c57d4680601a4a8778a1bd", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.5.12", + "doctrine/doctrine-cache-bundle": "~1.2", + "jdorn/sql-formatter": "^1.2.16", + "php": "^5.5.9|^7.0", + "symfony/console": "~2.7|~3.0|~4.0", + "symfony/dependency-injection": "~2.7|~3.0|~4.0", + "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", + "symfony/framework-bundle": "^2.7.22|~3.0|~4.0" + }, + "conflict": { + "symfony/http-foundation": "<2.6" + }, + "require-dev": { + "doctrine/orm": "~2.4", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^4.8.36|^5.7|^6.4", + "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", + "symfony/property-info": "~2.8|~3.0|~4.0", + "symfony/validator": "~2.7|~3.0|~4.0", + "symfony/web-profiler-bundle": "~2.7|~3.0|~4.0", + "symfony/yaml": "~2.7|~3.0|~4.0", + "twig/twig": "~1.26|~2.0" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "time": "2019-02-06T13:18:04+00:00" + }, + { + "name": "doctrine/doctrine-cache-bundle", + "version": "1.3.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineCacheBundle.git", + "reference": "5514c90d9fb595e1095e6d66ebb98ce9ef049927" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927", + "reference": "5514c90d9fb595e1095e6d66ebb98ce9ef049927", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.4.2", + "doctrine/inflector": "~1.0", + "php": ">=5.3.2", + "symfony/doctrine-bridge": "~2.7|~3.3|~4.0" + }, + "require-dev": { + "instaclick/coding-standard": "~1.1", + "instaclick/object-calisthenics-sniffs": "dev-master", + "instaclick/symfony2-coding-standard": "dev-remaster", + "phpunit/phpunit": "~4.8.36|~5.6|~6.5|~7.0", + "predis/predis": "~0.8", + "satooshi/php-coveralls": "^1.0", + "squizlabs/php_codesniffer": "~1.5", + "symfony/console": "~2.7|~3.3|~4.0", + "symfony/finder": "~2.7|~3.3|~4.0", + "symfony/framework-bundle": "~2.7|~3.3|~4.0", + "symfony/phpunit-bridge": "~2.7|~3.3|~4.0", + "symfony/security-acl": "~2.7|~3.3", + "symfony/validator": "~2.7|~3.3|~4.0", + "symfony/yaml": "~2.7|~3.3|~4.0" + }, + "suggest": { + "symfony/security-acl": "For using this bundle to cache ACLs" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineCacheBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Fabio B. Silva", + "email": "fabio.bat.silva@gmail.com" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@hotmail.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Bundle for Doctrine Cache", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2018-11-09T06:25:35+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "49fa399181db4bf4f9f725126bd1cb65c4398dce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce", + "reference": "49fa399181db4bf4f9f725126bd1cb65c4398dce", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "~1.0", + "doctrine/migrations": "^1.1", + "php": ">=5.4.0", + "symfony/framework-bundle": "~2.7|~3.3|~4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^7.4" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "time": "2018-12-03T11:55:33+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/migrations", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6", + "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6", + "shasum": "" + }, + "require": { + "doctrine/dbal": "~2.6", + "ocramius/proxy-manager": "^1.0|^2.0", + "php": "^7.1", + "symfony/console": "~3.3|^4.0" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "doctrine/orm": "~2.5", + "jdorn/sql-formatter": "~1.1", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "~7.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/yaml": "~3.3|^4.0" + }, + "suggest": { + "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "v1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations", + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "Database Schema migrations using Doctrine DBAL", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "migrations" + ], + "time": "2018-06-06T21:00:30+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": "jdorn/sql-formatter", + "version": "v1.2.17", + "source": { + "type": "git", + "url": "https://github.com/jdorn/sql-formatter.git", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/jdorn/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "time": "2014-01-12T16:20:24+00:00" + }, + { + "name": "ocramius/package-versions", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f", + "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0.0", + "php": "^7.1.0" + }, + "require-dev": { + "composer/composer": "^1.6.3", + "ext-zip": "*", + "infection/infection": "^0.7.1", + "phpunit/phpunit": "^7.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "time": "2018-02-05T13:05:30+00:00" + }, + { + "name": "ocramius/proxy-manager", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/ProxyManager.git", + "reference": "e18ac876b2e4819c76349de8f78ccc8ef1554cd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/e18ac876b2e4819c76349de8f78ccc8ef1554cd7", + "reference": "e18ac876b2e4819c76349de8f78ccc8ef1554cd7", + "shasum": "" + }, + "require": { + "ocramius/package-versions": "^1.1.1", + "php": "^7.1.0", + "zendframework/zend-code": "^3.1.0" + }, + "require-dev": { + "couscous/couscous": "^1.5.2", + "ext-phar": "*", + "humbug/humbug": "dev-master@DEV", + "nikic/php-parser": "^3.0.4", + "phpbench/phpbench": "^0.12.2", + "phpstan/phpstan": "^0.6.4", + "phpunit/phpunit": "^5.6.4", + "phpunit/phpunit-mock-objects": "^3.4.1", + "squizlabs/php_codesniffer": "^2.7.0" + }, + "suggest": { + "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects", + "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)", + "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)", + "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "ProxyManager\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + } + ], + "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", + "homepage": "https://github.com/Ocramius/ProxyManager", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "time": "2017-05-04T11:12:50+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+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/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20T15:27:04+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": "sensio/framework-extra-bundle", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "1fdf591c4b388e62dbb2579de89c1560b33f865d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/1fdf591c4b388e62dbb2579de89c1560b33f865d", + "reference": "1fdf591c4b388e62dbb2579de89c1560b33f865d", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.2", + "symfony/config": "^3.3|^4.0", + "symfony/dependency-injection": "^3.3|^4.0", + "symfony/framework-bundle": "^3.4|^4.0", + "symfony/http-kernel": "^3.3|^4.0" + }, + "require-dev": { + "doctrine/doctrine-bundle": "^1.6", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^3.3|^4.0", + "symfony/dom-crawler": "^3.3|^4.0", + "symfony/expression-language": "^3.3|^4.0", + "symfony/finder": "^3.3|^4.0", + "symfony/monolog-bridge": "^3.0|^4.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^3.4.19|^4.1.8", + "symfony/psr-http-message-bridge": "^0.3", + "symfony/security-bundle": "^3.3|^4.0", + "symfony/twig-bundle": "^3.3|^4.0", + "symfony/yaml": "^3.3|^4.0", + "twig/twig": "~1.12|~2.0", + "zendframework/zend-diactoros": "^1.3" + }, + "suggest": { + "symfony/expression-language": "", + "symfony/psr-http-message-bridge": "To use the PSR-7 converters", + "symfony/security-bundle": "" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "time": "2018-12-11T16:59:23+00:00" + }, + { + "name": "symfony/cache", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "7c5b85bcc5f87dd7938123be12ce3323be6cde5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/7c5b85bcc5f87dd7938123be12ce3323be6cde5a", + "reference": "7c5b85bcc5f87dd7938123be12ce3323be6cde5a", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "psr/simple-cache": "^1.0", + "symfony/contracts": "^1.0", + "symfony/var-exporter": "^4.2" + }, + "conflict": { + "doctrine/dbal": "<2.5", + "symfony/dependency-injection": "<3.4", + "symfony/var-dumper": "<3.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-contracts-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "~1.6", + "doctrine/dbal": "~2.5", + "predis/predis": "~1.1", + "symfony/config": "~4.2", + "symfony/dependency-injection": "~3.4|~4.1", + "symfony/var-dumper": "^4.1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "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": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "time": "2019-01-31T15:08:08+00:00" + }, + { + "name": "symfony/config", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "25a2e7abe0d97e70282537292e3df45cf6da7b98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/25a2e7abe0d97e70282537292e3df45cf6da7b98", + "reference": "25a2e7abe0d97e70282537292e3df45cf6da7b98", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "~3.4|~4.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "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 Config Component", + "homepage": "https://symfony.com", + "time": "2019-01-30T11:44:30+00:00" + }, + { + "name": "symfony/console", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4", + "reference": "1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4", + "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" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "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": "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-25T14:35:16+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/debug", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "cf9b2e33f757deb884ce474e06d2647c1c769b65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/cf9b2e33f757deb884ce474e06d2647c1c769b65", + "reference": "cf9b2e33f757deb884ce474e06d2647c1c769b65", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "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 Debug Component", + "homepage": "https://symfony.com", + "time": "2019-01-25T14:35:16+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "72c14cbc0c27706b9b4c33b9cd7a280972ff4806" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/72c14cbc0c27706b9b4c33b9cd7a280972ff4806", + "reference": "72c14cbc0c27706b9b4c33b9cd7a280972ff4806", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0", + "symfony/contracts": "^1.0" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-contracts-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~4.2", + "symfony/expression-language": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "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 DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2019-01-30T17:51:38+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "5145bb51562c15a550238c17860ca8f03a1939cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/5145bb51562c15a550238c17860ca8f03a1939cb", + "reference": "5145bb51562c15a550238c17860ca8f03a1939cb", + "shasum": "" + }, + "require": { + "doctrine/collections": "~1.0", + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "~1.0", + "php": "^7.1.3", + "symfony/contracts": "^1.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4", + "symfony/messenger": "<4.2" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.6", + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.4", + "doctrine/orm": "^2.4.5", + "doctrine/reflection": "~1.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/messenger": "~4.2", + "symfony/property-access": "~3.4|~4.0", + "symfony/property-info": "~3.4|~4.0", + "symfony/proxy-manager-bridge": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "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 Doctrine Bridge", + "homepage": "https://symfony.com", + "time": "2019-01-24T21:39:51+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "9a3bdfcd7a0d9602754894d76c614d15ca366535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/9a3bdfcd7a0d9602754894d76c614d15ca366535", + "reference": "9a3bdfcd7a0d9602754894d76c614d15ca366535", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/process": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "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": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2019-01-24T21:39:51+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1", + "reference": "bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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 EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2019-01-16T20:35:37+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "7c16ebc2629827d4ec915a52ac809768d060a4ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7c16ebc2629827d4ec915a52ac809768d060a4ee", + "reference": "7c16ebc2629827d4ec915a52ac809768d060a4ee", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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 Filesystem Component", + "homepage": "https://symfony.com", + "time": "2019-01-16T20:35:37+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ef71816cbb264988bb57fe6a73f610888b9aa70c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ef71816cbb264988bb57fe6a73f610888b9aa70c", + "reference": "ef71816cbb264988bb57fe6a73f610888b9aa70c", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "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 Finder Component", + "homepage": "https://symfony.com", + "time": "2019-01-16T20:35:37+00:00" + }, + { + "name": "symfony/flex", + "version": "v1.1.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "955774ecf07b10230bb5b44e150ba078b45f68fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/955774ecf07b10230bb5b44e150ba078b45f68fa", + "reference": "955774ecf07b10230bb5b44e150ba078b45f68fa", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0", + "php": "^7.0" + }, + "require-dev": { + "composer/composer": "^1.0.2", + "symfony/phpunit-bridge": "^3.2.8" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "time": "2018-11-15T06:11:38+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "5707ad22d7dcf39643128e73a85efc0f20745b44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/5707ad22d7dcf39643128e73a85efc0f20745b44", + "reference": "5707ad22d7dcf39643128e73a85efc0f20745b44", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/cache": "~4.2", + "symfony/config": "~4.2", + "symfony/contracts": "^1.0.2", + "symfony/dependency-injection": "^4.2", + "symfony/event-dispatcher": "^4.1", + "symfony/filesystem": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/http-foundation": "^4.1.2", + "symfony/http-kernel": "^4.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^4.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.4", + "symfony/console": "<3.4", + "symfony/dotenv": "<4.2", + "symfony/form": "<4.2", + "symfony/messenger": "<4.2", + "symfony/property-info": "<3.4", + "symfony/serializer": "<4.2", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<4.2", + "symfony/twig-bridge": "<4.1.1", + "symfony/validator": "<4.1", + "symfony/workflow": "<4.1" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "fig/link-util": "^1.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "~3.4|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "^4.2.3", + "symfony/lock": "~3.4|~4.0", + "symfony/messenger": "^4.2", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "~3.4|~4.0", + "symfony/property-info": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0", + "symfony/security-core": "~3.4|~4.0", + "symfony/security-csrf": "~3.4|~4.0", + "symfony/serializer": "^4.2", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~4.2", + "symfony/validator": "^4.1", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/web-link": "~3.4|~4.0", + "symfony/workflow": "^4.1", + "symfony/yaml": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "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 FrameworkBundle", + "homepage": "https://symfony.com", + "time": "2019-01-29T09:49:29+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "8d2318b73e0a1bc75baa699d00ebe2ae8b595a39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8d2318b73e0a1bc75baa699d00ebe2ae8b595a39", + "reference": "8d2318b73e0a1bc75baa699d00ebe2ae8b595a39", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/expression-language": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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 HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2019-01-29T09:49:29+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "d56b1706abaa771eb6acd894c6787cb88f1dc97d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d56b1706abaa771eb6acd894c6787cb88f1dc97d", + "reference": "d56b1706abaa771eb6acd894c6787cb88f1dc97d", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/contracts": "^1.0.2", + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~4.1", + "symfony/http-foundation": "^4.1.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<4.2", + "symfony/translation": "<4.2", + "symfony/var-dumper": "<4.1.1", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "^4.2", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~4.2", + "symfony/var-dumper": "^4.1.1" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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 HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2019-02-03T12:47:33+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" + }, + { + "name": "symfony/routing", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "7f8e44fc498972466f0841c3e48dc555f23bdf53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/7f8e44fc498972466f0841c3e48dc555f23bdf53", + "reference": "7f8e44fc498972466f0841c3e48dc555f23bdf53", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "psr/log": "~1.0", + "symfony/config": "~4.2", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/dependency-injection": "For loading routes from a service", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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 Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2019-01-29T09:49:29+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "d8bf4424c232b55f4c1816037d3077a89258557e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d8bf4424c232b55f4c1816037d3077a89258557e", + "reference": "d8bf4424c232b55f4c1816037d3077a89258557e", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/var-dumper": "^4.1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "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 blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "time": "2019-01-16T20:35:37+00:00" + }, + { + "name": "symfony/yaml", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d461670ee145092b7e2a56c1da7118f19cadadb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d461670ee145092b7e2a56c1da7118f19cadadb0", + "reference": "d461670ee145092b7e2a56c1da7118f19cadadb0", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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 Yaml Component", + "homepage": "https://symfony.com", + "time": "2019-01-16T20:35:37+00:00" + }, + { + "name": "zendframework/zend-code", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-code.git", + "reference": "c21db169075c6ec4b342149f446e7b7b724f95eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb", + "reference": "c21db169075c6ec4b342149f446e7b7b724f95eb", + "shasum": "" + }, + "require": { + "php": "^7.1", + "zendframework/zend-eventmanager": "^2.6 || ^3.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "ext-phar": "*", + "phpunit/phpunit": "^6.2.3", + "zendframework/zend-coding-standard": "^1.0.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "zendframework/zend-stdlib": "Zend\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev", + "dev-develop": "3.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides facilities to generate arbitrary code using an object oriented interface", + "homepage": "https://github.com/zendframework/zend-code", + "keywords": [ + "code", + "zf2" + ], + "time": "2018-08-13T20:36:59+00:00" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://github.com/zendframework/zend-eventmanager", + "keywords": [ + "event", + "eventmanager", + "events", + "zf2" + ], + "time": "2018-04-25T15:33:34+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.1.3", + "ext-ctype": "*", + "ext-iconv": "*", + "ext-json": "*" + }, + "platform-dev": [] +} diff --git a/config/bootstrap.php b/config/bootstrap.php new file mode 100644 index 000000000..f6afb4042 --- /dev/null +++ b/config/bootstrap.php @@ -0,0 +1,21 @@ +=1.2) +if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) { + $_SERVER += $env; + $_ENV += $env; +} elseif (!class_exists(Dotenv::class)) { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} else { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__).'/.env'); +} + +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 index 000000000..23134b421 --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,9 @@ + ['all' => true], + Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], +]; diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml new file mode 100644 index 000000000..93e620efa --- /dev/null +++ b/config/packages/cache.yaml @@ -0,0 +1,19 @@ +framework: + cache: + # Put the unique name of your app here: the prefix seed + # is used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The app cache caches to the filesystem by default. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu + + # Namespaced pools use the above "app" backend by default + #pools: + #my.dedicated.cache: ~ diff --git a/config/packages/dev/routing.yaml b/config/packages/dev/routing.yaml new file mode 100644 index 000000000..4116679a2 --- /dev/null +++ b/config/packages/dev/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: true diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml new file mode 100644 index 000000000..9521fad7d --- /dev/null +++ b/config/packages/doctrine.yaml @@ -0,0 +1,29 @@ +parameters: + # Adds a fallback DATABASE_URL if the env var is not set. + # This allows you to run cache:warmup even if your + # environment variables are not available yet. + # You should not need to change this value. + env(DATABASE_URL): '' + +doctrine: + dbal: + # configure these for your database server + driver: 'pdo_mysql' + server_version: '5.7' + charset: utf8mb4 + default_table_options: + charset: utf8mb4 + collate: utf8mb4_unicode_ci + + url: '%env(resolve:DATABASE_URL)%' + orm: + auto_generate_proxy_classes: true + naming_strategy: doctrine.orm.naming_strategy.underscore + auto_mapping: true + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml new file mode 100644 index 000000000..7f6fadd9d --- /dev/null +++ b/config/packages/doctrine_migrations.yaml @@ -0,0 +1,6 @@ +doctrine_migrations: + dir_name: '%kernel.project_dir%/src/Migrations' + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + namespace: DoctrineMigrations + organize_migrations: "BY_YEAR_AND_MONTH" diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml new file mode 100644 index 000000000..d3f884c4b --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,17 @@ +framework: + secret: '%env(APP_SECRET)%' + #default_locale: en + #csrf_protection: true + #http_method_override: true + + # Enables session support. Note that the session will ONLY be started if you read or write from it. + # Remove or comment this section to explicitly disable session support. + session: + handler_id: ~ + cookie_secure: auto + cookie_samesite: lax + + #esi: true + #fragments: true + php_errors: + log: true diff --git a/config/packages/prod/doctrine.yaml b/config/packages/prod/doctrine.yaml new file mode 100644 index 000000000..0a7c53b44 --- /dev/null +++ b/config/packages/prod/doctrine.yaml @@ -0,0 +1,32 @@ +doctrine: + orm: + auto_generate_proxy_classes: false + metadata_cache_driver: + type: service + id: doctrine.system_cache_provider + query_cache_driver: + type: service + id: doctrine.system_cache_provider + result_cache_driver: + type: service + id: doctrine.result_cache_provider + +services: + doctrine.result_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.result_cache_pool' + doctrine.system_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.system_cache_pool' + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml new file mode 100644 index 000000000..a15c4ec68 --- /dev/null +++ b/config/packages/routing.yaml @@ -0,0 +1,4 @@ +framework: + router: + strict_requirements: ~ + utf8: true diff --git a/config/packages/sensio_framework_extra.yaml b/config/packages/sensio_framework_extra.yaml new file mode 100644 index 000000000..1821ccc07 --- /dev/null +++ b/config/packages/sensio_framework_extra.yaml @@ -0,0 +1,3 @@ +sensio_framework_extra: + router: + annotations: false diff --git a/config/packages/test/framework.yaml b/config/packages/test/framework.yaml new file mode 100644 index 000000000..d051c8400 --- /dev/null +++ b/config/packages/test/framework.yaml @@ -0,0 +1,4 @@ +framework: + test: true + session: + storage_id: session.storage.mock_file diff --git a/config/packages/test/routing.yaml b/config/packages/test/routing.yaml new file mode 100644 index 000000000..4116679a2 --- /dev/null +++ b/config/packages/test/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: true diff --git a/config/routes.yaml b/config/routes.yaml new file mode 100644 index 000000000..bc1ffb86c --- /dev/null +++ b/config/routes.yaml @@ -0,0 +1,9 @@ +#index: +# path: / +# controller: App\Controller\DefaultController::index + +# first, run composer req annotations +controllers: + resource: ../src/Controller/ + type: annotation + prefix: /api diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml new file mode 100644 index 000000000..d49a502a8 --- /dev/null +++ b/config/routes/annotations.yaml @@ -0,0 +1,3 @@ +controllers: + resource: ../../src/Controller/ + type: annotation diff --git a/config/services.yaml b/config/services.yaml new file mode 100644 index 000000000..b16522a49 --- /dev/null +++ b/config/services.yaml @@ -0,0 +1,42 @@ +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + # this means you cannot fetch services directly from the container via $container->get() + # if you need to do this, you can override this setting on individual services + public: false + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Kernel.php}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # repositories + App\Repository\UserRepository: + factory: 'doctrine.orm.entity_manager:getRepository' + arguments: ['App\Entity\User'] + + # services + App\Service\UserImporter: + class: 'App\Service\UserImporter' + arguments: + - '@doctrine.orm.entity_manager' + - '@App\Repository\UserRepository' + - '%kernel.project_dir%/%env(resolve:USERS_FILE_PATH)%' + - '%kernel.project_dir%/%env(resolve:PRIORITY1_FILE_PATH)%' + - '%kernel.project_dir%/%env(resolve:PRIORITY2_FILE_PATH)%' \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..27c10fc39 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,58 @@ +version: '3.6' + +volumes: + mysql-data: + driver: local + es-data: + driver: local + +services: + api: + image: ambientum/php:7.1-caddy + container_name: api + ports: + - 8080:8080 + volumes: + - ./:/var/www/app + links: + - db + db: + image: mysql:5.7 + container_name: db + ports: + - 3306:3306 + volumes: + - mysql-data:/var/lib/mysql + environment: + - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + - MYSQL_DATABASE=${MYSQL_DATABASE} + - MYSQL_USER=${MYSQL_USER} + - MYSQL_PASSWORD=${MYSQL_PASSWORD} +# elasticsearch: +# image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0 +# container_name: elasticsearch +# environment: +# - node.name=es0 +# - cluster.name=docker-cluster +# - bootstrap.memory_lock=true +# - "ES_JAVA_OPTS=-Xms512m -Xmx512m" +# ulimits: +# nproc: 65535 +# memlock: +# soft: -1 +# hard: -1 +# cap_add: +# - ALL +# privileged: true +# deploy: +# mode: global +# restart_policy: +# condition: on-failure +# delay: 5s +# max_attempts: 3 +# window: 120s +# volumes: +# - es-data:/usr/share/elasticsearch/data +# ports: +# - 9200:9200 +# - 9300:9300 \ No newline at end of file diff --git a/public/index.php b/public/index.php new file mode 100644 index 000000000..e30f90c03 --- /dev/null +++ b/public/index.php @@ -0,0 +1,27 @@ +handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/src/Controller/.gitignore b/src/Controller/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/src/Controller/AbstractController.php b/src/Controller/AbstractController.php new file mode 100644 index 000000000..1a50e0b63 --- /dev/null +++ b/src/Controller/AbstractController.php @@ -0,0 +1,38 @@ + 'success', + 'msg' => $msg, + ], $statusCode); + } + + /** + * @param \Exception $e + * @param int $statusCode + * @return JsonResponse + */ + protected function getErrorJsonResponse(\Exception $e, $statusCode = JsonResponse::HTTP_INTERNAL_SERVER_ERROR) + { + return new JsonResponse([ + 'status' => 'error', + 'msg' => $e->getMessage(), + ], $statusCode); + } +} \ No newline at end of file diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php new file mode 100644 index 000000000..22d0e9df7 --- /dev/null +++ b/src/Controller/UserController.php @@ -0,0 +1,85 @@ +userRepository = $userRepository; + $this->userImporter = $userImporter; + } + + /** + * @Route("/import", name="_import") + * @Method({"GET"}) + * + * @return JsonResponse + */ + public function import() + { + try { + $this->userImporter->import(); + + return $this->getSuccessJsonResponse( + 'Users in the importation process. It may take a few minutes.', + JsonResponse::HTTP_CREATED + ); + } catch (\Exception $e) { + return $this->getErrorJsonResponse($e); + } + } + + /** + * @Route("", name="_get_users") + * @Method({"GET"}) + * + * @param Request $request + * @return JsonResponse + */ + public function getUsers(Request $request) + { + try { + return new JsonResponse([ + 'status' => 'success', + 'users' => $this->userRepository->findByFilter([ + 'name' => $request->get('name', ''), + 'username' => $request->get('username', '') + ], + $request->get('page', 0), + $request->get('size', 15)), + ]); + } catch (\Exception $e) { + return $this->getErrorJsonResponse($e); + } + } +} \ No newline at end of file diff --git a/src/Entity/.gitignore b/src/Entity/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/src/Entity/User.php b/src/Entity/User.php new file mode 100644 index 000000000..e38149267 --- /dev/null +++ b/src/Entity/User.php @@ -0,0 +1,153 @@ +id = $id; + $this->name = $name; + $this->username = $username; + $this->priority = $priority; + } + + /** + * @param string $id + */ + public function setId(string $id): void + { + $this->id = $id; + } + + /** + * @param string $name + */ + public function setName(string $name): void + { + $this->name = $name; + } + + /** + * @param string $username + */ + public function setUsername(string $username): void + { + $this->username = $username; + } + + /** + * @param int $priority + */ + public function setPriority(int $priority): void + { + $this->priority = $priority; + } + + /** + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * @return string + */ + public function getUsername(): string + { + return $this->username; + } + + /** + * @return int + */ + public function getPriority(): int + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return [ + 'id' => $this->getId(), + 'name' => $this->getName(), + 'username' => $this->getUsername(), + 'priority' => $this->getPriority() + ]; + } +} \ No newline at end of file diff --git a/src/Kernel.php b/src/Kernel.php new file mode 100644 index 000000000..d507edfa4 --- /dev/null +++ b/src/Kernel.php @@ -0,0 +1,48 @@ +getProjectDir().'/config/bundles.php'; + foreach ($contents as $class => $envs) { + if ($envs[$this->environment] ?? $envs['all'] ?? false) { + yield new $class(); + } + } + } + + protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) + { + $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); + $container->setParameter('container.dumper.inline_class_loader', true); + $confDir = $this->getProjectDir().'/config'; + + $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes) + { + $confDir = $this->getProjectDir().'/config'; + + $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); + } +} diff --git a/src/Migrations/.gitignore b/src/Migrations/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/src/Migrations/2019/02/Version20190215003733.php b/src/Migrations/2019/02/Version20190215003733.php new file mode 100644 index 000000000..495a163e3 --- /dev/null +++ b/src/Migrations/2019/02/Version20190215003733.php @@ -0,0 +1,40 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql(" + CREATE TABLE picpay.user ( + pk int(11) NOT NULL AUTO_INCREMENT, + id varchar(50) NOT NULL, + name varchar(100) NOT NULL, + username varchar(100) NOT NULL, + priority int(11) NOT NULL DEFAULT '999999', + PRIMARY KEY (pk), + KEY id (id) + ) ENGINE=InnoDB DEFAULT CHARSET=latin1; + "); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql(" + DROP TABLE picpay.user; + "); + } +} diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php new file mode 100644 index 000000000..b0b896497 --- /dev/null +++ b/src/Repository/UserRepository.php @@ -0,0 +1,59 @@ +getEntityManager()->persist($user); + $this->getEntityManager()->flush(); + } + catch (UniqueConstraintViolationException $e) { + throw new \InvalidArgumentException('User already exists.'); + } + } + + /** + * @param array $filters + * @param int $page + * @param int $size + * + * @return array + */ + public function findByFilter(array $filters, int $page = 0, int $size = 15) + { + $queryBuilder = $this->createQueryBuilder('user'); + if(!empty($filters['name'])) { + $queryBuilder->andWhere('user.name LIKE :name') + ->setParameter('name', '%'.$filters['name'].'%'); + } + if(!empty($filters['username'])) { + $queryBuilder->andWhere('user.username LIKE :username') + ->setParameter('username', '%'.$filters['username'].'%'); + } + $queryBuilder->setFirstResult($page * $size); + $queryBuilder->setMaxResults($size); + $queryBuilder->orderBy('user.priority', 'ASC'); + $queryBuilder->addOrderBy('user.name', 'ASC'); + + return $queryBuilder->getQuery()->getResult(); + } +} \ No newline at end of file diff --git a/src/Service/UserImporter.php b/src/Service/UserImporter.php new file mode 100644 index 000000000..e436932a4 --- /dev/null +++ b/src/Service/UserImporter.php @@ -0,0 +1,120 @@ +entityManager = $entityManager; + $this->userRepository = $userRepository; + $this->usersFilePath = $usersFilePath; + $this->priorityFilesPath[] = $priority1FilePath; + $this->priorityFilesPath[] = $priority2FilePath; + } + + /** + * @throws \Doctrine\ORM\OptimisticLockException + * @throws \Doctrine\ORM\ORMException + * @throws \Exception + */ + public function import(): void + { + $batchSize = 1000; + + if (($handle = \fopen($this->usersFilePath, "r")) !== FALSE) { + $i = 0; + while (($data = \fgetcsv($handle, 1000, ",")) !== FALSE) { + $user = $this->build($data); + $this->entityManager->persist($user); + if (($i % $batchSize) === 0) { + $this->entityManager->flush(); + $this->entityManager->clear(); + } + ++$i; + } + \fclose($handle); + $this->entityManager->flush(); + $this->entityManager->clear(); + } + + $priority = 0; + foreach($this->priorityFilesPath as $priorityFilePath) { + if (($handle = \fopen($priorityFilePath, "r")) !== FALSE) { + $i = 0; + while (($data = \fgetcsv($handle, 1000, ",")) !== FALSE) { + $user = $this->userRepository->findOneBy(['id' => $data]); + if($user instanceof User) { + $user->setPriority($priority); + $this->entityManager->persist($user); + if (($i % $batchSize) === 0) { + $this->entityManager->flush(); + $this->entityManager->clear(); + } + ++$i; + } + } + \fclose($handle); + $this->entityManager->flush(); + $this->entityManager->clear(); + ++$priority; + } + } + } + + /** + * @param array $data User's data + * + * @return User + * @throws \Exception + */ + public function build(array $data): User + { + + return new User( + $data[0] ?? '', + $data[1] ?? '', + $data[2] ?? '' + ); + } +} \ No newline at end of file diff --git a/symfony.lock b/symfony.lock new file mode 100644 index 000000000..c98780e4b --- /dev/null +++ b/symfony.lock @@ -0,0 +1,185 @@ +{ + "doctrine/annotations": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" + } + }, + "doctrine/cache": { + "version": "v1.8.0" + }, + "doctrine/collections": { + "version": "v1.5.0" + }, + "doctrine/common": { + "version": "v2.10.0" + }, + "doctrine/dbal": { + "version": "v2.9.2" + }, + "doctrine/doctrine-bundle": { + "version": "1.6", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.6", + "ref": "453e89b78ded666f351617baca5ae40d20622351" + } + }, + "doctrine/doctrine-cache-bundle": { + "version": "1.3.5" + }, + "doctrine/doctrine-migrations-bundle": { + "version": "1.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.2", + "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" + } + }, + "doctrine/event-manager": { + "version": "v1.0.0" + }, + "doctrine/inflector": { + "version": "v1.3.0" + }, + "doctrine/instantiator": { + "version": "1.1.0" + }, + "doctrine/lexer": { + "version": "v1.0.1" + }, + "doctrine/migrations": { + "version": "v1.8.1" + }, + "doctrine/orm": { + "version": "v2.6.3" + }, + "doctrine/persistence": { + "version": "v1.1.0" + }, + "doctrine/reflection": { + "version": "v1.0.0" + }, + "jdorn/sql-formatter": { + "version": "v1.2.17" + }, + "ocramius/package-versions": { + "version": "1.3.0" + }, + "ocramius/proxy-manager": { + "version": "2.2.2" + }, + "psr/cache": { + "version": "1.0.1" + }, + "psr/container": { + "version": "1.0.0" + }, + "psr/log": { + "version": "1.1.0" + }, + "psr/simple-cache": { + "version": "1.0.1" + }, + "sensio/framework-extra-bundle": { + "version": "5.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.2", + "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" + } + }, + "symfony/cache": { + "version": "v4.2.3" + }, + "symfony/config": { + "version": "v4.2.3" + }, + "symfony/console": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "0fa049c19069a65f52c1c181d64be3de672c1504" + } + }, + "symfony/contracts": { + "version": "v1.0.2" + }, + "symfony/debug": { + "version": "v4.2.3" + }, + "symfony/dependency-injection": { + "version": "v4.2.3" + }, + "symfony/doctrine-bridge": { + "version": "v4.2.3" + }, + "symfony/dotenv": { + "version": "v4.2.3" + }, + "symfony/event-dispatcher": { + "version": "v4.2.3" + }, + "symfony/filesystem": { + "version": "v4.2.3" + }, + "symfony/finder": { + "version": "v4.2.3" + }, + "symfony/flex": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "dc3fc2e0334a4137c47cfd5a3ececc601fa61a0b" + } + }, + "symfony/framework-bundle": { + "version": "4.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.2", + "ref": "5bb3a8c27df824d195fa68bb635d074854f8498f" + } + }, + "symfony/http-foundation": { + "version": "v4.2.3" + }, + "symfony/http-kernel": { + "version": "v4.2.3" + }, + "symfony/polyfill-mbstring": { + "version": "v1.10.0" + }, + "symfony/routing": { + "version": "4.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.2", + "ref": "5374e24d508ba8fd6ba9eb15170255fdb778316a" + } + }, + "symfony/var-exporter": { + "version": "v4.2.3" + }, + "symfony/yaml": { + "version": "v4.2.3" + }, + "zendframework/zend-code": { + "version": "3.3.1" + }, + "zendframework/zend-eventmanager": { + "version": "3.2.1" + } +} From ab25b0789dfeffd7cd698c257e80ef87e54f7be8 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Mon, 18 Feb 2019 13:27:23 -0300 Subject: [PATCH 02/21] Add composer script installation --- cli/composer-install | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 cli/composer-install diff --git a/cli/composer-install b/cli/composer-install new file mode 100755 index 000000000..83dc0f913 --- /dev/null +++ b/cli/composer-install @@ -0,0 +1,17 @@ +#!/bin/sh + +EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)" +php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" +ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" + +if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] +then + >&2 echo 'ERROR: Invalid installer signature' + rm composer-setup.php + exit 1 +fi + +php composer-setup.php --quiet +RESULT=$? +rm composer-setup.php +exit $RESULT \ No newline at end of file From ff95a81ce769178636f98330f9efad8e8ba70eac Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Mon, 18 Feb 2019 13:27:50 -0300 Subject: [PATCH 03/21] Fix data files variables --- .env.dist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.dist b/.env.dist index bd75fcc35..a6eb9e249 100644 --- a/.env.dist +++ b/.env.dist @@ -47,6 +47,6 @@ MYSQL_PASSWORD= #PRIORITY1_FILE_PATH=lista_relevancia_1.txt #PRIORITY2_FILE_PATH=lista_relevancia_2.txt -USERS_FILE_PATH=var/data/users.csv -PRIORITY1_FILE_PATH=lista_relevancia_1.txt -PRIORITY2_FILE_PATH=lista_relevancia_2.txt \ No newline at end of file +USERS_FILE_PATH= +PRIORITY1_FILE_PATH= +PRIORITY2_FILE_PATH= \ No newline at end of file From ad0032154b1170e4db69e2f4487744425f7eb452 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Mon, 18 Feb 2019 13:34:08 -0300 Subject: [PATCH 04/21] Update deploy script --- cli/deploy | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cli/deploy b/cli/deploy index 9e7508349..c6b981db6 100755 --- a/cli/deploy +++ b/cli/deploy @@ -1,7 +1,10 @@ #!/bin/bash -# Cria tabela do doctrine migrations -#docker-compose run --rm api php bin/console doctrine:migrations:status +# Install Cmopposer +./cli/composer-install -# Cria as tabelas do banco de dados -#docker exec "$CONTAINER_WEB_NAME" bin/console doctrine:migrations:migrate -vvv --allow-no-migration --no-interaction \ No newline at end of file +# Create doctrine migrations table and build tables +docker-compose run --rm api php bin/console doctrine:migrations:migrate + +# Install PHP dependencies +docker-compose run --rm api php composer.phar install \ No newline at end of file From 343010abe436051cafa4febd112ecba1a5697820 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Mon, 18 Feb 2019 15:23:51 -0300 Subject: [PATCH 05/21] Update documentation --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5a9a343a6..a46953be5 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,5 @@ Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu n ### Instalação - Construir containers: ```docker-compose up``` -- Instalar dependências PHP: ```docker-compose run --rm api php composer.phar install``` -- Construir base de dados: ```docker-compose run --rm api php bin/console doctrine:migrations:migrate``` -- carregar base de dados MySQL: http://localhost:8080/api/user/import \ No newline at end of file +- Realizar deploy: ```./cli/deploy``` +- Carregar base de dados MySQL: http://localhost:8080/api/user/import \ No newline at end of file From f6713989f269918a203330b01af691b30f90d749 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Mon, 18 Feb 2019 15:40:21 -0300 Subject: [PATCH 06/21] Add composer.json file --- .gitignore | 1 - composer.json | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 composer.json diff --git a/.gitignore b/.gitignore index 34f1ea04c..cf690c9d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ ### Composer ### composer.phar -composer.json ### Composer ### ### Data ### diff --git a/composer.json b/composer.json new file mode 100644 index 000000000..3354e06bd --- /dev/null +++ b/composer.json @@ -0,0 +1,64 @@ +{ + "name": "picpay/rasarmento", + "type": "project", + "license": "proprietary", + "require": { + "php": "^7.1.3", + "ext-ctype": "*", + "ext-iconv": "*", + "ext-json": "*", + "doctrine/doctrine-migrations-bundle": "^1.2", + "doctrine/orm": "^2.6", + "sensio/framework-extra-bundle": "^5.1", + "symfony/console": "4.2.*", + "symfony/dotenv": "4.2.*", + "symfony/flex": "^1.1", + "symfony/framework-bundle": "4.2.*", + "symfony/yaml": "4.2.*" + }, + "config": { + "preferred-install": { + "*": "dist" + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "paragonie/random_compat": "2.*", + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php71": "*", + "symfony/polyfill-php70": "*", + "symfony/polyfill-php56": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "4.2.*" + } + } +} From 128b9e1c7cc1ecfffeb9773c233fef1040979475 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Mon, 18 Feb 2019 16:54:03 -0300 Subject: [PATCH 07/21] Fix success message --- src/Controller/UserController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 22d0e9df7..0eff62c91 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -51,7 +51,7 @@ public function import() $this->userImporter->import(); return $this->getSuccessJsonResponse( - 'Users in the importation process. It may take a few minutes.', + 'Users imported.', JsonResponse::HTTP_CREATED ); } catch (\Exception $e) { From 49380fcdac71410dba5dcd65d74356d284816cf0 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Tue, 19 Feb 2019 08:54:47 -0300 Subject: [PATCH 08/21] Fix documentation --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a46953be5..47bc424fb 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,6 @@ Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu n - No arquivo ***.env*** preencher os dados de configuração do container docker ***mysql*** - No arquivo ***.env*** preencher os dados da URL de conexão do doctrine - No arquivo ***.env*** preencher os locais dos arquivos com os dados de usuários - - Obs: Para cada configuração será fornecido um exemplo ### Instalação From de2e154e592fc81fda3023436345e5a76ca109dc Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Tue, 19 Feb 2019 08:56:14 -0300 Subject: [PATCH 09/21] Update deploy script --- cli/deploy | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cli/deploy b/cli/deploy index c6b981db6..ed2a4edcf 100755 --- a/cli/deploy +++ b/cli/deploy @@ -1,10 +1,10 @@ #!/bin/bash # Install Cmopposer -./cli/composer-install - -# Create doctrine migrations table and build tables -docker-compose run --rm api php bin/console doctrine:migrations:migrate +docker-compose run --rm api sudo cli/composer-install # Install PHP dependencies -docker-compose run --rm api php composer.phar install \ No newline at end of file +docker-compose run --rm api sudo php composer.phar install + +# Create doctrine migrations table and build tables +docker-compose run --rm api php bin/console doctrine:migrations:migrate \ No newline at end of file From 83767abc30ea78c5f9acdcca01fb29879cb79f4f Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Tue, 19 Feb 2019 08:56:39 -0300 Subject: [PATCH 10/21] Exclude data file --- .gitignore | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index cf690c9d3..08bd3f737 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,6 @@ -### Composer ### +###> Composer ### composer.phar -### Composer ### - -### Data ### -/data/ -### Data ### +###< Composer ### ###> symfony/framework-bundle ### /.env.local @@ -16,4 +12,5 @@ composer.phar /.idea/ ###< symfony/framework-bundle ### -.env \ No newline at end of file +.env +*.csv \ No newline at end of file From 0b0e4c3de0507e60513455818b38dae8a475da9e Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Tue, 19 Feb 2019 08:57:07 -0300 Subject: [PATCH 11/21] Update data file path --- .env.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.dist b/.env.dist index a6eb9e249..f228df34c 100644 --- a/.env.dist +++ b/.env.dist @@ -43,7 +43,7 @@ MYSQL_PASSWORD= # Data files #Example: -#USERS_FILE_PATH=var/data/users.csv +#USERS_FILE_PATH=users.csv #PRIORITY1_FILE_PATH=lista_relevancia_1.txt #PRIORITY2_FILE_PATH=lista_relevancia_2.txt From 2d32961e5f51b13d1434048a62e392afa46d1e8a Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Fri, 22 Feb 2019 10:35:23 -0300 Subject: [PATCH 12/21] Build API Elasticsearch version --- .env.dist | 29 +- README.md | 3 +- cli/deploy | 5 +- composer.json | 2 + composer.lock | 479 ++++++++++++++++++++++++- config/services.yaml | 14 + docker-compose.yml | 58 +-- src/Controller/UserController.php | 98 ++++- src/Entity/Elastic/PicPay.php | 28 ++ src/Entity/Elastic/User.php | 35 ++ src/Service/Elastic/ClientFactory.php | 23 ++ src/Service/Elastic/ElasticManager.php | 170 +++++++++ src/Service/Elastic/PicPayManager.php | 43 +++ src/Service/Elastic/UserImporter.php | 141 ++++++++ src/Service/Elastic/UserManager.php | 101 ++++++ src/Service/UserImporter.php | 4 +- symfony.lock | 27 ++ 17 files changed, 1213 insertions(+), 47 deletions(-) create mode 100644 src/Entity/Elastic/PicPay.php create mode 100644 src/Entity/Elastic/User.php create mode 100644 src/Service/Elastic/ClientFactory.php create mode 100644 src/Service/Elastic/ElasticManager.php create mode 100644 src/Service/Elastic/PicPayManager.php create mode 100644 src/Service/Elastic/UserImporter.php create mode 100644 src/Service/Elastic/UserManager.php diff --git a/.env.dist b/.env.dist index f228df34c..edb7810bb 100644 --- a/.env.dist +++ b/.env.dist @@ -24,17 +24,18 @@ APP_SECRET=ebfb6dfbab639815bc1da66e6bf7509e # Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" # Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls -#Example: DATABASE_URL=mysql://user:userpass00@db:3306/picpay?charset=utf8mb4&serverVersion=5.7 +# Example: +# DATABASE_URL=mysql://user:userpass00@db:3306/picpay?charset=utf8mb4&serverVersion=5.7 DATABASE_URL=mysql://:db:3306/?charset=utf8mb4&serverVersion=5.7 ###< doctrine/doctrine-bundle ### # Configuration of the mysql docker container -#Example: -#MYSQL_ROOT_PASSWORD=rootpass00 -#MYSQL_DATABASE=picpay -#MYSQL_USER=user -#MYSQL_PASSWORD=userpass00 +# Example: +# MYSQL_ROOT_PASSWORD=rootpass00 +# MYSQL_DATABASE=picpay +# MYSQL_USER=user +# MYSQL_PASSWORD=userpass00 MYSQL_ROOT_PASSWORD= MYSQL_DATABASE= @@ -42,11 +43,17 @@ MYSQL_USER= MYSQL_PASSWORD= # Data files -#Example: -#USERS_FILE_PATH=users.csv -#PRIORITY1_FILE_PATH=lista_relevancia_1.txt -#PRIORITY2_FILE_PATH=lista_relevancia_2.txt +# Example: +# USERS_FILE_PATH=users.csv +# PRIORITY1_FILE_PATH=lista_relevancia_1.txt +# PRIORITY2_FILE_PATH=lista_relevancia_2.txt USERS_FILE_PATH= PRIORITY1_FILE_PATH= -PRIORITY2_FILE_PATH= \ No newline at end of file +PRIORITY2_FILE_PATH= + +# Elasticsearch base URI +# Example: +# ELASTIC_HTTP_CLIENT_BASE_URI=es:9200 + +ELASTIC_HTTP_CLIENT_BASE_URI= \ No newline at end of file diff --git a/README.md b/README.md index 47bc424fb..e96b41346 100644 --- a/README.md +++ b/README.md @@ -49,4 +49,5 @@ Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu n ### Instalação - Construir containers: ```docker-compose up``` - Realizar deploy: ```./cli/deploy``` -- Carregar base de dados MySQL: http://localhost:8080/api/user/import \ No newline at end of file +- Carregar base de dados MySQL: http://localhost:8080/api/user/import +- Carregar base de dados Elasticsearch: http://localhost:8080/api/user/es/import \ No newline at end of file diff --git a/cli/deploy b/cli/deploy index ed2a4edcf..570990e16 100755 --- a/cli/deploy +++ b/cli/deploy @@ -7,4 +7,7 @@ docker-compose run --rm api sudo cli/composer-install docker-compose run --rm api sudo php composer.phar install # Create doctrine migrations table and build tables -docker-compose run --rm api php bin/console doctrine:migrations:migrate \ No newline at end of file +docker-compose run --rm api php bin/console doctrine:migrations:migrate + +# Create elasticsearch indices/types +wget http://localhost:8080/api/user/es/reset \ No newline at end of file diff --git a/composer.json b/composer.json index 3354e06bd..0ca4289c2 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,8 @@ "ext-json": "*", "doctrine/doctrine-migrations-bundle": "^1.2", "doctrine/orm": "^2.6", + "elasticsearch/elasticsearch": "^6.1", + "guzzlehttp/guzzle": "^6.3", "sensio/framework-extra-bundle": "^5.1", "symfony/console": "4.2.*", "symfony/dotenv": "4.2.*", diff --git a/composer.lock b/composer.lock index 9e9fe1771..bc51d239b 100644 --- a/composer.lock +++ b/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": "f0fbd1fb9db75a6d9d8879c6ea12da9d", + "content-hash": "34d6b73f5fbc1c8df74ead667f31414e", "packages": [ { "name": "doctrine/annotations", @@ -1178,6 +1178,347 @@ ], "time": "2018-06-14T14:45:07+00:00" }, + { + "name": "elasticsearch/elasticsearch", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/elastic/elasticsearch-php.git", + "reference": "b237a37b2cdf23a5a17fd3576cdea771394ad00d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/b237a37b2cdf23a5a17fd3576cdea771394ad00d", + "reference": "b237a37b2cdf23a5a17fd3576cdea771394ad00d", + "shasum": "" + }, + "require": { + "ext-json": ">=1.3.7", + "guzzlehttp/ringphp": "~1.0", + "php": "^7.0", + "psr/log": "~1.0" + }, + "require-dev": { + "cpliakas/git-wrapper": "~1.0", + "doctrine/inflector": "^1.1", + "mockery/mockery": "0.9.4", + "phpstan/phpstan-shim": "0.8.3", + "phpunit/phpunit": "6.3.0", + "squizlabs/php_codesniffer": "3.0.2", + "symfony/finder": "^2.8", + "symfony/yaml": "^2.8" + }, + "suggest": { + "ext-curl": "*", + "monolog/monolog": "Allows for client-level logging and tracing" + }, + "type": "library", + "autoload": { + "psr-4": { + "Elasticsearch\\": "src/Elasticsearch/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Zachary Tong" + } + ], + "description": "PHP Client for Elasticsearch", + "keywords": [ + "client", + "elasticsearch", + "search" + ], + "time": "2019-01-08T18:53:46+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22T15:46:56+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "9f83dded91781a01c63574e387eaa769be769115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", + "reference": "9f83dded91781a01c63574e387eaa769be769115", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2018-12-04T20:46:45+00:00" + }, + { + "name": "guzzlehttp/ringphp", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/RingPHP.git", + "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/5e2a174052995663dd68e6b5ad838afd47dd615b", + "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b", + "shasum": "" + }, + "require": { + "guzzlehttp/streams": "~3.0", + "php": ">=5.4.0", + "react/promise": "~2.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "ext-curl": "Guzzle will use specific adapters if cURL is present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Ring\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.", + "time": "2018-07-31T13:22:33+00:00" + }, + { + "name": "guzzlehttp/streams", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/streams.git", + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5", + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Provides a simple abstraction over streams of data", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "stream" + ], + "time": "2014-10-12T19:18:40+00:00" + }, { "name": "jdorn/sql-formatter", "version": "v1.2.17", @@ -1441,6 +1782,56 @@ ], "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": "psr/log", "version": "1.1.0", @@ -1536,6 +1927,92 @@ ], "time": "2017-10-23T01:57:42+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.0", + "satooshi/php-coveralls": ">=1.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2016-02-11T07:05:27+00:00" + }, + { + "name": "react/promise", + "version": "v2.7.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "time": "2019-01-07T21:25:54+00:00" + }, { "name": "sensio/framework-extra-bundle", "version": "v5.2.4", diff --git a/config/services.yaml b/config/services.yaml index b16522a49..e600a459b 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -32,6 +32,11 @@ services: arguments: ['App\Entity\User'] # services + Elasticsearch\Client: + class: 'Elasticsearch\Client' + factory: 'App\Service\Elastic\ClientFactory:createClient' + arguments: ['%env(ELASTIC_HTTP_CLIENT_BASE_URI)%'] + App\Service\UserImporter: class: 'App\Service\UserImporter' arguments: @@ -39,4 +44,13 @@ services: - '@App\Repository\UserRepository' - '%kernel.project_dir%/%env(resolve:USERS_FILE_PATH)%' - '%kernel.project_dir%/%env(resolve:PRIORITY1_FILE_PATH)%' + - '%kernel.project_dir%/%env(resolve:PRIORITY2_FILE_PATH)%' + + App\Service\Elastic\UserImporter: + class: 'App\Service\Elastic\UserImporter' + arguments: + - '@Elasticsearch\Client' + - '@App\Service\Elastic\UserManager' + - '%kernel.project_dir%/%env(resolve:USERS_FILE_PATH)%' + - '%kernel.project_dir%/%env(resolve:PRIORITY1_FILE_PATH)%' - '%kernel.project_dir%/%env(resolve:PRIORITY2_FILE_PATH)%' \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 27c10fc39..6a77eacc1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,7 @@ services: - ./:/var/www/app links: - db + - es db: image: mysql:5.7 container_name: db @@ -28,31 +29,32 @@ services: - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} -# elasticsearch: -# image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0 -# container_name: elasticsearch -# environment: -# - node.name=es0 -# - cluster.name=docker-cluster -# - bootstrap.memory_lock=true -# - "ES_JAVA_OPTS=-Xms512m -Xmx512m" -# ulimits: -# nproc: 65535 -# memlock: -# soft: -1 -# hard: -1 -# cap_add: -# - ALL -# privileged: true -# deploy: -# mode: global -# restart_policy: -# condition: on-failure -# delay: 5s -# max_attempts: 3 -# window: 120s -# volumes: -# - es-data:/usr/share/elasticsearch/data -# ports: -# - 9200:9200 -# - 9300:9300 \ No newline at end of file + es: + image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0 + container_name: es + environment: + - node.name=es + - cluster.name=docker-cluster + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + command: bash -c "sysctl -w vm.max_map_count=262144 && /usr/local/bin/docker-entrypoint.sh" + ulimits: + nproc: 65535 + memlock: + soft: -1 + hard: -1 + cap_add: + - ALL + privileged: true + deploy: + mode: global + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 3 + window: 120s + volumes: + - es-data:/usr/share/elasticsearch/data + ports: + - 9200:9200 + - 9300:9300 \ No newline at end of file diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 0eff62c91..2745b6d52 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -3,6 +3,8 @@ namespace App\Controller; use App\Service\UserImporter; +use App\Service\Elastic\UserImporter as ElasticUserImporter; +use App\Service\Elastic\UserManager as ElasticUserManager; use App\Repository\UserRepository; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; @@ -27,16 +29,30 @@ class UserController extends AbstractController */ protected $userImporter; + /** + * @var ElasticUserImporter + */ + protected $elasticUserImporter; + + /** + * @var ElasticUserManager + */ + protected $elasticUserManager; + /** * UserController constructor. * * @param UserRepository $userRepository * @param UserImporter $userImporter + * @param ElasticUserImporter $elasticUserImporter + * @param ElasticUserManager $elasticUserManager */ - public function __construct(UserRepository $userRepository, UserImporter $userImporter) + public function __construct(UserRepository $userRepository, UserImporter $userImporter, ElasticUserImporter $elasticUserImporter, ElasticUserManager $elasticUserManager) { $this->userRepository = $userRepository; $this->userImporter = $userImporter; + $this->elasticUserImporter = $elasticUserImporter; + $this->elasticUserManager = $elasticUserManager; } /** @@ -59,6 +75,46 @@ public function import() } } + /** + * @Route("/es/reset", name="_elastic_reset") + * @Method({"GET"}) + * + * @return JsonResponse + */ + public function resetElastic() + { + try { + $this->elasticUserManager->reset(); + + return $this->getSuccessJsonResponse( + 'Users Elasticsearch database reseted.', + JsonResponse::HTTP_CREATED + ); + } catch (\Exception $e) { + return $this->getErrorJsonResponse($e); + } + } + + /** + * @Route("/es/import", name="_elastic_import") + * @Method({"GET"}) + * + * @return JsonResponse + */ + public function importElastic() + { + try { + $this->elasticUserImporter->import(); + + return $this->getSuccessJsonResponse( + 'Users imported.', + JsonResponse::HTTP_CREATED + ); + } catch (\Exception $e) { + return $this->getErrorJsonResponse($e); + } + } + /** * @Route("", name="_get_users") * @Method({"GET"}) @@ -75,8 +131,44 @@ public function getUsers(Request $request) 'name' => $request->get('name', ''), 'username' => $request->get('username', '') ], - $request->get('page', 0), - $request->get('size', 15)), + $request->get('page', 0), + $request->get('size', 15)), + ]); + } catch (\Exception $e) { + return $this->getErrorJsonResponse($e); + } + } + + /** + * @Route("/es", name="_elastic_get_users") + * @Method({"GET"}) + * + * @param Request $request + * @return JsonResponse + */ + public function getUsersElastic(Request $request) + { + try { + $criteria = []; + $name = $request->get('name', ''); + if($name !== '') { + $criteria[] = ['wildcard' => ['name' => '*'.$name.'*']]; + } + $username = $request->get('username', ''); + if($username !== '') { + $criteria[] = ['wildcard' => ['username' => '*'.$username.'*']]; + } + + $sort = []; + $sort[] = ['priority' => 'asc', 'name' => 'asc']; + return new JsonResponse([ + 'status' => 'success', + 'users' => $this->elasticUserManager->query([ + 'criteria' => $criteria, + 'page' => $request->get('page', 0), + 'size' => $request->get('size', 15), + 'sort' => $sort + ]) ]); } catch (\Exception $e) { return $this->getErrorJsonResponse($e); diff --git a/src/Entity/Elastic/PicPay.php b/src/Entity/Elastic/PicPay.php new file mode 100644 index 000000000..aa91422a7 --- /dev/null +++ b/src/Entity/Elastic/PicPay.php @@ -0,0 +1,28 @@ + [ + 'normalizer' => [ + 'full_text_lowercase' => [ + 'type' => 'custom', + 'filter' => ['lowercase'] + ] + ] + ] + ]; + } + +} \ No newline at end of file diff --git a/src/Entity/Elastic/User.php b/src/Entity/Elastic/User.php new file mode 100644 index 000000000..3b31aff84 --- /dev/null +++ b/src/Entity/Elastic/User.php @@ -0,0 +1,35 @@ + [ + "name" => [ + "type" => "keyword", + "normalizer" => "full_text_lowercase" + ], + "username" => [ + "type" => "keyword" + ], + "priority" => [ + "type" => "long" + ] + ] + ]; + } + +} diff --git a/src/Service/Elastic/ClientFactory.php b/src/Service/Elastic/ClientFactory.php new file mode 100644 index 000000000..cb599261f --- /dev/null +++ b/src/Service/Elastic/ClientFactory.php @@ -0,0 +1,23 @@ +setHosts([$baseUri])->build(); + } +} \ No newline at end of file diff --git a/src/Service/Elastic/ElasticManager.php b/src/Service/Elastic/ElasticManager.php new file mode 100644 index 000000000..f5128c651 --- /dev/null +++ b/src/Service/Elastic/ElasticManager.php @@ -0,0 +1,170 @@ +client = $client; + } + + /** + * @param string $elasticIndex + * @param string $elasticType + * @param string $id + * + * @return array + */ + public function get(string $elasticIndex, string $elasticType, string $id) + { + try { + $params = []; + $params['index'] = $elasticIndex; + $params['type'] = $elasticType; + $params['id'] = $id; + $response = $this->client->get($params); + + return \array_merge(['id' => $id], $response['_source']); + } + catch(Missing404Exception $exception) { + return []; + } + } + + /** + * @param string $elasticIndex + * @param string $elasticType + * @param array $options + * + * @return array + */ + public function query(string $elasticIndex, string $elasticType, array $options = []) + { + if ($elasticIndex == "") { + throw new \InvalidArgumentException("The elasticsearch index can't be empty"); + } + + if ($elasticType == "") { + throw new \InvalidArgumentException("The elasticsearch type can't be empty"); + } + + $result = []; + + $from = 0; + $size = 10000; + + $params = []; + $params['index'] = $elasticIndex; + $params['type'] = $elasticType; + $params['body']['size'] = (isset($options['size']) ? $options['size'] : $size); + $params['body']['from'] = (isset($options['page']) ? ($options['page'] * $params['body']['size']) : $from); + if (isset($options['criteria'])) { + if (\is_array($options['criteria'])) { + foreach ($options['criteria'] as $criterion) { + $params['body']['query']['bool']['must'][] = $criterion; + } + } + } + if (isset($options['sort'])) { + if (\is_array($options['sort'])) { + foreach ($options['sort'] as $criterion) { + $params['body']['sort'][] = $criterion; + } + } + } + $response = $this->client->search($params); + + $total = $response['hits']['total']; + if ($total > 0) { + foreach ($response['hits']['hits'] as $hit) { + $result[] = \array_merge(['id' => $hit['_id']], $hit['_source']); + } + } + + return $result; + } + + /** + * @param string $elasticIndex + * @param string $elasticType + * @param array $options + * + * @return mixed + */ + public function count(string $elasticIndex, string $elasticType, array $options = []) + { + if ($elasticIndex == "") { + throw new \InvalidArgumentException("The elasticsearch index can't be empty"); + } + + if ($elasticType == "") { + throw new \InvalidArgumentException("The elasticsearch type can't be empty"); + } + + $params = []; + $params['index'] = $elasticIndex; + $params['type'] = $elasticType; + if (isset($options['criteria'])) { + if (\is_array($options['criteria'])) { + foreach ($options['criteria'] as $criterion) { + $params['body']['query']['bool']['must'][] = $criterion; + } + } + } + $response = $this->client->count($params); + + return $response['count']; + } + + /** + * @param string $elasticIndex + * @param string $elasticType + * @param array $data + * + * @throws \Exception + */ + public function update(string $elasticIndex, string $elasticType, array $data) + { + if ($elasticIndex == "") { + throw new \InvalidArgumentException("The elasticsearch index can't be empty"); + } + + if ($elasticType == "") { + throw new \InvalidArgumentException("The elasticsearch type can't be empty"); + } + + try { + $params = []; + $params['index'] = $elasticIndex; + $params['type'] = $elasticType; + $params['id'] = $data['id']; + unset($data['id']); + $params['body'] = [ + 'doc' => $data + ]; + $this->client->update($params); + $this->client->indices()->flush(['index' => $elasticIndex]); + } catch (\Exception $e) { + throw $e; + } + } +} \ No newline at end of file diff --git a/src/Service/Elastic/PicPayManager.php b/src/Service/Elastic/PicPayManager.php new file mode 100644 index 000000000..36d53eb8e --- /dev/null +++ b/src/Service/Elastic/PicPayManager.php @@ -0,0 +1,43 @@ +client = $client; + } + + /** + * + */ + public function reset() + { + $params = []; + $params['index'] = \App\Entity\Elastic\PicPay::INDEX; + if ($this->client->indices()->exists($params)) { + $this->client->indices()->delete($params); + } + + $params['body']['index'] = \App\Entity\Elastic\PicPay::getSettings(); + $this->client->indices()->create($params); + } +} diff --git a/src/Service/Elastic/UserImporter.php b/src/Service/Elastic/UserImporter.php new file mode 100644 index 000000000..d96237a09 --- /dev/null +++ b/src/Service/Elastic/UserImporter.php @@ -0,0 +1,141 @@ +client = $client; + $this->userManager = $userManager; + $this->usersFilePath = $usersFilePath; + $this->priorityFilesPath[] = $priority1FilePath; + $this->priorityFilesPath[] = $priority2FilePath; + } + + /** + * @throws \Exception + */ + public function import(): void + { + $batchSize = 10000; + + $this->client->indices()->putSettings([ + 'index' => \App\Entity\Elastic\PicPay::INDEX, + 'body' => [ + 'settings' => [ + 'refresh_interval' => -1, + 'number_of_replicas' => 0 + ] + ] + ]); + + $params = []; + if (($handle = \fopen($this->usersFilePath, "r")) !== FALSE) { + $i = 1; + while (($data = \fgetcsv($handle, 1000, ",")) !== FALSE) { + $user = $this->buildUser($data); + $params['body'][] = [ + 'index' => [ + '_index' => \App\Entity\Elastic\PicPay::INDEX, + '_type' => \App\Entity\Elastic\User::TYPE, + '_id' => $user['id'], + ] + ]; + unset($user['id']); + $params['body'][] = $user; + + if (($i % $batchSize) === 0) { + $this->client->bulk($params); + $params = []; + } + ++$i; + } + \fclose($handle); + + if (\count($params) > 0) { + $this->client->bulk($params); + } + $this->client->indices()->flush(['index' => \App\Entity\Elastic\PicPay::INDEX]); + } + + $priority = 0; + foreach($this->priorityFilesPath as $priorityFilePath) { + if (($handle = \fopen($priorityFilePath, "r")) !== FALSE) { + while (($data = \fgetcsv($handle, 1000, ",")) !== FALSE) { + $user = $this->userManager->get($data[0]); + if (\count($user) > 0) { + $user['priority'] = $priority; + $this->userManager->update($user); + } + } + \fclose($handle); + ++$priority; + } + } + + $this->client->indices()->putSettings([ + 'index' => \App\Entity\Elastic\PicPay::INDEX, + 'body' => [ + 'settings' => [ + 'refresh_interval' => '1s', + 'number_of_replicas' => 1 + ] + ] + ]); + } + + /** + * @param array $data + * @param int $priority + * + * @return array + */ + private function buildUser(array $data, int $priority = \App\Entity\Elastic\User::PRIORITY_DEFAULT): array + { + return [ + 'id' => $data[0] ?? '', + 'name' => $data[1] ?? '', + 'username' => $data[2] ?? '', + 'priority' => $priority + ]; + } +} \ No newline at end of file diff --git a/src/Service/Elastic/UserManager.php b/src/Service/Elastic/UserManager.php new file mode 100644 index 000000000..b4faf548d --- /dev/null +++ b/src/Service/Elastic/UserManager.php @@ -0,0 +1,101 @@ +client = $client; + $this->elasticManager = $elasticManager; + $this->picPayManager = $picPayManager; + } + + /** + * + */ + public function reset() + { + $params = []; + $params['index'] = \App\Entity\Elastic\PicPay::INDEX; + + $this->picPayManager->reset(); + + $mappingType = \App\Entity\Elastic\User::TYPE; + $params['type'] = $mappingType; + if ($this->client->indices()->existsType($params)) { + $this->client->indices()->deleteMapping($params); + } + $params['body'][$mappingType] = \App\Entity\Elastic\User::getProperties(); + $this->client->indices()->putMapping($params); + } + + /** + * @param string $id + * + * @return array + */ + public function get(string $id) + { + return $this->elasticManager->get(\App\Entity\Elastic\PicPay::INDEX, \App\Entity\Elastic\User::TYPE, $id); + } + + /** + * @param array $options + * + * @return array + */ + public function query(array $options = []) + { + return $this->elasticManager->query(\App\Entity\Elastic\PicPay::INDEX, \App\Entity\Elastic\User::TYPE, $options); + } + + /** + * @param array $options + * + * @return mixed + */ + public function count(array $options = []) + { + return $this->elasticManager->count(\App\Entity\Elastic\PicPay::INDEX, \App\Entity\Elastic\User::TYPE, $options); + } + + /** + * @param array $options + * + * @throws \Exception + */ + public function update(array $options = []) + { + $this->elasticManager->update(\App\Entity\Elastic\PicPay::INDEX, \App\Entity\Elastic\User::TYPE, $options); + } +} diff --git a/src/Service/UserImporter.php b/src/Service/UserImporter.php index e436932a4..88afc5427 100644 --- a/src/Service/UserImporter.php +++ b/src/Service/UserImporter.php @@ -63,7 +63,7 @@ public function import(): void $batchSize = 1000; if (($handle = \fopen($this->usersFilePath, "r")) !== FALSE) { - $i = 0; + $i = 1; while (($data = \fgetcsv($handle, 1000, ",")) !== FALSE) { $user = $this->build($data); $this->entityManager->persist($user); @@ -81,7 +81,7 @@ public function import(): void $priority = 0; foreach($this->priorityFilesPath as $priorityFilePath) { if (($handle = \fopen($priorityFilePath, "r")) !== FALSE) { - $i = 0; + $i = 1; while (($data = \fgetcsv($handle, 1000, ",")) !== FALSE) { $user = $this->userRepository->findOneBy(['id' => $data]); if($user instanceof User) { diff --git a/symfony.lock b/symfony.lock index c98780e4b..37aaeeba7 100644 --- a/symfony.lock +++ b/symfony.lock @@ -65,6 +65,24 @@ "doctrine/reflection": { "version": "v1.0.0" }, + "elasticsearch/elasticsearch": { + "version": "v6.1.0" + }, + "guzzlehttp/guzzle": { + "version": "6.3.3" + }, + "guzzlehttp/promises": { + "version": "v1.3.1" + }, + "guzzlehttp/psr7": { + "version": "1.5.2" + }, + "guzzlehttp/ringphp": { + "version": "1.1.1" + }, + "guzzlehttp/streams": { + "version": "3.0.0" + }, "jdorn/sql-formatter": { "version": "v1.2.17" }, @@ -80,12 +98,21 @@ "psr/container": { "version": "1.0.0" }, + "psr/http-message": { + "version": "1.0.1" + }, "psr/log": { "version": "1.1.0" }, "psr/simple-cache": { "version": "1.0.1" }, + "ralouphie/getallheaders": { + "version": "2.0.5" + }, + "react/promise": { + "version": "v2.7.1" + }, "sensio/framework-extra-bundle": { "version": "5.2", "recipe": { From 842c52a18d1dc11a6bc43faeb1eb3af73f6ec5c3 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Wed, 6 Mar 2019 10:13:22 -0300 Subject: [PATCH 13/21] Update documentation --- README.md | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e96b41346..350a308b2 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,34 @@ Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu n # Solução +Foi desenvolvido um sistema que disponibiliza via URL http:// um sistema com duas telas. A primeira disponibiliza consulta à base de dados MySQL e a segunda consulta a base de dados do Elasticsearch. É possível visualizar no topo da tela o tempo necessário para a consulta, permitindo ao usuário comparar as duas abordagens. + +Para facilitar a comparação das consultas das duas telas, os resultados podem ser exibidos ordenados por nome. Caso seja escolhido ordenar, será possível testar o impacto da ordenação no tempo de consulta do MySQL e do Elasticsearch. Obs: Não é feita ordenação por username. + +Para a construção da solução foram levadas em consideração algumas das práticas propostas pela metodologia do [The Twelve-Factor App](https://12factor.net/config) + +# Limitação + +O Elasticsearch possui uma limitação no que diz respeito à paginação de conjuntos de dados muito grandes. Se tentarmos, por exemplo, acessar a última página (538545) do conjunto de dados fornecido sem qualquer filtro, o Elasticsearch vai acabar dando timeout, enquanto o MySQL consegue retornar. Não consegui encontrar uma solução para isso até o momento. + +Lembrando apenas que o caso acima é extremo. Para várias consultas, mesmo com a ordenação por nome, o número de páginas se restringe ao número na casa dos milhares, o que mantém o tempo de busca em poucos segundos. + ### Autor - Nome: Rodrigo Alves Sarmento - E-mail: rasarmento@gmail.com +### Tecnologias +- Docker +- Docker Compose +- MySQL 5.7 +- Elasticearch 6.6 +- Symfony 4.2 +- Angular 4.x +- Tema Bootstrap Smartadmin 1.8 ([Visitar](https://wrapbootstrap.com/theme/smartadmin-responsive-webapp-WB0573SK0)) + ### Configuração +- Criar o arquivo ***app/.env*** a partir do ***app/.env.dist*** +- No arquivo ***app/.env*** preencher a URL do servidor que contém a api (servidor do docker) - Criar o arquivo ***.env*** a partir do ***.env.dist*** - No arquivo ***.env*** preencher os dados de configuração do container docker ***mysql*** - No arquivo ***.env*** preencher os dados da URL de conexão do doctrine @@ -47,7 +70,7 @@ Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu n - Obs: Para cada configuração será fornecido um exemplo ### Instalação -- Construir containers: ```docker-compose up``` +- Construir containers: ```docker-compose -f docker-compose.yml -f app/docker-compose.prod.yml up -d --build``` - Realizar deploy: ```./cli/deploy``` -- Carregar base de dados MySQL: http://localhost:8080/api/user/import -- Carregar base de dados Elasticsearch: http://localhost:8080/api/user/es/import \ No newline at end of file +- Carregar base de dados MySQL: http://:8080/api/user/import +- Carregar base de dados Elasticsearch: http://:8080/api/user/es/import From 147fe5b351d33451655ffba20334f7b73ac68571 Mon Sep 17 00:00:00 2001 From: Rodrigo Sarmento Date: Wed, 6 Mar 2019 10:18:49 -0300 Subject: [PATCH 14/21] Build Angular module --- .dockerignore | 2 + .env.dist | 8 +- .gitignore | 3 +- app/.angular-cli.json | 56 + app/.env.dist | 6 + app/.gitignore | 2 + app/.idea/codeStyles/Project.xml | 16 + app/.idea/codeStyles/codeStyleConfig.xml | 5 + app/.idea/encodings.xml | 4 + .../inspectionProfiles/Project_Default.xml | 6 + app/.idea/misc.xml | 9 + app/.idea/modules.xml | 8 + app/.idea/painel-frontend.iml | 11 + app/.idea/vcs.xml | 6 + app/.idea/workspace.xml | 188 + app/docker-compose.dev.yml | 12 + app/docker-compose.prod.yml | 9 + app/docker/dockerfile.dev | 20 + app/docker/dockerfile.prod | 31 + app/docker/nginx.conf | 8 + app/e2e/app.e2e-spec.ts | 14 + app/e2e/app.po.ts | 11 + app/e2e/tsconfig.e2e.json | 12 + app/karma.conf.js | 44 + app/package-lock.json | 14501 ++++++++++++++++ app/package.json | 139 + app/protractor.conf.js | 30 + app/scripts/set-env.ts | 45 + .../+user/+user-es/user-es-routing.module.ts | 16 + .../app/+user/+user-es/user-es.component.html | 77 + .../app/+user/+user-es/user-es.component.ts | 114 + app/src/app/+user/+user-es/user-es.module.ts | 20 + .../+user-mysql/user-mysql-routing.module.ts | 16 + .../+user-mysql/user-mysql.component.html | 77 + .../+user/+user-mysql/user-mysql.component.ts | 113 + .../+user/+user-mysql/user-mysql.module.ts | 20 + app/src/app/+user/picpay-user.module.ts | 11 + app/src/app/+user/picpay-user.routing.ts | 20 + app/src/app/app.component.ts | 12 + app/src/app/app.module.ts | 64 + app/src/app/app.resolver.ts | 19 + app/src/app/app.routing.ts | 28 + app/src/app/app.service.ts | 39 + app/src/app/core/api/json-api.service.ts | 47 + app/src/app/core/api/user.api.ts | 3 + app/src/app/core/core.module.ts | 34 + .../app/core/guards/module-import-guard.ts | 5 + .../shared/animations/animations.module.ts | 16 + .../animations/fade-in-left.decorator.ts | 32 + .../animations/fade-in-top.decorator.ts | 32 + .../animations/fade-zoom-in-top.decorator.ts | 30 + .../shared/animations/router.animations.ts | Bin 0 -> 4326 bytes app/src/app/shared/forms/common/countries.ts | 251 + app/src/app/shared/forms/common/index.ts | 2 + .../shared/forms/common/validation-options.ts | 18 + .../forms/dropzone/dropzone.directive.ts | 28 + .../shared/forms/dropzone/dropzone.module.ts | 12 + app/src/app/shared/forms/dropzone/index.ts | 1 + .../forms/editors/markdown-editor.bundle.ts | 4 + .../editors/markdown-editor.directive.ts | 27 + .../editors/smartadmin-editors.module.ts | 25 + .../editors/summernote-attach.directive.ts | 22 + .../editors/summernote-detach.directive.ts | 18 + .../forms/editors/summernote.directive.ts | 35 + .../forms/input/colorpicker.directive.ts | 24 + .../forms/input/duallistbox.component.ts | 79 + .../input/file-input/file-input.component.ts | 19 + .../shared/forms/input/file-input/index.ts | 1 + .../shared/forms/input/ionslider.directive.ts | 23 + .../app/shared/forms/input/knob.directive.ts | 22 + .../forms/input/masked-input.directive.ts | 22 + .../forms/input/nouislider.directive.ts | 33 + .../on-off-switch.component.html | 13 + .../on-off-switch/on-off-switch.component.ts | 34 + .../on-off-switch/on-off-switch.module.ts | 13 + .../forms/input/select2/select2.directive.ts | 22 + .../forms/input/select2/select2.module.ts | 13 + .../input/smart-clockpicker.directive.ts | 29 + .../forms/input/smart-slider.directive.ts | 23 + .../forms/input/smart-tags.directive.ts | 24 + .../forms/input/smart-timepicker.directive.ts | 22 + .../forms/input/smartadmin-input.module.ts | 65 + .../forms/input/ui-datepicker.directive.ts | 62 + .../forms/input/ui-spinner.directive.ts | 35 + .../forms/input/x-editable.component.ts | 99 + .../forms/jcrop/actions/crop.actions.ts | 68 + .../forms/jcrop/actions/options.actions.ts | 36 + .../forms/jcrop/components/field.component.ts | 40 + .../jcrop/components/fields.component.ts | 25 + .../components/jcrop-preview.component.ts | 125 + .../forms/jcrop/components/jcrop.component.ts | 188 + .../components/option-radio.component.ts | 41 + .../components/option-toggle.component.ts | 43 + .../app/shared/forms/jcrop/jcrop.module.ts | 24 + .../forms/jcrop/reducers/crop-reducer.ts | 63 + .../forms/jcrop/reducers/jcrop-reducer.ts | 22 + .../forms/jcrop/reducers/options-reducer.ts | 82 + .../forms/smartadmin-forms-lite.module.ts | 17 + .../shared/forms/smartadmin-forms.module.ts | 27 + .../bootstrap-validator.directive.ts | 43 + app/src/app/shared/forms/validation/index.ts | 2 + .../smartadmin-validation.module.ts | 19 + .../forms/validation/ui-validate.directive.ts | 84 + .../forms/wizards/fuel-ux-wizard.component.ts | 51 + app/src/app/shared/forms/wizards/index.ts | 1 + .../wizards/smartadmin-wizards.module.ts | 12 + .../graphs/chart-js/chart-js.component.ts | 67 + .../shared/graphs/chart-js/chart-js.module.ts | 12 + .../graphs/chart-js/chart-js.presets.ts | 160 + app/src/app/shared/graphs/chart-js/index.ts | 1 + .../app/shared/graphs/d3/d3-map.component.css | 66 + .../app/shared/graphs/d3/d3-map.component.ts | 327 + app/src/app/shared/graphs/d3/d3.module.ts | 16 + .../graphs/dygraph/dygraph.component.ts | 48 + .../shared/graphs/dygraph/dygraph.module.ts | 12 + app/src/app/shared/graphs/dygraph/index.ts | 1 + .../graphs/flot-chart/flot-chart.component.ts | 56 + .../graphs/flot-chart/flot-chart.module.ts | 12 + app/src/app/shared/graphs/flot-chart/index.ts | 1 + .../highcharts/highchart-table.directive.ts | 26 + .../graphs/highcharts/highcharts.module.ts | 12 + .../easy-pie-chart-container.directive.ts | 64 + app/src/app/shared/graphs/inline/index.ts | 2 + .../graphs/inline/inline-graphs.module.ts | 14 + .../inline/sparkline-container.directive.ts | 359 + .../app/shared/graphs/morris-graph/index.ts | 1 + .../morris-graph/morris-graph.component.ts | 76 + .../morris-graph/morris-graph.module.ts | 12 + .../vector-map/vector-map.component.css | 136 + .../graphs/vector-map/vector-map.component.ts | 86 + .../graphs/vector-map/vector-map.module.ts | 12 + .../shared/graphs/vector-map/world-mill.ts | 1 + app/src/app/shared/i18n/i18n.module.ts | 22 + app/src/app/shared/i18n/i18n.pipe.ts | 16 + app/src/app/shared/i18n/i18n.service.ts | 59 + app/src/app/shared/i18n/index.ts | 4 + .../shared/i18n/language-selector/index.ts | 1 + .../language-selector.component.html | 16 + .../language-selector.component.ts | 27 + app/src/app/shared/i18n/languages.model.ts | 54 + .../app-layouts/auth-layout.component.html | 3 + .../app-layouts/auth-layout.component.ts | 16 + .../app-layouts/empty-layout.component.html | 1 + .../app-layouts/empty-layout.component.ts | 17 + .../app-layouts/main-layout.component.html | 17 + .../app-layouts/main-layout.component.ts | 17 + .../layout/footer/footer.component.html | 61 + .../shared/layout/footer/footer.component.ts | 13 + app/src/app/shared/layout/footer/index.ts | 1 + .../activities-message.component.html | 10 + .../activities-message.component.ts | 18 + .../activities/activities-message/index.ts | 1 + .../activities-notification.component.html | 8 + .../activities-notification.component.ts | 24 + .../activities-notification/index.ts | 1 + .../activities-task.component.html | 24 + .../activities-task.component.ts | 25 + .../activities/activities-task/index.ts | 1 + .../activities/activities.component.html | 45 + .../header/activities/activities.component.ts | 87 + .../header/activities/activities.service.ts | 20 + .../shared/layout/header/activities/index.ts | 5 + .../collapse-menu.component.html | 4 + .../collapse-menu/collapse-menu.component.ts | 21 + .../layout/header/collapse-menu/index.ts | 1 + .../full-screen/full-screen.component.html | 4 + .../full-screen/full-screen.component.ts | 37 + .../shared/layout/header/full-screen/index.ts | 1 + .../layout/header/header.component.html | 16 + .../shared/layout/header/header.component.ts | 31 + .../app/shared/layout/header/header.module.ts | 51 + app/src/app/shared/layout/header/index.ts | 7 + .../layout/header/recent-projects/index.ts | 2 + .../recent-projects.component.html | 17 + .../recent-projects.component.ts | 27 + .../recent-projects.service.ts | 33 + .../speech-button.component.html | 31 + .../speech-button/speech-button.component.ts | 73 + app/src/app/shared/layout/index.ts | 11 + .../layout/layout-switcher.component.html | 48 + .../layout/layout-switcher.component.ts | 87 + app/src/app/shared/layout/layout.module.ts | 52 + app/src/app/shared/layout/layout.service.ts | 251 + .../navigation/big-breadcrumbs.component.ts | 24 + app/src/app/shared/layout/navigation/index.ts | 6 + .../navigation/minify-menu.component.ts | 21 + .../navigation/navigation.component.html | 21 + .../layout/navigation/navigation.component.ts | 18 + .../layout/navigation/navigation.module.ts | 29 + .../layout/navigation/smart-menu.directive.ts | 116 + app/src/app/shared/layout/ribbon/index.ts | 1 + .../layout/ribbon/ribbon.component.html | 13 + .../shared/layout/ribbon/ribbon.component.ts | 19 + .../ribbon/route-breadcrumbs.component.ts | 46 + app/src/app/shared/layout/shortcut/index.ts | 1 + .../layout/shortcut/shortcut.component.html | 30 + .../layout/shortcut/shortcut.component.ts | 91 + app/src/app/shared/smartadmin.config.ts | 333 + app/src/app/shared/smartadmin.module.ts | 79 + app/src/app/shared/sound/sound.module.ts | 21 + app/src/app/shared/sound/sound.service.ts | 72 + app/src/app/shared/stats/index.ts | 1 + app/src/app/shared/stats/stats.component.html | 22 + app/src/app/shared/stats/stats.component.ts | 14 + app/src/app/shared/stats/stats.module.ts | 11 + .../ui/datatable/datatable.component.ts | 121 + app/src/app/shared/ui/datatable/index.ts | 1 + .../datatable/smartadmin-datatable.module.ts | 14 + .../shared/ui/gallery/gallery.component.ts | 148 + .../app/shared/ui/gallery/gallery.module.ts | 12 + .../shared/ui/jquery-ui/jquery-ui.module.ts | 41 + .../ui/jquery-ui/jqui-accordion.directive.ts | 30 + .../jquery-ui/jqui-autocomplete.directive.ts | 20 + .../jqui-dialog-launcher.directive.ts | 28 + .../jqui-dialog/jqui-dialog.directive.ts | 32 + .../ui/jquery-ui/jqui-menu.directive.ts | 20 + .../jquery-ui/jqui-progressbar.directive.ts | 20 + .../ui/jquery-ui/jqui-slider.directive.ts | 20 + .../ui/jquery-ui/jqui-spinner.directive.ts | 20 + .../ui/jquery-ui/jqui-tabs.directive.ts | 30 + .../nestable-list/nestable-list.component.ts | 78 + .../ui/nestable-list/nestable-list.module.ts | 12 + .../progressbar.directive.ts | 23 + .../smart-progressbar.module.ts | 12 + app/src/app/shared/ui/smartadmin-ui.module.ts | 13 + .../ui/tree-view/tree-view.component.ts | 89 + .../shared/ui/tree-view/tree-view.module.ts | 12 + app/src/app/shared/utils/body.service.ts | 28 + app/src/app/shared/utils/dom-helpers.ts | 40 + app/src/app/shared/utils/field-filter.pipe.ts | 14 + app/src/app/shared/utils/index.ts | 6 + app/src/app/shared/utils/moment.pipe.ts | 13 + .../app/shared/utils/notification.service.ts | 23 + app/src/app/shared/utils/time.directive.ts | 3 + .../shared/utils/toggle-active.directive.ts | 12 + app/src/app/shared/utils/utils.module.ts | 21 + .../commands-help.component.html | 83 + .../voice-control/commands-help.component.ts | 25 + .../voice-control/speech-recognition.api.ts | 2 + .../voice-control/voice-control.module.ts | 30 + .../voice-control/voice-control.service.ts | 181 + .../voice-recognition.service.ts | 334 + app/src/app/shared/widgets/index.ts | 2 + .../widgets/smartadmin-widgets.module.ts | 11 + app/src/app/shared/widgets/widget.defaults.ts | 75 + app/src/app/shared/widgets/widget/index.ts | 1 + .../shared/widgets/widget/widget.component.ts | 119 + .../app/shared/widgets/widgets-grid/index.ts | 1 + .../widgets-grid/widgets-grid.component.ts | 28 + app/src/assets/.gitkeep | 0 app/src/assets/.npmignore | 0 app/src/assets/api/activities/activities.json | 131 + app/src/assets/api/calendar/events.json | 1 + app/src/assets/api/chat/chat.json | 62 + app/src/assets/api/e-commerce/orders.json | 5 + app/src/assets/api/graphs/chartjs.json | 145 + .../assets/api/graphs/d3/world-topo-min.json | 1 + app/src/assets/api/graphs/flot.json | 1480 ++ app/src/assets/api/graphs/morris.json | 228 + app/src/assets/api/langs/cn.json | 86 + app/src/assets/api/langs/de.json | 81 + app/src/assets/api/langs/es.json | 81 + app/src/assets/api/langs/fr.json | 81 + app/src/assets/api/langs/jp.json | 86 + app/src/assets/api/langs/kr.json | 81 + app/src/assets/api/langs/pt.json | 81 + app/src/assets/api/langs/ru.json | 81 + app/src/assets/api/langs/us.json | 81 + app/src/assets/api/langs/zh.json | 81 + app/src/assets/api/languages.json | 52 + app/src/assets/api/maps/colorful.json | 167 + app/src/assets/api/maps/greyscale.json | 163 + app/src/assets/api/maps/metro.json | 156 + app/src/assets/api/maps/mono-color.json | 9 + app/src/assets/api/maps/monochrome.json | 154 + .../api/maps/nightvision-highlight.json | 189 + app/src/assets/api/maps/nightvision.json | 179 + app/src/assets/api/maps/old-paper.json | 201 + app/src/assets/api/menu-items.json | 21 + app/src/assets/api/outlook/draft.json | 1 + app/src/assets/api/outlook/inbox.json | 1 + app/src/assets/api/outlook/message.json | 28 + app/src/assets/api/outlook/messages.json | 1 + app/src/assets/api/outlook/outlook.json | 95 + app/src/assets/api/outlook/sent.json | 1 + app/src/assets/api/outlook/trash.json | 3 + app/src/assets/api/project-list.json | 199 + app/src/assets/api/projects.json | 14 + .../assets/api/tables/datatables.filters.json | 460 + .../api/tables/datatables.standard.json | 904 + app/src/assets/api/todo/todos.json | 1 + .../api/ui-examples/nestable-lists.json | 119 + app/src/assets/api/ui-examples/tree-view.json | 91 + app/src/assets/api/user/login-info.json | 5 + app/src/assets/css/bootstrap.min.css | 8 + app/src/assets/css/demo.min.css | 1 + app/src/assets/css/font-awesome.min.css | 7 + app/src/assets/css/invoice.min.css | 1 + .../assets/css/smartadmin-angular-next.css | 99 + .../css/smartadmin-production-plugins.min.css | 56 + .../assets/css/smartadmin-production.min.css | 17 + app/src/assets/css/smartadmin-rtl.min.css | 1 + app/src/assets/css/smartadmin-skins.min.css | 4 + app/src/assets/css/your_style.css | 19 + .../font-awesome/fontawesome-webfont.eot | Bin 0 -> 70807 bytes .../font-awesome/fontawesome-webfont.svg | 655 + .../font-awesome/fontawesome-webfont.ttf | Bin 0 -> 142072 bytes .../font-awesome/fontawesome-webfont.woff | Bin 0 -> 83588 bytes .../font-awesome/fontawesome-webfont.woff2 | Bin 0 -> 66624 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes app/src/assets/fonts/summernote.eot | Bin 0 -> 13234 bytes app/src/assets/fonts/summernote.ttf | Bin 0 -> 13048 bytes app/src/assets/fonts/summernote.woff | Bin 0 -> 8332 bytes app/src/assets/html/voice-commands.html | 88 + app/src/assets/html/widget-demo.html | 15 + app/src/assets/img/ajax-loader.gif | Bin 0 -> 8238 bytes app/src/assets/img/alpha.png | Bin 0 -> 962 bytes app/src/assets/img/avatars/1.png | Bin 0 -> 3165 bytes app/src/assets/img/avatars/2.png | Bin 0 -> 3190 bytes app/src/assets/img/avatars/3.png | Bin 0 -> 3217 bytes app/src/assets/img/avatars/4.png | Bin 0 -> 3276 bytes app/src/assets/img/avatars/5.png | Bin 0 -> 3111 bytes app/src/assets/img/avatars/copyright.txt | 1 + app/src/assets/img/avatars/female.png | Bin 0 -> 284 bytes app/src/assets/img/avatars/male.png | Bin 0 -> 268 bytes app/src/assets/img/avatars/sunny-big.png | Bin 0 -> 12300 bytes app/src/assets/img/avatars/sunny.png | Bin 0 -> 3341 bytes app/src/assets/img/blank.gif | Bin 0 -> 1095 bytes app/src/assets/img/cidade-do-automovel.svg | 103 + app/src/assets/img/clear.png | Bin 0 -> 509 bytes .../assets/img/colorblind-friendly/pt1.png | Bin 0 -> 1027 bytes .../assets/img/colorblind-friendly/pt2.png | Bin 0 -> 1007 bytes .../assets/img/colorblind-friendly/pt3.png | Bin 0 -> 2000 bytes app/src/assets/img/cover.png | Bin 0 -> 11687 bytes app/src/assets/img/demo/64x64.png | Bin 0 -> 231 bytes app/src/assets/img/demo/basic.png | Bin 0 -> 18672 bytes app/src/assets/img/demo/chat.png | Bin 0 -> 44113 bytes app/src/assets/img/demo/copyright.txt | 1 + .../assets/img/demo/demo-smartbig-alert.png | Bin 0 -> 3412 bytes .../img/demo/demo-smartmedium-alert.png | Bin 0 -> 2516 bytes .../assets/img/demo/demo-smartsmall-alert.png | Bin 0 -> 1330 bytes app/src/assets/img/demo/e-comm/1.png | Bin 0 -> 96181 bytes app/src/assets/img/demo/e-comm/2.png | Bin 0 -> 29961 bytes app/src/assets/img/demo/e-comm/3.png | Bin 0 -> 27556 bytes app/src/assets/img/demo/e-comm/4.png | Bin 0 -> 60678 bytes app/src/assets/img/demo/e-comm/5.png | Bin 0 -> 66371 bytes app/src/assets/img/demo/e-comm/6.png | Bin 0 -> 35733 bytes app/src/assets/img/demo/e-comm/7.png | Bin 0 -> 42001 bytes app/src/assets/img/demo/e-comm/8.png | Bin 0 -> 26456 bytes app/src/assets/img/demo/e-comm/9.png | Bin 0 -> 110248 bytes app/src/assets/img/demo/e-comm/detail-1.png | Bin 0 -> 98842 bytes app/src/assets/img/demo/e-comm/detail-2.png | Bin 0 -> 81586 bytes app/src/assets/img/demo/e-comm/detail-3.png | Bin 0 -> 67947 bytes app/src/assets/img/demo/hero.png | Bin 0 -> 19077 bytes .../img/demo/image-placeholder-64x64.png | Bin 0 -> 256 bytes app/src/assets/img/demo/iphoneview.png | Bin 0 -> 106752 bytes .../layout-skins/layout-collapse-minified.png | Bin 0 -> 95407 bytes .../img/demo/layout-skins/layout-collapse.png | Bin 0 -> 55129 bytes .../img/demo/layout-skins/layout-hidden.png | Bin 0 -> 46946 bytes .../img/demo/layout-skins/layout-menutop.png | Bin 0 -> 63406 bytes .../demo/layout-skins/layout-rtl-menutop.png | Bin 0 -> 69436 bytes .../img/demo/layout-skins/layout-rtl.png | Bin 0 -> 62356 bytes .../img/demo/layout-skins/skin-dark.png | Bin 0 -> 59663 bytes .../img/demo/layout-skins/skin-default.png | Bin 0 -> 59167 bytes .../img/demo/layout-skins/skin-glass.png | Bin 0 -> 105393 bytes .../img/demo/layout-skins/skin-google.png | Bin 0 -> 44459 bytes .../img/demo/layout-skins/skin-material.png | Bin 0 -> 142553 bytes .../img/demo/layout-skins/skin-pixel.png | Bin 0 -> 64948 bytes .../img/demo/layout-skins/skin-ultralight.png | Bin 0 -> 55872 bytes app/src/assets/img/demo/m1.jpg | Bin 0 -> 125346 bytes app/src/assets/img/demo/m2.jpg | Bin 0 -> 81284 bytes app/src/assets/img/demo/m3.jpg | Bin 0 -> 49063 bytes app/src/assets/img/demo/newsletter.png | Bin 0 -> 25929 bytes app/src/assets/img/demo/responseimg.png | Bin 0 -> 487 bytes app/src/assets/img/demo/s1.jpg | Bin 0 -> 174851 bytes app/src/assets/img/demo/s2.jpg | Bin 0 -> 162045 bytes app/src/assets/img/demo/s3.jpg | Bin 0 -> 468756 bytes app/src/assets/img/demo/sa-demo.png | Bin 0 -> 29193 bytes app/src/assets/img/demo/sample.jpg | Bin 0 -> 17932 bytes app/src/assets/img/demo/sidebar.png | Bin 0 -> 22687 bytes app/src/assets/img/demo/sidebarhero.png | Bin 0 -> 25389 bytes app/src/assets/img/demo/site-1.jpg | Bin 0 -> 56165 bytes app/src/assets/img/demo/site-2.jpg | Bin 0 -> 67458 bytes app/src/assets/img/demo/video.png | Bin 0 -> 79439 bytes .../assets/img/demo/widget-colorpicker.png | Bin 0 -> 1574 bytes app/src/assets/img/dropzone/spritemap.png | Bin 0 -> 7306 bytes app/src/assets/img/dropzone/spritemap@2x.png | Bin 0 -> 15388 bytes app/src/assets/img/favicon/favicon.ico | Bin 0 -> 1150 bytes app/src/assets/img/favicon/favicon.png | Bin 0 -> 24871 bytes app/src/assets/img/flags/de.png | Bin 0 -> 545 bytes app/src/assets/img/flags/es.png | Bin 0 -> 469 bytes app/src/assets/img/flags/flags.png | Bin 0 -> 23865 bytes app/src/assets/img/flags/us.png | Bin 0 -> 609 bytes app/src/assets/img/glass-image-copyright.txt | 2 + app/src/assets/img/glass.jpg | Bin 0 -> 74887 bytes app/src/assets/img/gradient/login.png | Bin 0 -> 807 bytes app/src/assets/img/hue.png | Bin 0 -> 494 bytes .../assets/img/invoice/americanexpress.png | Bin 0 -> 7519 bytes app/src/assets/img/invoice/license.txt | 2 + app/src/assets/img/invoice/mastercard.png | Bin 0 -> 7357 bytes app/src/assets/img/invoice/paypal.png | Bin 0 -> 6609 bytes app/src/assets/img/invoice/visa.png | Bin 0 -> 5847 bytes app/src/assets/img/jcrop/Jcrop.gif | Bin 0 -> 329 bytes .../jqueryui/ui-bg_flat_0_999999_40x100.png | Bin 0 -> 220 bytes .../jqueryui/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 87 bytes .../jqueryui/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 115 bytes .../jqueryui/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 98 bytes .../jqueryui/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../jqueryui/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../jqueryui/ui-bg_glass_75_ffffff_1x400.png | Bin 0 -> 99 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 86 bytes .../ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 0 -> 120 bytes .../img/jqueryui/ui-icons_222222_256x240.png | Bin 0 -> 3710 bytes .../img/jqueryui/ui-icons_2e83ff_256x240.png | Bin 0 -> 3712 bytes .../img/jqueryui/ui-icons_428bca_256x240.png | Bin 0 -> 4549 bytes .../img/jqueryui/ui-icons_454545_256x240.png | Bin 0 -> 3707 bytes .../img/jqueryui/ui-icons_555555_256x240.png | Bin 0 -> 6988 bytes .../img/jqueryui/ui-icons_888888_256x240.png | Bin 0 -> 3710 bytes .../img/jqueryui/ui-icons_999999_256x240.png | Bin 0 -> 6986 bytes .../img/jqueryui/ui-icons_cd0a0a_256x240.png | Bin 0 -> 3707 bytes .../img/jqueryui/ui-icons_f0ad4e_256x240.png | Bin 0 -> 4549 bytes .../img/jqueryui/ui-icons_f6cf3b_256x240.png | Bin 0 -> 3919 bytes .../img/jqueryui/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes app/src/assets/img/loading.gif | Bin 0 -> 723 bytes app/src/assets/img/logo-blacknwhite.png | Bin 0 -> 1440 bytes app/src/assets/img/logo-blue.png | Bin 0 -> 1484 bytes app/src/assets/img/logo-o.png | Bin 0 -> 628 bytes app/src/assets/img/logo-pale.png | Bin 0 -> 1333 bytes app/src/assets/img/logo-white.png | Bin 0 -> 1473 bytes app/src/assets/img/logo.png | Bin 0 -> 1475 bytes app/src/assets/img/logotipoadm.png | Bin 0 -> 12119 bytes app/src/assets/img/mappin-default.png | Bin 0 -> 431 bytes app/src/assets/img/minus.png | Bin 0 -> 1119 bytes app/src/assets/img/mybg.png | Bin 0 -> 2841 bytes app/src/assets/img/pattern/divider.jpg | Bin 0 -> 1820 bytes app/src/assets/img/pattern/graphy-xs.png | Bin 0 -> 124 bytes app/src/assets/img/pattern/graphy.png | Bin 0 -> 149 bytes app/src/assets/img/pattern/license-info.txt | 3 + .../assets/img/pattern/lightpaperfibers.png | Bin 0 -> 50401 bytes app/src/assets/img/pattern/movable.png | Bin 0 -> 102 bytes app/src/assets/img/pattern/nistri-xs.png | Bin 0 -> 185 bytes app/src/assets/img/pattern/nistri.png | Bin 0 -> 182 bytes .../assets/img/pattern/overlay-pattern.png | Bin 0 -> 107 bytes app/src/assets/img/pattern/paper-xs.png | Bin 0 -> 196 bytes app/src/assets/img/pattern/paper.png | Bin 0 -> 35472 bytes app/src/assets/img/pattern/pattern.png | Bin 0 -> 121 bytes .../img/pattern/sneaker_mesh_fabric-xs.png | Bin 0 -> 399 bytes .../img/pattern/sneaker_mesh_fabric.png | Bin 0 -> 7075 bytes .../img/pattern/tileable_wood_texture-xs.png | Bin 0 -> 755 bytes .../img/pattern/tileable_wood_texture.png | Bin 0 -> 97134 bytes app/src/assets/img/picpay.png | Bin 0 -> 86463 bytes app/src/assets/img/plus.png | Bin 0 -> 1192 bytes app/src/assets/img/realestate/1.png | Bin 0 -> 128256 bytes app/src/assets/img/realestate/2.png | Bin 0 -> 113271 bytes app/src/assets/img/realestate/3.png | Bin 0 -> 124932 bytes app/src/assets/img/realestate/4.png | Bin 0 -> 140710 bytes app/src/assets/img/realestate/5.png | Bin 0 -> 159165 bytes app/src/assets/img/realestate/6.png | Bin 0 -> 144474 bytes app/src/assets/img/ribbon.png | Bin 0 -> 610 bytes app/src/assets/img/sa-dark.png | Bin 0 -> 3337 bytes app/src/assets/img/sa-default.png | Bin 0 -> 3323 bytes app/src/assets/img/saturation.png | Bin 0 -> 4252 bytes app/src/assets/img/select2-spinner.gif | Bin 0 -> 1849 bytes app/src/assets/img/sort_asc.png | Bin 0 -> 117 bytes app/src/assets/img/sort_asc_disabled.png | Bin 0 -> 118 bytes app/src/assets/img/sort_both.png | Bin 0 -> 132 bytes app/src/assets/img/sort_desc.png | Bin 0 -> 116 bytes app/src/assets/img/sort_desc_disabled.png | Bin 0 -> 117 bytes app/src/assets/img/splash/ipad-landscape.png | Bin 0 -> 138029 bytes app/src/assets/img/splash/ipad-portrait.png | Bin 0 -> 174279 bytes app/src/assets/img/splash/iphone.png | Bin 0 -> 63096 bytes .../assets/img/splash/sptouch-icon-iphone.png | Bin 0 -> 2677 bytes .../img/splash/touch-icon-ipad-retina.png | Bin 0 -> 12271 bytes app/src/assets/img/splash/touch-icon-ipad.png | Bin 0 -> 3287 bytes .../img/splash/touch-icon-iphone-retina.png | Bin 0 -> 7110 bytes .../assets/img/superbox/superbox-full-1.jpg | Bin 0 -> 71730 bytes .../assets/img/superbox/superbox-full-10.jpg | Bin 0 -> 38002 bytes .../assets/img/superbox/superbox-full-11.jpg | Bin 0 -> 42656 bytes .../assets/img/superbox/superbox-full-12.jpg | Bin 0 -> 100066 bytes .../assets/img/superbox/superbox-full-13.jpg | Bin 0 -> 59434 bytes .../assets/img/superbox/superbox-full-14.jpg | Bin 0 -> 55100 bytes .../assets/img/superbox/superbox-full-15.jpg | Bin 0 -> 48743 bytes .../assets/img/superbox/superbox-full-16.jpg | Bin 0 -> 51185 bytes .../assets/img/superbox/superbox-full-17.jpg | Bin 0 -> 87184 bytes .../assets/img/superbox/superbox-full-18.jpg | Bin 0 -> 71723 bytes .../assets/img/superbox/superbox-full-19.jpg | Bin 0 -> 84379 bytes .../assets/img/superbox/superbox-full-2.jpg | Bin 0 -> 28175 bytes .../img/superbox/superbox-full-20-bw.jpg | Bin 0 -> 54691 bytes .../assets/img/superbox/superbox-full-20.jpg | Bin 0 -> 82005 bytes .../assets/img/superbox/superbox-full-21.jpg | Bin 0 -> 57390 bytes .../assets/img/superbox/superbox-full-22.jpg | Bin 0 -> 122369 bytes .../assets/img/superbox/superbox-full-23.jpg | Bin 0 -> 120766 bytes .../assets/img/superbox/superbox-full-24.jpg | Bin 0 -> 87651 bytes .../assets/img/superbox/superbox-full-3.jpg | Bin 0 -> 45436 bytes .../assets/img/superbox/superbox-full-4.jpg | Bin 0 -> 87610 bytes .../assets/img/superbox/superbox-full-5.jpg | Bin 0 -> 29440 bytes .../assets/img/superbox/superbox-full-6.jpg | Bin 0 -> 51533 bytes .../assets/img/superbox/superbox-full-7.jpg | Bin 0 -> 45229 bytes .../assets/img/superbox/superbox-full-8.jpg | Bin 0 -> 29514 bytes .../assets/img/superbox/superbox-full-9.jpg | Bin 0 -> 44066 bytes .../assets/img/superbox/superbox-thumb-1.jpg | Bin 0 -> 12576 bytes .../assets/img/superbox/superbox-thumb-10.jpg | Bin 0 -> 8076 bytes .../assets/img/superbox/superbox-thumb-11.jpg | Bin 0 -> 9460 bytes .../assets/img/superbox/superbox-thumb-12.jpg | Bin 0 -> 16451 bytes .../assets/img/superbox/superbox-thumb-13.jpg | Bin 0 -> 11136 bytes .../assets/img/superbox/superbox-thumb-14.jpg | Bin 0 -> 9758 bytes .../assets/img/superbox/superbox-thumb-15.jpg | Bin 0 -> 9800 bytes .../assets/img/superbox/superbox-thumb-16.jpg | Bin 0 -> 10803 bytes .../assets/img/superbox/superbox-thumb-17.jpg | Bin 0 -> 10006 bytes .../assets/img/superbox/superbox-thumb-18.jpg | Bin 0 -> 10251 bytes .../assets/img/superbox/superbox-thumb-19.jpg | Bin 0 -> 15385 bytes .../assets/img/superbox/superbox-thumb-2.jpg | Bin 0 -> 4591 bytes .../assets/img/superbox/superbox-thumb-20.jpg | Bin 0 -> 13585 bytes .../assets/img/superbox/superbox-thumb-21.jpg | Bin 0 -> 7997 bytes .../assets/img/superbox/superbox-thumb-22.jpg | Bin 0 -> 17601 bytes .../assets/img/superbox/superbox-thumb-23.jpg | Bin 0 -> 15826 bytes .../assets/img/superbox/superbox-thumb-24.jpg | Bin 0 -> 12943 bytes .../assets/img/superbox/superbox-thumb-3.jpg | Bin 0 -> 8575 bytes .../assets/img/superbox/superbox-thumb-4.jpg | Bin 0 -> 11941 bytes .../assets/img/superbox/superbox-thumb-5.jpg | Bin 0 -> 6316 bytes .../assets/img/superbox/superbox-thumb-6.jpg | Bin 0 -> 10157 bytes .../assets/img/superbox/superbox-thumb-7.jpg | Bin 0 -> 9451 bytes .../assets/img/superbox/superbox-thumb-8.jpg | Bin 0 -> 6493 bytes .../assets/img/superbox/superbox-thumb-9.jpg | Bin 0 -> 8380 bytes app/src/assets/img/triallo.png | Bin 0 -> 2541 bytes app/src/assets/img/versions/ajaxversion.png | Bin 0 -> 13985 bytes .../assets/img/versions/angularversion.png | Bin 0 -> 12957 bytes app/src/assets/img/versions/dotnetversion.png | Bin 0 -> 12785 bytes app/src/assets/img/versions/htmlversion.png | Bin 0 -> 13424 bytes app/src/assets/img/versions/phpversion.png | Bin 0 -> 13037 bytes app/src/assets/img/versions/reactversion.png | Bin 0 -> 14369 bytes app/src/assets/img/violate.jpg | Bin 0 -> 55291 bytes .../assets/img/voicecommand/active-btn.gif | Bin 0 -> 3692 bytes app/src/assets/img/vt-menu.png | Bin 0 -> 1819 bytes app/src/assets/sound/bigbox.mp3 | Bin 0 -> 61035 bytes app/src/assets/sound/bigbox.ogg | Bin 0 -> 42197 bytes app/src/assets/sound/license.txt | 8 + app/src/assets/sound/messagebox.mp3 | Bin 0 -> 10368 bytes app/src/assets/sound/messagebox.ogg | Bin 0 -> 18000 bytes app/src/assets/sound/smallbox.mp3 | Bin 0 -> 17024 bytes app/src/assets/sound/smallbox.ogg | Bin 0 -> 24370 bytes app/src/assets/sound/voice_alert.mp3 | Bin 0 -> 15488 bytes app/src/assets/sound/voice_alert.ogg | Bin 0 -> 32048 bytes app/src/assets/sound/voice_off.mp3 | Bin 0 -> 17536 bytes app/src/assets/sound/voice_off.ogg | Bin 0 -> 33351 bytes app/src/assets/sound/voice_on.mp3 | Bin 0 -> 21632 bytes app/src/assets/sound/voice_on.ogg | Bin 0 -> 32754 bytes app/src/index.html | 61 + app/src/lib.ts | 25 + app/src/main.ts | 12 + app/src/polyfills.ts | 65 + app/src/styles.css | 4 + app/src/test.ts | 32 + app/src/tsconfig.app.json | 13 + app/src/tsconfig.spec.json | 20 + app/src/typings.d.ts | 139 + app/tsconfig.json | 21 + app/tslint.json | 116 + composer.json | 1 + composer.lock | 60 +- config/bundles.php | 1 + config/packages/nelmio_cors.yaml | 9 + docker-compose.yml | 9 +- src/Controller/UserController.php | 62 +- src/Repository/UserRepository.php | 46 +- src/Service/Elastic/ElasticManager.php | 42 +- symfony.lock | 9 + 571 files changed, 32200 insertions(+), 33 deletions(-) create mode 100644 .dockerignore create mode 100644 app/.angular-cli.json create mode 100644 app/.env.dist create mode 100644 app/.gitignore create mode 100644 app/.idea/codeStyles/Project.xml create mode 100644 app/.idea/codeStyles/codeStyleConfig.xml create mode 100644 app/.idea/encodings.xml create mode 100644 app/.idea/inspectionProfiles/Project_Default.xml create mode 100644 app/.idea/misc.xml create mode 100644 app/.idea/modules.xml create mode 100644 app/.idea/painel-frontend.iml create mode 100644 app/.idea/vcs.xml create mode 100644 app/.idea/workspace.xml create mode 100644 app/docker-compose.dev.yml create mode 100644 app/docker-compose.prod.yml create mode 100644 app/docker/dockerfile.dev create mode 100644 app/docker/dockerfile.prod create mode 100644 app/docker/nginx.conf create mode 100644 app/e2e/app.e2e-spec.ts create mode 100644 app/e2e/app.po.ts create mode 100644 app/e2e/tsconfig.e2e.json create mode 100644 app/karma.conf.js create mode 100644 app/package-lock.json create mode 100644 app/package.json create mode 100644 app/protractor.conf.js create mode 100644 app/scripts/set-env.ts create mode 100644 app/src/app/+user/+user-es/user-es-routing.module.ts create mode 100644 app/src/app/+user/+user-es/user-es.component.html create mode 100644 app/src/app/+user/+user-es/user-es.component.ts create mode 100644 app/src/app/+user/+user-es/user-es.module.ts create mode 100644 app/src/app/+user/+user-mysql/user-mysql-routing.module.ts create mode 100644 app/src/app/+user/+user-mysql/user-mysql.component.html create mode 100644 app/src/app/+user/+user-mysql/user-mysql.component.ts create mode 100644 app/src/app/+user/+user-mysql/user-mysql.module.ts create mode 100644 app/src/app/+user/picpay-user.module.ts create mode 100644 app/src/app/+user/picpay-user.routing.ts create mode 100644 app/src/app/app.component.ts create mode 100644 app/src/app/app.module.ts create mode 100644 app/src/app/app.resolver.ts create mode 100644 app/src/app/app.routing.ts create mode 100644 app/src/app/app.service.ts create mode 100644 app/src/app/core/api/json-api.service.ts create mode 100644 app/src/app/core/api/user.api.ts create mode 100644 app/src/app/core/core.module.ts create mode 100644 app/src/app/core/guards/module-import-guard.ts create mode 100644 app/src/app/shared/animations/animations.module.ts create mode 100644 app/src/app/shared/animations/fade-in-left.decorator.ts create mode 100644 app/src/app/shared/animations/fade-in-top.decorator.ts create mode 100644 app/src/app/shared/animations/fade-zoom-in-top.decorator.ts create mode 100644 app/src/app/shared/animations/router.animations.ts create mode 100644 app/src/app/shared/forms/common/countries.ts create mode 100644 app/src/app/shared/forms/common/index.ts create mode 100644 app/src/app/shared/forms/common/validation-options.ts create mode 100644 app/src/app/shared/forms/dropzone/dropzone.directive.ts create mode 100644 app/src/app/shared/forms/dropzone/dropzone.module.ts create mode 100644 app/src/app/shared/forms/dropzone/index.ts create mode 100644 app/src/app/shared/forms/editors/markdown-editor.bundle.ts create mode 100644 app/src/app/shared/forms/editors/markdown-editor.directive.ts create mode 100644 app/src/app/shared/forms/editors/smartadmin-editors.module.ts create mode 100644 app/src/app/shared/forms/editors/summernote-attach.directive.ts create mode 100644 app/src/app/shared/forms/editors/summernote-detach.directive.ts create mode 100644 app/src/app/shared/forms/editors/summernote.directive.ts create mode 100644 app/src/app/shared/forms/input/colorpicker.directive.ts create mode 100644 app/src/app/shared/forms/input/duallistbox.component.ts create mode 100644 app/src/app/shared/forms/input/file-input/file-input.component.ts create mode 100644 app/src/app/shared/forms/input/file-input/index.ts create mode 100644 app/src/app/shared/forms/input/ionslider.directive.ts create mode 100644 app/src/app/shared/forms/input/knob.directive.ts create mode 100644 app/src/app/shared/forms/input/masked-input.directive.ts create mode 100644 app/src/app/shared/forms/input/nouislider.directive.ts create mode 100644 app/src/app/shared/forms/input/on-off-switch/on-off-switch.component.html create mode 100644 app/src/app/shared/forms/input/on-off-switch/on-off-switch.component.ts create mode 100644 app/src/app/shared/forms/input/on-off-switch/on-off-switch.module.ts create mode 100644 app/src/app/shared/forms/input/select2/select2.directive.ts create mode 100644 app/src/app/shared/forms/input/select2/select2.module.ts create mode 100644 app/src/app/shared/forms/input/smart-clockpicker.directive.ts create mode 100644 app/src/app/shared/forms/input/smart-slider.directive.ts create mode 100644 app/src/app/shared/forms/input/smart-tags.directive.ts create mode 100644 app/src/app/shared/forms/input/smart-timepicker.directive.ts create mode 100644 app/src/app/shared/forms/input/smartadmin-input.module.ts create mode 100644 app/src/app/shared/forms/input/ui-datepicker.directive.ts create mode 100644 app/src/app/shared/forms/input/ui-spinner.directive.ts create mode 100644 app/src/app/shared/forms/input/x-editable.component.ts create mode 100644 app/src/app/shared/forms/jcrop/actions/crop.actions.ts create mode 100644 app/src/app/shared/forms/jcrop/actions/options.actions.ts create mode 100644 app/src/app/shared/forms/jcrop/components/field.component.ts create mode 100644 app/src/app/shared/forms/jcrop/components/fields.component.ts create mode 100644 app/src/app/shared/forms/jcrop/components/jcrop-preview.component.ts create mode 100644 app/src/app/shared/forms/jcrop/components/jcrop.component.ts create mode 100644 app/src/app/shared/forms/jcrop/components/option-radio.component.ts create mode 100644 app/src/app/shared/forms/jcrop/components/option-toggle.component.ts create mode 100644 app/src/app/shared/forms/jcrop/jcrop.module.ts create mode 100644 app/src/app/shared/forms/jcrop/reducers/crop-reducer.ts create mode 100644 app/src/app/shared/forms/jcrop/reducers/jcrop-reducer.ts create mode 100644 app/src/app/shared/forms/jcrop/reducers/options-reducer.ts create mode 100644 app/src/app/shared/forms/smartadmin-forms-lite.module.ts create mode 100644 app/src/app/shared/forms/smartadmin-forms.module.ts create mode 100644 app/src/app/shared/forms/validation/bootstrap-validator.directive.ts create mode 100644 app/src/app/shared/forms/validation/index.ts create mode 100644 app/src/app/shared/forms/validation/smartadmin-validation.module.ts create mode 100644 app/src/app/shared/forms/validation/ui-validate.directive.ts create mode 100644 app/src/app/shared/forms/wizards/fuel-ux-wizard.component.ts create mode 100644 app/src/app/shared/forms/wizards/index.ts create mode 100644 app/src/app/shared/forms/wizards/smartadmin-wizards.module.ts create mode 100644 app/src/app/shared/graphs/chart-js/chart-js.component.ts create mode 100644 app/src/app/shared/graphs/chart-js/chart-js.module.ts create mode 100644 app/src/app/shared/graphs/chart-js/chart-js.presets.ts create mode 100644 app/src/app/shared/graphs/chart-js/index.ts create mode 100644 app/src/app/shared/graphs/d3/d3-map.component.css create mode 100644 app/src/app/shared/graphs/d3/d3-map.component.ts create mode 100644 app/src/app/shared/graphs/d3/d3.module.ts create mode 100644 app/src/app/shared/graphs/dygraph/dygraph.component.ts create mode 100644 app/src/app/shared/graphs/dygraph/dygraph.module.ts create mode 100644 app/src/app/shared/graphs/dygraph/index.ts create mode 100644 app/src/app/shared/graphs/flot-chart/flot-chart.component.ts create mode 100644 app/src/app/shared/graphs/flot-chart/flot-chart.module.ts create mode 100644 app/src/app/shared/graphs/flot-chart/index.ts create mode 100644 app/src/app/shared/graphs/highcharts/highchart-table.directive.ts create mode 100644 app/src/app/shared/graphs/highcharts/highcharts.module.ts create mode 100644 app/src/app/shared/graphs/inline/easy-pie-chart-container.directive.ts create mode 100644 app/src/app/shared/graphs/inline/index.ts create mode 100644 app/src/app/shared/graphs/inline/inline-graphs.module.ts create mode 100644 app/src/app/shared/graphs/inline/sparkline-container.directive.ts create mode 100644 app/src/app/shared/graphs/morris-graph/index.ts create mode 100644 app/src/app/shared/graphs/morris-graph/morris-graph.component.ts create mode 100644 app/src/app/shared/graphs/morris-graph/morris-graph.module.ts create mode 100644 app/src/app/shared/graphs/vector-map/vector-map.component.css create mode 100644 app/src/app/shared/graphs/vector-map/vector-map.component.ts create mode 100644 app/src/app/shared/graphs/vector-map/vector-map.module.ts create mode 100644 app/src/app/shared/graphs/vector-map/world-mill.ts create mode 100644 app/src/app/shared/i18n/i18n.module.ts create mode 100644 app/src/app/shared/i18n/i18n.pipe.ts create mode 100644 app/src/app/shared/i18n/i18n.service.ts create mode 100644 app/src/app/shared/i18n/index.ts create mode 100644 app/src/app/shared/i18n/language-selector/index.ts create mode 100644 app/src/app/shared/i18n/language-selector/language-selector.component.html create mode 100644 app/src/app/shared/i18n/language-selector/language-selector.component.ts create mode 100644 app/src/app/shared/i18n/languages.model.ts create mode 100644 app/src/app/shared/layout/app-layouts/auth-layout.component.html create mode 100644 app/src/app/shared/layout/app-layouts/auth-layout.component.ts create mode 100644 app/src/app/shared/layout/app-layouts/empty-layout.component.html create mode 100644 app/src/app/shared/layout/app-layouts/empty-layout.component.ts create mode 100644 app/src/app/shared/layout/app-layouts/main-layout.component.html create mode 100644 app/src/app/shared/layout/app-layouts/main-layout.component.ts create mode 100644 app/src/app/shared/layout/footer/footer.component.html create mode 100644 app/src/app/shared/layout/footer/footer.component.ts create mode 100644 app/src/app/shared/layout/footer/index.ts create mode 100644 app/src/app/shared/layout/header/activities/activities-message/activities-message.component.html create mode 100644 app/src/app/shared/layout/header/activities/activities-message/activities-message.component.ts create mode 100644 app/src/app/shared/layout/header/activities/activities-message/index.ts create mode 100644 app/src/app/shared/layout/header/activities/activities-notification/activities-notification.component.html create mode 100644 app/src/app/shared/layout/header/activities/activities-notification/activities-notification.component.ts create mode 100644 app/src/app/shared/layout/header/activities/activities-notification/index.ts create mode 100644 app/src/app/shared/layout/header/activities/activities-task/activities-task.component.html create mode 100644 app/src/app/shared/layout/header/activities/activities-task/activities-task.component.ts create mode 100644 app/src/app/shared/layout/header/activities/activities-task/index.ts create mode 100644 app/src/app/shared/layout/header/activities/activities.component.html create mode 100644 app/src/app/shared/layout/header/activities/activities.component.ts create mode 100644 app/src/app/shared/layout/header/activities/activities.service.ts create mode 100644 app/src/app/shared/layout/header/activities/index.ts create mode 100644 app/src/app/shared/layout/header/collapse-menu/collapse-menu.component.html create mode 100644 app/src/app/shared/layout/header/collapse-menu/collapse-menu.component.ts create mode 100644 app/src/app/shared/layout/header/collapse-menu/index.ts create mode 100644 app/src/app/shared/layout/header/full-screen/full-screen.component.html create mode 100644 app/src/app/shared/layout/header/full-screen/full-screen.component.ts create mode 100644 app/src/app/shared/layout/header/full-screen/index.ts create mode 100644 app/src/app/shared/layout/header/header.component.html create mode 100644 app/src/app/shared/layout/header/header.component.ts create mode 100644 app/src/app/shared/layout/header/header.module.ts create mode 100644 app/src/app/shared/layout/header/index.ts create mode 100644 app/src/app/shared/layout/header/recent-projects/index.ts create mode 100644 app/src/app/shared/layout/header/recent-projects/recent-projects.component.html create mode 100644 app/src/app/shared/layout/header/recent-projects/recent-projects.component.ts create mode 100644 app/src/app/shared/layout/header/recent-projects/recent-projects.service.ts create mode 100644 app/src/app/shared/layout/header/speech-button/speech-button.component.html create mode 100644 app/src/app/shared/layout/header/speech-button/speech-button.component.ts create mode 100644 app/src/app/shared/layout/index.ts create mode 100644 app/src/app/shared/layout/layout-switcher.component.html create mode 100644 app/src/app/shared/layout/layout-switcher.component.ts create mode 100644 app/src/app/shared/layout/layout.module.ts create mode 100644 app/src/app/shared/layout/layout.service.ts create mode 100644 app/src/app/shared/layout/navigation/big-breadcrumbs.component.ts create mode 100644 app/src/app/shared/layout/navigation/index.ts create mode 100644 app/src/app/shared/layout/navigation/minify-menu.component.ts create mode 100644 app/src/app/shared/layout/navigation/navigation.component.html create mode 100644 app/src/app/shared/layout/navigation/navigation.component.ts create mode 100644 app/src/app/shared/layout/navigation/navigation.module.ts create mode 100644 app/src/app/shared/layout/navigation/smart-menu.directive.ts create mode 100644 app/src/app/shared/layout/ribbon/index.ts create mode 100644 app/src/app/shared/layout/ribbon/ribbon.component.html create mode 100644 app/src/app/shared/layout/ribbon/ribbon.component.ts create mode 100644 app/src/app/shared/layout/ribbon/route-breadcrumbs.component.ts create mode 100644 app/src/app/shared/layout/shortcut/index.ts create mode 100644 app/src/app/shared/layout/shortcut/shortcut.component.html create mode 100644 app/src/app/shared/layout/shortcut/shortcut.component.ts create mode 100644 app/src/app/shared/smartadmin.config.ts create mode 100644 app/src/app/shared/smartadmin.module.ts create mode 100644 app/src/app/shared/sound/sound.module.ts create mode 100644 app/src/app/shared/sound/sound.service.ts create mode 100644 app/src/app/shared/stats/index.ts create mode 100644 app/src/app/shared/stats/stats.component.html create mode 100644 app/src/app/shared/stats/stats.component.ts create mode 100644 app/src/app/shared/stats/stats.module.ts create mode 100644 app/src/app/shared/ui/datatable/datatable.component.ts create mode 100644 app/src/app/shared/ui/datatable/index.ts create mode 100644 app/src/app/shared/ui/datatable/smartadmin-datatable.module.ts create mode 100644 app/src/app/shared/ui/gallery/gallery.component.ts create mode 100644 app/src/app/shared/ui/gallery/gallery.module.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jquery-ui.module.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-accordion.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-autocomplete.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-dialog/jqui-dialog-launcher.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-dialog/jqui-dialog.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-menu.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-progressbar.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-slider.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-spinner.directive.ts create mode 100644 app/src/app/shared/ui/jquery-ui/jqui-tabs.directive.ts create mode 100644 app/src/app/shared/ui/nestable-list/nestable-list.component.ts create mode 100644 app/src/app/shared/ui/nestable-list/nestable-list.module.ts create mode 100644 app/src/app/shared/ui/smart-progressbar/progressbar.directive.ts create mode 100644 app/src/app/shared/ui/smart-progressbar/smart-progressbar.module.ts create mode 100644 app/src/app/shared/ui/smartadmin-ui.module.ts create mode 100644 app/src/app/shared/ui/tree-view/tree-view.component.ts create mode 100644 app/src/app/shared/ui/tree-view/tree-view.module.ts create mode 100644 app/src/app/shared/utils/body.service.ts create mode 100644 app/src/app/shared/utils/dom-helpers.ts create mode 100644 app/src/app/shared/utils/field-filter.pipe.ts create mode 100644 app/src/app/shared/utils/index.ts create mode 100644 app/src/app/shared/utils/moment.pipe.ts create mode 100644 app/src/app/shared/utils/notification.service.ts create mode 100644 app/src/app/shared/utils/time.directive.ts create mode 100644 app/src/app/shared/utils/toggle-active.directive.ts create mode 100644 app/src/app/shared/utils/utils.module.ts create mode 100644 app/src/app/shared/voice-control/commands-help.component.html create mode 100644 app/src/app/shared/voice-control/commands-help.component.ts create mode 100644 app/src/app/shared/voice-control/speech-recognition.api.ts create mode 100644 app/src/app/shared/voice-control/voice-control.module.ts create mode 100644 app/src/app/shared/voice-control/voice-control.service.ts create mode 100644 app/src/app/shared/voice-control/voice-recognition.service.ts create mode 100644 app/src/app/shared/widgets/index.ts create mode 100644 app/src/app/shared/widgets/smartadmin-widgets.module.ts create mode 100644 app/src/app/shared/widgets/widget.defaults.ts create mode 100644 app/src/app/shared/widgets/widget/index.ts create mode 100644 app/src/app/shared/widgets/widget/widget.component.ts create mode 100644 app/src/app/shared/widgets/widgets-grid/index.ts create mode 100644 app/src/app/shared/widgets/widgets-grid/widgets-grid.component.ts create mode 100644 app/src/assets/.gitkeep create mode 100644 app/src/assets/.npmignore create mode 100644 app/src/assets/api/activities/activities.json create mode 100644 app/src/assets/api/calendar/events.json create mode 100644 app/src/assets/api/chat/chat.json create mode 100644 app/src/assets/api/e-commerce/orders.json create mode 100644 app/src/assets/api/graphs/chartjs.json create mode 100644 app/src/assets/api/graphs/d3/world-topo-min.json create mode 100644 app/src/assets/api/graphs/flot.json create mode 100644 app/src/assets/api/graphs/morris.json create mode 100644 app/src/assets/api/langs/cn.json create mode 100644 app/src/assets/api/langs/de.json create mode 100644 app/src/assets/api/langs/es.json create mode 100644 app/src/assets/api/langs/fr.json create mode 100644 app/src/assets/api/langs/jp.json create mode 100644 app/src/assets/api/langs/kr.json create mode 100644 app/src/assets/api/langs/pt.json create mode 100644 app/src/assets/api/langs/ru.json create mode 100644 app/src/assets/api/langs/us.json create mode 100644 app/src/assets/api/langs/zh.json create mode 100644 app/src/assets/api/languages.json create mode 100644 app/src/assets/api/maps/colorful.json create mode 100644 app/src/assets/api/maps/greyscale.json create mode 100644 app/src/assets/api/maps/metro.json create mode 100644 app/src/assets/api/maps/mono-color.json create mode 100644 app/src/assets/api/maps/monochrome.json create mode 100644 app/src/assets/api/maps/nightvision-highlight.json create mode 100644 app/src/assets/api/maps/nightvision.json create mode 100644 app/src/assets/api/maps/old-paper.json create mode 100644 app/src/assets/api/menu-items.json create mode 100644 app/src/assets/api/outlook/draft.json create mode 100644 app/src/assets/api/outlook/inbox.json create mode 100644 app/src/assets/api/outlook/message.json create mode 100644 app/src/assets/api/outlook/messages.json create mode 100644 app/src/assets/api/outlook/outlook.json create mode 100644 app/src/assets/api/outlook/sent.json create mode 100644 app/src/assets/api/outlook/trash.json create mode 100644 app/src/assets/api/project-list.json create mode 100644 app/src/assets/api/projects.json create mode 100644 app/src/assets/api/tables/datatables.filters.json create mode 100644 app/src/assets/api/tables/datatables.standard.json create mode 100644 app/src/assets/api/todo/todos.json create mode 100644 app/src/assets/api/ui-examples/nestable-lists.json create mode 100644 app/src/assets/api/ui-examples/tree-view.json create mode 100644 app/src/assets/api/user/login-info.json create mode 100644 app/src/assets/css/bootstrap.min.css create mode 100644 app/src/assets/css/demo.min.css create mode 100644 app/src/assets/css/font-awesome.min.css create mode 100644 app/src/assets/css/invoice.min.css create mode 100644 app/src/assets/css/smartadmin-angular-next.css create mode 100644 app/src/assets/css/smartadmin-production-plugins.min.css create mode 100644 app/src/assets/css/smartadmin-production.min.css create mode 100644 app/src/assets/css/smartadmin-rtl.min.css create mode 100644 app/src/assets/css/smartadmin-skins.min.css create mode 100644 app/src/assets/css/your_style.css create mode 100644 app/src/assets/fonts/font-awesome/fontawesome-webfont.eot create mode 100644 app/src/assets/fonts/font-awesome/fontawesome-webfont.svg create mode 100644 app/src/assets/fonts/font-awesome/fontawesome-webfont.ttf create mode 100644 app/src/assets/fonts/font-awesome/fontawesome-webfont.woff create mode 100644 app/src/assets/fonts/font-awesome/fontawesome-webfont.woff2 create mode 100644 app/src/assets/fonts/glyphicons-halflings-regular.eot create mode 100644 app/src/assets/fonts/glyphicons-halflings-regular.svg create mode 100644 app/src/assets/fonts/glyphicons-halflings-regular.ttf create mode 100644 app/src/assets/fonts/glyphicons-halflings-regular.woff create mode 100644 app/src/assets/fonts/glyphicons-halflings-regular.woff2 create mode 100644 app/src/assets/fonts/summernote.eot create mode 100644 app/src/assets/fonts/summernote.ttf create mode 100644 app/src/assets/fonts/summernote.woff create mode 100644 app/src/assets/html/voice-commands.html create mode 100644 app/src/assets/html/widget-demo.html create mode 100644 app/src/assets/img/ajax-loader.gif create mode 100644 app/src/assets/img/alpha.png create mode 100644 app/src/assets/img/avatars/1.png create mode 100644 app/src/assets/img/avatars/2.png create mode 100644 app/src/assets/img/avatars/3.png create mode 100644 app/src/assets/img/avatars/4.png create mode 100644 app/src/assets/img/avatars/5.png create mode 100644 app/src/assets/img/avatars/copyright.txt create mode 100644 app/src/assets/img/avatars/female.png create mode 100644 app/src/assets/img/avatars/male.png create mode 100644 app/src/assets/img/avatars/sunny-big.png create mode 100644 app/src/assets/img/avatars/sunny.png create mode 100644 app/src/assets/img/blank.gif create mode 100644 app/src/assets/img/cidade-do-automovel.svg create mode 100644 app/src/assets/img/clear.png create mode 100644 app/src/assets/img/colorblind-friendly/pt1.png create mode 100644 app/src/assets/img/colorblind-friendly/pt2.png create mode 100644 app/src/assets/img/colorblind-friendly/pt3.png create mode 100644 app/src/assets/img/cover.png create mode 100644 app/src/assets/img/demo/64x64.png create mode 100644 app/src/assets/img/demo/basic.png create mode 100644 app/src/assets/img/demo/chat.png create mode 100644 app/src/assets/img/demo/copyright.txt create mode 100644 app/src/assets/img/demo/demo-smartbig-alert.png create mode 100644 app/src/assets/img/demo/demo-smartmedium-alert.png create mode 100644 app/src/assets/img/demo/demo-smartsmall-alert.png create mode 100644 app/src/assets/img/demo/e-comm/1.png create mode 100644 app/src/assets/img/demo/e-comm/2.png create mode 100644 app/src/assets/img/demo/e-comm/3.png create mode 100644 app/src/assets/img/demo/e-comm/4.png create mode 100644 app/src/assets/img/demo/e-comm/5.png create mode 100644 app/src/assets/img/demo/e-comm/6.png create mode 100644 app/src/assets/img/demo/e-comm/7.png create mode 100644 app/src/assets/img/demo/e-comm/8.png create mode 100644 app/src/assets/img/demo/e-comm/9.png create mode 100644 app/src/assets/img/demo/e-comm/detail-1.png create mode 100644 app/src/assets/img/demo/e-comm/detail-2.png create mode 100644 app/src/assets/img/demo/e-comm/detail-3.png create mode 100644 app/src/assets/img/demo/hero.png create mode 100644 app/src/assets/img/demo/image-placeholder-64x64.png create mode 100644 app/src/assets/img/demo/iphoneview.png create mode 100644 app/src/assets/img/demo/layout-skins/layout-collapse-minified.png create mode 100644 app/src/assets/img/demo/layout-skins/layout-collapse.png create mode 100644 app/src/assets/img/demo/layout-skins/layout-hidden.png create mode 100644 app/src/assets/img/demo/layout-skins/layout-menutop.png create mode 100644 app/src/assets/img/demo/layout-skins/layout-rtl-menutop.png create mode 100644 app/src/assets/img/demo/layout-skins/layout-rtl.png create mode 100644 app/src/assets/img/demo/layout-skins/skin-dark.png create mode 100644 app/src/assets/img/demo/layout-skins/skin-default.png create mode 100644 app/src/assets/img/demo/layout-skins/skin-glass.png create mode 100644 app/src/assets/img/demo/layout-skins/skin-google.png create mode 100644 app/src/assets/img/demo/layout-skins/skin-material.png create mode 100644 app/src/assets/img/demo/layout-skins/skin-pixel.png create mode 100644 app/src/assets/img/demo/layout-skins/skin-ultralight.png create mode 100644 app/src/assets/img/demo/m1.jpg create mode 100644 app/src/assets/img/demo/m2.jpg create mode 100644 app/src/assets/img/demo/m3.jpg create mode 100644 app/src/assets/img/demo/newsletter.png create mode 100644 app/src/assets/img/demo/responseimg.png create mode 100644 app/src/assets/img/demo/s1.jpg create mode 100644 app/src/assets/img/demo/s2.jpg create mode 100644 app/src/assets/img/demo/s3.jpg create mode 100644 app/src/assets/img/demo/sa-demo.png create mode 100644 app/src/assets/img/demo/sample.jpg create mode 100644 app/src/assets/img/demo/sidebar.png create mode 100644 app/src/assets/img/demo/sidebarhero.png create mode 100644 app/src/assets/img/demo/site-1.jpg create mode 100644 app/src/assets/img/demo/site-2.jpg create mode 100644 app/src/assets/img/demo/video.png create mode 100644 app/src/assets/img/demo/widget-colorpicker.png create mode 100644 app/src/assets/img/dropzone/spritemap.png create mode 100644 app/src/assets/img/dropzone/spritemap@2x.png create mode 100644 app/src/assets/img/favicon/favicon.ico create mode 100644 app/src/assets/img/favicon/favicon.png create mode 100644 app/src/assets/img/flags/de.png create mode 100644 app/src/assets/img/flags/es.png create mode 100644 app/src/assets/img/flags/flags.png create mode 100644 app/src/assets/img/flags/us.png create mode 100644 app/src/assets/img/glass-image-copyright.txt create mode 100644 app/src/assets/img/glass.jpg create mode 100644 app/src/assets/img/gradient/login.png create mode 100644 app/src/assets/img/hue.png create mode 100644 app/src/assets/img/invoice/americanexpress.png create mode 100644 app/src/assets/img/invoice/license.txt create mode 100644 app/src/assets/img/invoice/mastercard.png create mode 100644 app/src/assets/img/invoice/paypal.png create mode 100644 app/src/assets/img/invoice/visa.png create mode 100644 app/src/assets/img/jcrop/Jcrop.gif create mode 100644 app/src/assets/img/jqueryui/ui-bg_flat_0_999999_40x100.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_glass_65_ffffff_1x400.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_glass_75_dadada_1x400.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_glass_75_ffffff_1x400.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 app/src/assets/img/jqueryui/ui-bg_inset-soft_95_fef1ec_1x100.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_222222_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_2e83ff_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_428bca_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_454545_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_555555_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_888888_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_999999_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_cd0a0a_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_f0ad4e_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_f6cf3b_256x240.png create mode 100644 app/src/assets/img/jqueryui/ui-icons_ffffff_256x240.png create mode 100644 app/src/assets/img/loading.gif create mode 100644 app/src/assets/img/logo-blacknwhite.png create mode 100644 app/src/assets/img/logo-blue.png create mode 100644 app/src/assets/img/logo-o.png create mode 100644 app/src/assets/img/logo-pale.png create mode 100644 app/src/assets/img/logo-white.png create mode 100644 app/src/assets/img/logo.png create mode 100644 app/src/assets/img/logotipoadm.png create mode 100644 app/src/assets/img/mappin-default.png create mode 100644 app/src/assets/img/minus.png create mode 100644 app/src/assets/img/mybg.png create mode 100644 app/src/assets/img/pattern/divider.jpg create mode 100644 app/src/assets/img/pattern/graphy-xs.png create mode 100644 app/src/assets/img/pattern/graphy.png create mode 100644 app/src/assets/img/pattern/license-info.txt create mode 100644 app/src/assets/img/pattern/lightpaperfibers.png create mode 100644 app/src/assets/img/pattern/movable.png create mode 100644 app/src/assets/img/pattern/nistri-xs.png create mode 100644 app/src/assets/img/pattern/nistri.png create mode 100644 app/src/assets/img/pattern/overlay-pattern.png create mode 100644 app/src/assets/img/pattern/paper-xs.png create mode 100644 app/src/assets/img/pattern/paper.png create mode 100644 app/src/assets/img/pattern/pattern.png create mode 100644 app/src/assets/img/pattern/sneaker_mesh_fabric-xs.png create mode 100644 app/src/assets/img/pattern/sneaker_mesh_fabric.png create mode 100644 app/src/assets/img/pattern/tileable_wood_texture-xs.png create mode 100644 app/src/assets/img/pattern/tileable_wood_texture.png create mode 100644 app/src/assets/img/picpay.png create mode 100644 app/src/assets/img/plus.png create mode 100644 app/src/assets/img/realestate/1.png create mode 100644 app/src/assets/img/realestate/2.png create mode 100644 app/src/assets/img/realestate/3.png create mode 100644 app/src/assets/img/realestate/4.png create mode 100644 app/src/assets/img/realestate/5.png create mode 100644 app/src/assets/img/realestate/6.png create mode 100644 app/src/assets/img/ribbon.png create mode 100644 app/src/assets/img/sa-dark.png create mode 100644 app/src/assets/img/sa-default.png create mode 100644 app/src/assets/img/saturation.png create mode 100644 app/src/assets/img/select2-spinner.gif create mode 100644 app/src/assets/img/sort_asc.png create mode 100644 app/src/assets/img/sort_asc_disabled.png create mode 100644 app/src/assets/img/sort_both.png create mode 100644 app/src/assets/img/sort_desc.png create mode 100644 app/src/assets/img/sort_desc_disabled.png create mode 100644 app/src/assets/img/splash/ipad-landscape.png create mode 100644 app/src/assets/img/splash/ipad-portrait.png create mode 100644 app/src/assets/img/splash/iphone.png create mode 100644 app/src/assets/img/splash/sptouch-icon-iphone.png create mode 100644 app/src/assets/img/splash/touch-icon-ipad-retina.png create mode 100644 app/src/assets/img/splash/touch-icon-ipad.png create mode 100644 app/src/assets/img/splash/touch-icon-iphone-retina.png create mode 100644 app/src/assets/img/superbox/superbox-full-1.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-10.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-11.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-12.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-13.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-14.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-15.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-16.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-17.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-18.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-19.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-2.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-20-bw.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-20.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-21.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-22.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-23.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-24.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-3.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-4.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-5.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-6.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-7.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-8.jpg create mode 100644 app/src/assets/img/superbox/superbox-full-9.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-1.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-10.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-11.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-12.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-13.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-14.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-15.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-16.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-17.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-18.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-19.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-2.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-20.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-21.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-22.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-23.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-24.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-3.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-4.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-5.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-6.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-7.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-8.jpg create mode 100644 app/src/assets/img/superbox/superbox-thumb-9.jpg create mode 100644 app/src/assets/img/triallo.png create mode 100644 app/src/assets/img/versions/ajaxversion.png create mode 100644 app/src/assets/img/versions/angularversion.png create mode 100644 app/src/assets/img/versions/dotnetversion.png create mode 100644 app/src/assets/img/versions/htmlversion.png create mode 100644 app/src/assets/img/versions/phpversion.png create mode 100644 app/src/assets/img/versions/reactversion.png create mode 100644 app/src/assets/img/violate.jpg create mode 100644 app/src/assets/img/voicecommand/active-btn.gif create mode 100644 app/src/assets/img/vt-menu.png create mode 100644 app/src/assets/sound/bigbox.mp3 create mode 100644 app/src/assets/sound/bigbox.ogg create mode 100644 app/src/assets/sound/license.txt create mode 100644 app/src/assets/sound/messagebox.mp3 create mode 100644 app/src/assets/sound/messagebox.ogg create mode 100644 app/src/assets/sound/smallbox.mp3 create mode 100644 app/src/assets/sound/smallbox.ogg create mode 100644 app/src/assets/sound/voice_alert.mp3 create mode 100644 app/src/assets/sound/voice_alert.ogg create mode 100644 app/src/assets/sound/voice_off.mp3 create mode 100644 app/src/assets/sound/voice_off.ogg create mode 100644 app/src/assets/sound/voice_on.mp3 create mode 100644 app/src/assets/sound/voice_on.ogg create mode 100644 app/src/index.html create mode 100644 app/src/lib.ts create mode 100644 app/src/main.ts create mode 100644 app/src/polyfills.ts create mode 100644 app/src/styles.css create mode 100644 app/src/test.ts create mode 100644 app/src/tsconfig.app.json create mode 100644 app/src/tsconfig.spec.json create mode 100644 app/src/typings.d.ts create mode 100644 app/tsconfig.json create mode 100644 app/tslint.json create mode 100644 config/packages/nelmio_cors.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..651665bbd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules +.git diff --git a/.env.dist b/.env.dist index edb7810bb..025790727 100644 --- a/.env.dist +++ b/.env.dist @@ -30,6 +30,12 @@ APP_SECRET=ebfb6dfbab639815bc1da66e6bf7509e DATABASE_URL=mysql://:db:3306/?charset=utf8mb4&serverVersion=5.7 ###< doctrine/doctrine-bundle ### +###> nelmio/cors-bundle ### +# Example: +# CORS_ALLOW_ORIGIN=^https?://localhost:?[0-9]*$ +CORS_ALLOW_ORIGIN=^https?://:?[0-9]*$ +###< nelmio/cors-bundle ### + # Configuration of the mysql docker container # Example: # MYSQL_ROOT_PASSWORD=rootpass00 @@ -56,4 +62,4 @@ PRIORITY2_FILE_PATH= # Example: # ELASTIC_HTTP_CLIENT_BASE_URI=es:9200 -ELASTIC_HTTP_CLIENT_BASE_URI= \ No newline at end of file +ELASTIC_HTTP_CLIENT_BASE_URI= diff --git a/.gitignore b/.gitignore index 08bd3f737..886d22b01 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ composer.phar ###< symfony/framework-bundle ### .env -*.csv \ No newline at end of file +*.csv +sync diff --git a/app/.angular-cli.json b/app/.angular-cli.json new file mode 100644 index 000000000..ffcac073a --- /dev/null +++ b/app/.angular-cli.json @@ -0,0 +1,56 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "smartadmin" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "styles.css" + ], + "scripts": [ + ], + "environmentSource": "environments/environment.ts" + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json" + }, + { + "project": "src/tsconfig.spec.json" + }, + { + "project": "e2e/tsconfig.e2e.json" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "css", + "component": { + "style": false, + "template": false + } + } +} diff --git a/app/.env.dist b/app/.env.dist new file mode 100644 index 000000000..abae33131 --- /dev/null +++ b/app/.env.dist @@ -0,0 +1,6 @@ +# API server base URI +# Example: +# API_HTTP_CLIENT_BASE_URI=http://localhost:8080 + +API_HTTP_CLIENT_BASE_URI= + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 000000000..de4d1f007 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/app/.idea/codeStyles/Project.xml b/app/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..c4f89e813 --- /dev/null +++ b/app/.idea/codeStyles/Project.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/codeStyles/codeStyleConfig.xml b/app/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..79ee123c2 --- /dev/null +++ b/app/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/.idea/encodings.xml b/app/.idea/encodings.xml new file mode 100644 index 000000000..15a15b218 --- /dev/null +++ b/app/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/.idea/inspectionProfiles/Project_Default.xml b/app/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..df7825df6 --- /dev/null +++ b/app/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/.idea/misc.xml b/app/.idea/misc.xml new file mode 100644 index 000000000..0ecb5c327 --- /dev/null +++ b/app/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/modules.xml b/app/.idea/modules.xml new file mode 100644 index 000000000..4606e30c2 --- /dev/null +++ b/app/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/painel-frontend.iml b/app/.idea/painel-frontend.iml new file mode 100644 index 000000000..b5aa097d1 --- /dev/null +++ b/app/.idea/painel-frontend.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/.idea/vcs.xml b/app/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/app/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.idea/workspace.xml b/app/.idea/workspace.xml new file mode 100644 index 000000000..5995984d6 --- /dev/null +++ b/app/.idea/workspace.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +