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();
+ }
+}