Skip to content

Commit 03d3ebf

Browse files
authored
Add alias support (#132)
1 parent 22ff1f6 commit 03d3ebf

File tree

6 files changed

+107
-4
lines changed

6 files changed

+107
-4
lines changed

api/src/api/members.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,22 @@ const {
1313
errorMessages,
1414
} = require('../utils/members');
1515

16+
const MEMBER_ALIASES = {
17+
'Co-Directors': ['CO_DIRECTOR'],
18+
Directors: [
19+
'CO_DIRECTOR',
20+
'COMMUNITY_DIRECTOR',
21+
'EXTERNAL_DIRECTOR',
22+
'TECH_DIRECTOR',
23+
],
24+
Leads: [
25+
'ACADEMY_LEAD',
26+
'TECH_LEAD',
27+
'PRODUCT_RESEARCH_LEAD',
28+
'PRODUCT_MANAGER',
29+
],
30+
};
31+
1632
const validateMemberQuery = (req, res, next) => {
1733
// Middleware that verifies that fields to be inserted/updated actually
1834
// exist in the Member schema, and that user has permission to update them
@@ -69,6 +85,17 @@ router.get(
6985
}),
7086
);
7187

88+
router.get(
89+
'/aliases',
90+
requireRegistered,
91+
errorWrap(async (req, res) => {
92+
res.json({
93+
success: true,
94+
result: Object.keys(MEMBER_ALIASES),
95+
});
96+
}),
97+
);
98+
7299
// Create a new member
73100
// Requires Director Level
74101
router.post(
@@ -218,3 +245,4 @@ router.put(
218245
);
219246

220247
module.exports = router;
248+
module.exports.MEMBER_ALIASES = MEMBER_ALIASES;

api/src/api/notes.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const {
1111
const {
1212
validateEditability,
1313
validateReqParams,
14+
parseNoteAliases,
1415
} = require('../middleware/notes');
1516
const { encryptNote, decryptNote } = require('../utils/apiWrapper');
1617

@@ -167,6 +168,7 @@ router.get(
167168
router.post(
168169
'/',
169170
requireLead,
171+
parseNoteAliases,
170172
errorWrap(async (req, res) => {
171173
const memberID = req.user._id;
172174
const currentVersion = {

api/src/middleware/notes.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
const flatten = require('lodash/flatten');
2+
13
const Note = require('../models/notes');
4+
const Member = require('../models/members');
5+
const { MEMBER_ALIASES } = require('../api/members');
26
const { isAdmin } = require('./auth');
37

48
// middleware to validate if user can edit
@@ -38,7 +42,46 @@ const validateReqParams = (req, res, next) => {
3842
next();
3943
};
4044

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+
4183
module.exports = {
4284
validateEditability,
4385
validateReqParams,
86+
parseNoteAliases,
4487
};

api/src/models/notes.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ const actions = Object.freeze({
99
});
1010

1111
const labelsEnum = [
12-
'1v1',
13-
'2v1',
14-
'2v2',
12+
'1:1',
13+
'2:1',
14+
'2:2',
15+
'Midpoint Reflection',
16+
'Final Reflection',
1517
'Lead Interview',
1618
'Director Interview',
1719
'Meeting',

client/src/pages/Note.jsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
updateNote,
3232
deleteNote,
3333
getMembers,
34+
getMemberAliases,
3435
getNoteLabels,
3536
endUserSession,
3637
} from '../utils/apiWrapper';
@@ -191,7 +192,19 @@ const Note = ({ user }: NoteProps): Node => {
191192
text: `${m.firstName} ${m.lastName}`,
192193
value: m._id,
193194
}));
194-
setMembers(cleanedMembers);
195+
196+
// get alias types
197+
const memberAliases = await getMemberAliases();
198+
199+
const cleanedMemberAliases = (memberAliases?.data?.result ?? []).map(
200+
(m) => ({
201+
key: m,
202+
text: m,
203+
value: m,
204+
}),
205+
);
206+
207+
setMembers([...cleanedMemberAliases, ...cleanedMembers]);
195208

196209
const resNoteLabels = await getNoteLabels();
197210
const cleanedNoteLabels = (resNoteLabels?.data?.result ?? []).map(

client/src/utils/apiWrapper.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,21 @@ export const getMembers = () => {
110110
}));
111111
};
112112

113+
// Retrieves all member aliases
114+
export const getMemberAliases = () => {
115+
const requestString = `${BACKEND_BASE_URL}/members/aliases`;
116+
return axios
117+
.get(requestString, {
118+
headers: {
119+
'Content-Type': 'application/JSON',
120+
},
121+
})
122+
.catch((error) => ({
123+
type: 'GET_MEMBER_ALIASES_FAIL',
124+
error,
125+
}));
126+
};
127+
113128
// Retrieves a member's permissions from their mongo ID
114129
export const updateMember = (member, memberID) => {
115130
const requestString = `${BACKEND_BASE_URL}/members/${memberID}`;

0 commit comments

Comments
 (0)