Skip to content

Commit 060d3cb

Browse files
authored
Merge branch 'master' into beta-new
2 parents 9808247 + ca71b95 commit 060d3cb

16 files changed

Lines changed: 262 additions & 145 deletions

File tree

functions/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const path = require('path');
1414
const functions = require('firebase-functions/v1');
1515
const express = require('express');
1616
const user = require('./utilities/user');
17+
const { getPrivacyState } = require('./utilities/privacy/utils');
1718
const privacyRouter = require('./utilities/privacy/router');
1819
const { countries } = require('./utilities/countries')
1920
const isProfileComplete = require('./utilities/profileComplete');
@@ -201,7 +202,7 @@ app.get('/api/find-user', async (req, res) => {
201202

202203
if(!found) return res.status(401).send({ error: 'no user data found' });
203204

204-
res.status(200).send(getTypeSafeUser({...found, email: authUser.email, privacy: user.getPrivacyState(authUser.email, found) }))
205+
res.status(200).send(getTypeSafeUser({...found, email: authUser.email, privacy: getPrivacyState(authUser.email, found) }))
205206
});
206207

207208
app.get('/api/user-answers', async (req, res) => {

functions/utilities/privacy/debugRouter.js

Lines changed: 132 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,24 @@ const router = express.Router();
33
const firebase = require("firebase-admin");
44
const {
55
firstSeenKey,
6-
userNeedsGuardianTouchKey,
6+
dueByKey,
77
guardianPrivacyAuthTokenKey,
8+
userNeedsGuardianTouchKey,
89
acceptedKey,
910
acceptedByKey,
11+
variantModeKey,
1012
isUnderThirteen,
1113
getPrivacyState,
12-
generateGuardianPrivacyAuthToken
14+
generateGuardianPrivacyAuthToken,
1315
} = require("./utils");
1416

1517
// /api/privacy/student/ultra-secret/view
1618
// /api/privacy/student/ultra-secret/reset/under13/new
1719
// /api/privacy/student/ultra-secret/reset/under13/8daysago
1820
// /api/privacy/student/ultra-secret/reset/over13/new
1921
// /api/privacy/student/ultra-secret/reset/over13/8daysago
22+
// /api/privacy/student/ultra-secret/reset/year8webinar/new
23+
// /api/privacy/student/ultra-secret/reset/year8webinar/31daysago
2024

2125
const userDB = firebase.firestore().collection("users");
2226

@@ -30,10 +34,12 @@ const studentMiddleware = (req, res, next) => {
3034
const getViewData = (req) => {
3135
const allKeys = [
3236
firstSeenKey,
37+
dueByKey,
3338
userNeedsGuardianTouchKey,
3439
guardianPrivacyAuthTokenKey,
3540
acceptedKey,
3641
acceptedByKey,
42+
variantModeKey,
3743
"birthMonth",
3844
"birthYear",
3945
];
@@ -51,102 +57,130 @@ const getViewData = (req) => {
5157
};
5258

5359
const getResponseBody = (req, updateBody) => {
54-
return {
55-
data: {
56-
...getViewData(req),
60+
return {
61+
data: {
62+
...getViewData(req),
63+
...updateBody,
64+
privacyState: getPrivacyState(req.user.email, {
65+
...req.user,
5766
...updateBody,
58-
privacyState: getPrivacyState(req.user.email, { ...req.user, ...updateBody }),
59-
isUnderThirteen: isUnderThirteen({ ...req.user, ...updateBody }),
60-
},
61-
}
62-
}
63-
64-
router.get(
65-
"/reset/under13/new",
66-
studentMiddleware,
67-
async (req, res) => {
68-
const updateBody = {
69-
[firstSeenKey]: null,
70-
[userNeedsGuardianTouchKey]: null,
71-
[guardianPrivacyAuthTokenKey]: null,
72-
[acceptedKey]: null,
73-
[acceptedByKey]: null,
74-
birthMonth: '1',
75-
birthYear: '2025',
76-
};
77-
78-
await userDB.doc(req.user.uid).update(updateBody);
79-
80-
return res.status(200).send(getResponseBody(req, updateBody));
81-
},
82-
);
83-
84-
router.get(
85-
"/reset/over13/new",
86-
studentMiddleware,
87-
async (req, res) => {
88-
const updateBody = {
89-
[firstSeenKey]: null,
90-
[userNeedsGuardianTouchKey]: null,
91-
[guardianPrivacyAuthTokenKey]: null,
92-
[acceptedKey]: null,
93-
[acceptedByKey]: null,
94-
birthMonth: '1',
95-
birthYear: '1990',
96-
};
97-
98-
await userDB.doc(req.user.uid).update(updateBody);
99-
100-
return res.status(200).send(getResponseBody(req, updateBody));
101-
},
102-
);
103-
104-
router.get(
105-
"/reset/under13/8daysago",
106-
studentMiddleware,
107-
async (req, res) => {
108-
const updateBody = {
109-
[firstSeenKey]: Date.now() - (8 * 24 * 60 * 60 * 1000),
110-
[userNeedsGuardianTouchKey]: Date.now() - (8 * 24 * 60 * 60 * 1000),
111-
[guardianPrivacyAuthTokenKey]: generateGuardianPrivacyAuthToken(),
112-
[acceptedKey]: null,
113-
[acceptedByKey]: null,
114-
birthMonth: '1',
115-
birthYear: '2025',
116-
};
117-
118-
await userDB.doc(req.user.uid).update(updateBody);
119-
120-
return res.status(200).send(getResponseBody(req, updateBody));
121-
},
122-
);
123-
124-
router.get(
125-
"/reset/over13/8daysago",
126-
studentMiddleware,
127-
async (req, res) => {
128-
const updateBody = {
129-
[firstSeenKey]: Date.now() - (8 * 24 * 60 * 60 * 1000),
130-
[userNeedsGuardianTouchKey]: null,
131-
[guardianPrivacyAuthTokenKey]: null,
132-
[acceptedKey]: null,
133-
[acceptedByKey]: null,
134-
birthMonth: '1',
135-
birthYear: '1990',
136-
};
137-
138-
await userDB.doc(req.user.uid).update(updateBody);
139-
140-
return res.status(200).send(getResponseBody(req, updateBody));
141-
},
142-
);
143-
144-
router.get(
145-
"/view",
146-
studentMiddleware,
147-
async (req, res) => {
148-
return res.status(200).send({ data: getViewData(req) });
149-
},
150-
);
67+
}),
68+
isUnderThirteen: isUnderThirteen({ ...req.user, ...updateBody }),
69+
},
70+
};
71+
};
72+
73+
router.get("/reset/under13/new", studentMiddleware, async (req, res) => {
74+
const updateBody = {
75+
[firstSeenKey]: null,
76+
[dueByKey]: null,
77+
[guardianPrivacyAuthTokenKey]: null,
78+
[userNeedsGuardianTouchKey]: null,
79+
[acceptedKey]: null,
80+
[acceptedByKey]: null,
81+
[variantModeKey]: null,
82+
birthMonth: "1",
83+
birthYear: "2025",
84+
};
85+
86+
await userDB.doc(req.user.uid).update(updateBody);
87+
88+
return res.status(200).send(getResponseBody(req, updateBody));
89+
});
90+
91+
router.get("/reset/over13/new", studentMiddleware, async (req, res) => {
92+
const updateBody = {
93+
[firstSeenKey]: null,
94+
[dueByKey]: null,
95+
[guardianPrivacyAuthTokenKey]: null,
96+
[userNeedsGuardianTouchKey]: null,
97+
[acceptedKey]: null,
98+
[acceptedByKey]: null,
99+
[variantModeKey]: null,
100+
birthMonth: "1",
101+
birthYear: "1990",
102+
};
103+
104+
await userDB.doc(req.user.uid).update(updateBody);
105+
106+
return res.status(200).send(getResponseBody(req, updateBody));
107+
});
108+
109+
110+
router.get("/reset/year8webinar/new", studentMiddleware, async (req, res) => {
111+
const updateBody = {
112+
[firstSeenKey]: null,
113+
[dueByKey]: Date.now() + 30 * 24 * 60 * 60 * 1000, // 30 days from now
114+
[guardianPrivacyAuthTokenKey]: null,
115+
[userNeedsGuardianTouchKey]: null,
116+
[acceptedKey]: null,
117+
[acceptedByKey]: null,
118+
[variantModeKey]: 'year8webinar',
119+
birthMonth: "1",
120+
birthYear: "1990",
121+
};
122+
123+
await userDB.doc(req.user.uid).update(updateBody);
124+
125+
return res.status(200).send(getResponseBody(req, updateBody));
126+
});
127+
128+
router.get("/reset/year8webinar/31daysago", studentMiddleware, async (req, res) => {
129+
const updateBody = {
130+
[firstSeenKey]: Date.now() - 31 * 24 * 60 * 60 * 1000, // first seen was 31 days ago
131+
[dueByKey]: Date.now() - 24 * 60 * 60 * 1000, // due date was 1 day ago
132+
[userNeedsGuardianTouchKey]: null,
133+
[guardianPrivacyAuthTokenKey]: null,
134+
[acceptedKey]: null,
135+
[acceptedByKey]: null,
136+
[variantModeKey]: 'year8webinar',
137+
birthMonth: "1",
138+
birthYear: "2025", // Age doesn't matter for this variant
139+
};
140+
141+
await userDB.doc(req.user.uid).update(updateBody);
142+
143+
return res.status(200).send(getResponseBody(req, updateBody));
144+
});
145+
146+
router.get("/reset/under13/8daysago", studentMiddleware, async (req, res) => {
147+
const updateBody = {
148+
[firstSeenKey]: Date.now() - 8 * 24 * 60 * 60 * 1000, // first seen was 8 days ago
149+
[dueByKey]: Date.now() - 24 * 60 * 60 * 1000, // due date was 1 day ago
150+
[userNeedsGuardianTouchKey]: Date.now() - 8 * 24 * 60 * 60 * 1000, // guardian touch was 8 days ago
151+
[guardianPrivacyAuthTokenKey]: generateGuardianPrivacyAuthToken(),
152+
[acceptedKey]: null,
153+
[acceptedByKey]: null,
154+
[variantModeKey]: null,
155+
birthMonth: "1",
156+
birthYear: "2025",
157+
};
158+
159+
await userDB.doc(req.user.uid).update(updateBody);
160+
161+
return res.status(200).send(getResponseBody(req, updateBody));
162+
});
163+
164+
router.get("/reset/over13/8daysago", studentMiddleware, async (req, res) => {
165+
const updateBody = {
166+
[firstSeenKey]: Date.now() - 8 * 24 * 60 * 60 * 1000, // first seen was 8 days ago
167+
[dueByKey]: Date.now() - 24 * 60 * 60 * 1000, // due date was 1 day ago
168+
[userNeedsGuardianTouchKey]: null,
169+
[guardianPrivacyAuthTokenKey]: null,
170+
[acceptedKey]: null,
171+
[acceptedByKey]: null,
172+
[variantModeKey]: null,
173+
birthMonth: "1",
174+
birthYear: "1990",
175+
};
176+
177+
await userDB.doc(req.user.uid).update(updateBody);
178+
179+
return res.status(200).send(getResponseBody(req, updateBody));
180+
});
181+
182+
router.get("/view", studentMiddleware, async (req, res) => {
183+
return res.status(200).send({ data: getViewData(req) });
184+
});
151185

152186
module.exports = router;

functions/utilities/privacy/router.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const firebase = require("firebase-admin");
44
const {
55
generateGuardianPrivacyAuthToken,
66
firstSeenKey,
7+
dueByKey,
78
userNeedsGuardianTouchKey,
89
guardianPrivacyAuthTokenKey,
910
acceptedKey,
@@ -109,10 +110,13 @@ const mergeAccountEmailsWithReqBodyGuardianEmails = (req, res) => {
109110
return user.emails || [];
110111
};
111112

113+
const SevenDays = 7 * 24 * 60 * 60 * 1000;
114+
112115
router.get("/student/delay", studentMiddleware, async (req, res) => {
113116
try {
114117
const updateBody = {
115118
[firstSeenKey]: req.user[firstSeenKey] || Date.now(),
119+
[dueByKey]: req.user[dueByKey] || Date.now() + SevenDays,
116120
};
117121

118122
await userDB.doc(req.user.uid).update(updateBody);
@@ -130,16 +134,18 @@ router.get("/student/delay", studentMiddleware, async (req, res) => {
130134
}
131135
});
132136

133-
134137
router.post("/student/update", studentMiddleware, async (req, res) => {
135138
try {
136139
const updateBody = {
137140
emails: mergeAccountEmailsWithReqBodyGuardianEmails(req, res),
138141
guardianEmail: null,
139-
[userNeedsGuardianTouchKey]: Date.now(),
140142
[guardianPrivacyAuthTokenKey]:
141-
req.user.guardianPrivacyAuthToken || generateGuardianPrivacyAuthToken(),
143+
req.user[guardianPrivacyAuthTokenKey] ||
144+
generateGuardianPrivacyAuthToken(),
145+
[userNeedsGuardianTouchKey]:
146+
req.user[userNeedsGuardianTouchKey] || Date.now(),
142147
[firstSeenKey]: req.user[firstSeenKey] || Date.now(),
148+
[dueByKey]: req.user[dueByKey] || Date.now() + SevenDays,
143149
};
144150

145151
await userDB.doc(req.user.uid).update(updateBody);
@@ -177,17 +183,15 @@ router.get("/student/accept", studentMiddleware, async (req, res) => {
177183
}
178184
});
179185

180-
const SevenDays = 7 * 24 * 60 * 60 * 1000;
181-
182186
router.get("/guardian/load/:token", guardianMiddleware, async (req, res) => {
183-
const startTime = res.locals.guardianStudent[firstSeenKey];
187+
const dueDate = res.locals.guardianStudent[dueByKey];
184188

185189
res.status(200).send({
186190
success: true,
187191
error: null,
188192
data: {
189193
first: res.locals.guardianStudent.first,
190-
dueDate: startTime ? startTime + SevenDays : null,
194+
dueDate: dueDate && Date.now() < dueDate ? dueDate : null, // only send due date if still valid
191195
},
192196
});
193197
});

0 commit comments

Comments
 (0)