Skip to content

Commit 190204b

Browse files
authored
Merge pull request #7684 from nextcloud/feat/assign-labels-on-federated-boards
feat(federation): assign labels
2 parents fdbcfc9 + 62e1ca3 commit 190204b

6 files changed

Lines changed: 66 additions & 4 deletions

File tree

appinfo/routes.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@
141141

142142
['name' => 'card_ocs#create', 'url' => '/api/v{apiVersion}/cards', 'verb' => 'POST'],
143143
['name' => 'card_ocs#update', 'url' => '/api/v{apiVersion}/cards/{cardId}', 'verb' => 'PUT'],
144+
['name' => 'card_ocs#assignLabel', 'url' => '/api/v{apiVersion}/cards/{cardId}/label/{labelId}', 'verb' => 'POST'],
145+
['name' => 'card_ocs#removeLabel', 'url' => '/api/v{apiVersion}/cards/{cardId}/label/{labelId}', 'verb' => 'DELETE'],
144146

145147
['name' => 'stack_ocs#create', 'url' => '/api/v{apiVersion}/stacks', 'verb' => 'POST'],
146148
['name' => 'stack_ocs#delete', 'url' => '/api/v{apiVersion}/stacks/{stackId}/{boardId}', 'verb' => 'DELETE', 'defaults' => ['boardId' => null]],

lib/Controller/CardOcsController.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,35 @@ public function create(string $title, int $stackId, ?int $boardId = null, ?strin
6262
return new DataResponse($card);
6363
}
6464

65+
66+
#[NoAdminRequired]
67+
#[PublicPage]
68+
#[NoCSRFRequired]
69+
public function assignLabel(?int $boardId, int $cardId, int $labelId): DataResponse {
70+
if ($boardId) {
71+
$board = $this->boardService->find($boardId, false);
72+
if ($board->getExternalId()) {
73+
return new DataResponse($this->externalBoardService->assignLabelOnRemote($board, $cardId, $labelId));
74+
}
75+
}
76+
77+
return new DataResponse($this->cardService->assignLabel($cardId, $labelId));
78+
}
79+
80+
#[NoAdminRequired]
81+
#[PublicPage]
82+
#[NoCSRFRequired]
83+
public function removeLabel(?int $boardId, int $cardId, int $labelId): DataResponse {
84+
if ($boardId) {
85+
$board = $this->boardService->find($boardId, false);
86+
if ($board->getExternalId()) {
87+
return new DataResponse($this->externalBoardService->removeLabelOnRemote($board, $cardId, $labelId));
88+
}
89+
}
90+
91+
return new DataResponse($this->cardService->removeLabel($cardId, $labelId));
92+
}
93+
6594
#[NoAdminRequired]
6695
#[PublicPage]
6796
#[NoCSRFRequired]

lib/Service/ExternalBoardService.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,30 @@ public function updateCardOnRemote(
135135
return $this->proxy->getOcsData($resp);
136136
}
137137

138+
public function assignLabelOnRemote(Board $localBoard, int $cardId, int $labelId): array {
139+
$this->configService->ensureFederationEnabled();
140+
$this->permissionService->checkPermission($this->boardMapper, $localBoard->getId(), Acl::PERMISSION_EDIT, $this->userId, false, false);
141+
$shareToken = $localBoard->getShareToken();
142+
$ownerCloudId = $this->cloudIdManager->resolveCloudId($localBoard->getOwner());
143+
$url = $ownerCloudId->getRemote() . '/ocs/v2.php/apps/deck/api/v1.0/cards/' . $cardId . '/label/' . $labelId;
144+
$resp = $this->proxy->post($ownerCloudId->getId(), $shareToken, $url, [
145+
'boardId' => $localBoard->getExternalId(),
146+
]);
147+
return $this->proxy->getOcsData($resp);
148+
}
149+
150+
public function removeLabelOnRemote(Board $localBoard, int $cardId, int $labelId): array {
151+
$this->configService->ensureFederationEnabled();
152+
$this->permissionService->checkPermission($this->boardMapper, $localBoard->getId(), Acl::PERMISSION_EDIT, $this->userId, false, false);
153+
$shareToken = $localBoard->getShareToken();
154+
$ownerCloudId = $this->cloudIdManager->resolveCloudId($localBoard->getOwner());
155+
$url = $ownerCloudId->getRemote() . '/ocs/v2.php/apps/deck/api/v1.0/cards/' . $cardId . '/label/' . $labelId;
156+
$resp = $this->proxy->delete($ownerCloudId->getId(), $shareToken, $url, [
157+
'boardId' => $localBoard->getExternalId(),
158+
]);
159+
return $this->proxy->getOcsData($resp);
160+
}
161+
138162
public function createStackOnRemote(
139163
Board $localBoard,
140164
string $title,

src/components/card/CardSidebarTabDetails.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ export default {
156156
const data = {
157157
card: this.copiedCard,
158158
labelId: newLabel.id,
159+
boardId: this.copiedCard.boardId,
159160
}
160161
this.$store.dispatch('addLabel', data)
161162
},

src/services/CardApi.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,10 @@ export class CardApi {
201201
}
202202

203203
assignLabelToCard(data) {
204-
return axios.post(this.url(`/cards/${data.card.id}/label/${data.labelId}`))
204+
return axios.post(this.ocsUrl(`/cards/${data.card.id}/label/${data.labelId}`), { boardId: data.boardId ? data.boardId : null })
205205
.then(
206206
(response) => {
207-
return Promise.resolve(response.data)
207+
return Promise.resolve(response.data.ocs.data)
208208
},
209209
(err) => {
210210
return Promise.reject(err)
@@ -216,10 +216,14 @@ export class CardApi {
216216
}
217217

218218
removeLabelFromCard(data) {
219-
return axios.delete(this.url(`/cards/${data.card.id}/label/${data.labelId}`))
219+
return axios.delete(this.ocsUrl(`/cards/${data.card.id}/label/${data.labelId}`), {
220+
data: {
221+
boardId: data.boardId ? data.boardId : null,
222+
},
223+
})
220224
.then(
221225
(response) => {
222-
return Promise.resolve(response.data)
226+
return Promise.resolve(response.data.ocs.data)
223227
},
224228
(err) => {
225229
return Promise.reject(err)

src/store/card.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,12 @@ export default function cardModuleFactory() {
350350
commit('removeUserFromCard', user)
351351
},
352352
async addLabel({ commit }, data) {
353+
data.boardId = this.state.currentBoard.id
353354
await apiClient.assignLabelToCard(data)
354355
commit('updateCardProperty', { property: 'labels', card: data.card })
355356
},
356357
async removeLabel({ commit }, data) {
358+
data.boardId = this.state.currentBoard.id
357359
await apiClient.removeLabelFromCard(data)
358360
commit('updateCardProperty', { property: 'labels', card: data.card })
359361
},

0 commit comments

Comments
 (0)