From 756517145fbb87385e7a34e86c69d9cb25e8fcdf Mon Sep 17 00:00:00 2001 From: srgooglo Date: Mon, 10 Oct 2022 16:18:11 +0200 Subject: [PATCH] implement `publicData` get methods --- packages/app/src/App.jsx | 7 ++++ packages/app/src/models/user/index.js | 10 ++++++ .../src/controllers/UserController/index.js | 33 +++++++++++++++++++ 3 files changed, 50 insertions(+) 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) => {