diff --git a/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php b/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php new file mode 100644 index 0000000000..10e1b6ca5d --- /dev/null +++ b/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php @@ -0,0 +1,64 @@ +get_connection()->prepare($sql); + $stmt->execute(); + $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); + $stmt->closeCursor(); + + $users = array(); + + foreach ($rs as $row) { + if (!isset($users[$row['usr_mail']])) { + $users[$row['usr_mail']] = array(); + } + + $users[$row['usr_mail']][] = $row; + } + + $badUsers = array(); + + foreach ($users as $email => $usrs) { + if (count($usrs) > 1) { + $badUsers[$email] = array(); + foreach ($usrs as $usrInfo) { + $badUsers[$email][$usrInfo['usr_id']] = $usrInfo; + } + } + } + + unset($users); + + return $badUsers; + } +} diff --git a/lib/classes/Setup/Upgrade.php b/lib/classes/Setup/Upgrade.php index 266b9f9e4b..e45d85202f 100644 --- a/lib/classes/Setup/Upgrade.php +++ b/lib/classes/Setup/Upgrade.php @@ -10,6 +10,7 @@ */ use Alchemy\Phrasea\Application; +use Alchemy\Phrasea\Setup\Version\MailChecker; /** * UpgradeManager for Phraseanet. @@ -64,8 +65,9 @@ class Setup_Upgrade $this->appbox = $app['phraseanet.appbox']; - if (count(User_Adapter::get_wrong_email_users($app)) > 0) { - throw new Exception_Setup_FixBadEmailAddresses('Please fix the database before starting'); + if (version_compare($this->appbox->get_version(), '3.9', '<') + && count(MailChecker::getWrongEmailUsers($app)) > 0) { + throw new \Exception_Setup_FixBadEmailAddresses('Please fix the database before starting'); } $this->write_lock(); diff --git a/lib/classes/User/Adapter.php b/lib/classes/User/Adapter.php index 3024c53ec4..aa852223e8 100644 --- a/lib/classes/User/Adapter.php +++ b/lib/classes/User/Adapter.php @@ -1172,45 +1172,6 @@ class User_Adapter implements User_Interface, cache_cacheableInterface return $this; } - public static function get_wrong_email_users(Application $app) - { - - $sql = 'SELECT usr_mail, usr_id FROM usr WHERE usr_mail IS NOT NULL'; - - $stmt = $app['phraseanet.appbox']->get_connection()->prepare($sql); - $stmt->execute(); - - $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); - - $stmt->closeCursor(); - - $users = array(); - - foreach ($rs as $row) { - if (!isset($users[$row['usr_mail']])) { - $users[$row['usr_mail']] = array(); - } - - $users[$row['usr_mail']][] = $row['usr_id']; - } - - $bad_users = array(); - - foreach ($users as $email => $usrs) { - if (count($usrs) > 1) { - $bad_users[$email] = array(); - foreach ($usrs as $usr_id) { - $user = User_Adapter::getInstance($usr_id, $app); - $bad_users[$email][$user->get_id()] = $user; - } - } - } - - unset($users); - - return $bad_users; - } - public function setPrefs($prop, $value) { $this->load_preferences(); diff --git a/lib/classes/module/console/systemMailCheck.php b/lib/classes/module/console/systemMailCheck.php index 59598048b8..17940fddd6 100644 --- a/lib/classes/module/console/systemMailCheck.php +++ b/lib/classes/module/console/systemMailCheck.php @@ -17,6 +17,7 @@ * @link www.phraseanet.com */ use Alchemy\Phrasea\Command\Command; +use Alchemy\Phrasea\Setup\Version\MailChecker; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -41,7 +42,10 @@ class module_console_systemMailCheck extends Command { $output->writeln("Processing..."); - $bad_users = User_Adapter::get_wrong_email_users($this->container); + $bad_users = array(); + if (version_compare($this->getService('phraseanet.appbox')->get_version(), '3.9', '<')) { + $bad_users = MailChecker::getWrongEmailUsers($this->container); + } foreach ($bad_users as $email => $users) { if ($input->getOption('list')) { @@ -112,12 +116,14 @@ class module_console_systemMailCheck extends Command $output->writeln($email); foreach ($users as $user) { + $dateConn = new \DateTime($user['last_conn']); + $output->writeln( sprintf( "\t %5d %40s %s" - , $user->get_id() - , $user->get_display_name() - , $user->get_last_connection()->format('Y m d') + , $user['usr_id'] + , $user['usr_login'] + , $dateConn->format('Y m d') ) ); } diff --git a/lib/classes/module/console/systemUpgrade.php b/lib/classes/module/console/systemUpgrade.php index 05827825e9..57241460c8 100644 --- a/lib/classes/module/console/systemUpgrade.php +++ b/lib/classes/module/console/systemUpgrade.php @@ -67,12 +67,12 @@ class module_console_systemUpgrade extends Command try { $output->write('Upgrading...', true); - if (count(User_Adapter::get_wrong_email_users($this->container)) > 0) { + try { + $upgrader = new Setup_Upgrade($this->container, $input->getOption('force')); + } catch (\Exception_Setup_FixBadEmailAddresses $e) { return $output->writeln(sprintf('You have to fix your database before upgrade with the system:mailCheck command ')); } - $upgrader = new Setup_Upgrade($this->container, $input->getOption('force')); - $queries = $this->getService('phraseanet.appbox')->forceUpgrade($upgrader, $this->container); if ($input->getOption('dump')) { diff --git a/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php b/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php new file mode 100644 index 0000000000..edeaa7fb15 --- /dev/null +++ b/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php @@ -0,0 +1,29 @@ +get_connection(); + $now = new \DateTime(); + + $stmt = $conn->prepare('CREATE TEMPORARY TABLE usr_tmp (usr_id INT, usr_mail VARCHAR(50), usr_login VARCHAR(50), last_conn DATETIME);'); + $stmt->execute(); + $stmt->closeCursor(); + $stmt = $conn->prepare('INSERT INTO usr_tmp (usr_id, usr_mail, usr_login, last_conn) VALUES(1, "email@email.com", "login1", "'.$now->format('Y-m-D H:i:s').'");'); + $stmt->execute(); + $stmt->closeCursor(); + $stmt = $conn->prepare('INSERT INTO usr_tmp (usr_id, usr_mail, usr_login, last_conn) VALUES(2, "email@email.com", "login2", "'.$now->format('Y-m-D H:i:s').'");'); + $stmt->execute(); + $stmt->closeCursor(); + unset($stmt); + $users = MailChecker::getWrongEmailUsers(self::$DI['app'], 'usr_tmp'); + + $this->assertEquals(1, count($users)); + $this->assertEquals(2, count($users['email@email.com'])); + } +}