diff options
Diffstat (limited to 'src/server/api/endpoints/i/favorites.ts')
| -rw-r--r-- | src/server/api/endpoints/i/favorites.ts | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts new file mode 100644 index 0000000000..23517baaff --- /dev/null +++ b/src/server/api/endpoints/i/favorites.ts @@ -0,0 +1,53 @@ +/** + * Module dependencies + */ +import $ from 'cafy'; import ID from '../../../../cafy-id'; +import Favorite, { pack } from '../../../../models/favorite'; + +/** + * Get favorited notes + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'limit' parameter + const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); + if (limitErr) return rej('invalid limit param'); + + // Get 'sinceId' parameter + const [sinceId, sinceIdErr] = $.type(ID).optional().get(params.sinceId); + if (sinceIdErr) return rej('invalid sinceId param'); + + // Get 'untilId' parameter + const [untilId, untilIdErr] = $.type(ID).optional().get(params.untilId); + if (untilIdErr) return rej('invalid untilId param'); + + // Check if both of sinceId and untilId is specified + if (sinceId && untilId) { + return rej('cannot set sinceId and untilId'); + } + + const query = { + userId: user._id + } as any; + + const sort = { + _id: -1 + }; + + if (sinceId) { + sort._id = 1; + query._id = { + $gt: sinceId + }; + } else if (untilId) { + query._id = { + $lt: untilId + }; + } + + // Get favorites + const favorites = await Favorite + .find(query, { limit, sort }); + + // Serialize + res(await Promise.all(favorites.map(favorite => pack(favorite, user)))); +}); |