feat(command): add command for refresh database
This commit is contained in:
		
							parent
							
								
									31155efabe
								
							
						
					
					
						commit
						58f43f096a
					
				
							
								
								
									
										6
									
								
								.env
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								.env
									
									
									
									
									
								
							@ -39,3 +39,9 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
 | 
				
			|||||||
###> symfony/mailer ###
 | 
					###> symfony/mailer ###
 | 
				
			||||||
# MAILER_DSN=null://null
 | 
					# MAILER_DSN=null://null
 | 
				
			||||||
###< symfony/mailer ###
 | 
					###< symfony/mailer ###
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					###> symfony/lock ###
 | 
				
			||||||
 | 
					# Choose one of the stores below
 | 
				
			||||||
 | 
					# postgresql+advisory://db_user:db_password@localhost/db_name
 | 
				
			||||||
 | 
					LOCK_DSN=flock
 | 
				
			||||||
 | 
					###< symfony/lock ###
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,8 @@
 | 
				
			|||||||
        "doctrine/doctrine-bundle": "^2.12",
 | 
					        "doctrine/doctrine-bundle": "^2.12",
 | 
				
			||||||
        "doctrine/doctrine-migrations-bundle": "^3.3",
 | 
					        "doctrine/doctrine-migrations-bundle": "^3.3",
 | 
				
			||||||
        "doctrine/orm": "^3.2",
 | 
					        "doctrine/orm": "^3.2",
 | 
				
			||||||
 | 
					        "fakerphp/faker": "^1.23",
 | 
				
			||||||
 | 
					        "nubium/this-should-never-happen-exception": "^1.0",
 | 
				
			||||||
        "phpdocumentor/reflection-docblock": "^5.4",
 | 
					        "phpdocumentor/reflection-docblock": "^5.4",
 | 
				
			||||||
        "phpstan/phpdoc-parser": "^1.29",
 | 
					        "phpstan/phpdoc-parser": "^1.29",
 | 
				
			||||||
        "symfony/asset": "7.1.*",
 | 
					        "symfony/asset": "7.1.*",
 | 
				
			||||||
@ -24,6 +26,7 @@
 | 
				
			|||||||
        "symfony/framework-bundle": "7.1.*",
 | 
					        "symfony/framework-bundle": "7.1.*",
 | 
				
			||||||
        "symfony/http-client": "7.1.*",
 | 
					        "symfony/http-client": "7.1.*",
 | 
				
			||||||
        "symfony/intl": "7.1.*",
 | 
					        "symfony/intl": "7.1.*",
 | 
				
			||||||
 | 
					        "symfony/lock": "7.1.*",
 | 
				
			||||||
        "symfony/mailer": "7.1.*",
 | 
					        "symfony/mailer": "7.1.*",
 | 
				
			||||||
        "symfony/mime": "7.1.*",
 | 
					        "symfony/mime": "7.1.*",
 | 
				
			||||||
        "symfony/monolog-bundle": "^3.0",
 | 
					        "symfony/monolog-bundle": "^3.0",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										184
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										184
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							@ -4,7 +4,7 @@
 | 
				
			|||||||
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
 | 
					        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
 | 
				
			||||||
        "This file is @generated automatically"
 | 
					        "This file is @generated automatically"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "content-hash": "7a7438d096ed310a67fe200d001e5bf4",
 | 
					    "content-hash": "131c365156daf6fd97b5e15f509f17eb",
 | 
				
			||||||
    "packages": [
 | 
					    "packages": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "composer/semver",
 | 
					            "name": "composer/semver",
 | 
				
			||||||
@ -1376,6 +1376,69 @@
 | 
				
			|||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "time": "2023-10-06T06:47:41+00:00"
 | 
					            "time": "2023-10-06T06:47:41+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "fakerphp/faker",
 | 
				
			||||||
 | 
					            "version": "v1.23.1",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/FakerPHP/Faker.git",
 | 
				
			||||||
 | 
					                "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b",
 | 
				
			||||||
 | 
					                "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": "^7.4 || ^8.0",
 | 
				
			||||||
 | 
					                "psr/container": "^1.0 || ^2.0",
 | 
				
			||||||
 | 
					                "symfony/deprecation-contracts": "^2.2 || ^3.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "conflict": {
 | 
				
			||||||
 | 
					                "fzaninotto/faker": "*"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "bamarni/composer-bin-plugin": "^1.4.1",
 | 
				
			||||||
 | 
					                "doctrine/persistence": "^1.3 || ^2.0",
 | 
				
			||||||
 | 
					                "ext-intl": "*",
 | 
				
			||||||
 | 
					                "phpunit/phpunit": "^9.5.26",
 | 
				
			||||||
 | 
					                "symfony/phpunit-bridge": "^5.4.16"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "suggest": {
 | 
				
			||||||
 | 
					                "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
 | 
				
			||||||
 | 
					                "ext-curl": "Required by Faker\\Provider\\Image to download images.",
 | 
				
			||||||
 | 
					                "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
 | 
				
			||||||
 | 
					                "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
 | 
				
			||||||
 | 
					                "ext-mbstring": "Required for multibyte Unicode string functionality."
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "Faker\\": "src/Faker/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "François Zaninotto"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Faker is a PHP library that generates fake data for you.",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "data",
 | 
				
			||||||
 | 
					                "faker",
 | 
				
			||||||
 | 
					                "fixtures"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "issues": "https://github.com/FakerPHP/Faker/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "time": "2024-01-02T13:46:09+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "monolog/monolog",
 | 
					            "name": "monolog/monolog",
 | 
				
			||||||
            "version": "3.7.0",
 | 
					            "version": "3.7.0",
 | 
				
			||||||
@ -1477,6 +1540,47 @@
 | 
				
			|||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "time": "2024-06-28T09:40:51+00:00"
 | 
					            "time": "2024-06-28T09:40:51+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "nubium/this-should-never-happen-exception",
 | 
				
			||||||
 | 
					            "version": "v1.0",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/nubium/this-should-never-happen-exception.git",
 | 
				
			||||||
 | 
					                "reference": "3ed1b6f725881c527050c235e2503a8300427b86"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/nubium/this-should-never-happen-exception/zipball/3ed1b6f725881c527050c235e2503a8300427b86",
 | 
				
			||||||
 | 
					                "reference": "3ed1b6f725881c527050c235e2503a8300427b86",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "jakub-onderka/php-parallel-lint": "~1.0",
 | 
				
			||||||
 | 
					                "phpstan/phpstan": "~0.9"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "Nubium\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Jiri Travnicek",
 | 
				
			||||||
 | 
					                    "email": "jiri.travnicek@nubium.cz"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Extend this exception and throw it anytime something unexpected happens.",
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "issues": "https://github.com/nubium/this-should-never-happen-exception/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/nubium/this-should-never-happen-exception/tree/master"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "time": "2018-03-27T10:16:09+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "phpdocumentor/reflection-common",
 | 
					            "name": "phpdocumentor/reflection-common",
 | 
				
			||||||
            "version": "2.2.0",
 | 
					            "version": "2.2.0",
 | 
				
			||||||
@ -4152,6 +4256,84 @@
 | 
				
			|||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "time": "2024-05-31T14:57:53+00:00"
 | 
					            "time": "2024-05-31T14:57:53+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "symfony/lock",
 | 
				
			||||||
 | 
					            "version": "v7.1.1",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/symfony/lock.git",
 | 
				
			||||||
 | 
					                "reference": "1f8c941f1270dee046e09a826bcdd3b2ebada45e"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/symfony/lock/zipball/1f8c941f1270dee046e09a826bcdd3b2ebada45e",
 | 
				
			||||||
 | 
					                "reference": "1f8c941f1270dee046e09a826bcdd3b2ebada45e",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": ">=8.2",
 | 
				
			||||||
 | 
					                "psr/log": "^1|^2|^3"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "conflict": {
 | 
				
			||||||
 | 
					                "doctrine/dbal": "<3.6",
 | 
				
			||||||
 | 
					                "symfony/cache": "<6.4"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "doctrine/dbal": "^3.6|^4",
 | 
				
			||||||
 | 
					                "predis/predis": "^1.1|^2.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "Symfony\\Component\\Lock\\": ""
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "exclude-from-classmap": [
 | 
				
			||||||
 | 
					                    "/Tests/"
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Jérémy Derussé",
 | 
				
			||||||
 | 
					                    "email": "jeremy@derusse.com"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Symfony Community",
 | 
				
			||||||
 | 
					                    "homepage": "https://symfony.com/contributors"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource",
 | 
				
			||||||
 | 
					            "homepage": "https://symfony.com",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "cas",
 | 
				
			||||||
 | 
					                "flock",
 | 
				
			||||||
 | 
					                "locking",
 | 
				
			||||||
 | 
					                "mutex",
 | 
				
			||||||
 | 
					                "redlock",
 | 
				
			||||||
 | 
					                "semaphore"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "source": "https://github.com/symfony/lock/tree/v7.1.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": "2024-05-31T14:57:53+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "symfony/mailer",
 | 
					            "name": "symfony/mailer",
 | 
				
			||||||
            "version": "v7.1.2",
 | 
					            "version": "v7.1.2",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								config/packages/lock.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								config/packages/lock.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					framework:
 | 
				
			||||||
 | 
					    lock: '%env(LOCK_DSN)%'
 | 
				
			||||||
@ -20,5 +20,8 @@ services:
 | 
				
			|||||||
            - '../src/Entity/'
 | 
					            - '../src/Entity/'
 | 
				
			||||||
            - '../src/Kernel.php'
 | 
					            - '../src/Kernel.php'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    App\Command\RefreshDatabaseCommand:
 | 
				
			||||||
 | 
					        arguments:
 | 
				
			||||||
 | 
					            $name: "brilo:refresh-database"
 | 
				
			||||||
    # add more service definitions when explicit configuration is needed
 | 
					    # add more service definitions when explicit configuration is needed
 | 
				
			||||||
    # please note that last definitions always *replace* previous ones
 | 
					    # please note that last definitions always *replace* previous ones
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										148
									
								
								src/Command/RefreshDatabaseCommand.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								src/Command/RefreshDatabaseCommand.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,148 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace App\Command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App\Entity\Database\Comments\Comment;
 | 
				
			||||||
 | 
					use App\Entity\Database\Posts\Post;
 | 
				
			||||||
 | 
					use App\Entity\Database\Users\User;
 | 
				
			||||||
 | 
					use App\Repository\Users\CompanyRepository;
 | 
				
			||||||
 | 
					use App\Service\Persist\RemoteCommentConvertor;
 | 
				
			||||||
 | 
					use App\Service\Persist\RemotePostsConvertor;
 | 
				
			||||||
 | 
					use App\Service\Persist\RemoteUsersConvertor;
 | 
				
			||||||
 | 
					use App\Service\Remote\BriloApiComments;
 | 
				
			||||||
 | 
					use App\Service\Remote\BriloApiPosts;
 | 
				
			||||||
 | 
					use App\Service\Remote\BriloApiUsers;
 | 
				
			||||||
 | 
					use Doctrine\ORM\EntityManagerInterface;
 | 
				
			||||||
 | 
					use Psr\Log\LoggerInterface;
 | 
				
			||||||
 | 
					use Symfony\Component\Console\Command\Command;
 | 
				
			||||||
 | 
					use Symfony\Component\Console\Input\InputInterface;
 | 
				
			||||||
 | 
					use Symfony\Component\Console\Output\OutputInterface;
 | 
				
			||||||
 | 
					use Symfony\Component\Lock\LockFactory;
 | 
				
			||||||
 | 
					use Symfony\Component\Lock\SharedLockInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Download new data from Brilo API and import it into the database.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					final class RefreshDatabaseCommand extends Command
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    private readonly SharedLockInterface $lock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct(
 | 
				
			||||||
 | 
					        ?string $name,
 | 
				
			||||||
 | 
					        private readonly BriloApiComments $remoteComments,
 | 
				
			||||||
 | 
					        private readonly BriloApiPosts $remotePosts,
 | 
				
			||||||
 | 
					        private readonly BriloApiUsers $remoteUsers,
 | 
				
			||||||
 | 
					        private readonly LoggerInterface $logger,
 | 
				
			||||||
 | 
					        private readonly RemoteUsersConvertor $remoteUsersConvertor,
 | 
				
			||||||
 | 
					        private readonly RemotePostsConvertor $remotePostsConvertor,
 | 
				
			||||||
 | 
					        private readonly RemoteCommentConvertor $remoteCommentsConvertor,
 | 
				
			||||||
 | 
					        private readonly CompanyRepository $companyRepository,
 | 
				
			||||||
 | 
					        private readonly EntityManagerInterface $em,
 | 
				
			||||||
 | 
					        LockFactory $lock,
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        $this->lock = $lock->createLock('refresh-database');
 | 
				
			||||||
 | 
					        parent::__construct($name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function configure(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->setHelp('Refresh the database from the Brilo API');
 | 
				
			||||||
 | 
					        $this->setDescription('Import new data from Brilo API and import it into the database.');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function execute(InputInterface $input, OutputInterface $output): int
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->lock->acquire(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            return $this->runImport();
 | 
				
			||||||
 | 
					        } finally {
 | 
				
			||||||
 | 
					            $this->lock->release();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return int
 | 
				
			||||||
 | 
					     * @throws \Exception
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private function runImport(): int
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $returnCode = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // First import users, then posts and finally comments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data = $this->remoteUsersConvertor->convert($this->remoteUsers->getUsers());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $code = $this->runGeneratorInTransaction($data, function (User $user) {
 | 
				
			||||||
 | 
					            $this->logger->info("Processing user: {$user->id}");
 | 
				
			||||||
 | 
					            $this->em->persist($user->address);
 | 
				
			||||||
 | 
					            $this->em->persist($user->company);
 | 
				
			||||||
 | 
					            $this->em->persist($user);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($code != 0) {
 | 
				
			||||||
 | 
					            $returnCode = 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data = $this->remotePostsConvertor->convert($this->remotePosts->getPosts());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $code = $this->runGeneratorInTransaction($data, function (Post $post) {
 | 
				
			||||||
 | 
					            $this->logger->info("Processing post: {$post->id}");
 | 
				
			||||||
 | 
					            $this->em->persist($post);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($code != 0) {
 | 
				
			||||||
 | 
					            $returnCode = 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data = $this->remoteCommentsConvertor->convert($this->remoteComments->getComments());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $code = $this->runGeneratorInTransaction($data, function (Comment $comment) {
 | 
				
			||||||
 | 
					            $this->logger->info("Processing comment: {$comment->id}");
 | 
				
			||||||
 | 
					            $this->em->persist($comment);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($code != 0) {
 | 
				
			||||||
 | 
					            $returnCode = 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->companyRepository->deleteOrphanRecords();
 | 
				
			||||||
 | 
					        $this->logger->info("Refreshing database completed");
 | 
				
			||||||
 | 
					        return $returnCode;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Run every yielded item from generator in separate transaction and call $callback with item from generator
 | 
				
			||||||
 | 
					     * @param \Generator $data
 | 
				
			||||||
 | 
					     * @param callable $callback
 | 
				
			||||||
 | 
					     * @return int
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private function runGeneratorInTransaction(\Generator $data, callable $callback): int
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $returnCode = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while ($data->valid()) { /* normalni foreach nepouzivam kvuli microtranskaci ...
 | 
				
			||||||
 | 
					            v tomhle pripade mi prijde lepsi mit v databazi neco nez nic (nebo stara data) v pripade jakekoliv chyby,
 | 
				
			||||||
 | 
					            navic "velke" transkace nejsou dobre pro databazi a tohle je api 3-ti strany...
 | 
				
			||||||
 | 
					            ale finalni slovo by mel mit zadavatel, ktereho "nemam" */
 | 
				
			||||||
 | 
					            $this->em->beginTransaction();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                $callback($data->current());
 | 
				
			||||||
 | 
					                $this->em->flush();
 | 
				
			||||||
 | 
					                $this->em->commit();
 | 
				
			||||||
 | 
					            } catch (\Exception $e) {
 | 
				
			||||||
 | 
					                $returnCode = 1;
 | 
				
			||||||
 | 
					                $this->em->rollback();
 | 
				
			||||||
 | 
					                $this->logger->error("Database transaction failed", ['exception' => $e]);
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            } finally {
 | 
				
			||||||
 | 
					                $data->next();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $returnCode;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -9,6 +9,7 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
 | 
				
			|||||||
use Doctrine\Persistence\ManagerRegistry;
 | 
					use Doctrine\Persistence\ManagerRegistry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
					 * In case of deleting records, you must modify RefreshDatabaseCommand transaction logic
 | 
				
			||||||
 * @extends ServiceEntityRepository<Post>
 | 
					 * @extends ServiceEntityRepository<Post>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class PostRepository extends ServiceEntityRepository
 | 
					class PostRepository extends ServiceEntityRepository
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
 | 
				
			|||||||
use Doctrine\Persistence\ManagerRegistry;
 | 
					use Doctrine\Persistence\ManagerRegistry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
					 * In case of deleting records, you must modify RefreshDatabaseCommand transaction logic
 | 
				
			||||||
 * @extends ServiceEntityRepository<Company>
 | 
					 * @extends ServiceEntityRepository<Company>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class CompanyRepository extends ServiceEntityRepository
 | 
					class CompanyRepository extends ServiceEntityRepository
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
 | 
				
			|||||||
use Doctrine\Persistence\ManagerRegistry;
 | 
					use Doctrine\Persistence\ManagerRegistry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
					 * In case of deleting records, you must modify RefreshDatabaseCommand transaction logic
 | 
				
			||||||
 * @extends ServiceEntityRepository<User>
 | 
					 * @extends ServiceEntityRepository<User>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class UserRepository extends ServiceEntityRepository
 | 
					class UserRepository extends ServiceEntityRepository
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								symfony.lock
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								symfony.lock
									
									
									
									
									
								
							@ -134,6 +134,18 @@
 | 
				
			|||||||
            "src/Kernel.php"
 | 
					            "src/Kernel.php"
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "symfony/lock": {
 | 
				
			||||||
 | 
					        "version": "7.1",
 | 
				
			||||||
 | 
					        "recipe": {
 | 
				
			||||||
 | 
					            "repo": "github.com/symfony/recipes",
 | 
				
			||||||
 | 
					            "branch": "main",
 | 
				
			||||||
 | 
					            "version": "5.2",
 | 
				
			||||||
 | 
					            "ref": "8e937ff2b4735d110af1770f242c1107fdab4c8e"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "files": [
 | 
				
			||||||
 | 
					            "config/packages/lock.yaml"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "symfony/mailer": {
 | 
					    "symfony/mailer": {
 | 
				
			||||||
        "version": "7.1",
 | 
					        "version": "7.1",
 | 
				
			||||||
        "recipe": {
 | 
					        "recipe": {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										44
									
								
								tests/Integration/Command/RefreshDatabaseCommandTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tests/Integration/Command/RefreshDatabaseCommandTest.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace App\Tests\Integration\Command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App\Entity\Database\Comments\Comment;
 | 
				
			||||||
 | 
					use App\Entity\Database\Posts\Post;
 | 
				
			||||||
 | 
					use App\Entity\Database\Users\Address;
 | 
				
			||||||
 | 
					use App\Entity\Database\Users\Company;
 | 
				
			||||||
 | 
					use App\Entity\Database\Users\User;
 | 
				
			||||||
 | 
					use App\Tests\Common\DatabaseTestTrait;
 | 
				
			||||||
 | 
					use Nubium\Exception\ThisShouldNeverHappenException;
 | 
				
			||||||
 | 
					use Symfony\Bundle\FrameworkBundle\Console\Application;
 | 
				
			||||||
 | 
					use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
 | 
				
			||||||
 | 
					use Symfony\Component\Console\Tester\CommandTester;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RefreshDatabaseCommandTest extends KernelTestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    use DatabaseTestTrait;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::bootKernel();
 | 
				
			||||||
 | 
					        $this->bootDatabase();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCommandIsSuccessful(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $app = new Application(self::$kernel ?? throw new ThisShouldNeverHappenException("Kernel not booted yet"));
 | 
				
			||||||
 | 
					        $command = $app->find('brilo:refresh-database');
 | 
				
			||||||
 | 
					        $commandTester = new CommandTester($command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $commandTester->execute([]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame(0, $commandTester->getStatusCode());
 | 
				
			||||||
 | 
					        // Tady bych otestoval ze jsou tam nejake data ktere tam vzdy maji byt ... nicmene o zadnych takovych datech nevim
 | 
				
			||||||
 | 
					        $this->assertGreaterThan(0, $this->getEntityCount(User::class));
 | 
				
			||||||
 | 
					        $this->assertGreaterThan(0, $this->getEntityCount(Company::class));
 | 
				
			||||||
 | 
					        $this->assertGreaterThan(0, $this->getEntityCount(Address::class));
 | 
				
			||||||
 | 
					        $this->assertGreaterThan(0, $this->getEntityCount(Post::class));
 | 
				
			||||||
 | 
					        $this->assertGreaterThan(0, $this->getEntityCount(Comment::class));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user