|
| 1 | +const flatten = require('lodash/flatten'); |
| 2 | + |
1 | 3 | const Note = require('../models/notes'); |
| 4 | +const Member = require('../models/members'); |
| 5 | +const { MEMBER_ALIASES } = require('../api/members'); |
2 | 6 | const { isAdmin } = require('./auth'); |
3 | 7 |
|
4 | 8 | // middleware to validate if user can edit |
@@ -38,7 +42,46 @@ const validateReqParams = (req, res, next) => { |
38 | 42 | next(); |
39 | 43 | }; |
40 | 44 |
|
| 45 | +// helper function to convert an alias to its ids |
| 46 | +const convertAliasToIds = async (referencedIds) => { |
| 47 | + const cleanedIds = await Promise.all( |
| 48 | + referencedIds.map(async (idOrAlias) => { |
| 49 | + if (!(idOrAlias in MEMBER_ALIASES)) return idOrAlias; |
| 50 | + |
| 51 | + const roles = MEMBER_ALIASES[idOrAlias]; |
| 52 | + const nestedIds = await Member.find( |
| 53 | + { role: { $in: roles }, status: 'ACTIVE' }, |
| 54 | + { _id: 1 }, |
| 55 | + ); |
| 56 | + const ids = nestedIds.map((nestedId) => String(nestedId._id)); |
| 57 | + |
| 58 | + return ids; |
| 59 | + }), |
| 60 | + ); |
| 61 | + |
| 62 | + const flattenedIds = flatten(cleanedIds); |
| 63 | + return flattenedIds; |
| 64 | +}; |
| 65 | + |
| 66 | +// middleware to parse the aliases into their respective IDs |
| 67 | +const parseNoteAliases = async (req, res, next) => { |
| 68 | + const note = req.body; |
| 69 | + |
| 70 | + note.metaData.referencedMembers = [ |
| 71 | + ...new Set(await convertAliasToIds(note.metaData.referencedMembers)), |
| 72 | + ]; |
| 73 | + note.metaData.access.editableBy = [ |
| 74 | + ...new Set(await convertAliasToIds(note.metaData.access.editableBy)), |
| 75 | + ]; |
| 76 | + note.metaData.access.viewableBy = [ |
| 77 | + ...new Set(await convertAliasToIds(note.metaData.access.viewableBy)), |
| 78 | + ]; |
| 79 | + |
| 80 | + next(); |
| 81 | +}; |
| 82 | + |
41 | 83 | module.exports = { |
42 | 84 | validateEditability, |
43 | 85 | validateReqParams, |
| 86 | + parseNoteAliases, |
44 | 87 | }; |
0 commit comments