Browse Source

more progress towards /user/:username

develop
Rob Colbert 2 years ago
parent
commit
e83e37394d
  1. 25
      app/controllers/user.js
  2. 50
      app/services/user.js

25
app/controllers/user.js

@ -60,8 +60,9 @@ class UserController extends SiteController {
return next(); return next();
} }
router.param('userId', this.populateUser.bind(this)); router.param('username', this.populateUsername.bind(this));
router.param('coreUserId', this.populateCoreUser.bind(this)); router.param('userId', this.populateUserId.bind(this));
router.param('coreUserId', this.populateCoreUserId.bind(this));
router.post( router.post(
'/core/:coreUserId/settings', '/core/:coreUserId/settings',
@ -131,7 +132,7 @@ class UserController extends SiteController {
this.getUserSettingsView.bind(this), this.getUserSettingsView.bind(this),
); );
router.get( router.get(
'/:userId', '/:username',
limiterService.createMiddleware(limiterService.config.user.getUserProfile), limiterService.createMiddleware(limiterService.config.user.getUserProfile),
authRequired, authRequired,
otpMiddleware, otpMiddleware,
@ -147,7 +148,21 @@ class UserController extends SiteController {
); );
} }
async populateUser (req, res, next, userId) { async populateUsername (req, res, next, username) {
const { user: userService } = this.dtp.services;
try {
res.locals.userProfile = await userService.getPublicProfile('User', username);
if (!res.locals.userProfile) {
throw new SiteError(404, 'Member not found');
}
return next();
} catch (error) {
this.log.error('failed to populate username with public profile', { username, error });
return next(error);
}
}
async populateUserId (req, res, next, userId) {
const { user: userService } = this.dtp.services; const { user: userService } = this.dtp.services;
try { try {
userId = mongoose.Types.ObjectId(userId); userId = mongoose.Types.ObjectId(userId);
@ -163,7 +178,7 @@ class UserController extends SiteController {
} }
} }
async populateCoreUser (req, res, next, coreUserId) { async populateCoreUserId (req, res, next, coreUserId) {
const { coreNode: coreNodeService } = this.dtp.services; const { coreNode: coreNodeService } = this.dtp.services;
try { try {
coreUserId = mongoose.Types.ObjectId(coreUserId); coreUserId = mongoose.Types.ObjectId(coreUserId);

50
app/services/user.js

@ -459,7 +459,7 @@ class UserService extends SiteService {
return user; return user;
} }
async getPublicProfile (username) { async getPublicProfile (type, username) {
if (!username || (typeof username !== 'string')) { if (!username || (typeof username !== 'string')) {
throw new SiteError(406, 'Invalid username'); throw new SiteError(406, 'Invalid username');
} }
@ -469,28 +469,32 @@ class UserService extends SiteService {
throw new SiteError(406, 'Invalid username'); throw new SiteError(406, 'Invalid username');
} }
/** let user;
* Try to resolve the user as a CoreUser switch (type) {
*/ case 'CoreUser':
let user = await CoreUser user = await CoreUser
.findOne({ username_lc: username }) .findOne({ username_lc: username })
.select('_id created username username_lc displayName bio picture header core') .select('_id created username username_lc displayName bio picture header core')
.populate(this.populateUser) .populate(this.populateUser)
.lean(); .lean();
if (user) { if (user) {
user.type = 'CoreUser'; user.type = 'CoreUser';
} else { }
/* break;
* Try to resolve the user as a local User
*/ case 'User':
user = await User user = await User
.findOne({ username_lc: username }) .findOne({ username_lc: username })
.select('_id created username username_lc displayName bio picture header') .select('_id created username username_lc displayName bio picture header')
.populate(this.populateUser) .populate(this.populateUser)
.lean(); .lean();
if (user) { if (user) {
user.type = 'User'; user.type = 'User';
} }
break;
default:
throw new SiteError(400, 'Invalid user account type');
} }
return user; return user;

Loading…
Cancel
Save