diff --git a/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php b/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php index 9cea69a9a6..350506be3e 100644 --- a/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php +++ b/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php @@ -12,7 +12,7 @@ namespace Alchemy\Phrasea\Setup\Version; use Alchemy\Phrasea\Application; -use Alchemy\Phrasea\Core\Version; +use Doctrine\DBAL\Driver\Statement; /** * In version 3.9 the user table have been removed. @@ -21,23 +21,42 @@ use Alchemy\Phrasea\Core\Version; */ class MailChecker { + /** @var \appbox */ + private $appbox; + /** @var string */ + private $table; + + /** + * Constructor + * + * @param \appbox $appbox + * @param string $table + */ + public function __construct(\appbox $appbox, $table = 'usr') + { + $this->appbox = $appbox; + $this->table = $table; + } + /** * Returns users with duplicated emails * - * @param \Application $app - * @param string $table The table name where to look - * * @return array An array of User */ - public static function getWrongEmailUsers(Application $app, $table = 'usr') + public function getWrongEmailUsers() { - if (version_compare(Version::getNumber(), '3.9', '>')) { + if (version_compare($this->appbox->get_version(), '3.9', '>=')) { return []; } - $sql = 'SELECT usr_mail, usr_id, last_conn, usr_login FROM '. $table .' WHERE usr_mail IS NOT NULL'; - $stmt = $app['phraseanet.appbox']->get_connection()->prepare($sql); - $stmt->execute(); + $builder = $this->appbox->get_connection()->createQueryBuilder(); + /** @var Statement $stmt */ + $stmt = $builder + ->select('u.usr_mail', 'u.usr_id', 'u.last_conn', 'u.usr_login') + ->from($this->table, 'u') + ->where($builder->expr()->isNotNull('u.usr_mail')) + ->execute() + ; $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); $stmt->closeCursor(); @@ -66,4 +85,14 @@ class MailChecker return $badUsers; } + + /** + * Whether there is users with same emails + * + * @return bool + */ + public function hasWrongEmailUsers() + { + return count($this->getWrongEmailUsers()) > 0; + } } diff --git a/lib/classes/Setup/Upgrade.php b/lib/classes/Setup/Upgrade.php index 6220eb4884..3fb0c6d299 100644 --- a/lib/classes/Setup/Upgrade.php +++ b/lib/classes/Setup/Upgrade.php @@ -39,8 +39,8 @@ class Setup_Upgrade $this->app = $app; - if (version_compare($this->app['phraseanet.appbox']->get_version(), '3.9', '<') - && count(MailChecker::getWrongEmailUsers($app)) > 0) { + $checker = new MailChecker($app['phraseanet.appbox']); + if ($checker->hasWrongEmailUsers()) { throw new \Exception_Setup_FixBadEmailAddresses('Please fix the database before starting'); } diff --git a/lib/classes/module/console/systemMailCheck.php b/lib/classes/module/console/systemMailCheck.php index ca93ed0313..17633eb4fd 100644 --- a/lib/classes/module/console/systemMailCheck.php +++ b/lib/classes/module/console/systemMailCheck.php @@ -35,15 +35,15 @@ class module_console_systemMailCheck extends Command { $output->writeln("Processing..."); - $bad_users = []; - if (version_compare($this->getService('phraseanet.appbox')->get_version(), '3.9', '<')) { - $bad_users = MailChecker::getWrongEmailUsers($this->container); - } + /** @var appbox $appBox */ + $appBox = $this->getService('phraseanet.appbox'); + $checker = new MailChecker($appBox); + $bad_users = $checker->getWrongEmailUsers(); foreach ($bad_users as $email => $users) { if ($input->getOption('list')) { - $this->write_infos($email, $users, $output, $this->getService('phraseanet.appbox')); - } elseif ($this->manage_group($email, $users, $output, $this->getService('phraseanet.appbox')) === false) { + $this->write_infos($email, $users, $output, $appBox); + } elseif ($this->manage_group($email, $users, $output, $appBox) === false) { break; } diff --git a/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php b/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php index ac359932b4..ef5a579ed3 100644 --- a/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php +++ b/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php @@ -8,8 +8,13 @@ class MailCheckerTest extends \PhraseanetTestCase { public function testMailChecker() { - $users = MailChecker::getWrongEmailUsers(self::$DI['app'], 'usr_tmp'); + $checker = new MailChecker(self::$DI['app']['phraseanet.appbox'], 'usr_tmp'); + $this->assertEmpty($checker->getWrongEmailUsers()); + } - $this->assertEquals(0, count($users)); + public function testItHasNoDuplicateEmailUsers() + { + $checker = new MailChecker(self::$DI['app']['phraseanet.appbox'], 'usr_tmp'); + $this->assertFalse($checker->hasWrongEmailUsers()); } }