From 0a15f364a24c5485abac3dc85b6dc6a4be5c7474 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Thu, 8 Apr 2021 16:41:54 +0200 Subject: [PATCH] add flex reciepes in base folder --- .env | 42 +- composer.json | 16 +- composer.lock | 3943 ++++++++++++++++- config/bundles.php | 8 + config/packages/dev/jms_serializer.yaml | 7 + config/packages/dev/swiftmailer.yaml | 4 + config/packages/doctrine.yaml | 19 + config/packages/doctrine_migrations.yaml | 6 + config/packages/fos_rest.yaml | 15 + config/packages/jms_serializer.yaml | 13 + config/packages/prod/doctrine.yaml | 20 + config/packages/prod/jms_serializer.yaml | 6 + config/packages/sensio_framework_extra.yaml | 3 + config/packages/swiftmailer.yaml | 3 + config/packages/test/doctrine.yaml | 7 + config/packages/test/swiftmailer.yaml | 2 + config/packages/test/twig.yaml | 2 + config/packages/twig.yaml | 2 + config/routes/annotations.yaml | 7 + doc/database_creation.md | 13 + doc/env-example | 53 + doc/examples.md | 65 + doc/migration.md | 16 + doc/nginx.md | 10 + doc/nginx/base-framadate-api.conf | 63 + doc/nginx/base-symfony.conf | 50 + doc/nginx/framadate-api.conf | 95 + doc/nginx/setup.sh | 28 + migrations/.gitignore | 0 src/Controller/AdminController.php | 18 + src/Controller/DefaultController.php | 18 + src/Controller/FramadateController.php | 156 + src/Controller/MigrationController.php | 26 + src/Controller/OwnerController.php | 18 + src/Controller/VoteController.php | 18 + src/Entity/.gitignore | 0 src/Entity/Choice.php | 145 + src/Entity/Comment.php | 103 + src/Entity/Owner.php | 228 + src/Entity/Poll.php | 606 +++ src/Entity/StackOfVotes.php | 145 + src/Entity/Vote.php | 124 + src/Entity/timedTrait.php | 12 + src/Repository/.gitignore | 0 src/Repository/ChoiceRepository.php | 50 + src/Repository/CommentRepository.php | 50 + src/Repository/OwnerRepository.php | 50 + src/Repository/PollRepository.php | 52 + src/Repository/StackOfVotesRepository.php | 50 + src/Repository/VoteRepository.php | 50 + symfony.lock | 239 + templates/admin/index.html.twig | 20 + templates/base.html.twig | 35 + templates/default/index.html.twig | 20 + templates/email-base-plaintext.html.twig | 15 + templates/email-base.html.twig | 64 + templates/emails/author-mail.html.twig | 25 + .../emails/comment-notification.html.twig | 22 + templates/emails/creation-mail.html.twig | 30 + templates/emails/expiration-mail.html.twig | 15 + templates/emails/footer.html.twig | 24 + .../modification-notification-mail.html.twig | 14 + templates/emails/owner-list.html.twig | 26 + templates/emails/partial/admin_link.html.twig | 2 + templates/emails/partial/poll.html.twig | 39 + .../emails/partial/public_link.html.twig | 11 + templates/emails/vote-notification.html.twig | 13 + templates/index.html.twig | 67 + templates/migration/index.html.twig | 20 + templates/owner/index.html.twig | 20 + templates/pages/funky.html.twig | 14 + templates/pages/home.html.twig | 5 + templates/poll/_delete_form.html.twig | 5 + templates/poll/_form.html.twig | 4 + templates/poll/edit.html.twig | 13 + templates/poll/index.html.twig | 65 + templates/poll/new.html.twig | 11 + templates/poll/show.html.twig | 78 + templates/split/footer.html.twig | 14 + templates/split/header.html.twig | 20 + templates/vote/index.html.twig | 20 + translations/en.json | 131 + translations/fr.json | 131 + 83 files changed, 7663 insertions(+), 6 deletions(-) create mode 100644 config/packages/dev/jms_serializer.yaml create mode 100644 config/packages/dev/swiftmailer.yaml create mode 100644 config/packages/doctrine.yaml create mode 100644 config/packages/doctrine_migrations.yaml create mode 100644 config/packages/fos_rest.yaml create mode 100644 config/packages/jms_serializer.yaml create mode 100644 config/packages/prod/doctrine.yaml create mode 100644 config/packages/prod/jms_serializer.yaml create mode 100644 config/packages/sensio_framework_extra.yaml create mode 100644 config/packages/swiftmailer.yaml create mode 100644 config/packages/test/doctrine.yaml create mode 100644 config/packages/test/swiftmailer.yaml create mode 100644 config/packages/test/twig.yaml create mode 100644 config/packages/twig.yaml create mode 100644 config/routes/annotations.yaml create mode 100644 doc/database_creation.md create mode 100755 doc/env-example create mode 100755 doc/examples.md create mode 100644 doc/migration.md create mode 100755 doc/nginx.md create mode 100755 doc/nginx/base-framadate-api.conf create mode 100755 doc/nginx/base-symfony.conf create mode 100755 doc/nginx/framadate-api.conf create mode 100755 doc/nginx/setup.sh create mode 100644 migrations/.gitignore create mode 100644 src/Controller/AdminController.php create mode 100644 src/Controller/DefaultController.php create mode 100755 src/Controller/FramadateController.php create mode 100644 src/Controller/MigrationController.php create mode 100644 src/Controller/OwnerController.php create mode 100644 src/Controller/VoteController.php create mode 100644 src/Entity/.gitignore create mode 100755 src/Entity/Choice.php create mode 100755 src/Entity/Comment.php create mode 100755 src/Entity/Owner.php create mode 100755 src/Entity/Poll.php create mode 100755 src/Entity/StackOfVotes.php create mode 100755 src/Entity/Vote.php create mode 100755 src/Entity/timedTrait.php create mode 100644 src/Repository/.gitignore create mode 100755 src/Repository/ChoiceRepository.php create mode 100755 src/Repository/CommentRepository.php create mode 100755 src/Repository/OwnerRepository.php create mode 100755 src/Repository/PollRepository.php create mode 100755 src/Repository/StackOfVotesRepository.php create mode 100755 src/Repository/VoteRepository.php create mode 100644 templates/admin/index.html.twig create mode 100755 templates/base.html.twig create mode 100644 templates/default/index.html.twig create mode 100644 templates/email-base-plaintext.html.twig create mode 100644 templates/email-base.html.twig create mode 100755 templates/emails/author-mail.html.twig create mode 100644 templates/emails/comment-notification.html.twig create mode 100755 templates/emails/creation-mail.html.twig create mode 100755 templates/emails/expiration-mail.html.twig create mode 100755 templates/emails/footer.html.twig create mode 100755 templates/emails/modification-notification-mail.html.twig create mode 100755 templates/emails/owner-list.html.twig create mode 100644 templates/emails/partial/admin_link.html.twig create mode 100644 templates/emails/partial/poll.html.twig create mode 100644 templates/emails/partial/public_link.html.twig create mode 100644 templates/emails/vote-notification.html.twig create mode 100755 templates/index.html.twig create mode 100644 templates/migration/index.html.twig create mode 100644 templates/owner/index.html.twig create mode 100644 templates/pages/funky.html.twig create mode 100644 templates/pages/home.html.twig create mode 100644 templates/poll/_delete_form.html.twig create mode 100644 templates/poll/_form.html.twig create mode 100644 templates/poll/edit.html.twig create mode 100644 templates/poll/index.html.twig create mode 100644 templates/poll/new.html.twig create mode 100644 templates/poll/show.html.twig create mode 100644 templates/split/footer.html.twig create mode 100644 templates/split/header.html.twig create mode 100644 templates/vote/index.html.twig create mode 100755 translations/en.json create mode 100755 translations/fr.json diff --git a/.env b/.env index ec8a266..073e40e 100644 --- a/.env +++ b/.env @@ -11,9 +11,47 @@ # 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.html#use-environment-variables-for-infrastructure-configuration +# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration ###> symfony/framework-bundle ### APP_ENV=dev -APP_SECRET=07ce2d71aface91c392a17c7081f683c +ADMIN_TOKEN=CHANGE_THIS_STRING_HERE +APP_SECRET=CHANGE_THIS_STRING_THERE +# Base website url, should contain https:// and having no trailing slash. example: BASE_URL=https://framadate.org +BASE_URL=https://YOUR_WEBSITE +WEBSITE_NAME=Framadate_2 +WEBSITE_LOGO=logo.svg +#TRUSTED_PROXIES=127.0.0.1,127.0.0.2 +#TRUSTED_HOSTS='^localhost|example\.com$' ###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.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" +# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11" +# IMPORTANT: You MUST also configure your db driver and server_version in config/packages/doctrine.yaml +DATABASE_URL=mysql://framadate-admin:framadate-admin-password@127.0.0.1:3306/framadate_api +###< doctrine/doctrine-bundle ### + +###> nelmio/cors-bundle ### +CORS_ALLOW_ORIGIN=^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$ +###< nelmio/cors-bundle ### + +###> symfony/swiftmailer-bundle ### +# For Gmail as a transport, use: "gmail://username:password@localhost" +# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" +# Delivery is disabled by default via "null://localhost" +MAILER_URL=sendmail://YOUR_WEBSITE +# set the support email who will answer users in case of emergency +SUPPORT_EMAIL=YOUR_EMAIL +###< symfony/swiftmailer-bundle ### + +###> symfony/mailer ### +MAILER_DSN=smtp://localhost +###< symfony/mailer ### +## Migration from v1 +OLD_DATABASE_NAME=framadate +OLD_DATABASE_USER=framadate +OLD_DATABASE_PASS=framadate +### UNIQ_INSTALL_KEY must be really unique +UNIQ_INSTALL_KEY=superCaliFragilistiExpialidousiousse diff --git a/composer.json b/composer.json index a95524c..b3dd9ee 100644 --- a/composer.json +++ b/composer.json @@ -7,14 +7,23 @@ "php": ">=7.2.5", "ext-ctype": "*", "ext-iconv": "*", + "composer/package-versions-deprecated": "1.11.99.1", + "doctrine/doctrine-bundle": "^2.3", + "doctrine/doctrine-migrations-bundle": "^3.1", + "doctrine/orm": "^2.8", + "friendsofsymfony/rest-bundle": "^3.0", + "jms/serializer-bundle": "^3.9", + "sensio/framework-extra-bundle": "^6.1", "symfony/console": "5.2.*", "symfony/dotenv": "5.2.*", "symfony/flex": "^1.3.1", + "symfony/form": "5.2.*", "symfony/framework-bundle": "5.2.*", + "symfony/proxy-manager-bridge": "5.2.*", + "symfony/swiftmailer-bundle": "^3.5", + "symfony/twig-bundle": "5.2.*", "symfony/yaml": "5.2.*" }, - "require-dev": { - }, "config": { "optimize-autoloader": true, "preferred-install": { @@ -57,5 +66,8 @@ "allow-contrib": false, "require": "5.2.*" } + }, + "require-dev": { + "symfony/maker-bundle": "^1.30" } } diff --git a/composer.lock b/composer.lock index 79acc9c..983ee2b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,2173 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ddab81359814b88dad27a2f6d961a375", + "content-hash": "f5dc0da6106cdc7158e5aa765c01596f", "packages": [ + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.1", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-11-11T10:22:58+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/b17c5014ef81d212ac539f07a1001832df1b6d3b", + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^9.1.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.12.1" + }, + "time": "2021-02-21T21:00:45+00:00" + }, + { + "name": "doctrine/cache", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "13e3381b25847283a91948d04640543941309727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", + "reference": "13e3381b25847283a91948d04640543941309727", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.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.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/1.10.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2020-07-07T18:54:01+00:00" + }, + { + "name": "doctrine/collections", + "version": "1.6.7", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "shasum": "" + }, + "require": { + "php": "^7.1.3 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan-shim": "^0.9.2", + "phpunit/phpunit": "^7.0", + "vimeo/psalm": "^3.8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/1.6.7" + }, + "time": "2020-07-27T17:53:49+00:00" + }, + { + "name": "doctrine/common", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0 || ^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "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, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.1.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2021-02-10T20:18:51+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.13.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "67d56d3203b33db29834e6b2fcdbfdc50535d796" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/67d56d3203b33db29834e6b2fcdbfdc50535d796", + "reference": "67d56d3203b33db29834e6b2fcdbfdc50535d796", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "doctrine/coding-standard": "8.2.0", + "jetbrains/phpstorm-stubs": "2020.2", + "phpstan/phpstan": "0.12.81", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.0", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "4.6.4" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "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", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2021-03-28T18:10:53+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v0.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + }, + "time": "2021-03-21T12:59:47+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "a08bc3b4d8567cdff05e89b272ba1e06e9d71c21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/a08bc3b4d8567cdff05e89b272ba1e06e9d71c21", + "reference": "a08bc3b4d8567cdff05e89b272ba1e06e9d71c21", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9.0|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", + "symfony/cache": "^4.3.3|^5.0", + "symfony/config": "^4.3.3|^5.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0", + "symfony/dependency-injection": "^4.3.3|^5.0", + "symfony/doctrine-bridge": "^4.4.7|^5.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/service-contracts": "^1.1.1|^2.0" + }, + "conflict": { + "doctrine/orm": "<2.6", + "twig/twig": "<1.34|>=2.0,<2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "doctrine/orm": "^2.6", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", + "psalm/plugin-phpunit": "^0.15.1", + "psalm/plugin-symfony": "^2.2.4", + "symfony/phpunit-bridge": "^5.2", + "symfony/property-info": "^4.3.3|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", + "symfony/security-bundle": "^4.4|5.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0", + "twig/twig": "^1.34|^2.12|^3.0", + "vimeo/psalm": "^4.7" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2021-04-05T14:21:02+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "d1248471734c62b94baac36cb18e9c635775eeb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/d1248471734c62b94baac36cb18e9c635775eeb0", + "reference": "d1248471734c62b94baac36cb18e9c635775eeb0", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "~1.0|~2.0", + "doctrine/migrations": "^3.1", + "php": "^7.2|^8.0", + "symfony/framework-bundle": "~3.4|~4.0|~5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3||^2.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2021-04-05T20:45:07+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.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": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2020-05-29T18:28:51+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2020-05-29T15:13:26+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "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": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-11-10T18:47:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "doctrine/migrations", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "e543224170a61ffe49fcadb8e7339c345df1baa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/e543224170a61ffe49fcadb8e7339c345df1baa2", + "reference": "e543224170a61ffe49fcadb8e7339c345df1baa2", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.8", + "doctrine/dbal": "^2.10", + "doctrine/event-manager": "^1.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.2 || ^8.0", + "psr/log": "^1.1.3", + "symfony/console": "^3.4 || ^4.4.16 || ^5.0", + "symfony/stopwatch": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3 || ^2.0", + "doctrine/sql-formatter": "^1.0", + "ergebnis/composer-normalize": "^2.9", + "ext-pdo_sqlite": "*", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpstan/phpstan-symfony": "^0.12", + "phpunit/phpunit": "^8.5 || ^9.4", + "symfony/process": "^3.4 || ^4.0 || ^5.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0" + }, + "suggest": { + "doctrine/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": "3.0.x-dev" + }, + "composer-normalize": { + "indent-size": 4, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "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": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/3.1.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2021-03-14T11:10:58+00:00" + }, + { + "name": "doctrine/orm", + "version": "2.8.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "a588555ecd837b8d7e89355d9a13902e54d529c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/a588555ecd837b8d7e89355d9a13902e54d529c7", + "reference": "a588555ecd837b8d7e89355d9a13902e54d529c7", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.8", + "doctrine/annotations": "^1.11.1", + "doctrine/cache": "^1.9.1", + "doctrine/collections": "^1.5", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.10.0", + "doctrine/event-manager": "^1.1", + "doctrine/inflector": "^1.4|^2.0", + "doctrine/instantiator": "^1.3", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^2.0", + "ext-pdo": "*", + "php": "^7.2|^8.0", + "symfony/console": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^8.5|^9.4", + "symfony/yaml": "^3.4|^4.0|^5.0", + "vimeo/psalm": "4.1.1" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.8.4" + }, + "time": "2021-04-05T18:38:36+00:00" + }, + { + "name": "doctrine/persistence", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "9899c16934053880876b920a3b8b02ed2337ac1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/9899c16934053880876b920a3b8b02ed2337ac1d", + "reference": "9899c16934053880876b920a3b8b02ed2337ac1d", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^6.0 || ^8.0", + "doctrine/common": "^3.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", + "vimeo/psalm": "^3.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common", + "Doctrine\\Persistence\\": "lib/Doctrine/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "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" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/2.1.0" + }, + "time": "2020-10-24T22:13:54+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "56070bebac6e77230ed7d306ad13528e60732871" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", + "reference": "56070bebac6e77230ed7d306ad13528e60732871", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "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/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" + }, + "time": "2020-07-30T16:57:33+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "c81f18a3efb941d8c4d2e025f6183b5c6d697307" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/c81f18a3efb941d8c4d2e025f6183b5c6d697307", + "reference": "c81f18a3efb941d8c4d2e025f6183b5c6d697307", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2021-04-01T18:37:14+00:00" + }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2021-01-14T21:52:44+00:00" + }, + { + "name": "friendsofsymfony/rest-bundle", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git", + "reference": "8779ceebf715d1c60bd10286fce9d32ed03c484a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/8779ceebf715d1c60bd10286fce9d32ed03c484a", + "reference": "8779ceebf715d1c60bd10286fce9d32ed03c484a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "psr/log": "^1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4.1|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/security-core": "^3.4|^4.3|^5.0", + "willdurand/jsonp-callback-validator": "^1.0", + "willdurand/negotiation": "^2.0|^3.0" + }, + "conflict": { + "doctrine/inflector": "1.4.0", + "jms/serializer": "<1.13.0", + "jms/serializer-bundle": "<2.4.3|3.0.0", + "sensio/framework-extra-bundle": "<5.2.3", + "symfony/error-handler": "<4.4.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "jms/serializer": "^1.13|^2.0|^3.0", + "jms/serializer-bundle": "^2.4.3|^3.0.1", + "phpoption/phpoption": "^1.1", + "psr/http-message": "^1.0", + "sensio/framework-extra-bundle": "^5.2.3", + "symfony/asset": "^4.4|^5.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/phpunit-bridge": "^5.2", + "symfony/security-bundle": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/web-profiler-bundle": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended, requires ^2.0|^3.0", + "sensio/framework-extra-bundle": "Add support for the request body converter and the view response listener, requires ^3.0", + "symfony/serializer": "Add support for basic serialization capabilities and xml decoding, requires ^2.7|^3.0", + "symfony/validator": "Add support for validation capabilities in the ParamFetcher, requires ^2.7|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "3.x-dev": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "FOS\\RestBundle\\": "" + }, + "exclude-from-classmap": [ + "Resources/", + "Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukas Kahwe Smith", + "email": "smith@pooteeweet.org" + }, + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com" + }, + { + "name": "FriendsOfSymfony Community", + "homepage": "https://github.com/friendsofsymfony/FOSRestBundle/contributors" + } + ], + "description": "This Bundle provides various tools to rapidly develop RESTful API's with Symfony", + "homepage": "http://friendsofsymfony.github.com", + "keywords": [ + "rest" + ], + "support": { + "issues": "https://github.com/FriendsOfSymfony/FOSRestBundle/issues", + "source": "https://github.com/FriendsOfSymfony/FOSRestBundle/tree/3.0.5" + }, + "time": "2021-01-02T11:26:24+00:00" + }, + { + "name": "jms/metadata", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "b5c52549807b2d855b3d7e36ec164c00eb547338" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/b5c52549807b2d855b3d7e36ec164c00eb547338", + "reference": "b5c52549807b2d855b3d7e36ec164c00eb547338", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "doctrine/cache": "^1.0", + "doctrine/coding-standard": "^8.0", + "mikey179/vfsstream": "^1.6.7", + "phpunit/phpunit": "^8.5|^9.0", + "psr/container": "^1.0", + "symfony/cache": "^3.1|^4.0|^5.0", + "symfony/dependency-injection": "^3.1|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "support": { + "issues": "https://github.com/schmittjoh/metadata/issues", + "source": "https://github.com/schmittjoh/metadata/tree/2.5.0" + }, + "time": "2021-03-07T19:20:09+00:00" + }, + { + "name": "jms/serializer", + "version": "3.12.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "ea54838a0acd960839b7401bfd83fcd6ebe34aed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/ea54838a0acd960839b7401bfd83fcd6ebe34aed", + "reference": "ea54838a0acd960839b7401bfd83fcd6ebe34aed", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/instantiator": "^1.0.3", + "doctrine/lexer": "^1.1", + "jms/metadata": "^2.0", + "php": "^7.2||^8.0", + "phpstan/phpdoc-parser": "^0.4" + }, + "require-dev": { + "doctrine/coding-standard": "^8.1", + "doctrine/orm": "~2.1", + "doctrine/persistence": "^1.3.3|^2.0|^3.0", + "doctrine/phpcr-odm": "^1.3|^2.0", + "ext-pdo_sqlite": "*", + "jackalope/jackalope-doctrine-dbal": "^1.1.5", + "ocramius/proxy-manager": "^1.0|^2.0", + "phpstan/phpstan": "^0.12.65", + "phpunit/phpunit": "^8.0||^9.0", + "psr/container": "^1.0", + "symfony/dependency-injection": "^3.0|^4.0|^5.0", + "symfony/expression-language": "^3.0|^4.0|^5.0", + "symfony/filesystem": "^3.0|^4.0|^5.0", + "symfony/form": "^3.0|^4.0|^5.0", + "symfony/translation": "^3.0|^4.0|^5.0", + "symfony/validator": "^3.1.9|^4.0|^5.0", + "symfony/yaml": "^3.3|^4.0|^5.0", + "twig/twig": "~1.34|~2.4|^3.0" + }, + "suggest": { + "doctrine/cache": "Required if you like to use cache functionality.", + "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "symfony/yaml": "Required if you'd like to use the YAML metadata format." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.12-dev" + } + }, + "autoload": { + "psr-4": { + "JMS\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ], + "support": { + "issues": "https://github.com/schmittjoh/serializer/issues", + "source": "https://github.com/schmittjoh/serializer/tree/3.12.2" + }, + "funding": [ + { + "url": "https://github.com/goetas", + "type": "github" + } + ], + "time": "2021-03-23T12:37:04+00:00" + }, + { + "name": "jms/serializer-bundle", + "version": "3.9.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/JMSSerializerBundle.git", + "reference": "2fbf2385668dd715d030567fd41e181bbf41fb42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/JMSSerializerBundle/zipball/2fbf2385668dd715d030567fd41e181bbf41fb42", + "reference": "2fbf2385668dd715d030567fd41e181bbf41fb42", + "shasum": "" + }, + "require": { + "jms/metadata": "^2.5", + "jms/serializer": "^3.0", + "php": "^7.2 || ^8.0", + "symfony/dependency-injection": "^3.3 || ^4.0 || ^5.0", + "symfony/framework-bundle": "^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.1", + "doctrine/orm": "^2.4", + "phpunit/phpunit": "^8.0 || ^9.0", + "symfony/expression-language": "^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^3.0 || ^4.0 || ^5.0", + "symfony/form": "^3.0 || ^4.0 || ^5.0", + "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0", + "symfony/twig-bundle": "*", + "symfony/validator": "^3.0 || ^4.0 || ^5.0", + "symfony/yaml": "^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "jms/di-extra-bundle": "Required to get lazy loading (de)serialization visitors, ^1.3", + "symfony/expression-language": "Required for opcache preloading, ^3.0 || ^4.0 || ^5.0", + "symfony/finder": "Required for cache warmup, supported versions ^3.0|^4.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.9-dev" + } + }, + "autoload": { + "psr-4": { + "JMS\\SerializerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "Allows you to easily serialize, and deserialize data of any complexity", + "homepage": "http://jmsyst.com/bundles/JMSSerializerBundle", + "keywords": [ + "deserialization", + "json", + "serialization", + "xml" + ], + "support": { + "issues": "https://github.com/schmittjoh/JMSSerializerBundle/issues", + "source": "https://github.com/schmittjoh/JMSSerializerBundle/tree/3.9.1" + }, + "funding": [ + { + "url": "https://github.com/goetas", + "type": "github" + } + ], + "time": "2021-03-23T12:21:23+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "5b553c274b94af3f880cbaaf8fbab047f279a31c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/5b553c274b94af3f880cbaaf8fbab047f279a31c", + "reference": "5b553c274b94af3f880cbaaf8fbab047f279a31c", + "shasum": "" + }, + "require": { + "laminas/laminas-eventmanager": "^3.3", + "php": "^7.4 || ~8.0.0" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "replace": { + "zendframework/zend-code": "self.version" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^2.1.4", + "laminas/laminas-stdlib": "^3.3.0", + "phpunit/phpunit": "^9.4.2", + "psalm/plugin-phpunit": "^0.14.0", + "vimeo/psalm": "^4.3.1" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component", + "laminas/laminas-zendframework-bridge": "A bridge with Zend Framework" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2021-03-27T13:55:31+00:00" + }, + { + "name": "laminas/laminas-eventmanager", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-eventmanager.git", + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/966c859b67867b179fde1eff0cd38df51472ce4a", + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a", + "shasum": "" + }, + "require": { + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.3 || ^8.0" + }, + "replace": { + "zendframework/zend-eventmanager": "^3.2.1" + }, + "require-dev": { + "container-interop/container-interop": "^1.1", + "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0", + "phpbench/phpbench": "^0.17.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "container-interop/container-interop": "^1.1, to use the lazy listeners feature", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://laminas.dev", + "keywords": [ + "event", + "eventmanager", + "events", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-eventmanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-eventmanager/issues", + "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", + "source": "https://github.com/laminas/laminas-eventmanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2021-03-08T15:24:29+00:00" + }, + { + "name": "laminas/laminas-zendframework-bridge", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-zendframework-bridge.git", + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6cccbddfcfc742eb02158d6137ca5687d92cee32", + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", + "psalm/plugin-phpunit": "^0.15.1", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.6" + }, + "type": "library", + "extra": { + "laminas": { + "module": "Laminas\\ZendFrameworkBridge" + } + }, + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ZendFrameworkBridge\\": "src//" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Alias legacy ZF class names to Laminas Project equivalents.", + "keywords": [ + "ZendFramework", + "autoloading", + "laminas", + "zf" + ], + "support": { + "forum": "https://discourse.laminas.dev/", + "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", + "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", + "source": "https://github.com/laminas/laminas-zendframework-bridge" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2021-02-25T21:54:58+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "0.4.14", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "cf4fc7d2aeca6910fba061901ffd7d107ccfdbcc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cf4fc7d2aeca6910fba061901ffd7d107ccfdbcc", + "reference": "cf4fc7d2aeca6910fba061901ffd7d107ccfdbcc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phing/phing": "^2.16.3", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.60", + "phpstan/phpstan-strict-rules": "^0.12.5", + "phpunit/phpunit": "^7.5.20", + "symfony/process": "^5.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/0.4.14" + }, + "time": "2021-03-19T10:54:14+00:00" + }, { "name": "psr/cache", "version": "2.0.0", @@ -203,6 +2368,159 @@ }, "time": "2020-03-23T09:12:05+00:00" }, + { + "name": "sensio/framework-extra-bundle", + "version": "v6.1.1", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "8ef75e99f20332f2725587896364f7079b53de95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/8ef75e99f20332f2725587896364f7079b53de95", + "reference": "8ef75e99f20332f2725587896364f7079b53de95", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "doctrine/dbal": "^2.10|^3.0", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/doctrine-bridge": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/monolog-bridge": "^4.0|^5.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9", + "symfony/security-bundle": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "6.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] + }, + "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" + ], + "support": { + "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.1.1" + }, + "time": "2021-02-23T11:50:58+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "15f7faf8508e04471f666633addacf54c0ab5933" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/15f7faf8508e04471f666633addacf54c0ab5933", + "reference": "15f7faf8508e04471f666633addacf54c0ab5933", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.0" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "time": "2021-03-09T12:30:35+00:00" + }, { "name": "symfony/cache", "version": "v5.2.6", @@ -707,6 +3025,120 @@ ], "time": "2020-09-07T11:33:47+00:00" }, + { + "name": "symfony/doctrine-bridge", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "72b6d743c6108e2b8d15ab94e1a8a224c4d0d144" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/72b6d743c6108e2b8d15ab94e1a8a224c4d0d144", + "reference": "72b6d743c6108e2b8d15ab94e1a8a224c4d0d144", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "doctrine/dbal": "<2.10", + "phpunit/phpunit": "<5.4.3", + "symfony/dependency-injection": "<4.4", + "symfony/form": "<5.1", + "symfony/http-kernel": "<5", + "symfony/messenger": "<4.4", + "symfony/property-info": "<5", + "symfony/security-bundle": "<5", + "symfony/security-core": "<5", + "symfony/validator": "<5.2" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.8", + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "~1.6", + "doctrine/collections": "~1.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^2.10|^3.0", + "doctrine/orm": "^2.7.3", + "symfony/cache": "^5.1", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/doctrine-messenger": "^5.1", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^5.1.3", + "symfony/http-kernel": "^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.0", + "symfony/property-info": "^5.0", + "symfony/proxy-manager-bridge": "^4.4|^5.0", + "symfony/security-core": "^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/uid": "^5.1", + "symfony/validator": "^5.2", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "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": "Provides integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-10T22:10:15+00:00" + }, { "name": "symfony/dotenv", "version": "v5.2.4", @@ -1201,6 +3633,107 @@ ], "time": "2021-02-16T14:05:05+00:00" }, + { + "name": "symfony/form", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/form.git", + "reference": "40fbaed8d4238e37fdd1fecce8e0678a3eb0e48b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/form/zipball/40fbaed8d4238e37fdd1fecce8e0678a3eb0e48b", + "reference": "40fbaed8d4238e37fdd1fecce8e0678a3eb0e48b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/options-resolver": "^5.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/property-access": "^5.0.8", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<4.4", + "symfony/error-handler": "<4.4.5", + "symfony/framework-bundle": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/translation": "<4.4", + "symfony/translation-contracts": "<1.1.7", + "symfony/twig-bridge": "<4.4" + }, + "require-dev": { + "doctrine/collections": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^4.4.17|^5.1.9", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "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": "Allows to easily create, process and reuse HTML forms", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/form/tree/v5.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-28T09:59:03+00:00" + }, { "name": "symfony/framework-bundle", "version": "v5.2.6", @@ -1614,6 +4147,163 @@ ], "time": "2021-03-29T05:16:58+00:00" }, + { + "name": "symfony/intl", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "11b4217e394c80a2e313d3a4a37262fbe65a7add" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/11b4217e394c80a2e313d3a4a37262fbe65a7add", + "reference": "11b4217e394c80a2e313d3a4a37262fbe65a7add", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/filesystem": "^4.4|^5.0" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-18T22:42:36+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T12:56:27+00:00" + }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.22.1", @@ -1695,6 +4385,180 @@ ], "time": "2021-01-22T09:19:47+00:00" }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "af1842919c7e7364aaaa2798b29839e3ba168588" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/af1842919c7e7364aaaa2798b29839e3ba168588", + "reference": "af1842919c7e7364aaaa2798b29839e3ba168588", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "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 polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.22.1", @@ -2021,6 +4885,244 @@ ], "time": "2021-01-07T16:49:33+00:00" }, + { + "name": "symfony/property-access", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3", + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/property-info": "^5.2" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:15:41+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/string": "^5.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-17T15:24:54+00:00" + }, + { + "name": "symfony/proxy-manager-bridge", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/proxy-manager-bridge.git", + "reference": "fd6bb40190b1719abbe831be09adf38e0744d5f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/fd6bb40190b1719abbe831be09adf38e0744d5f5", + "reference": "fd6bb40190b1719abbe831be09adf38e0744d5f5", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.8", + "friendsofphp/proxy-manager-lts": "^1.0.2", + "php": ">=7.2.5", + "symfony/dependency-injection": "^5.0" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\ProxyManager\\": "" + }, + "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": "Provides integration for ProxyManager with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:01:46+00:00" + }, { "name": "symfony/routing", "version": "v5.2.6", @@ -2111,6 +5213,95 @@ ], "time": "2021-03-14T13:53:33+00:00" }, + { + "name": "symfony/security-core", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/9dcedab1c2c637fc9a377b3a9313a61087609760", + "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^5.2" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "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 Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-10T22:10:15+00:00" + }, { "name": "symfony/service-contracts", "version": "v2.2.0", @@ -2190,6 +5381,68 @@ ], "time": "2020-09-07T11:33:47+00:00" }, + { + "name": "symfony/stopwatch", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b12274acfab9d9850c52583d136a24398cdf1a0c", + "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:15:41+00:00" + }, { "name": "symfony/string", "version": "v5.2.6", @@ -2273,6 +5526,371 @@ ], "time": "2021-03-17T17:12:15+00:00" }, + { + "name": "symfony/swiftmailer-bundle", + "version": "v3.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/swiftmailer-bundle.git", + "reference": "6b72355549f02823a2209180f9c035e46ca3f178" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/6b72355549f02823a2209180f9c035e46ca3f178", + "reference": "6b72355549f02823a2209180f9c035e46ca3f178", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "swiftmailer/swiftmailer": "^6.1.3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "conflict": { + "twig/twig": "<1.41|>=2.0,<2.10" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SwiftmailerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony SwiftmailerBundle", + "homepage": "http://symfony.com", + "support": { + "issues": "https://github.com/symfony/swiftmailer-bundle/issues", + "source": "https://github.com/symfony/swiftmailer-bundle/tree/v3.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-25T17:31:39+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "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": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-28T13:05:58+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "a65d8d38c66f147f29b73d53d14e8c9a983653b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/a65d8d38c66f147f29b73d53d14e8c9a983653b8", + "reference": "a65d8d38c66f147f29b73d53d14e8c9a983653b8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<4.4", + "symfony/form": "<5.1", + "symfony/http-foundation": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.2", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^5.1.9", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/mime": "^5.2", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^4.4|^5.1", + "symfony/routing": "^4.4|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/serializer": "^5.2", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.2", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^5.2", + "symfony/yaml": "^4.4|^5.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" + }, + "suggest": { + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "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": "Provides integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v5.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-16T09:10:13+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", + "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/dependency-injection": "<5.2", + "symfony/framework-bundle": "<5.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "~1.0", + "symfony/asset": "^4.4|^5.0", + "symfony/dependency-injection": "^5.2", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "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": "Provides a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:15:41+00:00" + }, { "name": "symfony/var-dumper", "version": "v5.2.6", @@ -2508,9 +6126,330 @@ } ], "time": "2021-03-06T07:59:01+00:00" + }, + { + "name": "twig/twig", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "1f3b7e2c06cc05d42936a8ad508ff1db7975cdc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/1f3b7e2c06cc05d42936a8ad508ff1db7975cdc5", + "reference": "1f3b7e2c06cc05d42936a8ad508ff1db7975cdc5", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2021-02-08T09:54:36+00:00" + }, + { + "name": "willdurand/jsonp-callback-validator", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/willdurand/JsonpCallbackValidator.git", + "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909", + "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonpCallbackValidator": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "william.durand1@gmail.com", + "homepage": "http://www.willdurand.fr" + } + ], + "description": "JSONP callback validator.", + "support": { + "issues": "https://github.com/willdurand/JsonpCallbackValidator/issues", + "source": "https://github.com/willdurand/JsonpCallbackValidator/tree/master" + }, + "time": "2014-01-20T22:35:06+00:00" + }, + { + "name": "willdurand/negotiation", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/willdurand/Negotiation.git", + "reference": "04e14f38d4edfcc974114a07d2777d90c98f3d9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/04e14f38d4edfcc974114a07d2777d90c98f3d9c", + "reference": "04e14f38d4edfcc974114a07d2777d90c98f3d9c", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Negotiation\\": "src/Negotiation" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "will+git@drnd.me" + } + ], + "description": "Content Negotiation tools for PHP provided as a standalone library.", + "homepage": "http://williamdurand.fr/Negotiation/", + "keywords": [ + "accept", + "content", + "format", + "header", + "negotiation" + ], + "support": { + "issues": "https://github.com/willdurand/Negotiation/issues", + "source": "https://github.com/willdurand/Negotiation/tree/3.0.0" + }, + "time": "2020-09-25T08:01:41+00:00" + } + ], + "packages-dev": [ + { + "name": "nikic/php-parser", + "version": "v4.10.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + }, + "time": "2020-12-20T10:01:03+00:00" + }, + { + "name": "symfony/maker-bundle", + "version": "v1.30.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "a395a85aa4ded6c1fa3da118d60329b64b6c2acd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a395a85aa4ded6c1fa3da118d60329b64b6c2acd", + "reference": "a395a85aa4ded6c1fa3da118d60329b64b6c2acd", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.2|^2.0", + "nikic/php-parser": "^4.0", + "php": ">=7.1.3", + "symfony/config": "^4.0|^5.0", + "symfony/console": "^4.0|^5.0", + "symfony/dependency-injection": "^4.0|^5.0", + "symfony/deprecation-contracts": "^2.2", + "symfony/filesystem": "^4.0|^5.0", + "symfony/finder": "^4.0|^5.0", + "symfony/framework-bundle": "^4.0|^5.0", + "symfony/http-kernel": "^4.0|^5.0" + }, + "require-dev": { + "composer/semver": "^3.0@dev", + "doctrine/doctrine-bundle": "^1.8|^2.0", + "doctrine/orm": "^2.3", + "friendsofphp/php-cs-fixer": "^2.8", + "friendsoftwig/twigcs": "^4.1.0|^5.0.0", + "symfony/http-client": "^4.3|^5.0", + "symfony/phpunit-bridge": "^4.3|^5.0", + "symfony/process": "^4.0|^5.0", + "symfony/security-core": "^4.0|^5.0", + "symfony/yaml": "^4.0|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MakerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "keywords": [ + "code generator", + "generator", + "scaffold", + "scaffolding" + ], + "support": { + "issues": "https://github.com/symfony/maker-bundle/issues", + "source": "https://github.com/symfony/maker-bundle/tree/v1.30.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T13:53:38+00:00" } ], - "packages-dev": [], "aliases": [], "minimum-stability": "dev", "stability-flags": [], diff --git a/config/bundles.php b/config/bundles.php index 49d3fb6..b101c2a 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -2,4 +2,12 @@ return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], + Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true], + JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], + FOS\RestBundle\FOSRestBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], ]; diff --git a/config/packages/dev/jms_serializer.yaml b/config/packages/dev/jms_serializer.yaml new file mode 100644 index 0000000..f946041 --- /dev/null +++ b/config/packages/dev/jms_serializer.yaml @@ -0,0 +1,7 @@ +jms_serializer: + visitors: + json_serialization: + options: + - JSON_PRETTY_PRINT + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION diff --git a/config/packages/dev/swiftmailer.yaml b/config/packages/dev/swiftmailer.yaml new file mode 100644 index 0000000..b98158e --- /dev/null +++ b/config/packages/dev/swiftmailer.yaml @@ -0,0 +1,4 @@ +# See https://symfony.com/doc/current/email/dev_environment.html +swiftmailer: + # send all emails to a specific address + #delivery_addresses: ['me@example.com'] diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml new file mode 100644 index 0000000..491dc6f --- /dev/null +++ b/config/packages/doctrine.yaml @@ -0,0 +1,19 @@ +doctrine: + dbal: + override_url: true + url: '%env(resolve:DATABASE_URL)%' + + # IMPORTANT: You MUST configure your server version, + # either here or in the DATABASE_URL env var (see .env file) + #server_version: '13' + orm: + auto_generate_proxy_classes: true + naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + 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 0000000..a0a17a0 --- /dev/null +++ b/config/packages/doctrine_migrations.yaml @@ -0,0 +1,6 @@ +doctrine_migrations: + migrations_paths: + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + 'DoctrineMigrations': '%kernel.project_dir%/migrations' + enable_profiler: '%kernel.debug%' diff --git a/config/packages/fos_rest.yaml b/config/packages/fos_rest.yaml new file mode 100644 index 0000000..d96294e --- /dev/null +++ b/config/packages/fos_rest.yaml @@ -0,0 +1,15 @@ +# Read the documentation: https://symfony.com/doc/master/bundles/FOSRestBundle/index.html +fos_rest: null +# param_fetcher_listener: true +# allowed_methods_listener: true +# routing_loader: true +# view: +# view_response_listener: true +# exception: +# codes: +# App\Exception\MyException: 403 +# messages: +# App\Exception\MyException: Forbidden area. +# format_listener: +# rules: +# - { path: ^/api, prefer_extension: true, fallback_format: json, priorities: [ json, html ] } diff --git a/config/packages/jms_serializer.yaml b/config/packages/jms_serializer.yaml new file mode 100644 index 0000000..d25fa03 --- /dev/null +++ b/config/packages/jms_serializer.yaml @@ -0,0 +1,13 @@ +jms_serializer: + visitors: + xml_serialization: + format_output: '%kernel.debug%' +# metadata: +# auto_detection: false +# directories: +# any-name: +# namespace_prefix: "My\\FooBundle" +# path: "@MyFooBundle/Resources/config/serializer" +# another-name: +# namespace_prefix: "My\\BarBundle" +# path: "@MyBarBundle/Resources/config/serializer" diff --git a/config/packages/prod/doctrine.yaml b/config/packages/prod/doctrine.yaml new file mode 100644 index 0000000..084f59a --- /dev/null +++ b/config/packages/prod/doctrine.yaml @@ -0,0 +1,20 @@ +doctrine: + orm: + auto_generate_proxy_classes: false + metadata_cache_driver: + type: pool + pool: doctrine.system_cache_pool + query_cache_driver: + type: pool + pool: doctrine.system_cache_pool + result_cache_driver: + type: pool + pool: doctrine.result_cache_pool + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/prod/jms_serializer.yaml b/config/packages/prod/jms_serializer.yaml new file mode 100644 index 0000000..89c86c8 --- /dev/null +++ b/config/packages/prod/jms_serializer.yaml @@ -0,0 +1,6 @@ +jms_serializer: + visitors: + json_serialization: + options: + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION diff --git a/config/packages/sensio_framework_extra.yaml b/config/packages/sensio_framework_extra.yaml new file mode 100644 index 0000000..1821ccc --- /dev/null +++ b/config/packages/sensio_framework_extra.yaml @@ -0,0 +1,3 @@ +sensio_framework_extra: + router: + annotations: false diff --git a/config/packages/swiftmailer.yaml b/config/packages/swiftmailer.yaml new file mode 100644 index 0000000..cae6508 --- /dev/null +++ b/config/packages/swiftmailer.yaml @@ -0,0 +1,3 @@ +swiftmailer: + url: '%env(MAILER_URL)%' + spool: { type: 'memory' } diff --git a/config/packages/test/doctrine.yaml b/config/packages/test/doctrine.yaml new file mode 100644 index 0000000..a19e8d9 --- /dev/null +++ b/config/packages/test/doctrine.yaml @@ -0,0 +1,7 @@ +#doctrine: +# dbal: +# # Overrides the database name in the test environment only +# # "host", "port", "username", & "password" can also be set to override their respective url parts +# # +# # If you're using ParaTest, "TEST_TOKEN" is set by ParaTest otherwise nothing is appended to the database name. +# dbname: main_test%env(default::TEST_TOKEN)% diff --git a/config/packages/test/swiftmailer.yaml b/config/packages/test/swiftmailer.yaml new file mode 100644 index 0000000..f438078 --- /dev/null +++ b/config/packages/test/swiftmailer.yaml @@ -0,0 +1,2 @@ +swiftmailer: + disable_delivery: true diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml new file mode 100644 index 0000000..8c6e0b4 --- /dev/null +++ b/config/packages/test/twig.yaml @@ -0,0 +1,2 @@ +twig: + strict_variables: true diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 index 0000000..b3cdf30 --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,2 @@ +twig: + default_path: '%kernel.project_dir%/templates' diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml new file mode 100644 index 0000000..e92efc5 --- /dev/null +++ b/config/routes/annotations.yaml @@ -0,0 +1,7 @@ +controllers: + resource: ../../src/Controller/ + type: annotation + +kernel: + resource: ../../src/Kernel.php + type: annotation diff --git a/doc/database_creation.md b/doc/database_creation.md new file mode 100644 index 0000000..8386a3c --- /dev/null +++ b/doc/database_creation.md @@ -0,0 +1,13 @@ +#Database setup + +In the mysql prompt, to create a new user and a dedicated database, run this: +``` +CREATE DATABASE IF NOT EXISTS framadate_api; +CREATE USER 'framadate-admin'@'localhost' IDENTIFIED BY 'framadate-admin-password'; +GRANT ALL PRIVILEGES ON framadate_api.* TO 'framadate-admin'@'localhost'; +FLUSH PRIVILEGES; +SHOW GRANTS FOR 'framadate-admin'@'localhost'; +SHOW DATABASES; +``` + +now you have your config ready to host Framadate API. diff --git a/doc/env-example b/doc/env-example new file mode 100755 index 0000000..14a6bf4 --- /dev/null +++ b/doc/env-example @@ -0,0 +1,53 @@ +# In all environments, the following files are loaded if they exist, +# the latter 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=dev +ADMIN_TOKEN=CHANGE_THIS_STRING_HERE +APP_SECRET=CHANGE_THIS_STRING_THERE +# Base website url, should contain https:// and having no trailing slash. example: BASE_URL=https://framadate.org +BASE_URL=https://localhost +WEBSITE_NAME=Framadate_2 +WEBSITE_LOGO=logo.svg +#TRUSTED_PROXIES=127.0.0.1,127.0.0.2 +#TRUSTED_HOSTS='^localhost|example\.com$' +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.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" +# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11" +# IMPORTANT: You MUST also configure your db driver and server_version in config/packages/doctrine.yaml +DATABASE_URL=mysql://framadate-admin:framadate-admin-password@127.0.0.1:5432/framadate-api +###< doctrine/doctrine-bundle ### + +###> nelmio/cors-bundle ### +CORS_ALLOW_ORIGIN=^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$ +###< nelmio/cors-bundle ### + +###> symfony/swiftmailer-bundle ### +# For Gmail as a transport, use: "gmail://username:password@localhost" +# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" +# Delivery is disabled by default via "null://localhost" +MAILER_URL=sendmail://YOUR_WEBSITE +# set the support email who will answer users in case of emergency +SUPPORT_EMAIL=YOUR_EMAIL +###< symfony/swiftmailer-bundle ### + +###> symfony/mailer ### +MAILER_DSN=smtp://localhost +###< symfony/mailer ### + +DATABASE_URL=mysql://framadate-admin:framadate-admin-password@127.0.0.1:5432/framadate-api diff --git a/doc/examples.md b/doc/examples.md new file mode 100755 index 0000000..aa014b2 --- /dev/null +++ b/doc/examples.md @@ -0,0 +1,65 @@ +# API example +after having setup your project and database, and having a local server running you can rest these commands +## get Swagger configuration + +``` +GET +http://127.0.0.1:8000/api/doc.json +``` + +## create a poll +```http request +POST http://127.0.0.1:8000/api/v1/poll/new +Content-Type:"application/json" + +{ + "title": "un coup à boire", + "description": "et on boit quoi?", + "kind": "text", + "custom_url": "this-is-sparta", + "password":"hah", + "owner": { + "email": "contact@cipherbliss.com", + "pseudo": "cipherbliss crée un sondage par postman" + }, + "choices_to_create": [ "cappou" ,"thé", "café", "vodka" ] +} + +``` + +## get configuration of existing poll, protected with a password + + + +```http request +GET http://127.0.0.1:8000/api/v1/poll/1 +Content-Type:"application/json" +{ + "password_input": "there_is_my_pass" +} + +``` + +## add a vote to an existing poll +```http request +POST http://127.0.0.1:8000/api/v1/poll/1/vote +Content-Type:"application/json" +{ + "pseudo": "tktest", + "email": "testing_vote_people@tktest.com", + "votes": [ + { + "choice_id": 5, + "value": "no" + }, + { + "choice_id": 6, + "value": "maybe" + }, + { + "choice_id": 7, + "value": "yes" + } + ] +} +``` diff --git a/doc/migration.md b/doc/migration.md new file mode 100644 index 0000000..63b2acb --- /dev/null +++ b/doc/migration.md @@ -0,0 +1,16 @@ +# Migration depuis la version 1 de Framadate + +Cela va importer vos anciens sondages dans les tables de la nouvelle version. + +* Remplissez les accès en base de données concernant la version 1 de Framadate dans votre fichier [.env](../.env) à la racine de ce dossier. +* Choisissez une chaine unique dans votre fichier .env à la place de superCaliFragilistiExpialidousiousse +* Une fois votre application accessible via navigateur, rendez vous sur votre point d'accès web à l'addresse /migration-from-v1/superCaliFragilistiExpialidousiousse en changeant __superCaliFragilistiExpialidousiousse__ par votre variable unique. +* tadam, vous aurez un message indiquant si vous avez réussi la migration. + + +## Comparaison de schémas +pour information, voici les schémas des bases de données des deux versions: +### Ancien +![old](../public/assets/img/framadate_v1_schema.svg) +### Nouveau +![old](../public/assets/img/framadate_funky_schema.svg) diff --git a/doc/nginx.md b/doc/nginx.md new file mode 100755 index 0000000..f25ecfd --- /dev/null +++ b/doc/nginx.md @@ -0,0 +1,10 @@ +# CORS config for nginx +To be able to work between some domain and an other you have to setup the cross origin ressource config of your web server. + +Use the nginx example config, don't forget to replace the example.com. +The following script copies the example confing and asks you for a replacement of the domains names. + +```bash +bash doc/nginx/setup.sh +``` + diff --git a/doc/nginx/base-framadate-api.conf b/doc/nginx/base-framadate-api.conf new file mode 100755 index 0000000..e9a4732 --- /dev/null +++ b/doc/nginx/base-framadate-api.conf @@ -0,0 +1,63 @@ +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name framadate-api.cipherbliss.com; + root /home/www/tykayn/cipherbliss/framadate/public/; + # Use Mozilla's guidelines for SSL/TLS settings + # https://mozilla.github.io/server-side-tls/ssl-config-generator/ + # NOTE: some settings below might be redundant + ssl_certificate /etc/letsencrypt/live/framadate-api.cipherbliss.com/fullchain.pem; # managed by Cert$ + ssl_certificate_key /etc/letsencrypt/live/framadate-api.cipherbliss.com/privkey.pem; # managed by Ce$ + + client_max_body_size 32m; + + + location / { + # try to serve file directly, fallback to index.php + try_files $uri /index.php$is_args$args; + } + + # optionally disable falling back to PHP script for the asset directories; + # nginx will return a 404 error when files are not found instead of passing the + # request to Symfony (improves performance but Symfony's 404 page is not displayed) + # location /bundles { + # try_files $uri =404; + # } + + location ~ ^/index\.php(/|$) { + fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; + # or your custom php-handler + # fastcgi_pass php-handler + fastcgi_split_path_info ^(.+\.php)(/.*)$; + include fastcgi_params; + #include fastcgi.conf; + + + # optionally set the value of the environment variables used in the application + # fastcgi_param APP_ENV prod; + # fastcgi_param APP_SECRET ; + # fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name"; + + # When you are using symlinks to link the document root to the + # current version of your application, you should pass the real + # application path instead of the path to the symlink to PHP + # FPM. + # Otherwise, PHP's OPcache may not properly detect changes to + # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 + # for more information). + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT $realpath_root; + # Prevents URIs that include the front controller. This will 404: + # http://framadate-api.cipherbliss.com/index.php/some-path + # Remove the internal directive to allow URIs like this + internal; + } + + # return 404 for all other php files not matching the front controller + # this prevents access to other php files you don't want to be accessible. + location ~ \.php$ { + return 404; + } + error_log /var/log/nginx/framadate-api_error.log; + access_log /var/log/nginx/framadate-api_access.log; +} diff --git a/doc/nginx/base-symfony.conf b/doc/nginx/base-symfony.conf new file mode 100755 index 0000000..f0690e8 --- /dev/null +++ b/doc/nginx/base-symfony.conf @@ -0,0 +1,50 @@ +server { + server_name domain.tld www.domain.tld; + root /var/www/project/public; + + location / { + # try to serve file directly, fallback to index.php + try_files $uri /index.php$is_args$args; + } + + # optionally disable falling back to PHP script for the asset directories; + # nginx will return a 404 error when files are not found instead of passing the + # request to Symfony (improves performance but Symfony's 404 page is not displayed) + # location /bundles { + # try_files $uri =404; + # } + + location ~ ^/index\.php(/|$) { + fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + include fastcgi_params; + + # optionally set the value of the environment variables used in the application + # fastcgi_param APP_ENV prod; + # fastcgi_param APP_SECRET ; + # fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name"; + + # When you are using symlinks to link the document root to the + # current version of your application, you should pass the real + # application path instead of the path to the symlink to PHP + # FPM. + # Otherwise, PHP's OPcache may not properly detect changes to + # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 + # for more information). + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT $realpath_root; + # Prevents URIs that include the front controller. This will 404: + # http://domain.tld/index.php/some-path + # Remove the internal directive to allow URIs like this + internal; + } + + # return 404 for all other php files not matching the front controller + # this prevents access to other php files you don't want to be accessible. + location ~ \.php$ { + return 404; + } + + error_log /var/log/nginx/project_error.log; + access_log /var/log/nginx/project_access.log; +} diff --git a/doc/nginx/framadate-api.conf b/doc/nginx/framadate-api.conf new file mode 100755 index 0000000..1e8b1eb --- /dev/null +++ b/doc/nginx/framadate-api.conf @@ -0,0 +1,95 @@ + +server { + listen 80; + listen [::]:80; + server_name framadate-api.cipherbliss.com; + # enforce https + return 301 https://$server_name$request_uri; + +} +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name framadate-api.cipherbliss.com; + + # Use Mozilla's guidelines for SSL/TLS settings + # https://mozilla.github.io/server-side-tls/ssl-config-generator/ + + # Path to the root of your installation + root /home/www/tykayn/cipherbliss/framadate/; + + location / { + # try to serve file directly, fallback to index.html to see the frontend of funky framadate + try_files $uri /index.html$is_args$args; + + # handle OPTIONS requests + # @note: don't try to DRY out this "if" block, or you're gonna have a bad time. + # @see: http://wiki.nginx.org/IfIsEvil + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Credentials' 'true'; + add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since'; + add_header 'Access-Control-Allow-Methods' 'GET, DELETE, OPTIONS, POST, PUT'; + add_header 'Access-Control-Allow-Origin' 'https://framadate-api.cipherbliss.com'; + add_header 'Access-Control-Max-Age' 2592000; + add_header 'Content-Length' 0; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + return 204; + } + # send the CORS headers + add_header 'Access-Control-Allow-Credentials' 'true'; + add_header 'Access-Control-Allow-Origin' 'https://framadate-api.cipherbliss.com'; + + # set additional security headers + add_header 'Cache-Control' 'no-cache, no-store, must-revalidate'; + add_header 'Content-Security-Policy' 'connect-src framadate-api.cipherbliss.com'; + add_header 'Expires' '0'; + add_header 'Pragma' 'no-cache'; + add_header 'Strict-Transport-Security' 'max-age=31536000; includeSubDomains'; + add_header 'X-Content-Type-Options' 'nosniff'; + add_header 'X-Frame-Options' 'DENY'; + add_header 'X-XSS-Protection' '1; mode=block'; + } + + location = /favicon.ico { + log_not_found off; + access_log off; + } + + location = /robots.txt { + allow all; + log_not_found off; + access_log off; + } + + + location ~* \.(png|jpg|jpeg|gif|ico)$ { + expires max; + log_not_found off; + } + + # PROD + location ~ ^/app\.php(/|$) { + include fastcgi.conf; + fastcgi_intercept_errors on; + fastcgi_pass php-handler; + # When you are using symlinks to link the document root to the + # current version of your application, you should pass the real + # application path instead of the path to the symlink to PHP + # FPM. + # Otherwise, PHP's OPcache may not properly detect changes to + # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 + # for more information). + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT $realpath_root; + # Prevents URIs that include the front controller. This will 404: + # http://domain.tld/app.php/some-path + # Remove the internal directive to allow URIs like this + internal; + } + + # return 404 for all other php files not matching the front controller + # this prevents access to other php files you don't want to be accessible. + location ~ \.php$ { + return 404; + } +} diff --git a/doc/nginx/setup.sh b/doc/nginx/setup.sh new file mode 100755 index 0000000..e5fb0c6 --- /dev/null +++ b/doc/nginx/setup.sh @@ -0,0 +1,28 @@ +#!/bib/bash +echo "copy framadate api nginx config" +sudo cp ./framadate-api.conf /etc/nginx/sites-available/ + +echo "replace api.example.com with your website api domain" +APISUBDOMAIN='other-api-domain.example.com' +read -p 'sub api domain [$APISUBDOMAIN]: ' APISUBDOMAIN +APIDOMAIN='other-api-domain.example.com' +read -p 'sub api domain [$APIDOMAIN]: ' APIDOMAIN +sudo sed -i 's/api.example.com/$APISUBDOMAIN/g' /etc/nginx/sites-available/framadate-api.conf +echo "replace example.com with your website api domain" +sudo sed -i 's/example.com/$APIDOMAIN/g' /etc/nginx/sites-available/framadate-api.conf + +echo "enable nginx config" +sudo ln -s /etc/nginx/sites-available/framadate-api.conf /etc/nginx/sites-enabled/framadate-api.conf + +echo "testing nginx config" +EXPECTED_NGINX_TEST="nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +nginx: configuration file /etc/nginx/nginx.conf test is successful" +CHECK_NGINX=$(sudo nginx -t) +# shellcheck disable=SC1073 +if [ "$CHECK_NGINX" = "$EXPECTED_NGINX_TEST"]; then + echo "config is OK" + exit 0 +else + echo "something is wrong in your nginx config, check the file /etc/nginx/sites-available/framadate-api.conf" + exit 1 +fi diff --git a/migrations/.gitignore b/migrations/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php new file mode 100644 index 0000000..1eefe68 --- /dev/null +++ b/src/Controller/AdminController.php @@ -0,0 +1,18 @@ +render('admin/index.html.twig', [ + 'controller_name' => 'AdminController', + ]); + } +} diff --git a/src/Controller/DefaultController.php b/src/Controller/DefaultController.php new file mode 100644 index 0000000..59fb080 --- /dev/null +++ b/src/Controller/DefaultController.php @@ -0,0 +1,18 @@ +render('pages/home.html.twig', [ + 'controller_name' => 'DefaultController', + ]); + } +} diff --git a/src/Controller/FramadateController.php b/src/Controller/FramadateController.php new file mode 100755 index 0000000..0a6d82e --- /dev/null +++ b/src/Controller/FramadateController.php @@ -0,0 +1,156 @@ +mail_service = $mailer; +// } + + /** + * generic way to send email with html template + * + * @param $config + */ + public function sendMailWithVars( $config ) { + + if ( ! isset( $config[ 'poll' ] ) ) { + $config[ 'poll' ] = new Poll(); + } + $emailChoicesTemplates = [ + 'creation_poll' => 'creation-mail.html.twig', + 'edit_poll' => 'modification-notification-mail.html.twig', + 'creation_poll_admin' => 'author-mail.html.twig', + 'owner_list' => 'owner-list.html.twig', + 'expiration' => 'expiration-mail.html.twig', + 'creation_comment' => 'comment-notification.html.twig', + 'creation_vote' => 'vote-notification.html.twig', + ]; + $emailChoicesTitles = [ + 'creation_poll' => 'Framadate | Création de sondage - lien public - ' . $config[ 'poll' ]->getTitle(), + 'edit_poll' => 'Framadate | Modification de sondage - ' . $config[ 'poll' ]->getTitle(), + 'creation_poll_admin' => 'Framadate | Création de sondage - lien admin - ', + 'owner_list' => 'Framadate | Vos sondages créés', + 'expiration' => 'Framadate | Notice d\'expiration du sondage ' . $config[ 'poll' ]->getTitle(), + 'creation_comment' => 'Framadate | Commentaire de "' . $config[ 'owner' ]->getPseudo() . '" - sondage ' . $config[ 'poll' ]->getTitle(), + 'creation_vote' => 'Framadate | Vote de "' . $config[ 'owner' ]->getPseudo() . '" - sondage ' . $config[ 'poll' ]->getTitle(), + ]; + // Create a message + $htmlbody = $this->renderView( + $config[ 'email_template' ], + $config + ); + $message = ( new Swift_Message( $config[ 'title' ] ) ) + ->setContentType( "text/html" ) + ->setCharset( 'UTF-8' ) + ->setFrom( [ 'ne-pas-repondre@framadate-api.cipherbliss.com' ] ) + ->setTo( [ $config[ 'owner' ]->getEmail() ] ) + ->setBody( $htmlbody, 'text/html' ); + + +// Send the message + $numSent = $this->mail_service->send( $message ); + $this->numSent = $numSent; + + return 1; + + } + + + /** + * send created polls to an owner + * + * @param Owner $owner + * + * @return int|void + * @throws Exception + */ + public function sendOwnerPollsAction( Owner $owner ) { + + $config = [ + 'owner' => $owner, + 'title' => 'Framadate | Mes sondages', + 'email_template' => 'emails/owner-list.html.twig', + ]; + $this->sendMailWithVars( $config ); + + return 1; + } + + /** + * @param Owner $foundOwner + * @param Poll|null $poll + * + */ + public function sendCreationMailAction( Owner $foundOwner, Poll $poll = null ) { + + // anti spam , limit to every minute TODO + + $config = [ + 'owner' => $foundOwner, + 'from' => 'ne-pas-repondre@framadate-api.cipherbliss.com', + 'poll' => $poll, + 'title' => 'Création de sondage - ' . ( $poll ? $poll->getTitle() : $poll ), + 'email_template' => 'emails/creation-mail.html.twig', + ]; + + return $this->sendMailWithVars( $config ); + } + + /** + * @param Owner $owner + * @param $comment + * + * @return int + */ + public function sendCommentNotificationAction( Owner $owner, $comment ) { + + $config = [ + 'owner' => $owner, + 'comment' => $comment, + 'poll' => $comment->getPoll(), + 'title' => 'Framadate | Commentaire de "' . $owner->getPseudo() . '" - sondage ' . $comment->getPoll()->getTitle(), + 'email_template' => 'emails/comment-notification.html.twig', + ]; + $this->sendMailWithVars( $config ); + + return 1; + } + + /** + * @param Owner $owner + * @param $stackOfVotes + * + * @return int + */ + public function sendVoteNotificationAction( Owner $owner, $stackOfVotes ) { + + $config = [ + 'owner' => $owner, + 'comment' => $stackOfVotes, + 'poll' => $stackOfVotes->getPoll(), + 'title' => 'Framadate | Vote de "' . $owner->getPseudo() . '" - sondage ' . $stackOfVotes->getPoll()->getTitle(), + 'email_template' => 'emails/vote-notification.html.twig', + ]; + $this->sendMailWithVars( $config ); + + return 1; + } +} diff --git a/src/Controller/MigrationController.php b/src/Controller/MigrationController.php new file mode 100644 index 0000000..2d8dd5e --- /dev/null +++ b/src/Controller/MigrationController.php @@ -0,0 +1,26 @@ +render('migration/index.html.twig', [ + 'controller_name' => 'MigrationController', + ]); + } +} diff --git a/src/Controller/OwnerController.php b/src/Controller/OwnerController.php new file mode 100644 index 0000000..9dc80f9 --- /dev/null +++ b/src/Controller/OwnerController.php @@ -0,0 +1,18 @@ +render('owner/index.html.twig', [ + 'controller_name' => 'OwnerController', + ]); + } +} diff --git a/src/Controller/VoteController.php b/src/Controller/VoteController.php new file mode 100644 index 0000000..2e5ad18 --- /dev/null +++ b/src/Controller/VoteController.php @@ -0,0 +1,18 @@ +render('vote/index.html.twig', [ + 'controller_name' => 'VoteController', + ]); + } +} diff --git a/src/Entity/.gitignore b/src/Entity/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/src/Entity/Choice.php b/src/Entity/Choice.php new file mode 100755 index 0000000..ce2a0fc --- /dev/null +++ b/src/Entity/Choice.php @@ -0,0 +1,145 @@ +poll = new ArrayCollection(); + $this->votes = new ArrayCollection(); + $this->setDateTime( new DateTime() ); + if ( $optionalName ) { + $this->setName( $optionalName ); + } + } + + + public function display() { + return [ + 'id' => $this->getId(), + 'date' => $this->getDateTime(), + 'text' => $this->getName(), + 'url' => $this->getUrl(), + ]; + } + + public function getId(): ?int { + return $this->id; + } + + public function getDateTime(): ?DateTimeInterface { + return $this->dateTime; + } + + public function setDateTime( ?DateTimeInterface $dateTime ): self { + $this->dateTime = $dateTime; + + return $this; + } + + public function getName(): ?string { + return $this->name; + } + + public function setName( ?string $name ): self { + $this->name = $name; + + return $this; + } + + public function getPoll(): ?Poll { + return $this->poll; + } + + public function setPoll( ?Poll $poll ): self { + $this->poll = $poll; + + return $this; + } + + /** + * @return Collection|Vote[] + */ + public function getVotes(): Collection { + return $this->votes; + } + + public function addVote( Vote $vote ): self { + if ( ! $this->votes->contains( $vote ) ) { + $this->votes[] = $vote; + $vote->setChoice( $this ); + } + + return $this; + } + + public function removeVote( Vote $vote ): self { + if ( $this->votes->contains( $vote ) ) { + $this->votes->removeElement( $vote ); + // set the owning side to null (unless already changed) + if ( $vote->getChoice() === $this ) { + $vote->setChoice( null ); + } + } + + return $this; + } + + public function getUrl(): ?string { + return $this->url; + } + + public function setUrl( ?string $url ): self { + $this->url = $url; + + return $this; + } + } diff --git a/src/Entity/Comment.php b/src/Entity/Comment.php new file mode 100755 index 0000000..c715869 --- /dev/null +++ b/src/Entity/Comment.php @@ -0,0 +1,103 @@ + $this->getId(), + 'text' => $this->getText(), + 'pseudo' => $this->getOwner()->getPseudo(), + 'date' => $this->getCreatedAt(), + ]; + } + + function __construct() { + $this->setCreatedAt( new \DateTime() ); + } + + public function getId(): ?int { + return $this->id; + } + + public function getOwner(): ?Owner { + return $this->owner; + } + + public function setOwner( ?Owner $owner ): self { + $this->owner = $owner; + + return $this; + } + + public function getText(): ?string { + return $this->text; + } + + public function setText( string $text ): self { + $this->text = $text; + + return $this; + } + + public function getCreatedAt(): ?DateTimeInterface { + return $this->createdAt; + } + + public function setCreatedAt( DateTimeInterface $createdAt ): self { + $this->createdAt = $createdAt; + + return $this; + } + + public function getPoll(): ?Poll { + return $this->poll; + } + + public function setPoll( ?Poll $poll ): self { + $this->poll = $poll; + + return $this; + } +} diff --git a/src/Entity/Owner.php b/src/Entity/Owner.php new file mode 100755 index 0000000..761427a --- /dev/null +++ b/src/Entity/Owner.php @@ -0,0 +1,228 @@ +polls = new ArrayCollection(); + $this->comments = new ArrayCollection(); + $this->stackOfVotes = new ArrayCollection(); + $this->setCreatedAt( new \DateTime() ); + $this->setModifierToken( uniqid() ); + } + + + public function getId(): ?int { + return $this->id; + } + + public function getEmail(): ?string { + return $this->email; + } + + public function setEmail( string $email ): self { + $this->email = $email; + + return $this; + } + + public function getPseudo(): ?string { + return $this->pseudo; + } + + public function setPseudo( string $pseudo ): self { + $this->pseudo = $pseudo; + + return $this; + } + + /** + * @return Collection|Poll[] + */ + public function getPolls(): Collection { + return $this->polls; + } + + public function addPoll( Poll $poll ): self { + if ( ! $this->polls->contains( $poll ) ) { + $this->polls[] = $poll; + $poll->setOwner( $this ); + } + + return $this; + } + + public function removePoll( Poll $poll ): self { + if ( $this->polls->contains( $poll ) ) { + $this->polls->removeElement( $poll ); + // set the owning side to null (unless already changed) + if ( $poll->getOwner() === $this ) { + $poll->setOwner( null ); + } + } + + return $this; + } + + /** + * @return Collection|Comment[] + */ + public function getComments(): Collection { + return $this->comments; + } + + public function addText( Comment $text ): self { + if ( ! $this->comments->contains( $text ) ) { + $this->comments[] = $text; + $text->setOwner( $this ); + } + + return $this; + } + + public function removeText( Comment $text ): self { + if ( $this->comments->contains( $text ) ) { + $this->comments->removeElement( $text ); + // set the owning side to null (unless already changed) + if ( $text->getOwner() === $this ) { + $text->setOwner( null ); + } + } + + return $this; + } + + /** + * @return Collection|StackOfVotes[] + */ + public function getStackOfVotes(): Collection { + return $this->stackOfVotes; + } + + public function addStackOfVote( StackOfVotes $stackOfVote ): self { + if ( ! $this->stackOfVotes->contains( $stackOfVote ) ) { + $this->stackOfVotes[] = $stackOfVote; + $stackOfVote->setOwner( $this ); + } + + return $this; + } + + public function removeStackOfVote( StackOfVotes $stackOfVote ): self { + if ( $this->stackOfVotes->contains( $stackOfVote ) ) { + $this->stackOfVotes->removeElement( $stackOfVote ); + // set the owning side to null (unless already changed) + if ( $stackOfVote->getOwner() === $this ) { + $stackOfVote->setOwner( null ); + } + } + + return $this; + } + + public function getModifierToken(): ?string { + return $this->modifierToken; + } + + public function setModifierToken( string $modifierToken ): self { + $this->modifierToken = $modifierToken; + + return $this; + } + + public function addComment( Comment $comment ): self { + if ( ! $this->comments->contains( $comment ) ) { + $this->comments[] = $comment; + $comment->setOwner( $this ); + } + + return $this; + } + + public function removeComment( Comment $comment ): self { + if ( $this->comments->contains( $comment ) ) { + $this->comments->removeElement( $comment ); + // set the owning side to null (unless already changed) + if ( $comment->getOwner() === $this ) { + $comment->setOwner( null ); + } + } + + return $this; + } + + public function getCreatedAt(): ?\DateTimeInterface { + return $this->createdAt; + } + + public function setCreatedAt( \DateTimeInterface $createdAt ): self { + $this->createdAt = $createdAt; + + return $this; + } + + public function getRequestedPollsDate() { + return $this->requestedPollsDate; + } + + public function setRequestedPollsDate( $requestedPollsDate ): self { + $this->requestedPollsDate = $requestedPollsDate; + + return $this; + } +} diff --git a/src/Entity/Poll.php b/src/Entity/Poll.php new file mode 100755 index 0000000..4b5fced --- /dev/null +++ b/src/Entity/Poll.php @@ -0,0 +1,606 @@ +") + * @Serializer\Expose() + */ + public $votes; + /** + * @ORM\OneToMany(targetEntity="App\Entity\StackOfVotes", mappedBy="poll", orphanRemoval=true, cascade={"persist", "remove"}) + * @Serializer\Expose() + */ + public $stacksOfVotes; + /** + * @ORM\OneToMany(targetEntity="App\Entity\Choice", mappedBy="poll", orphanRemoval=true, cascade={"persist", "remove"}) + * @Serializer\Expose() + * @Serializer\Type("ArrayCollection") + */ + public $choices; + /** + * @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="poll", orphanRemoval=true, cascade={"persist", "remove"}) + * @Serializer\Expose() + * @Serializer\Type("ArrayCollection") + */ + public $comments; + /** + * vote restricted by a password in md5 format + * @ORM\Column(type="string", length=255, nullable=true) + */ + private $password; + /** + * used to allow administration + * @ORM\Column(type="string", length=255) + * @Serializer\Type("string") + */ + private $adminKey; + + /** + * number of days from now for default expiracy date + * @var int + * @Serializer\Expose() + */ + public $defaultExpiracyDaysFromNow = 60; + private $maxChoicesLimit = 25; + + public function computeAnswers() { + // counts each number of answer for this choice + $computedArray = []; + $maxScore = 0; + + foreach ( $this->getStacksOfVotes() as $stack_of_vote ) { + foreach ( $stack_of_vote->getVotes() as $vote ) { + $answer = $vote->getValue(); + $choice_id = $vote->getChoice()->getId(); + + if ( ! isset( $computedArray[ $choice_id ] ) ) { + $computedArray[ $choice_id ] = [ + 'choice_id' => $choice_id, + 'choice_text' => $vote->getChoice()->getName(), + 'id' => $vote->getId(), + 'score' => 0, + 'yes' => [ + 'count' => 0, + 'people' => [], + ], + 'maybe' => [ + 'count' => 0, + 'people' => [], + ], + 'no' => [ + 'count' => 0, + 'people' => [], + ], + ]; + } + $computedArray[ $choice_id ][ $answer ][ 'count' ] ++; + $computedArray[ $choice_id ][ $answer ][ 'people' ][] = $stack_of_vote->getOwner()->getPseudo(); + + if ( $answer == 'yes' ) { + $computedArray[ $choice_id ][ 'score' ] += 1; + } elseif ( $answer == 'maybe' ) { + $computedArray[ $choice_id ][ 'score' ] += 0.5; + } + // compare with max value + if ( $computedArray[ $choice_id ][ 'score' ] > $maxScore ) { + $maxScore = $computedArray[ $choice_id ][ 'score' ]; + } + } + } + + return [ + 'counts' => $computedArray, + 'maxScore' => $maxScore, + ]; + } + + public function display() { + return [ + 'poll' => $this, + 'answers' => $this->computeAnswers(), + ]; + } + + public function __construct() { + $this->votes = new ArrayCollection(); + $this->stacksOfVotes = new ArrayCollection(); + $this->choices = new ArrayCollection(); + $this->comments = new ArrayCollection(); + $this->initiate(); + } + + + private function initiate() { + $this->adminKey = $this->generateAdminKey(); + $this->setCreationDate( new \DateTime() ); + $this->setExpiracyDate( $this->addDaysToDate( + new \DateTime(), + $this->defaultExpiracyDaysFromNow + ) ); + $this->setAllowedAnswers( [ 'yes' ] ); + } + + + public function generateAdminKey() { + $rand = random_int( PHP_INT_MIN, PHP_INT_MAX ); + + return str_shuffle( md5( $rand ) . $rand . $this->random_str() ); + } + + /** + * Generate a random string, using a cryptographically secure + * pseudorandom number generator (random_int) + * + * This function uses type hints now (PHP 7+ only), but it was originally + * written for PHP 5 as well. + * + * For PHP 7, random_int is a PHP core function + * For PHP 5.x, depends on https://github.com/paragonie/random_compat + * + * @param int $length How many characters do we want? + * @param string $keyspace A string of all possible characters + * to select from + * + * @return string + */ + public function random_str( + int $length = 64, + string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + ): string { + if ( $length < 1 ) { + throw new \RangeException( "Length must be a positive integer" ); + } + $pieces = []; + $max = mb_strlen( $keyspace, '8bit' ) - 1; + for ( $i = 0 ; $i < $length ; ++ $i ) { + $pieces [] = $keyspace[ random_int( 0, $max ) ]; + } + + return implode( '', $pieces ); + } + + public function findChoiceById( int $id ) { + + $choices = $this->getChoices(); + $counter = 0; + // there must be something cleaner than this in Doctrine ArrayCollection + foreach ( $choices as $choice ) { + $counter ++; + if ( $counter > $this->maxChoicesLimit ) { + throw new \ErrorException( "max number of choices reached for this poll" ); + } + if ( $choice && $choice->getId() == $id ) { + return $choice; + } + + } + + return null; + } + + public function addDaysToDate( \DateTime $date, int $days ) { + $st = strtotime( $date->getTimestamp() . ' + ' . $days . ' days' ); + + return new \DateTime( $st ); + } + + public function getId(): ?int { + return $this->id; + } + + public function getTitle(): ?string { + return $this->title; + } + + public function setTitle( string $title ): self { + $this->title = $title; + + return $this; + } + + public function getCreationDate(): ?DateTimeInterface { + return $this->creationDate; + } + + public function setCreationDate( DateTimeInterface $creationDate ): self { + $this->creationDate = $creationDate; + + return $this; + } + + public function setExpiracyDate( DateTimeInterface $expiracyDate ): self { + $this->expiracyDate = $expiracyDate; + + return $this; + } + + public function getOwner(): ?Owner { + return $this->owner; + } + + public function setOwner( ?Owner $owner ): self { + $this->owner = $owner; + + return $this; + } + + /** + * @return Collection|Vote[] + */ + public function getVotes(): Collection { + return $this->votes; + } + + + public function getAdminKey(): ?string { + return $this->adminKey; + } + + public function setAdminKey( string $adminKey ): self { + $this->adminKey = $adminKey; + + return $this; + } + + public function getDescription(): ?string { + return $this->description; + } + + public function setDescription( string $description ): self { + $this->description = $description; + + return $this; + } + + public function getKind(): ?string { + return $this->kind; + } + + public function setKind( string $kind ): self { + $this->kind = $kind; + + return $this; + } + + public function getCustomUrl(): ?string { + return $this->customUrl; + } + + public function setCustomUrl( string $customUrl ): self { + $this->customUrl = $customUrl; + + return $this; + } + + public function getPassword(): ?string { + return $this->password; + } + + public function setPassword( string $password ): self { + $this->password = md5( $password ); + + return $this; + } + + public function getModificationPolicy(): ?string { + return $this->modificationPolicy; + } + + public function setModificationPolicy( string $modificationPolicy ): self { + $this->modificationPolicy = $modificationPolicy; + + return $this; + } + + public function getMailOnComment(): ?bool { + return $this->mailOnComment; + } + + public function setMailOnComment( bool $mailOnComment ): self { + $this->mailOnComment = $mailOnComment; + + return $this; + } + + public function getMailOnVote(): ?bool { + return $this->mailOnVote; + } + + public function setMailOnVote( bool $mailOnVote ): self { + $this->mailOnVote = $mailOnVote; + + return $this; + } + + public function getHideResults(): ?bool { + return $this->hideResults; + } + + public function setHideResults( bool $hideResults ): self { + $this->hideResults = $hideResults; + + return $this; + } + + public function getShowResultEvenIfPasswords(): ?bool { + return $this->showResultEvenIfPasswords; + } + + public function setShowResultEvenIfPasswords( bool $showResultEvenIfPasswords ): self { + $this->showResultEvenIfPasswords = $showResultEvenIfPasswords; + + return $this; + } + + + /** + * @return Collection|Comment[] + */ + public function getComments(): Collection { + return $this->comments; + } + + public function addComment( Comment $comment ): self { + if ( ! $this->comments->contains( $comment ) ) { + $this->comments[] = $comment; + $comment->setPoll( $this ); + } + + return $this; + } + + public function removeComment( Comment $comment ): self { + if ( $this->comments->contains( $comment ) ) { + $this->comments->removeElement( $comment ); + // set the owning side to null (unless already changed) + if ( $comment->getPoll() === $this ) { + $comment->setPoll( null ); + } + } + + return $this; + } + + public function getStacksOfVotes() { + return $this->stacksOfVotes; + } + + public function setStacksOfVotes( ?StackOfVotes $stacksOfVotes ): self { + $this->stacksOfVotes = $stacksOfVotes; + + return $this; + } + + + public function addStackOfVote( StackOfVotes $stackOfVote ): self { + if ( ! $this->stacksOfVotes->contains( $stackOfVote ) ) { + $this->stacksOfVotes[] = $stackOfVote; + $stackOfVote->setPoll( $this ); + } + + return $this; + } + + public function removeStackOfVote( StackOfVotes $stackOfVote ): self { + if ( $this->stacksOfVotes->contains( $stackOfVote ) ) { + $this->stacksOfVotes->removeElement( $stackOfVote ); + // set the owning side to null (unless already changed) + if ( $stackOfVote->getPoll() === $this ) { + $stackOfVote->setPoll( null ); + } + } + + return $this; + } + + public function getExpiracyDate(): ?\DateTimeInterface { + return $this->expiracyDate; + } + + public function addVote( Vote $vote ): self { + if ( ! $this->votes->contains( $vote ) ) { + $this->votes[] = $vote; + $vote->setPoll( $this ); + } + + return $this; + } + + public function removeVote( Vote $vote ): self { + if ( $this->votes->contains( $vote ) ) { + $this->votes->removeElement( $vote ); + // set the owning side to null (unless already changed) + if ( $vote->getPoll() === $this ) { + $vote->setPoll( null ); + } + } + + return $this; + } + + /** + * @return Collection|Choice[] + */ + public function getChoices(): Collection { + return $this->choices; + } + + public function addTextChoiceArray( Array $choiceTextArray ): self { + foreach ( $choiceTextArray as $text ) { + $newChoice = new Choice(); + $newChoice->setName( $text ); + $this->addChoice( $newChoice ); + } + + return $this; + } + + + public function getAllowedAnswers(): ?array { + return $this->allowedAnswers; + } + + public function setAllowedAnswers( array $allowedAnswers ): self { + $this->allowedAnswers = $allowedAnswers; + + return $this; + } + + public function addStacksOfVote( StackOfVotes $stacksOfVote ): self { + if ( ! $this->stacksOfVotes->contains( $stacksOfVote ) ) { + $this->stacksOfVotes[] = $stacksOfVote; + $stacksOfVote->setPoll( $this ); + } + + return $this; + } + + public function removeStacksOfVote( StackOfVotes $stacksOfVote ): self { + if ( $this->stacksOfVotes->contains( $stacksOfVote ) ) { + $this->stacksOfVotes->removeElement( $stacksOfVote ); + // set the owning side to null (unless already changed) + if ( $stacksOfVote->getPoll() === $this ) { + $stacksOfVote->setPoll( null ); + } + } + + return $this; + } + + public function addChoice( Choice $choice ): self { + if ( ! is_null( $this->choices ) ) { + if ( ! $this->choices->contains( $choice ) ) { + $this->choices[] = $choice; + $choice->setPoll( $this ); + } + } else { + $this->choices[] = $choice; + $choice->setPoll( $this ); + } + + + return $this; + } + + public function removeChoice( Choice $choice ): self { + if ( $this->choices->contains( $choice ) ) { + $this->choices->removeElement( $choice ); + // set the owning side to null (unless already changed) + if ( $choice->getPoll() === $this ) { + $choice->setPoll( null ); + } + } + + return $this; + } + } diff --git a/src/Entity/StackOfVotes.php b/src/Entity/StackOfVotes.php new file mode 100755 index 0000000..2916446 --- /dev/null +++ b/src/Entity/StackOfVotes.php @@ -0,0 +1,145 @@ + $this->getId(), + 'modifier_token' => $this->getOwner()->getModifierToken(), + 'pseudo' => '', + 'creation_date' => '', + 'votes' => [], + ]; + // prefill votes with all choices ids + foreach ( $this->getPoll()->getChoices() as $choice ) { + $tab[ 'votes' ][ $choice->getId() ] = [ + 'choice_id' => $choice->getId(), + ]; + } + + foreach ( $this->getVotes() as $vote ) { + $tab[ 'votes' ][ $vote->getChoice()->getId() ] = $vote->display(); + $tab[ 'votes' ][ $vote->getChoice()->getId() ][ 'stack_id' ] = $this->getId(); + $tab[ 'pseudo' ] = $this->getOwner()->getPseudo(); + $tab[ 'creation_date' ] = $vote->getCreationDate(); + } + + return $tab; + } + + /** + * @ORM\PrePersist + */ + public function prePersist() { + $this->setPseudo( $this->getOwner()->getPseudo() ); + } + + public function __construct() { + $this->votes = new ArrayCollection(); + } + + public function getId(): ?int { + return $this->id; + } + + /** + * @return Collection|poll[] + */ + public function getVotes(): Collection { + return $this->votes; + } + + public function addVote( Vote $vote ): self { + if ( ! $this->votes->contains( $vote ) ) { + $vote->setPoll( $this->getPoll() ); + + $this->votes[] = $vote; + $vote->setStacksOfVotes( $this ); + } + + return $this; + } + + public function removeVote( Vote $vote ): self { + if ( $this->votes->contains( $vote ) ) { + $this->votes->removeElement( $vote ); + // set the owning side to null (unless already changed) + if ( $vote->getStacksOfVotes() === $this ) { + $vote->setStacksOfVotes( null ); + } + } + + return $this; + } + + public function getPseudo(): ?string { + return $this->pseudo; + } + + public function setPseudo( ?string $pseudo ): self { + $this->pseudo = $pseudo; + + return $this; + } + + public function getOwner(): ?Owner { + return $this->owner; + } + + public function setOwner( ?Owner $owner ): self { + $this->owner = $owner; + + return $this; + } + + public function getPoll(): ?Poll { + return $this->poll; + } + + public function setPoll( ?Poll $poll ): self { + $this->poll = $poll; + + return $this; + } +} diff --git a/src/Entity/Vote.php b/src/Entity/Vote.php new file mode 100755 index 0000000..6134d18 --- /dev/null +++ b/src/Entity/Vote.php @@ -0,0 +1,124 @@ + $this->getId(), + 'value' => $this->getValue(), + 'choice_id' => $this->getChoice()->getId(), + 'text' => $this->getChoice()->getName(), + ]; + } + + public function __construct() { + $this->setCreationDate( new \DateTime() ); + } + + public function getId(): ?int { + return $this->id; + } + + public function getPoll(): ?Poll { + return $this->poll; + } + + public function setPoll( ?Poll $poll ): self { + $this->poll = $poll; + if ( $poll ) { + $poll->addVote( $this ); + } + + return $this; + } + + public function getChoice(): ?Choice { + return $this->choice; + } + + public function setChoice( ?Choice $choice ): self { + $this->choice = $choice; + + return $this; + } + + public function getValue(): ?string { + return $this->value; + } + + public function setValue( ?string $value ): self { + $this->value = $value; + + return $this; + } + + public function getCreationDate(): ?DateTimeInterface { + return $this->creationDate; + } + + public function setCreationDate( DateTimeInterface $creationDate ): self { + $this->creationDate = $creationDate; + + return $this; + } + + public function getStacksOfVotes(): ?StackOfVotes { + return $this->stacksOfVotes; + } + + public function setStacksOfVotes( ?StackOfVotes $stacksOfVotes ): self { + $this->stacksOfVotes = $stacksOfVotes; + + return $this; + } + } diff --git a/src/Entity/timedTrait.php b/src/Entity/timedTrait.php new file mode 100755 index 0000000..2621137 --- /dev/null +++ b/src/Entity/timedTrait.php @@ -0,0 +1,12 @@ +createQueryBuilder('c') + ->andWhere('c.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('c.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?Choice + { + return $this->createQueryBuilder('c') + ->andWhere('c.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/src/Repository/CommentRepository.php b/src/Repository/CommentRepository.php new file mode 100755 index 0000000..cddf55d --- /dev/null +++ b/src/Repository/CommentRepository.php @@ -0,0 +1,50 @@ +createQueryBuilder('c') + ->andWhere('c.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('c.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?Comment + { + return $this->createQueryBuilder('c') + ->andWhere('c.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/src/Repository/OwnerRepository.php b/src/Repository/OwnerRepository.php new file mode 100755 index 0000000..3bffacf --- /dev/null +++ b/src/Repository/OwnerRepository.php @@ -0,0 +1,50 @@ +createQueryBuilder('o') + ->andWhere('o.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('o.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?Owner + { + return $this->createQueryBuilder('o') + ->andWhere('o.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/src/Repository/PollRepository.php b/src/Repository/PollRepository.php new file mode 100755 index 0000000..d090fa5 --- /dev/null +++ b/src/Repository/PollRepository.php @@ -0,0 +1,52 @@ +createQueryBuilder('p') + ->andWhere('p.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('p.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?Poll + { + return $this->createQueryBuilder('p') + ->andWhere('p.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/src/Repository/StackOfVotesRepository.php b/src/Repository/StackOfVotesRepository.php new file mode 100755 index 0000000..476a5ff --- /dev/null +++ b/src/Repository/StackOfVotesRepository.php @@ -0,0 +1,50 @@ +createQueryBuilder('s') + ->andWhere('s.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('s.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?StackOfVotes + { + return $this->createQueryBuilder('s') + ->andWhere('s.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/src/Repository/VoteRepository.php b/src/Repository/VoteRepository.php new file mode 100755 index 0000000..a95a2fd --- /dev/null +++ b/src/Repository/VoteRepository.php @@ -0,0 +1,50 @@ +createQueryBuilder('v') + ->andWhere('v.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('v.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?Vote + { + return $this->createQueryBuilder('v') + ->andWhere('v.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/symfony.lock b/symfony.lock index 34319bf..2350634 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,4 +1,140 @@ { + "composer/package-versions-deprecated": { + "version": "1.11.99.1" + }, + "doctrine/annotations": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" + }, + "files": [ + "config/routes/annotations.yaml" + ] + }, + "doctrine/cache": { + "version": "1.10.2" + }, + "doctrine/collections": { + "version": "1.6.7" + }, + "doctrine/common": { + "version": "3.1.2" + }, + "doctrine/dbal": { + "version": "2.13.0" + }, + "doctrine/deprecations": { + "version": "v0.5.3" + }, + "doctrine/doctrine-bundle": { + "version": "2.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "2.3", + "ref": "9777bf185961283a450b6237281132935025fe04" + }, + "files": [ + "config/packages/doctrine.yaml", + "config/packages/prod/doctrine.yaml", + "config/packages/test/doctrine.yaml", + "src/Entity/.gitignore", + "src/Repository/.gitignore" + ] + }, + "doctrine/doctrine-migrations-bundle": { + "version": "3.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.1", + "ref": "ee609429c9ee23e22d6fa5728211768f51ed2818" + }, + "files": [ + "config/packages/doctrine_migrations.yaml", + "migrations/.gitignore" + ] + }, + "doctrine/event-manager": { + "version": "1.1.1" + }, + "doctrine/inflector": { + "version": "2.0.3" + }, + "doctrine/instantiator": { + "version": "1.4.0" + }, + "doctrine/lexer": { + "version": "1.2.1" + }, + "doctrine/migrations": { + "version": "3.1.1" + }, + "doctrine/orm": { + "version": "2.8.4" + }, + "doctrine/persistence": { + "version": "2.1.0" + }, + "doctrine/sql-formatter": { + "version": "1.1.1" + }, + "egulias/email-validator": { + "version": "3.1.1" + }, + "friendsofphp/proxy-manager-lts": { + "version": "v1.0.3" + }, + "friendsofsymfony/rest-bundle": { + "version": "2.2", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "2.2", + "ref": "cad41ef93d6150067ae2bb3c7fd729492dff6f0a" + }, + "files": [ + "config/packages/fos_rest.yaml" + ] + }, + "jms/metadata": { + "version": "2.5.0" + }, + "jms/serializer": { + "version": "3.12.2" + }, + "jms/serializer-bundle": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "3.0", + "ref": "384cec52df45f3bfd46a09930d6960a58872b268" + }, + "files": [ + "config/packages/dev/jms_serializer.yaml", + "config/packages/jms_serializer.yaml", + "config/packages/prod/jms_serializer.yaml" + ] + }, + "laminas/laminas-code": { + "version": "4.1.0" + }, + "laminas/laminas-eventmanager": { + "version": "3.3.1" + }, + "laminas/laminas-zendframework-bridge": { + "version": "1.2.0" + }, + "nikic/php-parser": { + "version": "v4.10.4" + }, + "phpstan/phpdoc-parser": { + "version": "0.4.14" + }, "psr/cache": { "version": "2.0.0" }, @@ -11,6 +147,21 @@ "psr/log": { "version": "1.1.3" }, + "sensio/framework-extra-bundle": { + "version": "5.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.2", + "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" + }, + "files": [ + "config/packages/sensio_framework_extra.yaml" + ] + }, + "swiftmailer/swiftmailer": { + "version": "v6.2.7" + }, "symfony/cache": { "version": "v5.2.6" }, @@ -38,6 +189,9 @@ "symfony/deprecation-contracts": { "version": "v2.2.0" }, + "symfony/doctrine-bridge": { + "version": "v5.2.6" + }, "symfony/dotenv": { "version": "v5.2.4" }, @@ -68,6 +222,9 @@ ".env" ] }, + "symfony/form": { + "version": "v5.2.6" + }, "symfony/framework-bundle": { "version": "5.2", "recipe": { @@ -97,9 +254,33 @@ "symfony/http-kernel": { "version": "v5.2.6" }, + "symfony/intl": { + "version": "v5.2.4" + }, + "symfony/maker-bundle": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" + } + }, + "symfony/options-resolver": { + "version": "v5.2.4" + }, + "symfony/orm-pack": { + "version": "v2.1.0" + }, "symfony/polyfill-intl-grapheme": { "version": "v1.22.1" }, + "symfony/polyfill-intl-icu": { + "version": "v1.22.1" + }, + "symfony/polyfill-intl-idn": { + "version": "v1.22.1" + }, "symfony/polyfill-intl-normalizer": { "version": "v1.22.1" }, @@ -112,6 +293,15 @@ "symfony/polyfill-php80": { "version": "v1.22.1" }, + "symfony/property-access": { + "version": "v5.2.4" + }, + "symfony/property-info": { + "version": "v5.2.4" + }, + "symfony/proxy-manager-bridge": { + "version": "v5.2.4" + }, "symfony/routing": { "version": "5.1", "recipe": { @@ -126,12 +316,52 @@ "config/routes.yaml" ] }, + "symfony/security-core": { + "version": "v5.2.6" + }, "symfony/service-contracts": { "version": "v2.2.0" }, + "symfony/stopwatch": { + "version": "v5.2.4" + }, "symfony/string": { "version": "v5.2.6" }, + "symfony/swiftmailer-bundle": { + "version": "2.5", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "2.5", + "ref": "ae4d22af30bbd484506bc1817c5a3ef72c855b93" + }, + "files": [ + "config/packages/dev/swiftmailer.yaml", + "config/packages/swiftmailer.yaml", + "config/packages/test/swiftmailer.yaml" + ] + }, + "symfony/translation-contracts": { + "version": "v2.3.0" + }, + "symfony/twig-bridge": { + "version": "v5.2.6" + }, + "symfony/twig-bundle": { + "version": "5.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.0", + "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" + }, + "files": [ + "config/packages/test/twig.yaml", + "config/packages/twig.yaml", + "templates/base.html.twig" + ] + }, "symfony/var-dumper": { "version": "v5.2.6" }, @@ -140,5 +370,14 @@ }, "symfony/yaml": { "version": "v5.2.5" + }, + "twig/twig": { + "version": "v3.3.0" + }, + "willdurand/jsonp-callback-validator": { + "version": "v1.1.0" + }, + "willdurand/negotiation": { + "version": "3.0.0" } } diff --git a/templates/admin/index.html.twig b/templates/admin/index.html.twig new file mode 100644 index 0000000..2787881 --- /dev/null +++ b/templates/admin/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello AdminController!{% endblock %} + +{% block body %} + + +
+

Hello {{ controller_name }}! ✅

+ + This friendly message is coming from: + +
+{% endblock %} diff --git a/templates/base.html.twig b/templates/base.html.twig new file mode 100755 index 0000000..a2ad8c1 --- /dev/null +++ b/templates/base.html.twig @@ -0,0 +1,35 @@ + + + + + + + + + + + + {% block title %}Framdate{% endblock %} +{# {% block stylesheets %}#} +{# #} +{# #} +{# {% endblock %}#} + + +{% include 'split/header.html.twig' %} + +{% block outerBody %} +
+ + {% block body %} + + {% endblock %} +
+{% endblock %} +{% include 'split/footer.html.twig' %} +{# {% block javascripts %} #} +{# #} +{# #} +{# {% endblock %} #} + + diff --git a/templates/default/index.html.twig b/templates/default/index.html.twig new file mode 100644 index 0000000..28ad699 --- /dev/null +++ b/templates/default/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello DefaultController!{% endblock %} + +{% block body %} + + +
+

Hello {{ controller_name }}! ✅

+ + This friendly message is coming from: + +
+{% endblock %} diff --git a/templates/email-base-plaintext.html.twig b/templates/email-base-plaintext.html.twig new file mode 100644 index 0000000..8659d75 --- /dev/null +++ b/templates/email-base-plaintext.html.twig @@ -0,0 +1,15 @@ +{% block title %} + {% if title is defined %} +

{{ title }}

+ {% else %} +

Framadate - email

+ {% endif %} +
+{% endblock %} + {% block stylesheets %}{% endblock %} + + {% block content %} + {% endblock %} + {% block footer %} + {% include 'emails/footer.html.twig' %} + {% endblock %} diff --git a/templates/email-base.html.twig b/templates/email-base.html.twig new file mode 100644 index 0000000..9f7a8bf --- /dev/null +++ b/templates/email-base.html.twig @@ -0,0 +1,64 @@ + + + + + + + + + diff --git a/templates/emails/author-mail.html.twig b/templates/emails/author-mail.html.twig new file mode 100755 index 0000000..9a154ed --- /dev/null +++ b/templates/emails/author-mail.html.twig @@ -0,0 +1,25 @@ +{#[Framadate][Réservé à l'auteur] Sondage: TESSSSSSSSSST#} +{% extends 'email-base.html.twig' %} +{% block content %} +

+ + Ce message ne doit PAS être diffusé aux sondés. Il est réservé à l'auteur du sondage. +

+
+

+ Vous pouvez modifier ce sondage à l'adresse suivante : +

+
+ {% include 'emails/partial/admin_link.html.twig' %} +
+ Pour partager votre sondage aux participants, utilisez son lien d'accès public que vous avez reçu dans un autre email. +
+ + {% if poll.password %} + Ce sondage est protégé par un mot de passe, n'oubliez pas de le communiquer à vos participants. + Vous pouvez changer ce mot de passe via l'administration. + {% else %} + + {% endif %} + +{% endblock %} diff --git a/templates/emails/comment-notification.html.twig b/templates/emails/comment-notification.html.twig new file mode 100644 index 0000000..579ffd3 --- /dev/null +++ b/templates/emails/comment-notification.html.twig @@ -0,0 +1,22 @@ +{#[Framadate] Notification d'un sondage : TESSSSSSSSSST#} +{% extends 'email-base.html.twig' %} +{% block content %} + + {{ owner.pseudo }} + + vient de rédiger un commentaire. +
+ + {% autoescape %} + {{ comment.text }} + {% endautoescape %} + +
+
+ Vous pouvez retrouver votre sondage avec le lien suivant : +
+ {% include 'emails/partial/admin_link.html.twig' %} +
+ {% include 'emails/partial/public_link.html.twig' %} + +{% endblock %} diff --git a/templates/emails/creation-mail.html.twig b/templates/emails/creation-mail.html.twig new file mode 100755 index 0000000..081beef --- /dev/null +++ b/templates/emails/creation-mail.html.twig @@ -0,0 +1,30 @@ +{#[Framadate][Pour diffusion aux sondés] Sondage: TESSSSSSSSSST#} +{% extends 'email-base.html.twig' %} +{% block content %} + + + Suite à la création de votre sondage {{ title }} vous recevez deux emails afin de ne pas transmettre par erreur aux sondés le lien d'administration de votre sondage. +
+ Ce mail est le premier, comportant le message qui doit être envoyé aux sondés.
+ + Vous pouvez maintenant transmettre ce message à toutes les personnes susceptibles de participer au vote.
+ +
+
+ +
+ + + {{ owner.pseudo }} ( {{ owner.email }} ) vient de créer un sondage intitulé : " {{ title }} + ". +
+
+ Merci de bien vouloir participer au sondage à l'adresse suivante :
+ +
+ {% include 'emails/partial/public_link.html.twig' %} + +
+
+ +{% endblock %} diff --git a/templates/emails/expiration-mail.html.twig b/templates/emails/expiration-mail.html.twig new file mode 100755 index 0000000..49adf56 --- /dev/null +++ b/templates/emails/expiration-mail.html.twig @@ -0,0 +1,15 @@ +{#[Framadate][expiration] Sondage: TESSSSSSSSSST#} +{% extends 'email-base.html.twig' %} +{% block content %} + + + Ce sondage va bientôt expirer dans 1 jour,
+
+ le {{ poll.expiracyDate | date('D Y-m-d') }} +
+ il ne sera plus possible d'y voter.
+ Dans 31 jours il sera supprimé.
+ Vous pouvez exporter ses données à tout moment en vous rendant à ce lien pour l'administrer: +
+ {% include 'emails/partial/admin_link.html.twig' %} +{% endblock %} diff --git a/templates/emails/footer.html.twig b/templates/emails/footer.html.twig new file mode 100755 index 0000000..bb67a38 --- /dev/null +++ b/templates/emails/footer.html.twig @@ -0,0 +1,24 @@ + diff --git a/templates/emails/modification-notification-mail.html.twig b/templates/emails/modification-notification-mail.html.twig new file mode 100755 index 0000000..e6c2faa --- /dev/null +++ b/templates/emails/modification-notification-mail.html.twig @@ -0,0 +1,14 @@ +{#[Framadate] Participation au sondage : TESSSSSSSSSST#} +{% extends 'email-base.html.twig' %} +{% block content %} + + {{ poll.owner.pseudo }} , + {{ poll.owner.email }} , + vient de modifier votre sondage accessible au lien suivant: +
+ {% include 'emails/partial/admin_link.html.twig' %} +
+ lien public: +
+ {% include 'emails/partial/public_link.html.twig' %} +{% endblock %} diff --git a/templates/emails/owner-list.html.twig b/templates/emails/owner-list.html.twig new file mode 100755 index 0000000..2a9a868 --- /dev/null +++ b/templates/emails/owner-list.html.twig @@ -0,0 +1,26 @@ +{#[Framadate][Réservé à l'auteur] Sondage: TESSSSSSSSSST#} +{% extends 'email-base.html.twig' %} +{% block content %} + +

+ + Voici la liste des {{ owner.polls|length }} sondages + + Framadate + + que vous avez créé. +

+
+ Si vous n'avez pas demandé à recevoir cet email, veuillez en informer les administrateurs du site Framadate. +
+
+
    + {% for poll in owner.polls %} +
  • + {% include 'emails/partial/poll.html.twig' %} +
  • + {% endfor %} +
+ + +{% endblock %} diff --git a/templates/emails/partial/admin_link.html.twig b/templates/emails/partial/admin_link.html.twig new file mode 100644 index 0000000..9743509 --- /dev/null +++ b/templates/emails/partial/admin_link.html.twig @@ -0,0 +1,2 @@ +{{ BASE_URL }} + /admin/{{ poll.adminKey }} diff --git a/templates/emails/partial/poll.html.twig b/templates/emails/partial/poll.html.twig new file mode 100644 index 0000000..764aa70 --- /dev/null +++ b/templates/emails/partial/poll.html.twig @@ -0,0 +1,39 @@ +
+

+ Sondage {{ poll.title }} +

+ + +
+
+ créé le {{ poll.creationDate| date('Y m d ') }} +
+
+ expirera le {{ poll.expiracyDate| date('Y m d ') }} +
+ + {{ poll.stacksOfVotes |length }} votes + + + {{ poll.comments |length }} commentaires + + {% if poll.password |length %} + (accès avec mot de passe) + {% else %} + {% endif %} + +
+ +
+ + lien à donner aux votants: + + {% include 'emails/partial/public_link.html.twig' %} +
+
+ + administration: + + {% include 'emails/partial/admin_link.html.twig' %} +
+
diff --git a/templates/emails/partial/public_link.html.twig b/templates/emails/partial/public_link.html.twig new file mode 100644 index 0000000..41114ce --- /dev/null +++ b/templates/emails/partial/public_link.html.twig @@ -0,0 +1,11 @@ + + {% if poll.customUrl |length %} + + {{ BASE_URL }}/#/vote/poll/key/{{ poll.customUrl }} + + {% else %} + + {{ BASE_URL }}/#/vote/poll/id/{{ poll.id }} + + {% endif %} + diff --git a/templates/emails/vote-notification.html.twig b/templates/emails/vote-notification.html.twig new file mode 100644 index 0000000..b1b174d --- /dev/null +++ b/templates/emails/vote-notification.html.twig @@ -0,0 +1,13 @@ +{#[Framadate] Notification d'un sondage : TESSSSSSSSSST#} +{% extends 'email-base.html.twig' %} +{% block content %} + + {{ owner.pseudo }} + + vient de voter au sondage. +
+ Vous pouvez retrouver votre sondage avec le lien suivant : + {% include 'emails/partial/admin_link.html.twig' %} + {% include 'emails/partial/public_link.html.twig' %} + +{% endblock %} diff --git a/templates/index.html.twig b/templates/index.html.twig new file mode 100755 index 0000000..2552310 --- /dev/null +++ b/templates/index.html.twig @@ -0,0 +1,67 @@ + + + + + Framadate + + + + + + + + + + + + + + + + + + + diff --git a/templates/migration/index.html.twig b/templates/migration/index.html.twig new file mode 100644 index 0000000..388c189 --- /dev/null +++ b/templates/migration/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello MigrationController!{% endblock %} + +{% block body %} + + +
+

Hello {{ controller_name }}! ✅

+ + This friendly message is coming from: + +
+{% endblock %} diff --git a/templates/owner/index.html.twig b/templates/owner/index.html.twig new file mode 100644 index 0000000..42b0a54 --- /dev/null +++ b/templates/owner/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello OwnerController!{% endblock %} + +{% block body %} + + +
+

Hello {{ controller_name }}! ✅

+ + This friendly message is coming from: + +
+{% endblock %} diff --git a/templates/pages/funky.html.twig b/templates/pages/funky.html.twig new file mode 100644 index 0000000..af88fcf --- /dev/null +++ b/templates/pages/funky.html.twig @@ -0,0 +1,14 @@ +{% extends 'base.html.twig' %} +{% block outerBody %} + +

Bienvenue à la maison!

+
+ + + + + + + +
+{% endblock %} diff --git a/templates/pages/home.html.twig b/templates/pages/home.html.twig new file mode 100644 index 0000000..4974879 --- /dev/null +++ b/templates/pages/home.html.twig @@ -0,0 +1,5 @@ +{% extends 'base.html.twig' %} +{% block outerBody %} + +

Bienvenue à la maison!

+{% endblock %} diff --git a/templates/poll/_delete_form.html.twig b/templates/poll/_delete_form.html.twig new file mode 100644 index 0000000..2c942af --- /dev/null +++ b/templates/poll/_delete_form.html.twig @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/templates/poll/_form.html.twig b/templates/poll/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/poll/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/poll/edit.html.twig b/templates/poll/edit.html.twig new file mode 100644 index 0000000..1926974 --- /dev/null +++ b/templates/poll/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Poll{% endblock %} + +{% block body %} +

Edit Poll

+ + {{ include('poll/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('poll/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/poll/index.html.twig b/templates/poll/index.html.twig new file mode 100644 index 0000000..88c2d29 --- /dev/null +++ b/templates/poll/index.html.twig @@ -0,0 +1,65 @@ +{% extends 'base.html.twig' %} + +{% block title %}Poll index{% endblock %} + +{% block body %} +

Poll index

+ + + + + + + + + + + + + + + + + + + + + + + + {% for poll in polls %} + + + + + + + + + + + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdTitleCustomUrlDescriptionCreationDateExpiracyDateKindAllowedAnswersModificationPolicyMailOnCommentMailOnVoteHideResultsShowResultEvenIfPasswordsPasswordAdminKeyactions
{{ poll.id }}{{ poll.title }}{{ poll.customUrl }}{{ poll.description }}{{ poll.creationDate ? poll.creationDate|date('Y-m-d H:i:s') : '' }}{{ poll.expiracyDate ? poll.expiracyDate|date('Y-m-d H:i:s') : '' }}{{ poll.kind }}{{ poll.allowedAnswers ? poll.allowedAnswers|join(', ') : '' }}{{ poll.modificationPolicy }}{{ poll.mailOnComment ? 'Yes' : 'No' }}{{ poll.mailOnVote ? 'Yes' : 'No' }}{{ poll.hideResults ? 'Yes' : 'No' }}{{ poll.showResultEvenIfPasswords ? 'Yes' : 'No' }} + {% if poll.password %} + (***) oui, caché + {% endif %} + {{ poll.adminKey }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/poll/new.html.twig b/templates/poll/new.html.twig new file mode 100644 index 0000000..08cce0e --- /dev/null +++ b/templates/poll/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Poll{% endblock %} + +{% block body %} +

Create new Poll

+ + {{ include('poll/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/poll/show.html.twig b/templates/poll/show.html.twig new file mode 100644 index 0000000..634f9c2 --- /dev/null +++ b/templates/poll/show.html.twig @@ -0,0 +1,78 @@ +{% extends 'base.html.twig' %} + +{% block title %}Poll{% endblock %} + +{% block body %} +

Poll

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ poll.id }}
Title{{ poll.title }}
CustomUrl{{ poll.customUrl }}
Description{{ poll.description }}
CreationDate{{ poll.creationDate ? poll.creationDate|date('Y-m-d H:i:s') : '' }}
ExpiracyDate{{ poll.expiracyDate ? poll.expiracyDate|date('Y-m-d H:i:s') : '' }}
Kind{{ poll.kind }}
AllowedAnswers{{ poll.allowedAnswers ? poll.allowedAnswers|join(', ') : '' }}
ModificationPolicy{{ poll.modificationPolicy }}
MailOnComment{{ poll.mailOnComment ? 'Yes' : 'No' }}
MailOnVote{{ poll.mailOnVote ? 'Yes' : 'No' }}
HideResults{{ poll.hideResults ? 'Yes' : 'No' }}
ShowResultEvenIfPasswords{{ poll.showResultEvenIfPasswords ? 'Yes' : 'No' }}
Password{{ poll.password }}
AdminKey{{ poll.adminKey }}
+ + back to list + + edit + + {{ include('poll/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/split/footer.html.twig b/templates/split/footer.html.twig new file mode 100644 index 0000000..a2833b4 --- /dev/null +++ b/templates/split/footer.html.twig @@ -0,0 +1,14 @@ +{% block footer %} + +{% endblock %} diff --git a/templates/split/header.html.twig b/templates/split/header.html.twig new file mode 100644 index 0000000..e134ad9 --- /dev/null +++ b/templates/split/header.html.twig @@ -0,0 +1,20 @@ +{% block header %} + +
+ +
+{% endblock %} diff --git a/templates/vote/index.html.twig b/templates/vote/index.html.twig new file mode 100644 index 0000000..472772d --- /dev/null +++ b/templates/vote/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello VoteController!{% endblock %} + +{% block body %} + + +
+

Hello {{ controller_name }}! ✅

+ + This friendly message is coming from: + +
+{% endblock %} diff --git a/translations/en.json b/translations/en.json new file mode 100755 index 0000000..7f54d74 --- /dev/null +++ b/translations/en.json @@ -0,0 +1,131 @@ +{ + "Language": "Language", + "Title": "Translation example", + "Intro": "Hello I am {{name}}, I am {{age}} years old.", + "home": { + "title": "home's title" + }, + "config": { + "demo": "this is a demo", + "demo_other": "this is an other demo", + "continue": "Continue", + "perfect": "That's perfect", + "title": "Create a poll", + "letsgo": "Lets go!", + "description": "Shedule appointments with your friends or your family, or create a pool with text, pictures or links… A real survey!", + "find_my_polls": "Where are my polls ?", + "find_helper": "I am looking for polls linked to my email", + "find_button": "Find my polls" + }, + "creation": { + "title": "To begin with", + "want": "I want to create a poll", + "kind": { + "classic": "classic", + "date": "special dates" + }, + "choose_title": "Whom title will be", + "choose_title_placeholder": "title", + "name": "I can also specify my name if i want", + "name_placeholder": "my name", + "description": "and the description would be", + "description_placeholder": "summary of the poll's purpose" + }, + "dates": { + "title": "Config especially for the dates", + "hours_different": "I want to put", + "hours_each_day": "slots for each day", + "multiple": { + "identical": "the same", + "different": "possibly different" + }, + "add": "Add a date choice", + "add_time": "Add a schedule proposal", + "empty": "Empty", + "count_dates": "choices of dates", + "count_time": "choices of schedules", + "add_interval": "Add a date interval", + "interval_propose": "I want to suggest all the dates from", + "interval_span": "to", + "interval_button": "Add these", + "interval_button_dates": "dates" + }, + "choices": { + "title": "Write the proposals", + "helper": "You can use markdown syntax", + "answer_preset_1": "Demo answer 1", + "answer_preset_2": "answer 2", + "answer_preset_3": "and D, the answer D", + "add": "Add", + "continue": "Let's see how it goes" + }, + "resume": { + "title": "And that's all for us!", + "admins": "Admin side", + "users": "Respondent side", + "links_mail": "Receive links by email" + }, + "visibility": { + "top_txt": "A few settings...", + "title": "Visibility of answers", + "visibility_want": "I want that", + "visibility_link": "anybody having the link", + "visibility_nobody": "nobody", + "visibility_see": "can see answers to the pool.", + "votes": "Votes", + "votes_possible": "Possible answers will be", + "votes_possible_single": "only \"yes\"", + "votes_possible_normal": "\"yes\" or \"maybe\"", + "votes_possible_full": "\"yes\" or \"maybe\" or \"no\"", + "archiving": "Polled people will be able to vote until", + "archiving_start": "They", + "archiving_can": "will", + "archiving_can_not": "will not", + "archiving_end": "be able to edit", + "modfiy_their": "their vote", + "modfiy_everyone": "all the votes", + "access": "Access to the poll", + "access_url": "Pooled people will be able to access it via this address:", + "access_url_key": "URL", + "see_pass": "see", + "access_instructions": "may contain letters, numbers and dashes", + "access_want": "I", + "access_want_yes": "want", + "access_want_no": "do not need", + "access_protect": "it to be password-protected.", + "validate_btn": "Create this poll!" + }, + "admin": { + "choose_title": "The pool title is", + "description": "and its description is", + "info_section_title": "Pool informations", + "settings_section_title": "Settings", + "votes_deletion_desc": "To start over from scratch, I can delete them all", + "votes_deletion_btn": "Delete all the votes", + "comments_deletion_title": "Comments", + "comments_deletion_desc": "If I wish, I can delete all the comments", + "comments_deletion_btn": "Delete all the comments", + "archiving_title": "Archiving", + "archiving_desc": "This poll will no longer be editable from", + "deletion": "Delete all", + "deletion_desc": "In the case you want do delete everything, this button is for you:", + "deletion_btn": "Delete the poll", + "link": "Links to access the survey", + "link_admin": "Administrator's side", + "link_admin_desc": "To access the poll and all its settings", + "link_admin_btn": "To see the poll as an administrator", + "copy_link": "Copy the link", + "polled_people": "Polled side", + "polled_people_desc": "To access the poll and all its settings", + "polled_people_btn": "See the poll", + "email_links": "Receive the links by email", + "email_links_desc": "To be sure to find these links, they can be sent to you by email", + "email_links_key": "email", + "email_links_btn": "Send the links to the poll" + }, + "pollGraphic": { + "choiceColorblind": "I am", + "choiceNotColorblind": "I am not", + "colorblindText": "colorblind." + } +} diff --git a/translations/fr.json b/translations/fr.json new file mode 100755 index 0000000..892f3fa --- /dev/null +++ b/translations/fr.json @@ -0,0 +1,131 @@ +{ + "Language": "Langue", + "Title": "Exemple de traduction", + "Intro": "Bonjour je m'appelle {{name}}, j'ai {{age}} ans.", + "home": { + "title": "le titre de la home" + }, + "config": { + "demo": "C'est une démo traduite en Français", + "demo_other": "C'est une autre démo traduite en Français", + "continue": "Continuer", + "perfect": "C'est parfait", + "title": "Créer un sondage", + "letsgo": "C'est parti !", + "description": "Planifiez des rendez-vous avec vos amis ou votre famille ou créez un sondage avec du texte, des images ou des liens… un sondage quoi !", + "find_my_polls": "Mes sondages", + "find_helper": "Je cherche d'autres sondages qui correspondent à mon mail", + "find_button": "Retrouver mes sondages" + }, + "creation": { + "title": "Créer un sondage", + "want": "Je veux créer un sondage", + "kind": { + "classic": "classique", + "date": "spécial dates" + }, + "choose_title": "Dont le titre sera", + "choose_title_placeholder": "titre", + "name": "Je peux aussi préciser mon nom si je le souhaite", + "name_placeholder": "mon nom", + "description": "et la description serait", + "description_placeholder": "description" + }, + "dates": { + "title": "Config spécialement pour les dates", + "hours_different": "Je souhaite mettre des créneaux horaires", + "hours_each_day": "pour chaque journée", + "multiple": { + "identical": "identiques", + "different": "possiblement différents" + }, + "add": "Ajouter une plage de dates", + "add_time": "Ajouter une plage horaire", + "empty": "Vider", + "count_dates": "choix de dates", + "count_time": "choix de plages horaires", + "add_interval": "Ajouter un intervalle de dates", + "interval_propose": "Je souhaite proposer pour mon sondage toutes les dates entre le", + "interval_span": "et le", + "interval_button": "Ajouter ces", + "interval_button_dates": "dates" + }, + "choices": { + "title": "Choisir les propositions", + "helper": "vous pouvez utiliser la syntaxe markdown ", + "answer_preset_1": "réponse de démo 1", + "answer_preset_2": "réponse 2", + "answer_preset_3": "la réponse D", + "add": "Ajouter", + "continue": "Voyons ce que ça donne" + }, + "resume": { + "title": "Et c'est tout pour nous !", + "admins": "Côté administrateur-ice-eux", + "users": "Côté sondés", + "links_mail": "Recevoir les liens par e-mail" + }, + "visibility": { + "top_txt": "Un peu de paramétrage…", + "title": "Visibilité des réponses", + "visibility_want": "Je veux que", + "visibility_link": "tous ceux qui ont le lien puissent", + "visibility_nobody": "seulement moi puisse", + "visibility_see": "voir les réponses au sondage.", + "votes": "Votes", + "votes_possible": "Les réponses possibles seront :", + "votes_possible_single": "Uniquement « oui »", + "votes_possible_normal": "« oui » ou « peut-être »", + "votes_possible_full": "« oui » ou « peut-être » ou « non »", + "archiving": "Les personnes sondées pourront voter jusqu’au", + "archiving_start": "Elles", + "archiving_can": "auront", + "archiving_can_not": "n'auront pas", + "archiving_end": "la possibilité de modifier", + "modfiy_their": "leur vote", + "modfiy_everyone": "tous les votes", + "access": "Accès au sondage", + "access_url": "Les votants pourront y accéder via cette adresse :", + "access_url_key": "URL", + "see_pass": "voir", + "access_instructions": "peut contenir des lettres, chiffres et des tirets", + "access_want": "Je", + "access_want_yes": "souhaite", + "access_want_no": "n'ai pas besoin", + "access_protect": "qu’il soit protégé par un mot de passe.", + "validate_btn": "Créer ce sondage !" + }, + "admin": { + "choose_title": "Le titre du sondage est", + "description": "et sa description :", + "info_section_title": "Informations du sondage", + "settings_section_title": "Paramètres", + "votes_deletion_desc": "Pour repartir à zéro, je peux tous les supprimer :", + "votes_deletion_btn": "Supprimer tous les votes", + "comments_deletion_title": "Commentaires", + "comments_deletion_desc": "Si je le souhaite, je peux supprimer l'ensemble des commentaires", + "comments_deletion_btn": "Supprimer tous les commentaires", + "archiving_title": "Archivage", + "archiving_desc": "Ce sondage ne sera plus éditable à partir du", + "deletion": "Tout supprimer", + "deletion_desc": "Dans le cas où vous voudriez tout supprimer, ce bouton est fait pour vous :", + "deletion_btn": "Supprimer le sondage", + "link": "Liens d’accès au sondage", + "link_admin": "Coté administrateur·ice", + "link_admin_desc": "Pour accéder au sondage et à tous ses paramètres :", + "link_admin_btn": "Voir le sondage coté administrateur·ice", + "copy_link": "Copier le lien", + "polled_people": "Côté sondé·es", + "polled_people_desc": "Pour accéder au sondage et à tous ses paramètres :", + "polled_people_btn": "Voir le sondage", + "email_links": "Recevoir les liens par mail", + "email_links_desc": "Pour être sûr de retrouver ces liens, nous pouvons vous les envoyer sur votre boîte mail.", + "email_links_key": "mail", + "email_links_btn": "Envoyer les liens du sondage" + }, + "pollGraphic": { + "choiceColorblind": "Je suis", + "choiceNotColorblind": "Je ne suis pas", + "colorblindText": "daltonien." + } +}