From 26df3a53a4576b3a0a7ce601bb7c3f5aaf7b3d36 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Fri, 11 Nov 2016 11:53:26 +0100 Subject: [PATCH] Conversation Mapper addition + migration to proper scheme --- appinfo/database.xml | 32 ++++++++ appinfo/info.xml | 10 ++- appinfo/ocsmsapp.php | 27 ++++++- controller/smscontroller.php | 13 ++- db/conversationstatemapper.php | 88 +++++++++++++++++++++ db/smsmapper.php | 48 ++--------- lib/migration/fixconversationreadstates.php | 54 +++++++++++++ 7 files changed, 220 insertions(+), 52 deletions(-) create mode 100644 db/conversationstatemapper.php create mode 100644 lib/migration/fixconversationreadstates.php diff --git a/appinfo/database.xml b/appinfo/database.xml index 2ce66a8..865572e 100644 --- a/appinfo/database.xml +++ b/appinfo/database.xml @@ -201,6 +201,38 @@ + + *dbprefix*ocsms_conversation_read_states + + + user_id + text + true + 64 + + + phone_number + text + true + 64 + + + int_date + integer + 32 + true + + + sms_conversation_rs_pkey + + user_id + + + phone_number + + + +
*dbprefix*ocsms_config diff --git a/appinfo/info.xml b/appinfo/info.xml index 234e653..731553a 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -6,15 +6,21 @@ A app to sync SMS with your ownCloud agpl Loic Blot - 1.9.0 + 1.10.0 167289 - + https://github.com/nerzhul/ocsms https://github.com/nerzhul/ocsms/issues https://github.com/nerzhul/ocsms + + + + OCA\OcSms\Migration\FixConversationReadStates + + diff --git a/appinfo/ocsmsapp.php b/appinfo/ocsmsapp.php index 7814cbd..b192b46 100644 --- a/appinfo/ocsmsapp.php +++ b/appinfo/ocsmsapp.php @@ -22,9 +22,12 @@ use \OCA\OcSms\Controller\SmsController; use \OCA\OcSms\Db\Sms; use \OCA\OcSms\Db\SmsMapper; +use \OCA\OcSms\Db\ConversationStateMapper; use \OCA\OcSms\Db\ConfigMapper; +use \OCA\OcSms\Migration\FixConversationReadStates; + class OcSmsApp extends App { /** @@ -41,8 +44,8 @@ class OcSmsApp extends App { }); /** - * Database Layer - */ + * Database Layer + */ $container->registerService('ConfigMapper', function (IContainer $c) use ($server) { return new ConfigMapper( $server->getDb(), @@ -55,8 +58,15 @@ class OcSmsApp extends App { return new Sms($server->getDb()); }); + $container->registerService('ConversationStateMapper', function(IContainer $c) use ($server) { + return new ConversationStateMapper($server->getDb()); + }); + $container->registerService('SmsMapper', function(IContainer $c) use ($server) { - return new SmsMapper($server->getDb()); + return new SmsMapper( + $server->getDb(), + $c->query('ConversationStateMapper') + ); }); /** @@ -83,6 +93,7 @@ class OcSmsApp extends App { $c->query('Request'), $c->query('UserId'), $c->query('SmsMapper'), + $c->query('ConversationStateMapper'), $c->query('ConfigMapper'), $server->getContactsManager(), $server->getURLGenerator() @@ -97,5 +108,15 @@ class OcSmsApp extends App { $c->query('SmsMapper') ); }); + + /** + * Migration services + */ + $container->registerService('OCA\OcSms\Migration\FixConversationReadStates', function ($c) { + return new FixConversationReadStates( + $c->query('ConversationStateMapper'), + $c->getServer()->getUserManager() + ); + }); } } diff --git a/controller/smscontroller.php b/controller/smscontroller.php index 2560f5c..889b285 100644 --- a/controller/smscontroller.php +++ b/controller/smscontroller.php @@ -22,6 +22,7 @@ use \OCP\AppFramework\Http; use \OCA\OcSms\Db\ConfigMapper; use \OCA\OcSms\Db\SmsMapper; +use \OCA\OcSms\Db\ConversationStateMapper; use \OCA\OcSms\Lib\ContactCache; use \OCA\OcSms\Lib\PhoneNumberFormatter; @@ -31,6 +32,7 @@ class SmsController extends Controller { private $userId; private $configMapper; private $smsMapper; + private $convStateMapper; private $urlGenerator; private $contactCache; @@ -44,11 +46,14 @@ class SmsController extends Controller { * @param IContactsManager $contactsManager * @param $urlGenerator */ - public function __construct ($appName, IRequest $request, $userId, SmsMapper $mapper, ConfigMapper $cfgMapper, - IContactsManager $contactsManager, IURLGenerator $urlGenerator) { + public function __construct ($appName, IRequest $request, $userId, + SmsMapper $mapper, ConversationStateMapper $cmapper, + ConfigMapper $cfgMapper, + IContactsManager $contactsManager, IURLGenerator $urlGenerator) { parent::__construct($appName, $request); $this->userId = $userId; $this->smsMapper = $mapper; + $this->convStateMapper = $cmapper; $this->configMapper = $cfgMapper; $this->urlGenerator = $urlGenerator; $this->contactCache = new ContactCache($cfgMapper, $contactsManager); @@ -103,7 +108,7 @@ class SmsController extends Controller { $contacts[$number] = $fmtPN; } } - $lastRead = $this->smsMapper->getLastReadDate($this->userId); + $lastRead = $this->convStateMapper->getLast($this->userId); $ocversion = \OCP\Util::getVersion(); $photoversion = 1; if (version_compare($ocversion[0].".".$ocversion[1].".".$ocversion[2], "9.0.0", ">=")) { @@ -160,7 +165,7 @@ class SmsController extends Controller { if (count($messages) > 0) { $maxDate = max(array_keys($messages)); for ($i=0;$ismsMapper->setLastReadDate($this->userId, $phoneNumbers[$i], $maxDate); + $this->convStateMapper->setLast($this->userId, $phoneNumbers[$i], $maxDate); } } diff --git a/db/conversationstatemapper.php b/db/conversationstatemapper.php new file mode 100644 index 0000000..bac0d9d --- /dev/null +++ b/db/conversationstatemapper.php @@ -0,0 +1,88 @@ + + * @copyright Loic Blot 2014-2016 + */ + +namespace OCA\OcSms\Db; + +use \OCP\IDb; + +use \OCP\AppFramework\Db\Mapper; + +use \OCA\OcSms\AppInfo\OcSmsApp; +use \OCA\OcSms\Lib\PhoneNumberFormatter; + +class ConversationStateMapper extends Mapper { + public function __construct (IDb $db) { + parent::__construct($db, 'ocsms_smsdatas'); + } + + public function getLast ($userId) { + $sql = 'SELECT MAX(int_date) as mx FROM ' . + '*PREFIX*ocsms_conversation_read_states WHERE user_id = ?'; + + $query = \OCP\DB::prepare($sql); + $result = $query->execute(array($userId)); + + if ($row = $result->fetchRow()) { + return $row["mx"]; + } + + return 0; + } + + public function getLastForPhoneNumber ($userId, $phoneNumber) { + $sql = 'SELECT MAX(int_date) as mx FROM ' . + '*PREFIX*ocsms_conversation_read_states WHERE user_id = ? AND phone_number = ?'; + + $query = \OCP\DB::prepare($sql); + $result = $query->execute(array($userId, $phoneNumber)); + + if ($row = $result->fetchRow()) { + return $row["mx"]; + } + + return 0; + } + + public function setLast ($userId, $phoneNumber, $lastDate) { + \OCP\DB::beginTransaction(); + $query = \OCP\DB::prepare('DELETE FROM *PREFIX*ocsms_conversation_read_states ' . + 'WHERE user_id = ? AND phone_number = ?'); + $query->execute(array($userId, $phoneNumber)); + + $query = \OCP\DB::prepare('INSERT INTO *PREFIX*ocsms_conversation_read_states' . + '(user_id, phone_number, int_date) VALUES ' . + '(?,?,?)'); + $query->execute(array($userId, $phoneNumber, $lastDate)); + \OCP\DB::commit(); + } + + /* + * Migration steps + */ + + public function migrate () { + $sql = 'SELECT user_id, datakey, datavalue FROM ' . + '*PREFIX*ocsms_user_datas WHERE datakey LIKE \'lastReadDate-%\''; + + $query = \OCP\DB::prepare($sql); + $result = $query->execute(array()); + + while ($row = $result->fetchRow()) { + $pn = preg_replace("#lastReadDate[-]#", "", $row["datakey"]); + $this->setLast($row["user_id"], $pn, $row["datavalue"]); + }; + + $query = \OCP\DB::prepare("DELETE FROM *PREFIX*ocsms_user_datas WHERE datakey LIKE 'lastReadDate-%'"); + $query->execute(array()); + } +} + +?> diff --git a/db/smsmapper.php b/db/smsmapper.php index 0c389a0..d3559a1 100644 --- a/db/smsmapper.php +++ b/db/smsmapper.php @@ -17,6 +17,7 @@ use \OCP\AppFramework\Db\Mapper; use \OCA\OcSms\AppInfo\OcSmsApp; use \OCA\OcSms\Lib\PhoneNumberFormatter; +use \OCA\OcSms\Db\ConversationStateMapper; class SmsMapper extends Mapper { /* @@ -30,9 +31,11 @@ class SmsMapper extends Mapper { 4 => "outbox", 5 => "failed", 6 => "queued" ); + private $convStateMapper; - public function __construct (IDb $db) { + public function __construct (IDb $db, ConversationStateMapper $cmapper) { parent::__construct($db, 'ocsms_smsdatas'); + $this->convStateMapper = $cmapper; } public function getAllIds ($userId) { @@ -235,7 +238,7 @@ class SmsMapper extends Mapper { $phoneList = array(); while ($row = $result->fetchRow()) { $phoneNumber = preg_replace("#[ ]#", "", $row["sms_address"]); - if ($this->getLastReadDateForPhoneNumber($userId, $phoneNumber) < $lastDate) { + if ($this->convStateMapper->getLastForPhoneNumber($userId, $phoneNumber) < $lastDate) { if (!array_key_exists($phoneNumber, $phoneList)) { $phoneList[$phoneNumber] = $row["ct"]; } @@ -247,47 +250,6 @@ class SmsMapper extends Mapper { return $phoneList; } - public function getLastReadDate ($userId) { - $sql = 'SELECT MAX(datavalue) as mx FROM ' . - '*PREFIX*ocsms_user_datas WHERE user_id = ?'; - - $query = \OCP\DB::prepare($sql); - $result = $query->execute(array($userId)); - - if ($row = $result->fetchRow()) { - return $row["mx"]; - } - - return 0; - } - - public function getLastReadDateForPhoneNumber ($userId, $phoneNumber) { - $sql = 'SELECT MAX(datavalue) as mx FROM ' . - '*PREFIX*ocsms_user_datas WHERE user_id = ? AND datakey = ?'; - - $query = \OCP\DB::prepare($sql); - $result = $query->execute(array($userId, 'lastReadDate-' . $phoneNumber)); - - if ($row = $result->fetchRow()) { - return $row["mx"]; - } - - return 0; - } - - public function setLastReadDate ($userId, $phoneNumber, $lastDate) { - \OCP\DB::beginTransaction(); - $query = \OCP\DB::prepare('DELETE FROM *PREFIX*ocsms_user_datas ' . - 'WHERE user_id = ? AND datakey = ?'); - $query->execute(array($userId, 'lastReadDate-' . $phoneNumber)); - - $query = \OCP\DB::prepare('INSERT INTO *PREFIX*ocsms_user_datas' . - '(user_id, datakey, datavalue) VALUES ' . - '(?,?,?)'); - $query->execute(array($userId, 'lastReadDate-' . $phoneNumber, $lastDate)); - \OCP\DB::commit(); - } - public function writeToDB ($userId, $smsList, $purgeAllSmsBeforeInsert = false) { \OCP\DB::beginTransaction(); diff --git a/lib/migration/fixconversationreadstates.php b/lib/migration/fixconversationreadstates.php new file mode 100644 index 0000000..c9be22f --- /dev/null +++ b/lib/migration/fixconversationreadstates.php @@ -0,0 +1,54 @@ + + * @copyright Loic Blot 2014-2016 + */ + + +namespace OCA\OcSms\Migration; + +use OCP\IUser; +use OCP\IUserManager; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +use \OCA\OcSms\Db\ConversationStateMapper; + +class FixConversationReadStates implements IRepairStep { + + private $userManager; + private $convStateMapper; + + /** + * FixConversationReadStates constructor. + * + * @param IUserManager $userManager + */ + public function __construct(ConversationStateMapper $mapper, IUserManager $userManager) { + $this->userManager = $userManager; + $this->convStateMapper = $mapper; + } + + /** + * @inheritdoc + */ + public function getName() { + return 'Migrate legacy conversation reading states'; + } + + /** + * @inheritdoc + */ + public function run(IOutput $output) { + + $output->startProgress(); + $output->advance(1, "Migrate states"); + $this->convStateMapper->migrate(); + $output->finishProgress(); + } +}