Handle save for any leaving collaborator. Ref #63, #95, #83

This commit is contained in:
Victor Dubiniuk 2013-10-31 20:24:55 +03:00
parent 13a4007eb1
commit 262834b6af
4 changed files with 58 additions and 10 deletions

View File

@ -85,12 +85,7 @@ class DocumentController extends Controller{
$members = array(); $members = array();
$member = new Db_Member(); $member = new Db_Member();
foreach ($sessions as $session) { foreach ($sessions as $session) {
$sessionMembers = $member->getCollectionBy('es_id', $session['es_id']); $members[$session['es_id']] = $member->getActiveCollection($session['es_id']);
$activeMembers = array_filter($sessionMembers, function($member){
return $member['status']==Db_Member::MEMBER_STATUS_ACTIVE;
});
$members[$session['es_id']] = array_values($activeMembers);
} }
\OCP\JSON::success(array('documents' => $documents,'sessions' => $sessions,'members' => $members)); \OCP\JSON::success(array('documents' => $documents,'sessions' => $sessions,'members' => $members));

View File

@ -81,6 +81,23 @@ class SessionController extends Controller{
throw new \Exception($path . ' does not exist or is not writable for user ' . $uid); throw new \Exception($path . ' does not exist or is not writable for user ' . $uid);
} }
$member = new Db_Member();
$members = $member->getActiveCollection($esId);
$memberIds = array_map(
function($x){
return ($x['member_id']);
},
$members
);
//check if member belongs to the session
if (!in_array($memberId, $memberIds)){
throw new \Exception($memberId . ' does not belong to session ' . $esId);
}
// Active users except current user
$memberCount = count($memberIds) - 1;
if ($view->file_exists($path)){ if ($view->file_exists($path)){
$currentHash = sha1($view->file_get_contents($path)); $currentHash = sha1($view->file_get_contents($path));
if ($currentHash !== $sessionData['genesis_hash']){ if ($currentHash !== $sessionData['genesis_hash']){
@ -90,9 +107,15 @@ class SessionController extends Controller{
} }
if ($view->file_put_contents($path, $content)){ if ($view->file_put_contents($path, $content)){
//Document saved successfully. Cleaning session data // Not a last user
// temporary workaround for https://github.com/owncloud/documents/issues/63 if ($memberCount>0){
Db_Session::cleanUp($esId); // Update genesis hash to prevent conflicts
$session->updateGenesisHash($esId, sha1($content));
} else {
// Last user. Kill session data
Db_Session::cleanUp($esId);
}
$view->touch($path); $view->touch($path);
} }
\OCP\JSON::success(); \OCP\JSON::success();

View File

@ -39,6 +39,27 @@ class Db_Member extends Db{
); );
} }
public function getActiveCollection($esId){
$result = $this->execute('
SELECT `es_id`, `member_id`
FROM ' . self::DB_TABLE . '
WHERE `es_id`= ?
AND `status`=?
',
array(
$esId,
self::MEMBER_STATUS_ACTIVE
)
);
$members = $result->fetchAll();
if (!is_array($members)){
$members = array();
}
return $members;
}
/** /**
* Mark members as inactive * Mark members as inactive
* @param string $esId - session Id * @param string $esId - session Id

View File

@ -103,6 +103,15 @@ class Db_Session extends \OCA\Documents\Db {
return parent::insert($this->data); return parent::insert($this->data);
} }
public function updateGenesisHash($esId, $genesisHash){
return $this->execute(
'UPDATE `*PREFIX*documents_session` SET `genesis_hash`=? WHERE `es_id`=?',
array(
$esId, $genesisHash
)
);
}
public function getInfo($esId){ public function getInfo($esId){
$result = $this->execute(' $result = $this->execute('
SELECT `s`.*, COUNT(`m`.`member_id`) AS `users` SELECT `s`.*, COUNT(`m`.`member_id`) AS `users`