Skip to content

Commit 7d00b09

Browse files
authored
Merge pull request #7712 from nextcloud/feat/federation-reorder
Feat/federation reorder
2 parents 234be86 + 674c765 commit 7d00b09

8 files changed

Lines changed: 72 additions & 8 deletions

File tree

appinfo/routes.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,11 @@
143143
['name' => 'card_ocs#update', 'url' => '/api/v{apiVersion}/cards/{cardId}', 'verb' => 'PUT'],
144144
['name' => 'card_ocs#assignLabel', 'url' => '/api/v{apiVersion}/cards/{cardId}/label/{labelId}', 'verb' => 'POST'],
145145
['name' => 'card_ocs#removeLabel', 'url' => '/api/v{apiVersion}/cards/{cardId}/label/{labelId}', 'verb' => 'DELETE'],
146+
['name' => 'card_ocs#reorder', 'url' => '/api/v{apiVersion}/cards/{cardId}/reorder', 'verb' => 'PUT'],
146147

147148
['name' => 'stack_ocs#create', 'url' => '/api/v{apiVersion}/stacks', 'verb' => 'POST'],
148149
['name' => 'stack_ocs#delete', 'url' => '/api/v{apiVersion}/stacks/{stackId}/{boardId}', 'verb' => 'DELETE', 'defaults' => ['boardId' => null]],
150+
['name' => 'stack_ocs#reorder', 'url' => '/api/v{apiVersion}/stacks/{stackId}/reorder', 'verb' => 'PUT'],
149151

150152
['name' => 'Config#get', 'url' => '/api/v{apiVersion}/config', 'verb' => 'GET'],
151153
['name' => 'Config#setValue', 'url' => '/api/v{apiVersion}/config/{key}', 'verb' => 'POST'],

lib/Controller/CardOcsController.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,17 @@ public function update(int $id, string $title, int $stackId, string $type, int $
138138
$done
139139
));
140140
}
141+
142+
#[NoAdminRequired]
143+
#[PublicPage]
144+
#[NoCSRFRequired]
145+
public function reorder(int $cardId, int $stackId, int $order, ?int $boardId): DataResponse {
146+
if ($boardId) {
147+
$board = $this->boardService->find($boardId, false);
148+
if ($board->getExternalId()) {
149+
return new DataResponse($this->externalBoardService->reorderCardOnRemote($board, $cardId, $stackId, $order));
150+
}
151+
}
152+
return new DataResponse($this->cardService->reorder($cardId, $stackId, $order));
153+
}
141154
}

lib/Controller/StackOcsController.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,21 @@ public function delete(int $stackId, ?int $boardId = null):DataResponse {
6060
return new DataResponse($result);
6161
}
6262

63+
64+
#[NoAdminRequired]
65+
#[PublicPage]
66+
#[NoCSRFRequired]
67+
#[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)]
68+
public function reorder(int $stackId, int $order, ?int $boardId):DataResponse {
69+
if ($boardId !== null) {
70+
$board = $this->boardService->find($boardId, false);
71+
if ($board->getExternalId()) {
72+
$stacks = $this->externalBoardService->reorderStackOnRemote($board, $stackId, $order);
73+
return new DataResponse($stacks);
74+
}
75+
}
76+
$stacks = $this->stackService->reorder($stackId, $order);
77+
return new DataResponse($stacks);
78+
}
79+
6380
}

lib/Service/ExternalBoardService.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,35 @@ public function deleteStackOnRemote(Board $localBoard, int $stackId): array {
190190
$resp = $this->proxy->delete($participantCloudId->getId(), $shareToken, $url, []);
191191
return $this->proxy->getOcsData($resp);
192192
}
193+
194+
public function reorderCardOnRemote(Board $localBoard, int $cardId, int $stackId, int $order): array {
195+
$this->configService->ensureFederationEnabled();
196+
$this->permissionService->checkPermission($this->boardMapper, $localBoard->getId(), Acl::PERMISSION_EDIT, $this->userId, false, false);
197+
$shareToken = $localBoard->getShareToken();
198+
$participantCloudId = $this->cloudIdManager->getCloudId($this->userId, null);
199+
$ownerCloudId = $this->cloudIdManager->resolveCloudId($localBoard->getOwner());
200+
$url = $ownerCloudId->getRemote() . '/ocs/v2.php/apps/deck/api/v1.0/cards/' . $cardId . '/reorder';
201+
$params = [
202+
'stackId' => $stackId,
203+
'order' => $order,
204+
'boardId' => $localBoard->getExternalId(),
205+
];
206+
$resp = $this->proxy->put($participantCloudId->getId(), $shareToken, $url, $params);
207+
return $this->proxy->getOcsData($resp);
208+
}
209+
210+
public function reorderStackOnRemote(Board $localBoard, int $stackId, int $order): array {
211+
$this->configService->ensureFederationEnabled();
212+
$this->permissionService->checkPermission($this->boardMapper, $localBoard->getId(), Acl::PERMISSION_EDIT, $this->userId, false, false);
213+
$shareToken = $localBoard->getShareToken();
214+
$participantCloudId = $this->cloudIdManager->getCloudId($this->userId, null);
215+
$ownerCloudId = $this->cloudIdManager->resolveCloudId($localBoard->getOwner());
216+
$url = $ownerCloudId->getRemote() . '/ocs/v2.php/apps/deck/api/v1.0/stacks/' . $stackId . '/reorder';
217+
$params = [
218+
'order' => $order,
219+
'boardId' => $localBoard->getExternalId(),
220+
];
221+
$resp = $this->proxy->put($participantCloudId->getId(), $shareToken, $url, $params);
222+
return $this->proxy->getOcsData($resp);
223+
}
193224
}

src/services/CardApi.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ export class CardApi {
9595
})
9696
}
9797

98-
reorderCard(card) {
99-
return axios.put(this.url(`/cards/${card.id}/reorder`), card)
98+
reorderCard(card, boardId) {
99+
return axios.put(this.ocsUrl(`/cards/${card.id}/reorder`), { ...card, boardId: boardId ?? null })
100100
.then(
101101
(response) => {
102-
return Promise.resolve(response.data)
102+
return Promise.resolve(response.data.ocs.data)
103103
},
104104
(err) => {
105105
return Promise.reject(err)

src/services/StackApi.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ export class StackApi {
8383
})
8484
}
8585

86-
reorderStack(stackId, order) {
87-
return axios.put(this.url(`/stacks/${stackId}/reorder`), { order })
86+
reorderStack(stackId, order, boardId) {
87+
return axios.put(this.ocsUrl(`/stacks/${stackId}/reorder`), { order, boardId: boardId ?? null })
8888
.then(
8989
(response) => {
90-
return Promise.resolve(response.data)
90+
return Promise.resolve(response.data.ocs.data)
9191
},
9292
(err) => {
9393
return Promise.reject(err)

src/store/card.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ export default function cardModuleFactory() {
314314
newCards.push(card)
315315
await commit('updateCardsReorder', newCards)
316316

317-
apiClient.reorderCard(card).then((cards) => {
317+
const stack = getters.stackById(card.stackId)
318+
apiClient.reorderCard(card, stack.boardId).then((cards) => {
318319
commit('updateCardsReorder', Object.values(cards))
319320
})
320321
},

src/store/stack.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export default function stackModuleFactory() {
5858
actions: {
5959
orderStack({ commit }, { stack, removedIndex, addedIndex }) {
6060
commit('orderStack', { stack, removedIndex, addedIndex })
61-
apiClient.reorderStack(stack.id, addedIndex)
61+
apiClient.reorderStack(stack.id, addedIndex, stack.boardId)
6262
.catch((err) => {
6363
OC.Notification.showTemporary('Failed to change order')
6464
console.error(err.response.data.message)

0 commit comments

Comments
 (0)