diff --git a/appinfo/database.xml b/appinfo/database.xml index ed5c2d7ad..3404b0772 100644 --- a/appinfo/database.xml +++ b/appinfo/database.xml @@ -328,4 +328,50 @@ + + *dbprefix*deck_board_acl + + + id + integer + 0 + true + 1 + 4 + + + board_id + integer + true + 8 + + + type + integer + true + 4 + + + participant + text + true + 64 + + + permission_write + boolean + false + + + permission_invite + boolean + false + + + permission_manage + boolean + false + + +
diff --git a/appinfo/info.xml b/appinfo/info.xml index e4ce548b8..30b2ef54a 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -5,7 +5,7 @@ My first ownCloud app AGPL Julius Härtl - 0.0.1.10 + 0.0.1.11 Deck other diff --git a/appinfo/routes.php b/appinfo/routes.php index bbddc7186..13387d157 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -22,6 +22,10 @@ return [ ['name' => 'board#read', 'url' => '/boards/{boardId}/', 'verb' => 'GET'], ['name' => 'board#update', 'url' => '/boards/', 'verb' => 'PUT'], ['name' => 'board#delete', 'url' => '/boards/{boardId}/', 'verb' => 'DELETE'], + // boards - sharees + ['name' => 'board#addSharee', 'url' => '/boards/sharee', 'verb' => 'POST'], + ['name' => 'board#removeSharee', 'url' => '/boards/sharee', 'verb' => 'DELETE'], + ['name' => 'board#updateSharee', 'url' => '/boards/sharee', 'verb' => 'PUT'], // stacks ['name' => 'stack#index', 'url' => '/stacks/{boardId}/', 'verb' => 'GET'], diff --git a/db/acl.php b/db/acl.php new file mode 100644 index 000000000..e1e37f83f --- /dev/null +++ b/db/acl.php @@ -0,0 +1,32 @@ +addType('id','integer'); + $this->addType('boardId','integer'); + } + public function jsonSerialize() { + return [ + 'id' => $this->id, + 'participant' => $this->participant, + 'type' => $this->type, + 'boardId' => $this->boardId, + 'permissionWrite' => $this->permissionWrite, + 'permissionInvite' => $this->permissionInvite, + 'permissionManage' => $this->permissionManage, + ]; + } +} \ No newline at end of file diff --git a/db/aclmapper.php b/db/aclmapper.php new file mode 100644 index 000000000..41c81acb1 --- /dev/null +++ b/db/aclmapper.php @@ -0,0 +1,21 @@ +findEntities($sql, [$boardId], $limit, $offset); + } + +} diff --git a/db/board.php b/db/board.php index 5ed0344ea..74f9f662a 100644 --- a/db/board.php +++ b/db/board.php @@ -11,11 +11,13 @@ class Board extends \OCA\Deck\Db\Entity implements JsonSerializable { protected $owner; protected $color; protected $archived; + public $acl = array(); protected $labels; public function __construct() { $this->addType('id','integer'); $this->addRelation('labels'); + $this->addRelation('acl'); } public function jsonSerialize() { @@ -25,6 +27,7 @@ class Board extends \OCA\Deck\Db\Entity implements JsonSerializable { 'owner' => $this->owner, 'color' => $this->color, 'labels' => $this->labels, + 'acl' => $this->acl, ]; } } \ No newline at end of file diff --git a/db/boardmapper.php b/db/boardmapper.php index b7118deaa..a306c6b97 100644 --- a/db/boardmapper.php +++ b/db/boardmapper.php @@ -15,9 +15,10 @@ class BoardMapper extends Mapper { $this->_relationMappers[$name] = $mapper; } - public function __construct(IDb $db, LabelMapper $labelMapper) { + public function __construct(IDb $db, LabelMapper $labelMapper, AclMapper $aclMapper) { parent::__construct($db, 'deck_boards', '\OCA\Deck\Db\Board'); $this->labelMapper = $labelMapper; + $this->aclMapper = $aclMapper; } @@ -29,12 +30,22 @@ class BoardMapper extends Mapper { $sql = 'SELECT * FROM `*PREFIX*deck_boards` ' . 'WHERE `id` = ?'; $board = $this->findEntity($sql, [$id]); + // Add labels $labels = $this->labelMapper->findAll($id); $board->setLabels($labels); + // Add sharees + $acl = $this->aclMapper->findAll($id); + $board->setAcl($acl); return $board; } - + /** + * Find all boards for a given user + * @param $userId + * @param null $limit + * @param null $offset + * @return array + */ public function findAll($userId, $limit=null, $offset=null) { $sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE `owner` = ? ORDER BY `title`'; return $this->findEntities($sql, [$userId], $limit, $offset); diff --git a/db/labelmapper.php b/db/labelmapper.php index 241da83fe..da41f2938 100644 --- a/db/labelmapper.php +++ b/db/labelmapper.php @@ -24,12 +24,12 @@ class LabelMapper extends DeckMapper { } public function findAssignedLabelsForCard($cardId) { - $sql = 'SELECT l.* FROM `*PREFIX*deck_assigned_labels` as al INNER JOIN *PREFIX*deck_labels as l ON l.id = al.label_id WHERE `card_id` = ?'; + $sql = 'SELECT l.* FROM `*PREFIX*deck_assigned_labels` as al INNER JOIN *PREFIX*deck_labels as l ON l.id = al.label_id WHERE `card_id` = ? ORDER BY l.id'; return $this->findEntities($sql, [$cardId], $limit, $offset); } public function findAssignedLabelsForBoard($boardId, $limit=null, $offset=null) { $sql = "SELECT c.id as card_id, l.id as id, l.title as title, l.color as color FROM oc_deck_cards as c " . - " INNER JOIN oc_deck_assigned_labels as al ON al.card_id = c.id INNER JOIN oc_deck_labels as l ON al.label_id = l.id WHERE board_id=?"; + " INNER JOIN oc_deck_assigned_labels as al ON al.card_id = c.id INNER JOIN oc_deck_labels as l ON al.label_id = l.id WHERE board_id=? ORDER BY l.id"; $entities = $this->findEntities($sql, [$boardId], $limit, $offset); return $entities; } diff --git a/js/controller/BoardController.js b/js/controller/BoardController.js index 193804541..a6bf06ced 100644 --- a/js/controller/BoardController.js +++ b/js/controller/BoardController.js @@ -29,9 +29,9 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St }); BoardService.searchUsers(); - console.log(BoardService.sharees); - BoardService.fetchOne($scope.id).then(function(data) { + BoardService.fetchOne($scope.id).then(function(data) { + console.log(BoardService.getCurrent()); $scope.statusservice.releaseWaiting(); }, function(error) { $scope.statusservice.setError('Error occured', error); @@ -86,6 +86,11 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St LabelService.update(label); } + $scope.addSharee = function(sharee) { + sharee.boardId = $scope.id; + BoardService.addSharee(sharee); + $scope.status.addSharee = null; + } // TODO: move to filter? // Lighten Color of the board for background usage $scope.rgblight = function (hex) { diff --git a/js/public/app.js b/js/public/app.js index b0c43d261..3b031e4ca 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -137,9 +137,9 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat }); BoardService.searchUsers(); - console.log(BoardService.sharees); - BoardService.fetchOne($scope.id).then(function(data) { + BoardService.fetchOne($scope.id).then(function(data) { + console.log(BoardService.getCurrent()); $scope.statusservice.releaseWaiting(); }, function(error) { $scope.statusservice.setError('Error occured', error); @@ -194,6 +194,11 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat LabelService.update(label); } + $scope.addSharee = function(sharee) { + sharee.boardId = $scope.id; + BoardService.addSharee(sharee); + $scope.status.addSharee = null; + } // TODO: move to filter? // Lighten Color of the board for background usage $scope.rgblight = function (hex) { @@ -643,8 +648,8 @@ app.factory('BoardService', ["ApiService", "$http", "$q", function(ApiService, $ var self = this; this.sharees = []; $http.get(url).then(function (response) { - self.sharees = response.data.users; - console.log(this.sharees); + self.sharees = response.data; + console.log(self.sharees); deferred.resolve(response.data); }, function (error) { deferred.reject('Error while update ' + self.endpoint); @@ -652,8 +657,24 @@ app.factory('BoardService', ["ApiService", "$http", "$q", function(ApiService, $ return deferred.promise; } + BoardService.prototype.addSharee = function(sharee) { + var board = this.getCurrent(); + board.acl.push(sharee); + var deferred = $q.defer(); + var self = this; + $http.post(this.baseUrl + '/sharee', sharee).then(function (response) { + console.log("Add sharee " + response); + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error while insert ' + self.endpoint); + }); + sharee = null; + return deferred.promise; + } + service = new BoardService($http, 'boards', $q) return service; + }]); app.factory('CardService', ["ApiService", "$http", "$q", function(ApiService, $http, $q){ var CardService = function($http, ep, $q) { diff --git a/js/service/BoardService.js b/js/service/BoardService.js index e63a6f084..4c265679f 100644 --- a/js/service/BoardService.js +++ b/js/service/BoardService.js @@ -10,8 +10,8 @@ app.factory('BoardService', function(ApiService, $http, $q){ var self = this; this.sharees = []; $http.get(url).then(function (response) { - self.sharees = response.data.users; - console.log(this.sharees); + self.sharees = response.data; + console.log(self.sharees); deferred.resolve(response.data); }, function (error) { deferred.reject('Error while update ' + self.endpoint); @@ -19,6 +19,22 @@ app.factory('BoardService', function(ApiService, $http, $q){ return deferred.promise; } + BoardService.prototype.addSharee = function(sharee) { + var board = this.getCurrent(); + board.acl.push(sharee); + var deferred = $q.defer(); + var self = this; + $http.post(this.baseUrl + '/sharee', sharee).then(function (response) { + console.log("Add sharee " + response); + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error while insert ' + self.endpoint); + }); + sharee = null; + return deferred.promise; + } + service = new BoardService($http, 'boards', $q) return service; + }); \ No newline at end of file diff --git a/service/boardservice.php b/service/boardservice.php index 4973794b6..1edcd6331 100644 --- a/service/boardservice.php +++ b/service/boardservice.php @@ -2,6 +2,8 @@ namespace OCA\Deck\Service; +use OCA\Deck\Db\Acl; +use OCA\Deck\Db\AclMapper; use OCA\Deck\Db\Label; use OCP\ILogger; use OCP\IL10N; @@ -13,9 +15,10 @@ use \OCA\Deck\Db\BoardMapper; use \OCA\Deck\Db\LabelMapper; -class BoardService { +class BoardService { private $boardMapper; + private $aclMapper; private $labelMapper; private $logger; private $l10n; @@ -24,9 +27,11 @@ class BoardService { public function __construct(BoardMapper $boardMapper, ILogger $logger, IL10N $l10n, ITimeFactory $timeFactory, - LabelMapper $labelMapper) { + LabelMapper $labelMapper, + AclMapper $aclMapper) { $this->boardMapper = $boardMapper; $this->labelMapper = $labelMapper; + $this->aclMapper = $aclMapper; $this->logger = $logger; } @@ -36,7 +41,7 @@ class BoardService { public function find($userId, $boardId) { $board = $this->boardMapper->find($boardId); - if($board->getOwner() === $userId) + if ($board->getOwner() === $userId) return $board; else return null; @@ -78,6 +83,17 @@ class BoardService { } public function labels($boardId) { - + + } + + public function addParticipant($boardId, $type, $participant, $write, $invite, $manage) { + $acl = new Acl(); + $acl->setBoardId($boardId); + $acl->setType($type); + $acl->setParticipant($participant); + $acl->setPermissionWrite($write); + $acl->setPermissionInvite($invite); + $acl->setPermissionManage($manage); + return $this-$this->aclMapper->insert($acl); } } \ No newline at end of file diff --git a/templates/part.board.sidebarView.php b/templates/part.board.sidebarView.php index 4b121709d..4cdf33115 100644 --- a/templates/part.board.sidebarView.php +++ b/templates/part.board.sidebarView.php @@ -18,26 +18,39 @@
- - {{$item.id}} - - {{ sharee.id }} + + + {{ $item.participant }} + + + + {{ sharee.participant }} + + Dang! We couldn't find any choices... +
    -
  • -
    Freigabe aufheben
    +
  • +
    D
    - directmenu + + + {{ sharee.participant }} - - + + - - + + + + + + + +
@@ -46,8 +59,8 @@
  • - - {{ label.title }} + + {{ label.title }}