refactor(api): remove rx from boot/user.js (#49386)

* refactor(api): remove rx from `boot/user.js`

* fix: handle async session user error

* fix lint: do not make changes without npm ci
This commit is contained in:
Shaun Hamilton
2023-03-16 20:38:53 +05:30
committed by GitHub
parent 7aeb4ab76b
commit c030757f03
+70 -78
View File
@@ -2,7 +2,6 @@ import debugFactory from 'debug';
import dedent from 'dedent';
import { body } from 'express-validator';
import { pick } from 'lodash';
import { Observable } from 'rx';
import {
fixCompletedChallengeItem,
@@ -98,84 +97,77 @@ function createReadSessionUser(app) {
return async function getSessionUser(req, res, next) {
const queryUser = req.user;
const userId = queryUser?.id;
const userToken = userId
? await UserToken.findOne({
where: { userId }
})
: null;
const encodedUserToken = userToken
? encodeUserToken(userToken.id)
: undefined;
const source =
queryUser &&
Observable.forkJoin(
queryUser.getCompletedChallenges$(),
queryUser.getPartiallyCompletedChallenges$(),
queryUser.getSavedChallenges$(),
queryUser.getPoints$(),
Donation.getCurrentActiveDonationCount$(),
(
completedChallenges,
partiallyCompletedChallenges,
savedChallenges,
progressTimestamps,
activeDonations
) => ({
activeDonations,
completedChallenges,
partiallyCompletedChallenges,
progress: getProgress(progressTimestamps, queryUser.timezone),
savedChallenges
})
);
Observable.if(
() => !queryUser,
Observable.of({ user: {}, result: '' }),
Observable.defer(() => source)
.map(
({
activeDonations,
completedChallenges,
partiallyCompletedChallenges,
progress,
savedChallenges
}) => ({
user: {
...queryUser.toJSON(),
...progress,
completedChallenges: completedChallenges.map(
fixCompletedChallengeItem
),
partiallyCompletedChallenges: partiallyCompletedChallenges.map(
fixPartiallyCompletedChallengeItem
),
savedChallenges: savedChallenges.map(fixSavedChallengeItem)
},
sessionMeta: { activeDonations }
let encodedUserToken;
try {
const userId = queryUser?.id;
const userToken = userId
? await UserToken.findOne({
where: { userId }
})
)
.map(({ user, sessionMeta }) => ({
user: {
[user.username]: {
...pick(user, userPropsForSession),
username: user.usernameDisplay || user.username,
isEmailVerified: !!user.emailVerified,
isGithub: !!user.githubProfile,
isLinkedIn: !!user.linkedin,
isTwitter: !!user.twitter,
isWebsite: !!user.website,
...normaliseUserFields(user),
joinDate: user.id.getTimestamp(),
userToken: encodedUserToken
}
},
sessionMeta,
result: user.username
}))
).subscribe(user => res.json(user), next);
: null;
encodedUserToken = userToken ? encodeUserToken(userToken.id) : undefined;
} catch (e) {
return next(e);
}
if (!queryUser || !queryUser.toJSON().username) {
// TODO: This should return an error status
return res.json({ user: {}, result: '' });
}
try {
const [
activeDonations,
completedChallenges,
partiallyCompletedChallenges,
progressTimestamps,
savedChallenges
] = await Promise.all(
[
Donation.getCurrentActiveDonationCount$(),
queryUser.getCompletedChallenges$(),
queryUser.getPartiallyCompletedChallenges$(),
queryUser.getPoints$(),
queryUser.getSavedChallenges$()
].map(obs => obs.toPromise())
);
const progress = getProgress(progressTimestamps, queryUser.timezone);
const user = {
...queryUser.toJSON(),
...progress,
completedChallenges: completedChallenges.map(fixCompletedChallengeItem),
partiallyCompletedChallenges: partiallyCompletedChallenges.map(
fixPartiallyCompletedChallengeItem
),
savedChallenges: savedChallenges.map(fixSavedChallengeItem)
};
const response = {
user: {
[user.username]: {
...pick(user, userPropsForSession),
username: user.usernameDisplay || user.username,
isEmailVerified: !!user.emailVerified,
isGithub: !!user.githubProfile,
isLinkedIn: !!user.linkedin,
isTwitter: !!user.twitter,
isWebsite: !!user.website,
...normaliseUserFields(user),
joinDate: user.id.getTimestamp(),
userToken: encodedUserToken
}
},
sessionMeta: {
activeDonations
},
result: user.username
};
return res.json(response);
} catch (e) {
// TODO: This should return an error status
return res.json({ user: {}, result: '' });
}
};
}