diff --git a/appinfo/routes.php b/appinfo/routes.php index 9752c36db..a6db9c680 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -143,9 +143,11 @@ ['name' => 'card_ocs#update', 'url' => '/api/v{apiVersion}/cards/{cardId}', 'verb' => 'PUT'], ['name' => 'card_ocs#assignLabel', 'url' => '/api/v{apiVersion}/cards/{cardId}/label/{labelId}', 'verb' => 'POST'], ['name' => 'card_ocs#removeLabel', 'url' => '/api/v{apiVersion}/cards/{cardId}/label/{labelId}', 'verb' => 'DELETE'], + ['name' => 'card_ocs#reorder', 'url' => '/api/v{apiVersion}/cards/{cardId}/reorder', 'verb' => 'PUT'], ['name' => 'stack_ocs#create', 'url' => '/api/v{apiVersion}/stacks', 'verb' => 'POST'], ['name' => 'stack_ocs#delete', 'url' => '/api/v{apiVersion}/stacks/{stackId}/{boardId}', 'verb' => 'DELETE', 'defaults' => ['boardId' => null]], + ['name' => 'stack_ocs#reorder', 'url' => '/api/v{apiVersion}/stacks/{stackId}/reorder', 'verb' => 'PUT'], ['name' => 'Config#get', 'url' => '/api/v{apiVersion}/config', 'verb' => 'GET'], ['name' => 'Config#setValue', 'url' => '/api/v{apiVersion}/config/{key}', 'verb' => 'POST'], diff --git a/lib/Controller/CardOcsController.php b/lib/Controller/CardOcsController.php index d0a4fe70e..0381c1c6e 100644 --- a/lib/Controller/CardOcsController.php +++ b/lib/Controller/CardOcsController.php @@ -138,4 +138,17 @@ public function update(int $id, string $title, int $stackId, string $type, int $ $done )); } + + #[NoAdminRequired] + #[PublicPage] + #[NoCSRFRequired] + public function reorder(int $cardId, int $stackId, int $order, ?int $boardId): DataResponse { + if ($boardId) { + $board = $this->boardService->find($boardId, false); + if ($board->getExternalId()) { + return new DataResponse($this->externalBoardService->reorderCardOnRemote($board, $cardId, $stackId, $order)); + } + } + return new DataResponse($this->cardService->reorder($cardId, $stackId, $order)); + } } diff --git a/lib/Controller/StackOcsController.php b/lib/Controller/StackOcsController.php index a5fd656b9..18e186a47 100644 --- a/lib/Controller/StackOcsController.php +++ b/lib/Controller/StackOcsController.php @@ -60,4 +60,21 @@ public function delete(int $stackId, ?int $boardId = null):DataResponse { return new DataResponse($result); } + + #[NoAdminRequired] + #[PublicPage] + #[NoCSRFRequired] + #[RequestHeader(name: 'x-nextcloud-federation', description: 'Set to 1 when the request is performed by another Nextcloud Server to indicate a federation request', indirect: true)] + public function reorder(int $stackId, int $order, ?int $boardId):DataResponse { + if ($boardId !== null) { + $board = $this->boardService->find($boardId, false); + if ($board->getExternalId()) { + $stacks = $this->externalBoardService->reorderStackOnRemote($board, $stackId, $order); + return new DataResponse($stacks); + } + } + $stacks = $this->stackService->reorder($stackId, $order); + return new DataResponse($stacks); + } + } diff --git a/lib/Service/ExternalBoardService.php b/lib/Service/ExternalBoardService.php index 6125c63b3..24c045e47 100644 --- a/lib/Service/ExternalBoardService.php +++ b/lib/Service/ExternalBoardService.php @@ -190,4 +190,35 @@ public function deleteStackOnRemote(Board $localBoard, int $stackId): array { $resp = $this->proxy->delete($participantCloudId->getId(), $shareToken, $url, []); return $this->proxy->getOcsData($resp); } + + public function reorderCardOnRemote(Board $localBoard, int $cardId, int $stackId, int $order): array { + $this->configService->ensureFederationEnabled(); + $this->permissionService->checkPermission($this->boardMapper, $localBoard->getId(), Acl::PERMISSION_EDIT, $this->userId, false, false); + $shareToken = $localBoard->getShareToken(); + $participantCloudId = $this->cloudIdManager->getCloudId($this->userId, null); + $ownerCloudId = $this->cloudIdManager->resolveCloudId($localBoard->getOwner()); + $url = $ownerCloudId->getRemote() . '/ocs/v2.php/apps/deck/api/v1.0/cards/' . $cardId . '/reorder'; + $params = [ + 'stackId' => $stackId, + 'order' => $order, + 'boardId' => $localBoard->getExternalId(), + ]; + $resp = $this->proxy->put($participantCloudId->getId(), $shareToken, $url, $params); + return $this->proxy->getOcsData($resp); + } + + public function reorderStackOnRemote(Board $localBoard, int $stackId, int $order): array { + $this->configService->ensureFederationEnabled(); + $this->permissionService->checkPermission($this->boardMapper, $localBoard->getId(), Acl::PERMISSION_EDIT, $this->userId, false, false); + $shareToken = $localBoard->getShareToken(); + $participantCloudId = $this->cloudIdManager->getCloudId($this->userId, null); + $ownerCloudId = $this->cloudIdManager->resolveCloudId($localBoard->getOwner()); + $url = $ownerCloudId->getRemote() . '/ocs/v2.php/apps/deck/api/v1.0/stacks/' . $stackId . '/reorder'; + $params = [ + 'order' => $order, + 'boardId' => $localBoard->getExternalId(), + ]; + $resp = $this->proxy->put($participantCloudId->getId(), $shareToken, $url, $params); + return $this->proxy->getOcsData($resp); + } } diff --git a/src/services/CardApi.js b/src/services/CardApi.js index d9491f1f5..e1e22f214 100644 --- a/src/services/CardApi.js +++ b/src/services/CardApi.js @@ -95,11 +95,11 @@ export class CardApi { }) } - reorderCard(card) { - return axios.put(this.url(`/cards/${card.id}/reorder`), card) + reorderCard(card, boardId) { + return axios.put(this.ocsUrl(`/cards/${card.id}/reorder`), { ...card, boardId: boardId ?? null }) .then( (response) => { - return Promise.resolve(response.data) + return Promise.resolve(response.data.ocs.data) }, (err) => { return Promise.reject(err) diff --git a/src/services/StackApi.js b/src/services/StackApi.js index 044e8bf26..df58d2ae0 100644 --- a/src/services/StackApi.js +++ b/src/services/StackApi.js @@ -83,11 +83,11 @@ export class StackApi { }) } - reorderStack(stackId, order) { - return axios.put(this.url(`/stacks/${stackId}/reorder`), { order }) + reorderStack(stackId, order, boardId) { + return axios.put(this.ocsUrl(`/stacks/${stackId}/reorder`), { order, boardId: boardId ?? null }) .then( (response) => { - return Promise.resolve(response.data) + return Promise.resolve(response.data.ocs.data) }, (err) => { return Promise.reject(err) diff --git a/src/store/card.js b/src/store/card.js index e9d0098a9..e34682a35 100644 --- a/src/store/card.js +++ b/src/store/card.js @@ -314,7 +314,8 @@ export default function cardModuleFactory() { newCards.push(card) await commit('updateCardsReorder', newCards) - apiClient.reorderCard(card).then((cards) => { + const stack = getters.stackById(card.stackId) + apiClient.reorderCard(card, stack.boardId).then((cards) => { commit('updateCardsReorder', Object.values(cards)) }) }, diff --git a/src/store/stack.js b/src/store/stack.js index acc992992..f49e646a8 100644 --- a/src/store/stack.js +++ b/src/store/stack.js @@ -58,7 +58,7 @@ export default function stackModuleFactory() { actions: { orderStack({ commit }, { stack, removedIndex, addedIndex }) { commit('orderStack', { stack, removedIndex, addedIndex }) - apiClient.reorderStack(stack.id, addedIndex) + apiClient.reorderStack(stack.id, addedIndex, stack.boardId) .catch((err) => { OC.Notification.showTemporary('Failed to change order') console.error(err.response.data.message)