From 9b0afdd44a2bde1c251db7a1fe2278ae5e5bb839 Mon Sep 17 00:00:00 2001 From: Victor Dubiniuk Date: Mon, 28 Oct 2013 20:01:30 +0300 Subject: [PATCH] Disconnect user on leaving a session. Closes #15 --- ajax/documentController.php | 6 +++++- ajax/userController.php | 23 +++++++++++++++++++++++ appinfo/routes.php | 10 ++++++++++ js/documents.js | 16 ++++++++++++++-- lib/db/member.php | 2 +- 5 files changed, 53 insertions(+), 4 deletions(-) diff --git a/ajax/documentController.php b/ajax/documentController.php index 68240bfb..5fc8592d 100644 --- a/ajax/documentController.php +++ b/ajax/documentController.php @@ -85,7 +85,11 @@ class DocumentController extends Controller{ $members = array(); $member = new Db_Member(); foreach ($sessions as $session) { - $members[$session['es_id']] = $member->getCollectionBy('es_id', $session['es_id']); + $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']] = $activeMembers; } \OCP\JSON::success(array('documents' => $documents,'sessions' => $sessions,'members' => $members)); diff --git a/ajax/userController.php b/ajax/userController.php index 3e51feb1..783d411a 100644 --- a/ajax/userController.php +++ b/ajax/userController.php @@ -14,6 +14,29 @@ namespace OCA\Documents; class UserController extends Controller{ + public static function disconnectUser($args){ + $uid = self::preDispatch(); + self::disconnect($args, $uid); + } + + public static function disconnectGuest($args){ + self::preDispatchGuest(); + self::disconnect($args, false); + } + + protected static function disconnect($args, $uid){ + $esId = @$_POST['esId']; + $member = new Db_Member(); + $member->loadBy('member_id', $args['member_id']); + if ($esId && $member->hasData()){ + $memberData = $member->getData(); + if ($memberData['es_id']===$esId){ + $member->deactivate(array($args['member_id'])); + } + } + \OCP\JSON::success(); + } + /** * Invite users to the editing session */ diff --git a/appinfo/routes.php b/appinfo/routes.php index e922da2a..6ea9b07f 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -87,6 +87,16 @@ $this->create('documents_user_avatar', 'ajax/user/avatar') ->action('\OCA\Documents\UserController', 'sendAvatar') ; +$this->create('documents_user_disconnect', 'ajax/user/disconnect/{member_id}') + ->post() + ->action('\OCA\Documents\UserController', 'disconnectUser') +; + +$this->create('documents_user_disconnectGuest', 'ajax/user/disconnectGuest/{member_id}') + ->post() + ->action('\OCA\Documents\UserController', 'disconnectGuest') +; + $this->create('documents_user_invite', 'ajax/user/invite') ->post() ->action('\OCA\Documents\UserController', 'invite') diff --git a/js/documents.js b/js/documents.js index 3984b86d..b46e72b0 100644 --- a/js/documents.js +++ b/js/documents.js @@ -6,6 +6,8 @@ var documentsMain = { isEditormode : false, useUnstable : false, isGuest : false, + memberId : false, + esId : false, ready :false, UI : { @@ -163,14 +165,15 @@ var documentsMain = { response.permissions & OC.PERMISSION_SHARE && !documentsMain.isGuest ); var serverFactory = new ServerFactory(); + documentsMain.esId = response.es_id; + documentsMain.memberId = response.member_id; - var memberId = response.member_id; documentsMain.webodfServerInstance = serverFactory.createServer(); documentsMain.webodfServerInstance.setToken(oc_requesttoken); documentsMain.webodfEditorInstance = new Editor({unstableFeaturesEnabled: documentsMain.useUnstable}, documentsMain.webodfServerInstance, serverFactory); // load the document and get called back when it's live - documentsMain.webodfEditorInstance.openSession(response.es_id, memberId, function() { + documentsMain.webodfEditorInstance.openSession(documentsMain.esId, documentsMain.memberId, function() { documentsMain.webodfEditorInstance.startEditing(); documentsMain.UI.hideOverlay(); parent.location.hash = response.file_id; @@ -256,6 +259,15 @@ var documentsMain = { $('header,footer').show(); } documentsMain.webodfEditorInstance.destroy(documentsMain.UI.hideEditor); + + if (documentsMain.isGuest){ + var url = OC.Router.generate('documents_user_disconnectGuest'); + } else { + var url = OC.Router.generate('documents_user_disconnect'); + } + + $.post(url + '/' + documentsMain.memberId, {esId: documentsMain.esId}); + documentsMain.show(); // }); }); diff --git a/lib/db/member.php b/lib/db/member.php index 11d9cd9e..be270a68 100644 --- a/lib/db/member.php +++ b/lib/db/member.php @@ -80,7 +80,7 @@ class Db_Member extends Db{ * Update members to inactive state * @param array $memberIds */ - protected function deactivate($memberIds){ + public function deactivate($memberIds){ $stmt = $this->buildInQuery('member_id', $memberIds); array_unshift($memberIds, self::MEMBER_STATUS_INACTIVE); $this->execute('