diff --git a/app/static/js/App.js b/app/static/js/App.js index c7a372f8e31a1f2673d712f97029191f30a6194b..532bff5c36f0d91aa5e669251a71c76ae41b39f1 100644 --- a/app/static/js/App.js +++ b/app/static/js/App.js @@ -8,33 +8,20 @@ class App { this.socket.on('PATCH', (patch) => {this.onPatch(patch);}); } - getUser(userId) { + getUser(userId, backrefs=false, relationships=false) { if (userId in this.data.promises.getUser) { return this.data.promises.getUser[userId]; } this.data.promises.getUser[userId] = new Promise((resolve, reject) => { - fetch(`/users/${userId}?backrefs=true&relationships=true`, {headers: {Accept: 'application/json'}}) - .then( - (response) => { - if (response.status === 403) {this.flash('Forbidden', 'error'); reject(response);} - return response.json(); - }, - (response) => { - this.flash('Something went wrong', 'error'); - reject(response); - } - ) - .then( - (user) => { - this.data.users[userId] = user; - resolve(this.data.users[userId]); - }, - (error) => { - console.error(error, 'error'); - reject(error); - } - ); + this.socket.emit('GET /users/<user_id>', userId, backrefs, relationships, (response) => { + if (response.status !== 200) { + reject(response); + return; + } + this.data.users[userId] = response.body; + resolve(this.data.users[userId]); + }); }); return this.data.promises.getUser[userId]; @@ -47,11 +34,11 @@ class App { this.data.promises.subscribeUser[userId] = new Promise((resolve, reject) => { this.socket.emit('SUBSCRIBE /users/<user_id>', userId, (response) => { - if (response.code === 200) { - resolve(response); - } else { + if (response.status !== 200) { reject(response); + return; } + resolve(response); }); }); diff --git a/app/users/events.py b/app/users/events.py index 7cab2199ee3d6a802058a399ab2deabffcbcc9e7..532bf42d558108b73aa511f9d318b3ba7752c705 100644 --- a/app/users/events.py +++ b/app/users/events.py @@ -5,17 +5,55 @@ from app.decorators import socketio_login_required from app.models import User +@socketio.on('GET /users/<user_id>') +@socketio_login_required +def get_user(user_hashid, backrefs=False, relationships=False): + user_id = hashids.decode(user_hashid) + user = User.query.get(user_id) + if user is None: + return {'status': 404, 'statusText': 'Not found'} + if not (user == current_user or current_user.is_administrator): + return {'status': 403, 'statusText': 'Forbidden'} + return { + 'body': user.to_json_serializeable( + backrefs=backrefs, + relationships=relationships + ), + 'status': 200, + 'statusText': 'OK', + } + + +# @socketio.on('GET /users/<user_id>') +# @socketio_login_required +# def get_user(user_hashid): +# user_id = hashids.decode(user_hashid) +# user = User.query.get(user_id) +# if user is None: +# return {'options': {'status': 404, 'statusText': 'Not found'}} +# if not (user == current_user or current_user.is_administrator): +# return {'options': {'status': 403, 'statusText': 'Forbidden'}} +# return { +# 'body': user.to_json_serializable2(), +# 'options': { +# 'status': 200, +# 'statusText': 'OK', +# 'headers': {'Content-Type: application/json'} +# } +# } + + @socketio.on('SUBSCRIBE /users/<user_id>') @socketio_login_required def subscribe_user(user_hashid): user_id = hashids.decode(user_hashid) user = User.query.get(user_id) if user is None: - return {'code': 404, 'msg': 'Not found'} + return {'status': 404, 'statusText': 'Not found'} if not (user == current_user or current_user.is_administrator): - return {'code': 403, 'msg': 'Forbidden'} + return {'status': 403, 'statusText': 'Forbidden'} join_room(f'/users/{user.hashid}') - return {'code': 200, 'msg': 'OK'} + return {'status': 200, 'statusText': 'OK'} @socketio.on('UNSUBSCRIBE /users/<user_id>') @@ -24,8 +62,8 @@ def unsubscribe_user(user_hashid): user_id = hashids.decode(user_hashid) user = User.query.get(user_id) if user is None: - return {'code': 404, 'msg': 'Not found'} + return {'status': 404, 'statusText': 'Not found'} if not (user == current_user or current_user.is_administrator): - return {'code': 403, 'msg': 'Forbidden'} + return {'status': 403, 'statusText': 'Forbidden'} leave_room(f'/users/{user.hashid}') - return {'code': 200, 'msg': 'OK'} + return {'status': 200, 'statusText': 'OK'} diff --git a/app/users/routes.py b/app/users/routes.py index 968806ac70fed8e423a85253b0d44c9cbb337d7d..4c06cad3e5004fe82c46942242ecc4d6f69fa01e 100644 --- a/app/users/routes.py +++ b/app/users/routes.py @@ -1,4 +1,4 @@ -from flask import abort, current_app, request +from flask import abort, current_app from flask_login import current_user, login_required from threading import Thread from app import db @@ -9,13 +9,7 @@ from . import bp @bp.route('/<hashid:user_id>') @login_required def user(user_id): - user = User.query.get_or_404(user_id) - if not (user == current_user or current_user.is_administrator()): - abort(403) - backrefs = request.args.get('backrefs', 'false').lower() == 'true' - relationships = ( - request.args.get('relationships', 'false').lower() == 'true') - return user.to_json_serializeable(backrefs=backrefs, relationships=relationships), 200 + abort(503) @bp.route('/<hashid:user_id>', methods=['DELETE'])