Skip to content

Commit 915fe8c

Browse files
committed
2 parents 2d97a5c + ca71b95 commit 915fe8c

2 files changed

Lines changed: 73 additions & 3 deletions

File tree

functions/utilities/privacy/debugRouter.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const {
88
userNeedsGuardianTouchKey,
99
acceptedKey,
1010
acceptedByKey,
11+
variantModeKey,
1112
isUnderThirteen,
1213
getPrivacyState,
1314
generateGuardianPrivacyAuthToken,
@@ -18,6 +19,8 @@ const {
1819
// /api/privacy/student/ultra-secret/reset/under13/8daysago
1920
// /api/privacy/student/ultra-secret/reset/over13/new
2021
// /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
2124

2225
const userDB = firebase.firestore().collection("users");
2326

@@ -36,6 +39,7 @@ const getViewData = (req) => {
3639
guardianPrivacyAuthTokenKey,
3740
acceptedKey,
3841
acceptedByKey,
42+
variantModeKey,
3943
"birthMonth",
4044
"birthYear",
4145
];
@@ -74,6 +78,7 @@ router.get("/reset/under13/new", studentMiddleware, async (req, res) => {
7478
[userNeedsGuardianTouchKey]: null,
7579
[acceptedKey]: null,
7680
[acceptedByKey]: null,
81+
[variantModeKey]: null,
7782
birthMonth: "1",
7883
birthYear: "2025",
7984
};
@@ -91,6 +96,7 @@ router.get("/reset/over13/new", studentMiddleware, async (req, res) => {
9196
[userNeedsGuardianTouchKey]: null,
9297
[acceptedKey]: null,
9398
[acceptedByKey]: null,
99+
[variantModeKey]: null,
94100
birthMonth: "1",
95101
birthYear: "1990",
96102
};
@@ -100,6 +106,43 @@ router.get("/reset/over13/new", studentMiddleware, async (req, res) => {
100106
return res.status(200).send(getResponseBody(req, updateBody));
101107
});
102108

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+
103146
router.get("/reset/under13/8daysago", studentMiddleware, async (req, res) => {
104147
const updateBody = {
105148
[firstSeenKey]: Date.now() - 8 * 24 * 60 * 60 * 1000, // first seen was 8 days ago
@@ -108,6 +151,7 @@ router.get("/reset/under13/8daysago", studentMiddleware, async (req, res) => {
108151
[guardianPrivacyAuthTokenKey]: generateGuardianPrivacyAuthToken(),
109152
[acceptedKey]: null,
110153
[acceptedByKey]: null,
154+
[variantModeKey]: null,
111155
birthMonth: "1",
112156
birthYear: "2025",
113157
};
@@ -125,6 +169,7 @@ router.get("/reset/over13/8daysago", studentMiddleware, async (req, res) => {
125169
[guardianPrivacyAuthTokenKey]: null,
126170
[acceptedKey]: null,
127171
[acceptedByKey]: null,
172+
[variantModeKey]: null,
128173
birthMonth: "1",
129174
birthYear: "1990",
130175
};

functions/utilities/privacy/utils.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ const userNeedsGuardianTouchKey = `${latestPrivacyVersion}-ng-touch`;
1717
const guardianPrivacyAuthTokenKey = "guardianPrivacyAuthToken";
1818
const acceptedKey = `${latestPrivacyVersion}-accepted`;
1919
const acceptedByKey = `${latestPrivacyVersion}-acceptedBy`;
20+
const variantModeKey = `${latestPrivacyVersion}-variant`;
21+
22+
const supportedCustomVariants = ['year8webinar']
2023

2124
const getCleanNumber = (n) => {
2225
if (!n) return null;
@@ -45,8 +48,23 @@ const isUnderThirteen = (user) => {
4548
return true;
4649
};
4750

51+
const getPrivacyVariant = (user) => {
52+
try {
53+
const variant = user?.[variantModeKey];
54+
if (supportedCustomVariants.includes(variant)) {
55+
return variant;
56+
}
57+
return null;
58+
} catch {
59+
return null;
60+
}
61+
}
62+
4863
const getPrivacyState = (email, user) => {
4964
const isUnder13 = isUnderThirteen(user);
65+
const variant = getPrivacyVariant(user);
66+
67+
const useUnder13 = isUnder13 && variant !== 'year8webinar'
5068

5169
if (
5270
!email.includes("@mcmill.co.uk") ||
@@ -56,6 +74,7 @@ const getPrivacyState = (email, user) => {
5674
debug: 1,
5775
visible: false,
5876
mode: "none",
77+
variant
5978
};
6079
}
6180

@@ -65,20 +84,23 @@ const getPrivacyState = (email, user) => {
6584
debug: 2,
6685
visible: false,
6786
mode: "none",
87+
variant
6888
};
6989
}
7090

91+
const firstSeen = user[firstSeenKey];
7192
const dueBy = user[dueByKey];
7293

73-
if (dueBy) {
94+
if (firstSeen && dueBy) {
7495
// User has seen popup before
7596

7697
if (Date.now() > dueBy) {
7798
// if 7 days or more since first seen, show block
7899
return {
79100
debug: 3,
80101
visible: true,
81-
mode: isUnder13 ? "under-13-block" : "over-13-block",
102+
mode: useUnder13 ? "under-13-block" : "over-13-block",
103+
variant
82104
};
83105
}
84106

@@ -87,6 +109,7 @@ const getPrivacyState = (email, user) => {
87109
debug: 4,
88110
visible: false,
89111
mode: "none",
112+
variant
90113
};
91114
}
92115

@@ -95,7 +118,8 @@ const getPrivacyState = (email, user) => {
95118
debug: 5,
96119
visible: true,
97120
isUnder13,
98-
mode: isUnder13 ? "under-13-delay" : "over-13-delay",
121+
mode: useUnder13 ? "under-13-delay" : "over-13-delay",
122+
variant
99123
};
100124
};
101125

@@ -126,3 +150,4 @@ exports.latestPrivacyVersion = latestPrivacyVersion;
126150
exports.validateGuardianToken = validateGuardianToken;
127151
exports.userNeedsGuardianTouchKey = userNeedsGuardianTouchKey;
128152
exports.isUnderThirteen = isUnderThirteen;
153+
exports.variantModeKey = variantModeKey;

0 commit comments

Comments
 (0)