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

pull/1/head
Victor Dubiniuk 11 years ago
parent 13a4007eb1
commit 262834b6af

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

@ -81,6 +81,23 @@ class SessionController extends Controller{
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)){
$currentHash = sha1($view->file_get_contents($path));
if ($currentHash !== $sessionData['genesis_hash']){
@ -90,9 +107,15 @@ class SessionController extends Controller{
}
if ($view->file_put_contents($path, $content)){
//Document saved successfully. Cleaning session data
// temporary workaround for https://github.com/owncloud/documents/issues/63
Db_Session::cleanUp($esId);
// Not a last user
if ($memberCount>0){
// Update genesis hash to prevent conflicts
$session->updateGenesisHash($esId, sha1($content));
} else {
// Last user. Kill session data
Db_Session::cleanUp($esId);
}
$view->touch($path);
}
\OCP\JSON::success();

@ -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
* @param string $esId - session Id

@ -102,6 +102,15 @@ class Db_Session extends \OCA\Documents\Db {
array_unshift($this->data, $esId);
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){
$result = $this->execute('

Loading…
Cancel
Save