2018-01-12 11:25:48 -08:00
|
|
|
import { Observable } from 'rx';
|
2018-02-16 23:18:53 +00:00
|
|
|
import _ from 'lodash';
|
2015-07-24 17:52:07 -07:00
|
|
|
|
2018-02-16 23:18:53 +00:00
|
|
|
import {
|
2018-02-19 20:32:14 +00:00
|
|
|
getProgress,
|
|
|
|
normaliseUserFields,
|
|
|
|
userPropsForSession
|
2018-02-16 23:18:53 +00:00
|
|
|
} from '../utils/publicUserProps';
|
2015-07-24 17:52:07 -07:00
|
|
|
|
2015-10-29 17:09:26 -07:00
|
|
|
export default function userServices() {
|
2015-07-24 17:52:07 -07:00
|
|
|
return {
|
|
|
|
name: 'user',
|
2018-02-19 20:32:14 +00:00
|
|
|
read: function readUserService(
|
|
|
|
req,
|
|
|
|
resource,
|
|
|
|
params,
|
|
|
|
config,
|
|
|
|
cb) {
|
|
|
|
const queryUser = req.user;
|
|
|
|
const source = queryUser && Observable.forkJoin(
|
|
|
|
queryUser.getChallengeMap$(),
|
|
|
|
queryUser.getPoints$(),
|
|
|
|
(challengeMap, progressTimestamps) => ({
|
|
|
|
challengeMap,
|
|
|
|
progress: getProgress(progressTimestamps, queryUser.timezone)
|
|
|
|
})
|
|
|
|
);
|
2018-01-12 11:25:48 -08:00
|
|
|
Observable.if(
|
2018-02-19 20:32:14 +00:00
|
|
|
() => !queryUser,
|
2018-01-12 11:25:48 -08:00
|
|
|
Observable.of({}),
|
2018-02-19 20:32:14 +00:00
|
|
|
Observable.defer(() => source)
|
|
|
|
.map(({ challengeMap, progress }) => ({
|
|
|
|
...queryUser.toJSON(),
|
|
|
|
...progress,
|
|
|
|
challengeMap
|
|
|
|
}))
|
|
|
|
.map(
|
|
|
|
user => ({
|
2018-02-16 23:18:53 +00:00
|
|
|
entities: {
|
|
|
|
user: {
|
|
|
|
[user.username]: {
|
|
|
|
..._.pick(user, userPropsForSession),
|
|
|
|
isEmailVerified: !!user.emailVerified,
|
|
|
|
isGithub: !!user.githubURL,
|
|
|
|
isLinkedIn: !!user.linkedIn,
|
|
|
|
isTwitter: !!user.twitter,
|
|
|
|
isWebsite: !!user.website,
|
|
|
|
...normaliseUserFields(user)
|
|
|
|
}
|
2018-01-12 11:25:48 -08:00
|
|
|
}
|
2018-02-16 23:18:53 +00:00
|
|
|
},
|
|
|
|
result: user.username
|
|
|
|
})
|
|
|
|
)
|
|
|
|
)
|
2018-01-12 11:25:48 -08:00
|
|
|
.subscribe(
|
|
|
|
user => cb(null, user),
|
|
|
|
cb
|
|
|
|
);
|
2015-07-24 17:52:07 -07:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|