diff --git a/models/cards.js b/models/cards.js index 546efdfe6..a0eaaa8ca 100644 --- a/models/cards.js +++ b/models/cards.js @@ -4440,6 +4440,83 @@ JsonRoutes.add('GET', '/api/boards/:boardId/cards_count', function( }); }, ); + + /** + * @operation archive_card + * @summary Archive a card + * + * @description Archive a card + * @param {string} boardId the board ID of the card + * @param {string} listId the list ID of the card + * @param {string} cardId the ID of the card + * @return_type {_id: string, archived: boolean, archivedAt: Date} + */ + JsonRoutes.add( + 'POST', + '/api/boards/:boardId/lists/:listId/cards/:cardId/archive', + function(req, res) { + const paramBoardId = req.params.boardId; + const paramCardId = req.params.cardId; + const paramListId = req.params.listId; + Authentication.checkBoardAccess(req.userId, paramBoardId); + const card = ReactiveCache.getCard({ + _id: paramCardId, + listId: paramListId, + boardId: paramBoardId, + archived: false, + }); + if (!card) { + throw new Meteor.Error(404, 'Card not found'); + } + card.archive(); + JsonRoutes.sendResult(res, { + code: 200, + data: { + _id: paramCardId, + archived: true, + archivedAt: new Date(), + }, + }); + }, + ); + + /** + * @operation unarchive_card + * @summary Unarchive card + * + * @description Unarchive card + * @param {string} boardId the board ID of the card + * @param {string} listId the list ID of the card + * @param {string} cardId the ID of the card + * @return_type {_id: string, archived: boolean} + */ + JsonRoutes.add( + 'POST', + '/api/boards/:boardId/lists/:listId/cards/:cardId/unarchive', + function(req, res) { + const paramBoardId = req.params.boardId; + const paramCardId = req.params.cardId; + const paramListId = req.params.listId; + Authentication.checkBoardAccess(req.userId, paramBoardId); + const card = ReactiveCache.getCard({ + _id: paramCardId, + listId: paramListId, + boardId: paramBoardId, + archived: true, + }); + if (!card) { + throw new Meteor.Error(404, 'Card not found'); + } + card.restore(); + JsonRoutes.sendResult(res, { + code: 200, + data: { + _id: paramCardId, + archived: false, + }, + }); + }, + ); } // Position history tracking methods diff --git a/public/api/wekan.yml b/public/api/wekan.yml index cbb1a23a6..947aa3862 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -2594,6 +2594,53 @@ paths: properties: _id: type: string + /api/boards/{board}/lists/{list}/cards/{card}/archive: + post: + operationId: archive_card + summary: Archive a card + description: | + Archive a card + tags: + - Cards + consumes: + - multipart/form-data + - application/json + parameters: + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: list + in: path + description: | + the list ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + archived: + type: boolean + archivedAt: + type: string /api/boards/{board}/lists/{list}/cards/{card}/customFields/{customField}: post: operationId: edit_card_custom_field @@ -2658,6 +2705,51 @@ paths: type: string value: type: object + /api/boards/{board}/lists/{list}/cards/{card}/unarchive: + post: + operationId: unarchive_card + summary: Unarchive card + description: | + Unarchive card + tags: + - Cards + consumes: + - multipart/form-data + - application/json + parameters: + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: list + in: path + description: | + the list ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + archived: + type: boolean /api/boards/{board}/lists/{list}/cards_count: get: operationId: get_list_cards_count