Completed
Push — master ( c5110b...a167e6 )
by Valentyn
13:46
created

Version20181030094901::down()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DoctrineMigrations;
6
7
use App\Movies\Exception\TmdbMovieNotFoundException;
8
use App\Movies\Exception\TmdbRequestLimitException;
9
use App\Movies\Service\ImdbIdLoaderService;
10
use Doctrine\DBAL\Schema\Schema;
11
use Doctrine\Migrations\AbstractMigration;
12
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
13
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
14
15
/**
16
 * Auto-generated Migration: Please modify to your needs!
17
 */
18
final class Version20181030094901 extends AbstractMigration implements ContainerAwareInterface
19
{
20
    use ContainerAwareTrait;
21
22
    public function up(Schema $schema): void
23
    {
24
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
25
26
        $currentDate = \date('Y-m-d');
27
        $movies = $this->connection->executeQuery(
28
            'SELECT m.id, m.imdb_id, m.tmdb_id FROM movies m WHERE m.release_date IS NOT NULL AND m.release_date::date > \''.$currentDate.'\''
0 ignored issues
show
Security introduced by
'SELECT m.id, m.imdb_id,...' . $currentDate . '\'' is used as a query on line 27. If $currentDate can contain user-input, it is usually preferable to use a parameter placeholder like :paramName and pass the dynamic input as second argument array('param' => $currentDate).

Instead of embedding dynamic parameters in SQL, Doctrine also allows you to pass them separately and insert a placeholder instead:

function findUser(Doctrine\DBAL\Connection $con, $email) {
    // Unsafe
    $con->executeQuery("SELECT * FROM users WHERE email = '".$email."'");

    // Safe
    $con->executeQuery(
        "SELECT * FROM users WHERE email = :email",
        array('email' => $email)
    );
}
Loading history...
29
        );
30
31
        /** @var $imdbIdLoader ImdbIdLoaderService */
32
        $imdbIdLoader = $this->container->get(ImdbIdLoaderService::class);
33
        $i = 0;
34
35
        foreach ($movies as $movie) {
36
            $isActive = $movie['imdb_id'] ? 1 : 0;
37
38
            if ($i === 10) {
39
                $i = 0;
40
                sleep(5);
41
            }
42
43
            if ($isActive === 0) {
44
                $imdbId = null;
45
                ++$i;
46
                try {
47
                    $imdbId = $imdbIdLoader->getImdbId((int) $movie['tmdb_id']);
48
                } catch (TmdbMovieNotFoundException $movieNotFoundException) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
49
                } catch (TmdbRequestLimitException $requestLimitException) {
50
                    sleep(5);
51
                }
52
53
                if ($imdbId) {
54
                    $isActive = 1;
55
                    $this->addSql("UPDATE movies SET imdb_id = '{$imdbId}' WHERE id = {$movie['id']}");
56
                }
57
            }
58
59
            $this->addSql("INSERT INTO release_date_queue (id, movie_id, added_at, is_active) 
60
                            VALUES 
61
                           (NEXTVAL('release_date_queue_id_seq'), {$movie['id']}, '{$currentDate}', {$isActive})");
62
        }
63
    }
64
65
    public function down(Schema $schema): void
66
    {
67
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
68
69
        $this->addSql('DELETE FROM release_date_queue;');
70
    }
71
}
72