diff --git a/packages/app/src/App.jsx b/packages/app/src/App.jsx index 8cab7048..7025bfac 100644 --- a/packages/app/src/App.jsx +++ b/packages/app/src/App.jsx @@ -457,7 +457,14 @@ class App extends React.Component { } const user = await User.data() + await this.setState({ user }) + + const publicData = await User.publicData() + + app.userData = { + ...publicData, + } } render() { diff --git a/packages/app/src/models/user/index.js b/packages/app/src/models/user/index.js index d1a8298d..40232264 100644 --- a/packages/app/src/models/user/index.js +++ b/packages/app/src/models/user/index.js @@ -15,6 +15,16 @@ export default class User { return User.bridge.get.user(undefined, { username: token.username, _id: token.user_id }) } + static async publicData() { + const token = await Session.decodedToken() + + if (!token) { + return false + } + + return User.bridge.get.userPublicData({ username: token.username }) + } + static async roles() { const token = await Session.decodedToken() diff --git a/packages/server/src/controllers/UserController/index.js b/packages/server/src/controllers/UserController/index.js index 76e24d97..f3432e28 100644 --- a/packages/server/src/controllers/UserController/index.js +++ b/packages/server/src/controllers/UserController/index.js @@ -13,6 +13,13 @@ const AllowedPublicUpdateFields = [ "description", ] +const AllowedAnonPublicGetters = [ + "username", + "fullName", + "avatar", + "roles" +] + const MaxStringsLengths = { fullName: 120, email: 320, @@ -188,6 +195,32 @@ export default class UserController extends Controller { }) }), }, + "/user/public_data": { + middlewares: ["withOptionalAuthentication"], + fn: async (req, res) => { + let user = req.query?.username ?? req.user.username + + if (!user) { + return res.status(400).json({ + error: "No user provided", + }) + } + + user = await User.findOne({ + username: user, + }).catch(() => null) + + if (!user) { + return res.json({ + user: null, + }) + } + + user = _.pick(user, AllowedAnonPublicGetters) + + return res.json(user) + } + }, "/self": { middlewares: ["withAuthentication"], fn: async (req, res) => {