diff --git a/controller/boardcontroller.php b/controller/boardcontroller.php index 5fd122b7f..7987a1874 100644 --- a/controller/boardcontroller.php +++ b/controller/boardcontroller.php @@ -8,18 +8,34 @@ use OCP\IRequest; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Controller; use OCP\AppFramework\Db\DoesNotExistException; +use OCP\IUserManager; +use OCP\IGroupManager; class BoardController extends Controller { private $userId; private $boardService; - + protected $userManager; + protected $groupManager; public function __construct($appName, IRequest $request, + IUserManager $userManager, + IGroupManager $groupManager, BoardService $cardService, $userId) { parent::__construct($appName, $request); $this->userId = $userId; + $this->userManager = $userManager; + $this->groupManager = $groupManager; $this->boardService = $cardService; + $this->userInfo = $this->getBoardPrequisites(); + } + + private function getBoardPrequisites() { + $groups = $this->groupManager->getUserGroupIds($this->userManager->get($this->userId)); + return [ + 'user' => $this->userId, + 'groups' => $groups + ]; } /** @@ -27,7 +43,7 @@ class BoardController extends Controller { */ public function index() { - return $this->boardService->findAll($this->userId); + return $this->boardService->findAll($this->userInfo); } /** diff --git a/controller/sharecontroller.php b/controller/sharecontroller.php index 721229164..13d5cdb22 100644 --- a/controller/sharecontroller.php +++ b/controller/sharecontroller.php @@ -12,14 +12,17 @@ class ShareController extends Controller { protected $userManager; protected $groupManager; + private $userId; public function __construct($appName, IRequest $request, IUserManager $userManager, - IGroupManager $groupManager + IGroupManager $groupManager, + $userId ){ parent::__construct($appName, $request); $this->userManager = $userManager; $this->groupManager = $groupManager; + $this->userId = $userId; } /** @@ -41,9 +44,11 @@ class ShareController extends Controller { $result[] = $acl; } foreach ($this->userManager->searchDisplayName($search, $limit, $offset) as $idx => $user) { + if($user->getUID() === $this->userId) + continue; $acl = new Acl(); $acl->setType('user'); - $acl->setParticipant($user->getDisplayName()); + $acl->setParticipant($user->getUID()); $acl->setPermissionWrite(true); $acl->setPermissionInvite(true); $acl->setPermissionManage(true); diff --git a/css/style.css b/css/style.css index d748d7cf0..b1ac2cc78 100644 --- a/css/style.css +++ b/css/style.css @@ -6,6 +6,14 @@ .app-navigation-entry-utils-menu-button { display: block !important; } +.app-navigation-entry-utils-menu-share { + display: block !important; + text-align:right; + padding-top:3px; + padding-right:5px; + opacity:0.4; +} + #app-navigation .app-navigation-entry-edit { height: auto; } diff --git a/db/acl.php b/db/acl.php index b1376cfc9..fe6dd59e8 100644 --- a/db/acl.php +++ b/db/acl.php @@ -13,6 +13,7 @@ class Acl extends Entity implements JsonSerializable { protected $permissionWrite; protected $permissionInvite; protected $permissionManage; + protected $owner; public function __construct() { $this->addType('id','integer'); @@ -20,6 +21,8 @@ class Acl extends Entity implements JsonSerializable { $this->addType('permissionWrite', 'boolean'); $this->addType('permissionInvite', 'boolean'); $this->addType('permissionManage', 'boolean'); + $this->addType('owner', 'boolean'); + $this->addRelation('owner'); } public function jsonSerialize() { return [ @@ -30,6 +33,7 @@ class Acl extends Entity implements JsonSerializable { 'permissionWrite' => $this->permissionWrite, 'permissionInvite' => $this->permissionInvite, 'permissionManage' => $this->permissionManage, + 'owner' => $this->owner ]; } } \ No newline at end of file diff --git a/db/aclmapper.php b/db/aclmapper.php index 41c81acb1..09d61d5a7 100644 --- a/db/aclmapper.php +++ b/db/aclmapper.php @@ -14,8 +14,8 @@ class AclMapper extends DeckMapper { } public function findAll($boardId, $limit=null, $offset=null) { - $sql = 'SELECT * FROM `*PREFIX*deck_board_acl` WHERE `board_id` = ?'; - return $this->findEntities($sql, [$boardId], $limit, $offset); + $sql = 'SELECT id, board_id, type, participant, permission_write, permission_invite, permission_manage, 0 as owner FROM `*PREFIX*deck_board_acl` WHERE `board_id` = ? UNION SELECT 0, id, \'user\', owner, 1, 1, 1, 1 FROM `*PREFIX*deck_boards` WHERE `id` = ? '; + return $this->findEntities($sql, [$boardId, $boardId], $limit, $offset); } } diff --git a/db/board.php b/db/board.php index abf2e7ccc..a616818ad 100644 --- a/db/board.php +++ b/db/board.php @@ -13,15 +13,19 @@ class Board extends \OCA\Deck\Db\Entity implements JsonSerializable { protected $archived; protected $labels; protected $acl; + protected $shared; public function __construct() { $this->addType('id','integer'); + $this->addType('shared','integer'); $this->addRelation('labels'); $this->addRelation('acl'); + $this->addRelation('shared'); + $this->shared = -1; } public function jsonSerialize() { - return [ + $result = [ 'id' => $this->id, 'title' => $this->title, 'owner' => $this->owner, @@ -29,6 +33,10 @@ class Board extends \OCA\Deck\Db\Entity implements JsonSerializable { 'labels' => $this->labels, 'acl' => $this->acl, ]; + if($this->shared!==-1) { + $result['shared'] = $this->shared; + } + return $result; } public function setLabels($labels) { diff --git a/db/boardmapper.php b/db/boardmapper.php index 5b3d64522..472267dc7 100644 --- a/db/boardmapper.php +++ b/db/boardmapper.php @@ -4,6 +4,7 @@ namespace OCA\Deck\Db; use OCP\IDb; use OCP\AppFramework\Db\Mapper; +use Symfony\Component\Config\Definition\Exception\Exception; class BoardMapper extends Mapper { @@ -27,7 +28,7 @@ class BoardMapper extends Mapper { * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result */ public function find($id) { - $sql = 'SELECT * FROM `*PREFIX*deck_boards` ' . + $sql = 'SELECT id, title, owner, color, archived FROM `*PREFIX*deck_boards` ' . 'WHERE `id` = ?'; $board = $this->findEntity($sql, [$id]); @@ -49,9 +50,39 @@ class BoardMapper extends Mapper { * @param null $offset * @return array */ - public function findAll($userId, $limit=null, $offset=null) { - $sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE `owner` = ? ORDER BY `title`'; - $entries = $this->findEntities($sql, [$userId], $limit, $offset); + public function findAllByUser($userId, $limit=null, $offset=null) { + $sql = 'SELECT id, title, owner, color, archived, 0 as shared FROM oc_deck_boards WHERE owner = ? UNION ' . + 'SELECT boards.id, title, owner, color, archived, 1 as shared FROM oc_deck_boards as boards ' . + 'JOIN oc_deck_board_acl as acl ON boards.id=acl.board_id WHERE acl.participant=? AND acl.type=\'user\' AND boards.owner != ?'; + $entries = $this->findEntities($sql, [$userId, $userId, $userId], $limit, $offset); + /* @var Board $entry */ + foreach ($entries as $entry) { + $acl = $this->aclMapper->findAll($entry->id); + $entry->setAcl($acl); + } + return $entries; + } + /** + * Find all boards for a given user + * @param $groups + * @param null $limit + * @param null $offset + * @return array + */ + public function findAllByGroups($userId, $groups, $limit=null, $offset=null) { + if(count($groups)<=0) { + return []; + } + $sql = 'SELECT boards.id, title, owner, color, archived, 2 as shared FROM oc_deck_boards as boards ' . + 'INNER JOIN oc_deck_board_acl as acl ON boards.id=acl.board_id WHERE owner != ? AND type=\'group\' AND ('; + $countGroups = 0; + foreach ($groups as $group) { + $sql .= 'acl.participant = ? '; + if(count($groups)>1 && $countGroups++findEntities($sql, array_merge([$userId], $groups), $limit, $offset); /* @var Board $entry */ foreach ($entries as $entry) { $acl = $this->aclMapper->findAll($entry->id); @@ -65,4 +96,23 @@ class BoardMapper extends Mapper { return parent::delete($entity); } + public function userCanView($boardId, $userInfo) { + $board = $this->find($boardId); + if($board->getOwner()===$userInfo['user']) { + return true; + } + try { + $sql = 'SELECT acl.* FROM oc_deck_boards as boards ' . + 'JOIN oc_deck_board_acl as acl ON boards.id=acl.board_id WHERE acl.participant=? AND acl.type=\'user\' AND boards.id = ? AND boards.owner != ?'; + $acl = $this->find($sql, [$userInfo['user'], $boardId, $userInfo['user']], $limit, $offset); + return true; + } catch (Exception $e) { } + try { + $acl = $this->find($sql, [$userInfo['user'], $boardId, $userInfo['user']], $limit, $offset); + return true; + } catch (Exception $e) { + } + + } + } \ No newline at end of file diff --git a/lib/Middleware/SharingMiddleware.php b/lib/Middleware/SharingMiddleware.php new file mode 100644 index 000000000..cbe58e353 --- /dev/null +++ b/lib/Middleware/SharingMiddleware.php @@ -0,0 +1,32 @@ +userId = $userId; + $this->db = $db; + $this->userManager = $userManager; + $this->groupManager = $groupManager; + } + + public function beforeController($controller, $methodName) { + \OCP\Util::writeLog('deck', "", \OCP\Util::ERROR); + //$userBoards = $this->boardMapper->findAllByUser($userInfo['user']); + //$groupBoards = $this->boardMapper->findAllByGroups($userInfo['user'], $userInfo['groups']); + + } + +} \ No newline at end of file diff --git a/middleware/SharingMiddleware.php b/middleware/SharingMiddleware.php deleted file mode 100644 index 2dca9fac9..000000000 --- a/middleware/SharingMiddleware.php +++ /dev/null @@ -1,11 +0,0 @@ -l10n = $l10n; } - public function findAll($userId) { - return $this->boardMapper->findAll($userId); + public function findAll($userInfo) { + $userBoards = $this->boardMapper->findAllByUser($userInfo['user']); + $groupBoards = $this->boardMapper->findAllByGroups($userInfo['user'], $userInfo['groups']); + return array_merge($userBoards, $groupBoards); } public function find($userId, $boardId) {