|
@@ -8,7 +8,7 @@ const express = require('express');
|
|
|
|
|
|
|
|
const router = express.Router();
|
|
const router = express.Router();
|
|
|
|
|
|
|
|
-const { body } = require('express-validator');
|
|
|
|
|
|
|
+const { body, query, param } = require('express-validator');
|
|
|
|
|
|
|
|
const ErrorV3 = require('../../models/vo/error-apiv3');
|
|
const ErrorV3 = require('../../models/vo/error-apiv3');
|
|
|
|
|
|
|
@@ -28,14 +28,19 @@ module.exports = (crowi) => {
|
|
|
const csrf = require('../../middlewares/csrf')(crowi);
|
|
const csrf = require('../../middlewares/csrf')(crowi);
|
|
|
const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
|
|
const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
|
|
|
const ShareLink = crowi.model('ShareLink');
|
|
const ShareLink = crowi.model('ShareLink');
|
|
|
|
|
+ const Page = crowi.model('Page');
|
|
|
|
|
|
|
|
|
|
+ validator.getShareLinks = [
|
|
|
|
|
+ // validate the page id is MongoId
|
|
|
|
|
+ query('relatedPage').isMongoId().withMessage('Page Id is required'),
|
|
|
|
|
+ ];
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
|
*
|
|
*
|
|
|
* paths:
|
|
* paths:
|
|
|
* /share-links/:
|
|
* /share-links/:
|
|
|
- * post:
|
|
|
|
|
|
|
+ * get:
|
|
|
* tags: [ShareLink]
|
|
* tags: [ShareLink]
|
|
|
* description: get share links
|
|
* description: get share links
|
|
|
* parameters:
|
|
* parameters:
|
|
@@ -49,10 +54,19 @@ module.exports = (crowi) => {
|
|
|
* 200:
|
|
* 200:
|
|
|
* description: Succeeded to get share links
|
|
* description: Succeeded to get share links
|
|
|
*/
|
|
*/
|
|
|
- router.get('/', loginRequired, async(req, res) => {
|
|
|
|
|
|
|
+ router.get('/', loginRequired, validator.getShareLinks, apiV3FormValidator, async(req, res) => {
|
|
|
const { relatedPage } = req.query;
|
|
const { relatedPage } = req.query;
|
|
|
|
|
+
|
|
|
|
|
+ const page = await Page.findByIdAndViewer(relatedPage, req.user);
|
|
|
|
|
+
|
|
|
|
|
+ if (page == null) {
|
|
|
|
|
+ const msg = 'Page is not found or forbidden';
|
|
|
|
|
+ logger.error('Error', msg);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'get-shareLink-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
- const shareLinksResult = await ShareLink.find({ relatedPage: { $in: relatedPage } }).populate({ path: 'relatedPage', select: 'path' });
|
|
|
|
|
|
|
+ const shareLinksResult = await ShareLink.find({ relatedPage }).populate({ path: 'relatedPage', select: 'path' });
|
|
|
return res.apiv3({ shareLinksResult });
|
|
return res.apiv3({ shareLinksResult });
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
@@ -63,8 +77,8 @@ module.exports = (crowi) => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
validator.shareLinkStatus = [
|
|
validator.shareLinkStatus = [
|
|
|
- // validate the page id is null
|
|
|
|
|
- body('relatedPage').not().isEmpty().withMessage('Page Id is null'),
|
|
|
|
|
|
|
+ // validate the page id is MongoId
|
|
|
|
|
+ body('relatedPage').isMongoId().withMessage('Page Id is required'),
|
|
|
// validate expireation date is not empty, is not before today and is date.
|
|
// validate expireation date is not empty, is not before today and is date.
|
|
|
body('expiredAt').if(value => value != null).isAfter(today.toString()).withMessage('Your Selected date is past'),
|
|
body('expiredAt').if(value => value != null).isAfter(today.toString()).withMessage('Your Selected date is past'),
|
|
|
// validate the length of description is max 100.
|
|
// validate the length of description is max 100.
|
|
@@ -103,6 +117,15 @@ module.exports = (crowi) => {
|
|
|
|
|
|
|
|
router.post('/', loginRequired, csrf, validator.shareLinkStatus, apiV3FormValidator, async(req, res) => {
|
|
router.post('/', loginRequired, csrf, validator.shareLinkStatus, apiV3FormValidator, async(req, res) => {
|
|
|
const { relatedPage, expiredAt, description } = req.body;
|
|
const { relatedPage, expiredAt, description } = req.body;
|
|
|
|
|
+
|
|
|
|
|
+ const page = await Page.findByIdAndViewer(relatedPage, req.user);
|
|
|
|
|
+
|
|
|
|
|
+ if (page == null) {
|
|
|
|
|
+ const msg = 'Page is not found or forbidden';
|
|
|
|
|
+ logger.error('Error', msg);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'post-shareLink-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const ShareLink = crowi.model('ShareLink');
|
|
const ShareLink = crowi.model('ShareLink');
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
@@ -116,6 +139,12 @@ module.exports = (crowi) => {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ validator.deleteShareLinks = [
|
|
|
|
|
+ // validate the page id is MongoId
|
|
|
|
|
+ query('relatedPage').isMongoId().withMessage('Page Id is required'),
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
|
*
|
|
*
|
|
@@ -135,9 +164,17 @@ module.exports = (crowi) => {
|
|
|
* 200:
|
|
* 200:
|
|
|
* description: Succeeded to delete o all share links related one page
|
|
* description: Succeeded to delete o all share links related one page
|
|
|
*/
|
|
*/
|
|
|
- router.delete('/', loginRequired, csrf, async(req, res) => {
|
|
|
|
|
|
|
+ router.delete('/', loginRequired, csrf, validator.deleteShareLinks, apiV3FormValidator, async(req, res) => {
|
|
|
const { relatedPage } = req.query;
|
|
const { relatedPage } = req.query;
|
|
|
|
|
|
|
|
|
|
+ const page = await Page.findByIdAndViewer(relatedPage, req.user);
|
|
|
|
|
+
|
|
|
|
|
+ if (page == null) {
|
|
|
|
|
+ const msg = 'Page is not found or forbidden';
|
|
|
|
|
+ logger.error('Error', msg);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'delete-shareLinks-for-page-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
const deletedShareLink = await ShareLink.remove({ relatedPage });
|
|
const deletedShareLink = await ShareLink.remove({ relatedPage });
|
|
|
return res.apiv3(deletedShareLink);
|
|
return res.apiv3(deletedShareLink);
|
|
@@ -174,6 +211,10 @@ module.exports = (crowi) => {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+ validator.deleteShareLink = [
|
|
|
|
|
+ param('id').isMongoId().withMessage('ShareLink Id is required'),
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
|
*
|
|
*
|
|
@@ -192,11 +233,22 @@ module.exports = (crowi) => {
|
|
|
* 200:
|
|
* 200:
|
|
|
* description: Succeeded to delete one share link
|
|
* description: Succeeded to delete one share link
|
|
|
*/
|
|
*/
|
|
|
- router.delete('/:id', loginRequired, csrf, async(req, res) => {
|
|
|
|
|
|
|
+ router.delete('/:id', loginRequired, csrf, validator.deleteShareLink, apiV3FormValidator, async(req, res) => {
|
|
|
const { id } = req.params;
|
|
const { id } = req.params;
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- const deletedShareLink = await ShareLink.findOneAndRemove({ _id: id });
|
|
|
|
|
|
|
+ const deletedShareLink = await ShareLink.findOne({ _id: id });
|
|
|
|
|
+
|
|
|
|
|
+ // check permission
|
|
|
|
|
+ const page = await Page.findByIdAndViewer(deletedShareLink.relatedPage, req.user);
|
|
|
|
|
+ if (page == null) {
|
|
|
|
|
+ const msg = 'Page is not found or forbidden';
|
|
|
|
|
+ logger.error('Error', msg);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'delete-shareLink-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // remove
|
|
|
|
|
+ await deletedShareLink.remove();
|
|
|
return res.apiv3({ deletedShareLink });
|
|
return res.apiv3({ deletedShareLink });
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|