diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/iqdevTranningProgram.iml b/.idea/iqdevTranningProgram.iml new file mode 100644 index 0000000000000000000000000000000000000000..54d8720cc242bb9e2d9c1e29990d5988f667bb5b --- /dev/null +++ b/.idea/iqdevTranningProgram.iml @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="WEB_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="App\" /> + <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" packagePrefix="App\Tests\" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/composer" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/cache" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/collections" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/dbal" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/deprecations" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/doctrine-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/doctrine-migrations-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/event-manager" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/inflector" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/instantiator" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/lexer" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/migrations" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/orm" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/persistence" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/sql-formatter" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/egulias/email-validator" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/masterminds/html5" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/manifest" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/version" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-common" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-docblock" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/type-resolver" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpstan/phpdoc-parser" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-code-coverage" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-file-iterator" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-invoker" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-text-template" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-timer" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/phpunit" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/psr/cache" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/psr/clock" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/psr/container" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/psr/event-dispatcher" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/psr/link" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/psr/log" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/cli-parser" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit-reverse-lookup" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/comparator" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/complexity" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/diff" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/environment" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/exporter" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/global-state" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/lines-of-code" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-enumerator" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-reflector" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/recursion-context" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/resource-operations" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/type" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/version" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/asset" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/asset-mapper" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/browser-kit" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/cache" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/cache-contracts" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/clock" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/config" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/console" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/css-selector" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/debug-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dependency-injection" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/deprecation-contracts" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/doctrine-bridge" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/doctrine-messenger" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dom-crawler" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dotenv" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/error-handler" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher-contracts" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/expression-language" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/filesystem" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/finder" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/flex" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/form" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/framework-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-client" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-client-contracts" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-foundation" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-kernel" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/intl" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/mailer" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/maker-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/messenger" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/mime" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/monolog-bridge" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/monolog-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/notifier" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/options-resolver" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/password-hasher" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/phpunit-bridge" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-grapheme" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-icu" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-idn" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-normalizer" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-mbstring" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php83" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/process" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/property-access" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/property-info" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/routing" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/runtime" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-core" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-csrf" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-http" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/serializer" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/service-contracts" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/stimulus-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/stopwatch" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/string" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/translation" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/translation-contracts" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/twig-bridge" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/twig-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/ux-turbo" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/validator" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/var-dumper" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/var-exporter" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/web-link" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/web-profiler-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/yaml" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/theseer/tokenizer" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/twig/extra-bundle" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/twig/twig" /> + <excludeFolder url="file://$MODULE_DIR$/vendor/webmozart/assert" /> + <excludeFolder url="file://$MODULE_DIR$/var" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..aedf51d4705090b3af7b4d50da524da260b488fd --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/iqdevTranningProgram.iml" filepath="$PROJECT_DIR$/.idea/iqdevTranningProgram.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000000000000000000000000000000000000..762b2dfb47f89213485944d42f43f98703d63d19 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="MessDetectorOptionsConfiguration"> + <option name="transferred" value="true" /> + </component> + <component name="PHPCSFixerOptionsConfiguration"> + <option name="transferred" value="true" /> + </component> + <component name="PHPCodeSnifferOptionsConfiguration"> + <option name="highlightLevel" value="WARNING" /> + <option name="transferred" value="true" /> + </component> + <component name="PhpIncludePathManager"> + <include_path> + <path value="$PROJECT_DIR$/vendor/psr/cache" /> + <path value="$PROJECT_DIR$/vendor/psr/link" /> + <path value="$PROJECT_DIR$/vendor/psr/log" /> + <path value="$PROJECT_DIR$/vendor/psr/container" /> + <path value="$PROJECT_DIR$/vendor/psr/clock" /> + <path value="$PROJECT_DIR$/vendor/psr/event-dispatcher" /> + <path value="$PROJECT_DIR$/vendor/twig/twig" /> + <path value="$PROJECT_DIR$/vendor/twig/extra-bundle" /> + <path value="$PROJECT_DIR$/vendor/nikic/php-parser" /> + <path value="$PROJECT_DIR$/vendor/egulias/email-validator" /> + <path value="$PROJECT_DIR$/vendor/monolog/monolog" /> + <path value="$PROJECT_DIR$/vendor/myclabs/deep-copy" /> + <path value="$PROJECT_DIR$/vendor/phar-io/manifest" /> + <path value="$PROJECT_DIR$/vendor/phar-io/version" /> + <path value="$PROJECT_DIR$/vendor/phpstan/phpdoc-parser" /> + <path value="$PROJECT_DIR$/vendor/phpunit/php-text-template" /> + <path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" /> + <path value="$PROJECT_DIR$/vendor/phpunit/phpunit" /> + <path value="$PROJECT_DIR$/vendor/phpunit/php-code-coverage" /> + <path value="$PROJECT_DIR$/vendor/phpunit/php-file-iterator" /> + <path value="$PROJECT_DIR$/vendor/phpunit/php-timer" /> + <path value="$PROJECT_DIR$/vendor/symfony/dom-crawler" /> + <path value="$PROJECT_DIR$/vendor/symfony/intl" /> + <path value="$PROJECT_DIR$/vendor/symfony/cache" /> + <path value="$PROJECT_DIR$/vendor/symfony/dependency-injection" /> + <path value="$PROJECT_DIR$/vendor/symfony/mime" /> + <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-grapheme" /> + <path value="$PROJECT_DIR$/vendor/symfony/string" /> + <path value="$PROJECT_DIR$/vendor/symfony/asset" /> + <path value="$PROJECT_DIR$/vendor/symfony/security-http" /> + <path value="$PROJECT_DIR$/vendor/symfony/security-csrf" /> + <path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher-contracts" /> + <path value="$PROJECT_DIR$/vendor/symfony/dotenv" /> + <path value="$PROJECT_DIR$/vendor/symfony/translation" /> + <path value="$PROJECT_DIR$/vendor/symfony/translation-contracts" /> + <path value="$PROJECT_DIR$/vendor/symfony/yaml" /> + <path value="$PROJECT_DIR$/vendor/symfony/serializer" /> + <path value="$PROJECT_DIR$/vendor/symfony/doctrine-messenger" /> + <path value="$PROJECT_DIR$/vendor/symfony/error-handler" /> + <path value="$PROJECT_DIR$/vendor/symfony/http-foundation" /> + <path value="$PROJECT_DIR$/vendor/symfony/security-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/web-profiler-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/var-dumper" /> + <path value="$PROJECT_DIR$/vendor/symfony/config" /> + <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php83" /> + <path value="$PROJECT_DIR$/vendor/symfony/finder" /> + <path value="$PROJECT_DIR$/vendor/symfony/ux-turbo" /> + <path value="$PROJECT_DIR$/vendor/symfony/cache-contracts" /> + <path value="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring" /> + <path value="$PROJECT_DIR$/vendor/symfony/css-selector" /> + <path value="$PROJECT_DIR$/vendor/symfony/security-core" /> + <path value="$PROJECT_DIR$/vendor/symfony/property-access" /> + <path value="$PROJECT_DIR$/vendor/symfony/validator" /> + <path value="$PROJECT_DIR$/vendor/symfony/mailer" /> + <path value="$PROJECT_DIR$/vendor/symfony/monolog-bridge" /> + <path value="$PROJECT_DIR$/vendor/symfony/debug-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/filesystem" /> + <path value="$PROJECT_DIR$/vendor/symfony/console" /> + <path value="$PROJECT_DIR$/vendor/symfony/twig-bridge" /> + <path value="$PROJECT_DIR$/vendor/symfony/process" /> + <path value="$PROJECT_DIR$/vendor/symfony/service-contracts" /> + <path value="$PROJECT_DIR$/vendor/symfony/messenger" /> + <path value="$PROJECT_DIR$/vendor/symfony/deprecation-contracts" /> + <path value="$PROJECT_DIR$/vendor/symfony/http-client-contracts" /> + <path value="$PROJECT_DIR$/vendor/symfony/var-exporter" /> + <path value="$PROJECT_DIR$/vendor/symfony/monolog-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/http-client" /> + <path value="$PROJECT_DIR$/vendor/symfony/clock" /> + <path value="$PROJECT_DIR$/vendor/symfony/doctrine-bridge" /> + <path value="$PROJECT_DIR$/vendor/symfony/phpunit-bridge" /> + <path value="$PROJECT_DIR$/vendor/symfony/routing" /> + <path value="$PROJECT_DIR$/vendor/symfony/web-link" /> + <path value="$PROJECT_DIR$/vendor/symfony/notifier" /> + <path value="$PROJECT_DIR$/vendor/symfony/property-info" /> + <path value="$PROJECT_DIR$/vendor/symfony/asset-mapper" /> + <path value="$PROJECT_DIR$/vendor/symfony/expression-language" /> + <path value="$PROJECT_DIR$/vendor/symfony/http-kernel" /> + <path value="$PROJECT_DIR$/vendor/symfony/browser-kit" /> + <path value="$PROJECT_DIR$/vendor/symfony/flex" /> + <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-idn" /> + <path value="$PROJECT_DIR$/vendor/symfony/twig-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/stopwatch" /> + <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-icu" /> + <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-normalizer" /> + <path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher" /> + <path value="$PROJECT_DIR$/vendor/symfony/stimulus-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/options-resolver" /> + <path value="$PROJECT_DIR$/vendor/symfony/password-hasher" /> + <path value="$PROJECT_DIR$/vendor/symfony/maker-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/runtime" /> + <path value="$PROJECT_DIR$/vendor/symfony/framework-bundle" /> + <path value="$PROJECT_DIR$/vendor/symfony/form" /> + <path value="$PROJECT_DIR$/vendor/theseer/tokenizer" /> + <path value="$PROJECT_DIR$/vendor/doctrine/cache" /> + <path value="$PROJECT_DIR$/vendor/doctrine/doctrine-bundle" /> + <path value="$PROJECT_DIR$/vendor/doctrine/event-manager" /> + <path value="$PROJECT_DIR$/vendor/doctrine/collections" /> + <path value="$PROJECT_DIR$/vendor/doctrine/deprecations" /> + <path value="$PROJECT_DIR$/vendor/doctrine/lexer" /> + <path value="$PROJECT_DIR$/vendor/doctrine/persistence" /> + <path value="$PROJECT_DIR$/vendor/doctrine/orm" /> + <path value="$PROJECT_DIR$/vendor/doctrine/inflector" /> + <path value="$PROJECT_DIR$/vendor/doctrine/sql-formatter" /> + <path value="$PROJECT_DIR$/vendor/doctrine/doctrine-migrations-bundle" /> + <path value="$PROJECT_DIR$/vendor/doctrine/instantiator" /> + <path value="$PROJECT_DIR$/vendor/doctrine/dbal" /> + <path value="$PROJECT_DIR$/vendor/doctrine/migrations" /> + <path value="$PROJECT_DIR$/vendor/sebastian/environment" /> + <path value="$PROJECT_DIR$/vendor/sebastian/diff" /> + <path value="$PROJECT_DIR$/vendor/sebastian/resource-operations" /> + <path value="$PROJECT_DIR$/vendor/sebastian/recursion-context" /> + <path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" /> + <path value="$PROJECT_DIR$/vendor/sebastian/code-unit" /> + <path value="$PROJECT_DIR$/vendor/sebastian/object-enumerator" /> + <path value="$PROJECT_DIR$/vendor/sebastian/object-reflector" /> + <path value="$PROJECT_DIR$/vendor/sebastian/complexity" /> + <path value="$PROJECT_DIR$/vendor/sebastian/comparator" /> + <path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" /> + <path value="$PROJECT_DIR$/vendor/sebastian/version" /> + <path value="$PROJECT_DIR$/vendor/sebastian/exporter" /> + <path value="$PROJECT_DIR$/vendor/sebastian/type" /> + <path value="$PROJECT_DIR$/vendor/sebastian/global-state" /> + <path value="$PROJECT_DIR$/vendor/sebastian/code-unit-reverse-lookup" /> + <path value="$PROJECT_DIR$/vendor/webmozart/assert" /> + <path value="$PROJECT_DIR$/vendor/masterminds/html5" /> + <path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-common" /> + <path value="$PROJECT_DIR$/vendor/phpdocumentor/type-resolver" /> + <path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-docblock" /> + <path value="$PROJECT_DIR$/vendor/composer" /> + </include_path> + </component> + <component name="PhpProjectSharedConfiguration" php_language_level="8.1" /> + <component name="PhpStanOptionsConfiguration"> + <option name="transferred" value="true" /> + </component> + <component name="PhpUnit"> + <phpunit_settings> + <PhpUnitSettings configuration_file_path="$PROJECT_DIR$/phpunit.xml.dist" custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" use_configuration_file="true" /> + </phpunit_settings> + </component> + <component name="PsalmOptionsConfiguration"> + <option name="transferred" value="true" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/phpunit.xml b/.idea/phpunit.xml new file mode 100644 index 0000000000000000000000000000000000000000..4f8104cfb166aed9afb9fa8317271ebd4f44e5cb --- /dev/null +++ b/.idea/phpunit.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="PHPUnit"> + <option name="directories"> + <list> + <option value="$PROJECT_DIR$/tests" /> + </list> + </option> + </component> +</project> \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/0/e/0e61f67641b441bb3ee38e903c594d99cafa14b4 b/.idea/sonarlint/issuestore/0/e/0e61f67641b441bb3ee38e903c594d99cafa14b4 new file mode 100644 index 0000000000000000000000000000000000000000..ef18277ec815ab66f9347e4276513938f9fc5984 --- /dev/null +++ b/.idea/sonarlint/issuestore/0/e/0e61f67641b441bb3ee38e903c594d99cafa14b4 @@ -0,0 +1,2 @@ + +f php:S4833"QReplace "require_once" with namespace import mechanism through the "use" keyword.(úÕ§ò \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/1/1/11fc5ee351c0edf973b3158acd40705a072901f7 b/.idea/sonarlint/issuestore/1/1/11fc5ee351c0edf973b3158acd40705a072901f7 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.idea/sonarlint/issuestore/7/c/7c103dcd8c0314a8821f84f7886754511983a720 b/.idea/sonarlint/issuestore/7/c/7c103dcd8c0314a8821f84f7886754511983a720 new file mode 100644 index 0000000000000000000000000000000000000000..49baffe2daef275d9641cc73fbdcc8705cfd0037 --- /dev/null +++ b/.idea/sonarlint/issuestore/7/c/7c103dcd8c0314a8821f84f7886754511983a720 @@ -0,0 +1,2 @@ + +Œphp:S112"FDefine and throw a dedicated exception instead of using a generic one.(÷¾Þ–ýÿÿÿÿ8¼Èñýë1J$639b0b04-18e2-4d6f-b884-25955f0cf69c \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/d/a/dacdf19231dacf48f340f1ddb51182a025c0e074 b/.idea/sonarlint/issuestore/d/a/dacdf19231dacf48f340f1ddb51182a025c0e074 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb new file mode 100644 index 0000000000000000000000000000000000000000..952c8a69794caa637ef4b2d74236ebf8f3ae2674 --- /dev/null +++ b/.idea/sonarlint/issuestore/index.pb @@ -0,0 +1,11 @@ + +_ +/src/Controller/ReadFileLineByLineController.php,1/1/11fc5ee351c0edf973b3158acd40705a072901f7 +F +public/HelloWorld.html,d/a/dacdf19231dacf48f340f1ddb51182a025c0e074 +@ +public/index.php,0/e/0e61f67641b441bb3ee38e903c594d99cafa14b4 +_ +/src/Repository/ReadFileLineByLineRepository.php,7/c/7c103dcd8c0314a8821f84f7886754511983a720 +X +(src/Actions/ReadFileLineByLineAction.php,b/b/bb599184d4f741824c29e585018cdb8069747a80 \ No newline at end of file diff --git a/.idea/sonarlint/securityhotspotstore/0/e/0e61f67641b441bb3ee38e903c594d99cafa14b4 b/.idea/sonarlint/securityhotspotstore/0/e/0e61f67641b441bb3ee38e903c594d99cafa14b4 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.idea/sonarlint/securityhotspotstore/1/1/11fc5ee351c0edf973b3158acd40705a072901f7 b/.idea/sonarlint/securityhotspotstore/1/1/11fc5ee351c0edf973b3158acd40705a072901f7 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.idea/sonarlint/securityhotspotstore/7/c/7c103dcd8c0314a8821f84f7886754511983a720 b/.idea/sonarlint/securityhotspotstore/7/c/7c103dcd8c0314a8821f84f7886754511983a720 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.idea/sonarlint/securityhotspotstore/d/a/dacdf19231dacf48f340f1ddb51182a025c0e074 b/.idea/sonarlint/securityhotspotstore/d/a/dacdf19231dacf48f340f1ddb51182a025c0e074 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.idea/sonarlint/securityhotspotstore/index.pb b/.idea/sonarlint/securityhotspotstore/index.pb new file mode 100644 index 0000000000000000000000000000000000000000..952c8a69794caa637ef4b2d74236ebf8f3ae2674 --- /dev/null +++ b/.idea/sonarlint/securityhotspotstore/index.pb @@ -0,0 +1,11 @@ + +_ +/src/Controller/ReadFileLineByLineController.php,1/1/11fc5ee351c0edf973b3158acd40705a072901f7 +F +public/HelloWorld.html,d/a/dacdf19231dacf48f340f1ddb51182a025c0e074 +@ +public/index.php,0/e/0e61f67641b441bb3ee38e903c594d99cafa14b4 +_ +/src/Repository/ReadFileLineByLineRepository.php,7/c/7c103dcd8c0314a8821f84f7886754511983a720 +X +(src/Actions/ReadFileLineByLineAction.php,b/b/bb599184d4f741824c29e585018cdb8069747a80 \ No newline at end of file diff --git a/.idea/symfony2.xml b/.idea/symfony2.xml new file mode 100644 index 0000000000000000000000000000000000000000..329806066e98b4e5d3cac43f8b4f3f10d55bec96 --- /dev/null +++ b/.idea/symfony2.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Symfony2PluginSettings"> + <option name="pluginEnabled" value="true" /> + <option name="lastServiceGeneratorLanguage" value="yaml" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/app/public/HelloWorld.html b/app/public/HelloWorld.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/public/helloWorld.html b/app/public/helloWorld.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/Actions/CountFriday13Action.php b/src/Actions/CountFriday13Action.php new file mode 100644 index 0000000000000000000000000000000000000000..c7986cd84ca2880d10e25b391da5d684f6e02888 --- /dev/null +++ b/src/Actions/CountFriday13Action.php @@ -0,0 +1,27 @@ +<?php + +namespace App\Actions; + +use DateTimeImmutable; + +class CountFriday13Action +{ + /** + * Вернет вÑе пÑтницы 13 в году + * @param int $year год, в котором необходимо произвеÑти раÑчет + * @return DateTimeImmutable[] + */ + public function act(int $year): array + { + $AllFri13 = []; + + for ($i = 1; $i <= 12; $i++) { + $next13 = (new DateTimeImmutable())->setDate($year, $i, 13); + + if ($next13->format("D") === "Fri") { + $AllFri13[] = $next13; + } + } + return $AllFri13; + } +} diff --git a/src/Actions/DiffDaysAction.php b/src/Actions/DiffDaysAction.php new file mode 100644 index 0000000000000000000000000000000000000000..c3ee3c28a3e86c759e6627eb79b4fbcc9f4f4fa7 --- /dev/null +++ b/src/Actions/DiffDaysAction.php @@ -0,0 +1,21 @@ +<?php + +namespace App\Actions; + +use DateTimeImmutable; + +class DiffDaysAction +{ + /** + * Вернет кол-во дней между датами + * @param DateTimeImmutable $dateStart дата начала + * @param DateTimeImmutable $dateEnd дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ + * @return int + * */ + public function act( + DateTimeImmutable $dateStart, + DateTimeImmutable $dateEnd + ): int { + return (int) $dateStart->diff($dateEnd)->format('%a'); + } +} diff --git a/src/Actions/HowDaysToNYAction.php b/src/Actions/HowDaysToNYAction.php new file mode 100644 index 0000000000000000000000000000000000000000..3c133ed921bc0eeaa7d38b13f083b3315a846786 --- /dev/null +++ b/src/Actions/HowDaysToNYAction.php @@ -0,0 +1,20 @@ +<?php + +namespace App\Actions; + +use DateTimeImmutable; + +class HowDaysToNYAction +{ + /** + * Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°ÑÑчитывает кол-во дней до нового года + * @param DateTime $date дата от которой, необходимо раÑÑчитать кол-во дней + * @return int + */ + public function act(DateTimeImmutable $date): int + { + $dateOfNY = $date->modify('first day of Jan +1 year'); + + return (int) $dateOfNY->diff($date)->format('%a'); + } +} \ No newline at end of file diff --git a/src/Actions/IdSearchAction.php b/src/Actions/IdSearchAction.php new file mode 100644 index 0000000000000000000000000000000000000000..695329150f8356cafbe37813f6c032ff44fd337b --- /dev/null +++ b/src/Actions/IdSearchAction.php @@ -0,0 +1,29 @@ +<?php + +namespace App\Actions; + +class IdSearchAction +{ + /** + * Ðайдет Ñлемент Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹Ð¼ id + * @param array $array - маÑÑив, Ñодержащий Ñлементы Ñо Ñтруктурой + * [ + * 'id' => 30, + * 'name' => 'Jhon', + * 'age' => 23, + * ] + * @param $id - ид иÑкомого Ñлемента + * @return array|null - найденный Ñлемент/ вернет null при его отÑутÑтвии + */ + public static function act(array $array): ?array + { + + foreach ($array['users'] as $item){ + if ($item['id'] === $array['id']){ + return $item; + } + } + + return null; + } +} diff --git a/src/Actions/PrepareMenuAction.php b/src/Actions/PrepareMenuAction.php new file mode 100644 index 0000000000000000000000000000000000000000..6c819831ff2c5e757354a29e2325268c881ea3fb --- /dev/null +++ b/src/Actions/PrepareMenuAction.php @@ -0,0 +1,35 @@ +<?php + +namespace App\Actions; + +class PrepareMenuAction +{ + /** + * Группирует подразедлы в верхние разделы меню + * Дочерние Ñлементы помещает в маÑÑив Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ submenu + * Значение под ключом depth определÑет уровень раздела + * МаÑÑив $aMenu вÑегда должен начинаетÑÑ Ñ Ñлемента depth = 0, + * вÑе поÑледующие Ñлементы Ñ depth = 1 ÑвлÑÑŽÑ‚ÑÑ ÐµÐ³Ð¾ дочерними Ñлементами + * + * @param array $menu + * @return array + */ + public function act(array $menu): array + { + $returnableAMenu = []; + foreach ($menu as $menuPoint) { + + $depth = $menuPoint["depth"]; + + if ($depth === 1) { + $tempArray = array_pop($returnableAMenu); + $tempArray['submenu'][] = $menuPoint; + $returnableAMenu[] = $tempArray; + } else { + $returnableAMenu[] = $menuPoint; + } + } + + return $returnableAMenu; + } +} diff --git a/src/Actions/ReadFileLineByLineAction.php b/src/Actions/ReadFileLineByLineAction.php new file mode 100644 index 0000000000000000000000000000000000000000..cf7f1f6fd14f715c057fe14ef46e7734e2fb468e --- /dev/null +++ b/src/Actions/ReadFileLineByLineAction.php @@ -0,0 +1,29 @@ +<?php + +namespace App\Actions; + +use Generator; + +class ReadFileLineByLineAction +{ + /** + * Принимает путь до файла, + * проверÑет, что файл ÑущеÑтвует и выводит пользователю поÑтрочный вывод иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ yield + * (файл можешь Ñоздать любой) + * + * @param string $filePath путь до файла + * @return string|Generator */ + public function act(string $filePath): Generator + { + if (!file_exists($filePath)) { + throw new Exception("неверный путь"); + } + + $file = fopen($filePath, 'r'); + while (!feof($file)) { + yield fgets($file); + } + + fclose($file); + } +} diff --git a/src/Actions/ReadLogFileAction.php b/src/Actions/ReadLogFileAction.php new file mode 100644 index 0000000000000000000000000000000000000000..ba63dd798f6508def3c58b48b1fbff4ed593adb2 --- /dev/null +++ b/src/Actions/ReadLogFileAction.php @@ -0,0 +1,26 @@ +<?php + +namespace App\Actions; + +use Exception; + +class ReadLogFileAction +{ + /** + * Принимает путь до файла, + * проверÑет, что файл ÑущеÑтвует и выводит пользователю веÑÑŒ контент файла + * (файл можешь Ñоздать любой) + * + * @param string $filePath путь до файла + * @return false|string + * @throws Exception при отÑутÑвии фаила по переданному пути + */ + public function act(string $filePath) + { + if (!file_exists($filePath)) { + throw new Exception("По данному пути ничего не найдено: $filePath"); + } + + return file_get_contents($filePath); + } +} diff --git a/src/Actions/SortPriceAction.php b/src/Actions/SortPriceAction.php new file mode 100644 index 0000000000000000000000000000000000000000..067f67ed9020bbdfacb7f88dfae057eec402b6fc --- /dev/null +++ b/src/Actions/SortPriceAction.php @@ -0,0 +1,27 @@ +<?php + +namespace App\Actions; + +class SortPriceAction +{ + /** + * ВыполнÑет Ñортировку маÑÑива по убыванию цены + * @param array $array + * @return array отÑортированный + */ + public function act(array $array): array + { + $priceColumn = array_column($array, "price"); + $countColumn = array_column($array, "count"); + + array_multisort( + $priceColumn, + SORT_DESC, + $countColumn, + SORT_ASC, + $array, + ); + + return $array; + } +} diff --git a/src/Actions/UniqElementsAction.php b/src/Actions/UniqElementsAction.php new file mode 100644 index 0000000000000000000000000000000000000000..3aa0e139f1779dcbe693c239f8b58a5ef0f3845d --- /dev/null +++ b/src/Actions/UniqElementsAction.php @@ -0,0 +1,16 @@ +<?php + +namespace App\Actions; + +class UniqElementsAction +{ + /** + * УдалÑет дубликаты, оÑтавив только уникальные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ + * @param array $array + * @return array + */ + public static function act(array $array): array + { + return array_unique($array, SORT_REGULAR); + } +} \ No newline at end of file diff --git a/src/Controller/CountFriday13Controller.php b/src/Controller/CountFriday13Controller.php new file mode 100644 index 0000000000000000000000000000000000000000..dc3e7418aa51adf6719b9ca799e9f6381693f8fb --- /dev/null +++ b/src/Controller/CountFriday13Controller.php @@ -0,0 +1,25 @@ +<?php + +namespace App\Controller; + +use App\Actions\CountFriday13Action; +use App\Requests\AllFri13Request; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class CountFriday13Controller extends AbstractController +{ + /** + * git Контроллер вернет вÑе пÑтницы 13 в году иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ countFriday13 функцию + * @param AllFri13Request $request + * @param CountFriday13Action $action + * @return Response + */ + #[Route('/count/friday13', name: 'app_count_friday13')] + public function index(AllFri13Request $request, CountFriday13Action $action): Response + { + return new JsonResponse($action->act($request->serialise())); + } +} diff --git a/src/Controller/DiffDaysController.php b/src/Controller/DiffDaysController.php new file mode 100644 index 0000000000000000000000000000000000000000..7dc8cd80893a2738cbc5eec8998572c3bee67e7c --- /dev/null +++ b/src/Controller/DiffDaysController.php @@ -0,0 +1,26 @@ +<?php + +namespace App\Controller; + +use App\Actions\DiffDaysAction; +use App\Requests\DiffDaysRequest; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class DiffDaysController extends AbstractController +{ + /** + * Контроллер вернет кол-во дней между датами + * @param DiffDaysRequest $request + * @param DiffDaysAction $action + * @return Response + */ + #[Route('/diff/days', name: 'app_diff_days', methods: ['POST'])] + public function index(DiffDaysRequest $request, DiffDaysAction $action): Response + { + $array = $request->serialise(); + return new JsonResponse($action->act($array['startDate'], $array['endDate'])); + } +} diff --git a/src/Controller/HowDaysToNYController.php b/src/Controller/HowDaysToNYController.php new file mode 100644 index 0000000000000000000000000000000000000000..8311dcef842015f0f0fcbafea037d03fd26f89be --- /dev/null +++ b/src/Controller/HowDaysToNYController.php @@ -0,0 +1,25 @@ +<?php + +namespace App\Controller; + +use App\Actions\HowDaysToNYAction; +use App\Requests\BeforeNYDateRequest; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class HowDaysToNYController extends AbstractController +{ + /** + * Контролер раÑÑчитывает кол-во дней до нового года иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑŽÑ howDaysToNy + * @param BeforeNYDateRequest $request + * @param HowDaysToNYAction $action + * @return Response + */ + #[Route('/howdaystony', name: 'app_how_days_to_n_y')] + public function index(BeforeNYDateRequest $request, HowDaysToNYAction $action): Response + { + return new JsonResponse($action->act($request->serialise())); + } +} diff --git a/src/Controller/IdSearchController.php b/src/Controller/IdSearchController.php new file mode 100644 index 0000000000000000000000000000000000000000..3dd1716b17df2919d4f5fc5ca78d4930393cd9b2 --- /dev/null +++ b/src/Controller/IdSearchController.php @@ -0,0 +1,24 @@ +<?php + +namespace App\Controller; + +use App\Actions\IdSearchAction; +use App\Requests\UsersRequest; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\Routing\Attribute\Route; + +class IdSearchController extends AbstractController +{ + /** + * Контроллер найдет Ñлемент Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹Ð¼ id иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ sortPrice + * @param UsersRequest $request + * @param IdSearchAction $action + * @return JsonResponse + */ + #[Route('/search', name: 'app_search', methods: ['POST'])] + public function index(UsersRequest $request, IdSearchAction $action): JsonResponse + { + return new JsonResponse($action->act($request->serialise())); + } +} \ No newline at end of file diff --git a/src/Controller/PrepareMenuController.php b/src/Controller/PrepareMenuController.php new file mode 100644 index 0000000000000000000000000000000000000000..49a74dd59b5600f956078046d942b7f9dfab405e --- /dev/null +++ b/src/Controller/PrepareMenuController.php @@ -0,0 +1,26 @@ +<?php + +namespace App\Controller; + +use App\Actions\PrepareMenuAction; +use App\Requests\MenuRequest; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class PrepareMenuController extends AbstractController +{ + /** + * Контроллер реÑтруктурирует маÑÑив меню добавлÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑ‚ÑŒ по значению depth + * иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑŽÑ prepareMenu функцию + * @param MenuRequest $request + * @param PrepareMenuAction $action + * @return Response + */ + #[Route('/prepare/menu', name: 'app_prepare_menu', methods: ['POST'])] + public function index(MenuRequest $request, PrepareMenuAction $action): Response + { + return new JsonResponse($action->act($request->serialise())); + } +} diff --git a/src/Controller/ReadFileLineByLineController.php b/src/Controller/ReadFileLineByLineController.php new file mode 100644 index 0000000000000000000000000000000000000000..c6d0f0398a031505d844e51636a858ad469b7bc7 --- /dev/null +++ b/src/Controller/ReadFileLineByLineController.php @@ -0,0 +1,36 @@ +<?php + +namespace App\Controller; + +use App\Actions\ReadFileLineByLineAction; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class ReadFileLineByLineController extends AbstractController +{ + /** + * Принимает путь до файла, + * проверÑет, что файл ÑущеÑтвует и выводит пользователю поÑтрочный вывод иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ yield + * + * @param string $filePath путь до файла + * @return Response */ + #[Route('/readbyline', name: 'app_read_file_line_by_line', methods: ['POST'])] + public function index( + Request $request, + ReadFileLineByLineAction $action + ) : Response { + $file = $request->files->get('File'); + $content = ""; + try{ + foreach ($action->act($file->getRealPath()) as $line) { + $content .= $line; + } + } catch (\Exception $exception) { + return new Response($exception->getMessage(), Response::HTTP_NOT_FOUND); + } + + return new Response($content); + } +} diff --git a/src/Controller/ReadLogFileController.php b/src/Controller/ReadLogFileController.php new file mode 100644 index 0000000000000000000000000000000000000000..809cf6439f59dbc6117f3a7d180a7702f643a785 --- /dev/null +++ b/src/Controller/ReadLogFileController.php @@ -0,0 +1,29 @@ +<?php + +namespace App\Controller; +use App\Actions\ReadLogFileAction; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class ReadLogFileController extends AbstractController +{ + /** + * Принимает путь до файла, + * проверÑет, что файл ÑущеÑтвует и выводит пользователю веÑÑŒ контент файла + * (файл можешь Ñоздать любой) + * + * @param Request $request + * @param ReadLogFileAction $action + * @return Response + */ + #[Route('/read', name: 'app_read_log_file', methods: ['POST'])] + public function index(Request $request, ReadLogFileAction $action): Response + { + $file = $request->files->get("File"); + return new Response($action->act($file->getPathname())); + } + + } + diff --git a/src/Controller/SortPriceController.php b/src/Controller/SortPriceController.php new file mode 100644 index 0000000000000000000000000000000000000000..0f1d250b6c31ea3f0dee3f4581c722d10adb2cdf --- /dev/null +++ b/src/Controller/SortPriceController.php @@ -0,0 +1,24 @@ +<?php + +namespace App\Controller; + +use App\Actions\SortPriceAction; +use App\Requests\PricesRequest; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\Routing\Attribute\Route; + +class SortPriceController extends AbstractController +{ + /** + * Контроллер волнÑет Ñортировку маÑÑива по убыванию цены иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ sortPrice + * @param PricesRequest $request + * @param SortPriceAction $action + * @return JsonResponse + */ + #[Route('/sort/price', name: 'app_sort_price', methods: ['POST'])] + public function index(PricesRequest $request, SortPriceAction $action): JsonResponse + { + return new JsonResponse($action->act($request->serialise())); + } +} diff --git a/src/Controller/UniqElementsController.php b/src/Controller/UniqElementsController.php new file mode 100644 index 0000000000000000000000000000000000000000..442c9d706cd88d708688f9dc1a5ecb3260d812a1 --- /dev/null +++ b/src/Controller/UniqElementsController.php @@ -0,0 +1,19 @@ +<?php + +namespace App\Controller; + +use App\Actions\UniqElementsAction; +use App\Requests\UniqElementsRequest; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class UniqElementsController extends AbstractController +{ + #[Route('/uniq/elements', name: 'app_uniq_elements', methods: ['POST'])] + public function index(UniqElementsRequest $request, UniqElementsAction $action): Response + { + return new JsonResponse($action->act($request->serialise())); + } +} diff --git a/src/Requests/AllFri13Request.php b/src/Requests/AllFri13Request.php new file mode 100644 index 0000000000000000000000000000000000000000..d98cebb598d5216595bfd7c89d2b6e2b91662619 --- /dev/null +++ b/src/Requests/AllFri13Request.php @@ -0,0 +1,21 @@ +<?php + +namespace App\Requests; + +use Symfony\Component\Validator\Constraints\Positive; +use Symfony\Component\Validator\Constraints\Type; + +class AllFri13Request extends BaseRequest +{ + #[Type('integer')] + #[Positive] + public $year; + + /** + * @return mixed + */ + public function serialise(): int + { + return (int) $this->year; + } +} \ No newline at end of file diff --git a/src/Requests/BaseRequest.php b/src/Requests/BaseRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..b2fb49ed286c374885e1b073732ab13a0366d5a0 --- /dev/null +++ b/src/Requests/BaseRequest.php @@ -0,0 +1,71 @@ +<?php + +namespace App\Requests; + +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Validator\Exception\ValidatorException; +use Symfony\Component\Validator\Validator\ValidatorInterface; + +abstract class BaseRequest +{ + /** + * Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð²Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ð¸ + * перезапиÑать на false Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ автовалидации + */ + protected const AUTO_VALIDATE = true; + + public function __construct(protected ValidatorInterface $validator) + { + $this->populate(); + + if (self::AUTO_VALIDATE) { + $this->validate(); + } + } + + protected function populate(): void + { + foreach ($this->getRequest()->toArray() as $property => $value) { + if (property_exists($this, $property)) { + $this->{$property} = $value; + } + } + } + + /** + * Ð²Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ñ Ð¸ выброкÑа ошибки при валидации + * @return void + */ + public function validate() + { + $errors = $this->validator->validate($this); + + $messages = [ + 'message' => 'validation_failed', + 'errors' => [] + ]; + + foreach ($errors as $error) { + $messages['errors'][] = [ + 'property' => $error->getPropertyPath(), + 'value' => $error->getInvalidValue(), + 'message' => $error->getMessage(), + ]; + } + + if (count($messages['errors']) > 0) { + $response = new JsonResponse($messages, 201); + $response->send(); + + throw new ValidatorException('Validation failed', $messages); + } + } + + public function getRequest(): Request + { + return Request::createFromGlobals(); + } + + abstract public function serialise(): mixed; +} \ No newline at end of file diff --git a/src/Requests/BeforeNYDateRequest.php b/src/Requests/BeforeNYDateRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..445bc20f34656a0551f6a13947206872e4db6aa6 --- /dev/null +++ b/src/Requests/BeforeNYDateRequest.php @@ -0,0 +1,19 @@ +<?php + +namespace App\Requests; + +use DateTimeImmutable; +use Symfony\Component\Validator\Constraints\Date; +use Symfony\Component\Validator\Constraints\Type; + +class BeforeNYDateRequest extends BaseRequest +{ + #[Date()] + #[Type('string')] + public $date; + + public function serialise(): mixed + { + return new DateTimeImmutable($this->date); + } +} diff --git a/src/Requests/DiffDaysRequest.php b/src/Requests/DiffDaysRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..95295fd7bba664592cb6358dac546176dd9d6ea7 --- /dev/null +++ b/src/Requests/DiffDaysRequest.php @@ -0,0 +1,29 @@ +<?php + +namespace App\Requests; + +use DateTimeImmutable; +use Symfony\Component\Validator\Constraints\Date; +use Symfony\Component\Validator\Constraints\NotBlank; + +class DiffDaysRequest extends BaseRequest +{ + #[Date] + #[NotBlank] + public $startDate; + + #[Date] + #[NotBlank] + public $endDate; + + /** + * @return mixed + */ + public function serialise(): mixed + { + return [ + 'startDate' => new DateTimeImmutable($this->startDate), + 'endDate' => new DateTimeImmutable($this->endDate), + ]; + } +} \ No newline at end of file diff --git a/src/Requests/MenuRequest.php b/src/Requests/MenuRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..99bf7832858bdbab9739ab66d52845988756873d --- /dev/null +++ b/src/Requests/MenuRequest.php @@ -0,0 +1,32 @@ +<?php + +namespace App\Requests; + +use Symfony\Component\Validator\Constraints\All; +use Symfony\Component\Validator\Constraints\Collection; +use Symfony\Component\Validator\Constraints\NotBlank; +use Symfony\Component\Validator\Constraints\Type; + +class MenuRequest extends BaseRequest +{ + + #[Type('array')] + #[All( + constraints: new Collection(fields:[ + 'name' => [ + new NotBlank(), + new Type('string'), + ], + 'depth' => [ + new NotBlank(), + new Type('integer'), + ] + ]) + )] + public $menu; + + public function serialise(): mixed + { + return $this->menu; + } +} diff --git a/src/Requests/PricesRequest.php b/src/Requests/PricesRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..dadac42991ac8f9fab940eccac3de760d24cbff3 --- /dev/null +++ b/src/Requests/PricesRequest.php @@ -0,0 +1,42 @@ +<?php + +namespace App\Requests; + +use Symfony\Component\Validator\Constraints\All; +use Symfony\Component\Validator\Constraints\Collection; +use Symfony\Component\Validator\Constraints\NotBlank; +use Symfony\Component\Validator\Constraints\Type; +use Symfony\Contracts\Service\Attribute\Required; + +class PricesRequest extends BaseRequest +{ + #[Type('array')] + #[NotBlank()] + #[Required()] + #[All( + constraints: [ + new Collection( + fields: [ + 'price' => [ + new NotBlank(), + new Type('integer'), + ], + 'count' => [ + new NotBlank(), + new Type('integer'), + ], + ], + ) + ] + )] + public $prices; + + /** + * ÑÐµÑ€Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ€ÐµÐºÐ²ÐµÑта под маÑÑив + * @return mixed + */ + public function serialise(): mixed + { + return $this->prices; + } +} diff --git a/src/Requests/UniqElementsRequest.php b/src/Requests/UniqElementsRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..111731374bbdde336e946a1623fdb42512fe8939 --- /dev/null +++ b/src/Requests/UniqElementsRequest.php @@ -0,0 +1,21 @@ +<?php + +namespace App\Requests; + +use Symfony\Component\Validator\Constraints\Type; +use Symfony\Contracts\Service\Attribute\Required; + +class UniqElementsRequest extends BaseRequest +{ + #[Type('array')] + #[Required] + public $data; + + /** + * @return mixed + */ + public function serialise(): mixed + { + return $this->data; + } +} diff --git a/src/Requests/UsersRequest.php b/src/Requests/UsersRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..1d5bd95f0d2b5f3840e001e6247e272c555a8d82 --- /dev/null +++ b/src/Requests/UsersRequest.php @@ -0,0 +1,45 @@ +<?php + +namespace App\Requests; + +use Symfony\Component\Validator\Constraints\All; +use Symfony\Component\Validator\Constraints\Collection; +use Symfony\Component\Validator\Constraints\NotBlank; +use Symfony\Component\Validator\Constraints\Optional; +use Symfony\Component\Validator\Constraints\Type; + +class UsersRequest extends BaseRequest +{ + #[Type('integer')] + #[NotBlank] + public $id; + + #[Type('array')] + #[All( + constraints: new Collection(fields: [ + 'id' => [ + new Type('integer'), + new NotBlank(), + ], + 'name' => [ + new Type('string'), + new NotBlank(), + ], + 'age' => new Optional([ + new Type('integer'), + ]) + ]) + )] + public $users; + + /** + * @return array + */ + public function serialise(): array + { + return [ + 'id' => $this->id, + 'users' => $this->users, + ]; + } +} \ No newline at end of file diff --git a/templates/count_friday13/index.html.twig b/templates/count_friday13/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..e90908d4154aa6ea087da53532a9996b0a1573f3 --- /dev/null +++ b/templates/count_friday13/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello CountFriday13Controller!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/CountFriday13Controller.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/count_friday13/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/diff_days/index.html.twig b/templates/diff_days/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..462ac0bbc54b6e9311447613b99e5457433851c0 --- /dev/null +++ b/templates/diff_days/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello DiffDaysController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/DiffDaysController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/diff_days/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/how_days_to_ny/index.html.twig b/templates/how_days_to_ny/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..4058510b94b0920e26da7a99e4def23bac7be5d2 --- /dev/null +++ b/templates/how_days_to_ny/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello HowDaysToNYController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/HowDaysToNYController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/how_days_to_ny/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/prepare_menu/index.html.twig b/templates/prepare_menu/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..ddfd6d14ef4b7191b4413d38aa67b9f4a6bd8137 --- /dev/null +++ b/templates/prepare_menu/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello PrepareMenuController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/PrepareMenuController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/prepare_menu/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/read_file_line_by_line/index.html.twig b/templates/read_file_line_by_line/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..68aed515aad05ba67fe66ac06faeec8307a21a4f --- /dev/null +++ b/templates/read_file_line_by_line/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello ReadFileLineByLineController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/ReadFileLineByLineController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/read_file_line_by_line/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/read_log_file/index.html.twig b/templates/read_log_file/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..9f08f19af529af6e8a648246ba6606cce8dcb9fe --- /dev/null +++ b/templates/read_log_file/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello ReadLogFileController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/ReadLogFileController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/read_log_file/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/search/index.html.twig b/templates/search/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..bd465aa05ce19d1de5e42d822bcf4fb7a6b6e239 --- /dev/null +++ b/templates/search/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello SearchController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/SearchController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/search/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/sort_price/index.html.twig b/templates/sort_price/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..cd62397e96e6d43936ad35e95dec013ea992cb21 --- /dev/null +++ b/templates/sort_price/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello SortPriceController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/SortPriceController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/sort_price/index.html.twig</code></li> + </ul> +</div> +{% endblock %} diff --git a/templates/uniq_elements/index.html.twig b/templates/uniq_elements/index.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..d56494b7519d691246e25955e4d51e8d7523b566 --- /dev/null +++ b/templates/uniq_elements/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello UniqElementsController!{% endblock %} + +{% block body %} +<style> + .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } + .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } +</style> + +<div class="example-wrapper"> + <h1>Hello {{ controller_name }}! ✅</h1> + + This friendly message is coming from: + <ul> + <li>Your controller at <code>/home/tamanit/myProj/iqdevTranningProgram/src/Controller/UniqElementsController.php</code></li> + <li>Your template at <code>/home/tamanit/myProj/iqdevTranningProgram/templates/uniq_elements/index.html.twig</code></li> + </ul> +</div> +{% endblock %}