From 2c3bc0f9bc1a60abf77f26353ac093ec179e2510 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 8 Feb 2020 13:09:01 +0100 Subject: [PATCH] API & Client : replace id with username to fetch a user --- docs/api/users.html | 6 +-- docs/http-routingtable.html | 4 +- docs/objects.inv | Bin 836 -> 842 bytes docs/searchindex.js | 2 +- .../fittrackee_api/tests/test_users_api.py | 37 ++++-------------- fittrackee_api/fittrackee_api/users/users.py | 8 ++-- .../src/components/Admin/Users/index.jsx | 4 +- fittrackee_client/src/components/App.jsx | 2 +- .../src/components/User/UserProfile.jsx | 10 ++--- fittrackee_client/src/fitTrackeeApi/index.js | 4 +- 10 files changed, 28 insertions(+), 49 deletions(-) diff --git a/docs/api/users.html b/docs/api/users.html index 684be566..9630c322 100644 --- a/docs/api/users.html +++ b/docs/api/users.html @@ -217,8 +217,8 @@
-
-GET /api/users/(user_id)
+
+GET /api/users/(user_name)

Get single user details

Example request:

GET /api/users/1 HTTP/1.1
@@ -264,7 +264,7 @@
 
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • user_id (integer) – user id

  • +
  • user_name (integer) – user name

Request Headers
diff --git a/docs/http-routingtable.html b/docs/http-routingtable.html index ad846325..df318575 100644 --- a/docs/http-routingtable.html +++ b/docs/http-routingtable.html @@ -217,12 +217,12 @@ - GET /api/users/(user_id) + GET /api/users/(user_id)/picture - GET /api/users/(user_id)/picture + GET /api/users/(user_name) diff --git a/docs/objects.inv b/docs/objects.inv index 955063cf5fe1695ee04599e95eddecd84c881327..a2cab175e3707bd29f8a4182be1fd8f9561f25d1 100644 GIT binary patch delta 727 zcmX@Yc8YC6eZ6h|Z3BU}@_$@Rv2z+lccpQ2v787{$hdTK!P3nxAwsOLLR9|mTk<2Z zYl`g7LUCuCeeVxH?zGwYpjo4$^HIM8qjIi5`){cUb&F5WT+dtfR^0aRjClzYTPG&* z8lCtkbJVA{N3(3v@oMwB``xe3HECxsKIFOOx2zy7AgA%xo;#uSM}M4gVm`jfGThL( zeD=| z7Bd#yTJ%}Elt;p)b8^$xGSPa4Znsp6dnIC9QjJ#&sP->vUHkjvCs7y1sRy(tZPYW{ zoiwK@s)r-XTFXLa*_6M5S6)ubDG8EkeKUEly^x*Jf=X-&fN6UGCEtvl$ z-Dk?@zp6KT{pS8GU4H-Z1s{Q0*8G*le7jud*Uw)uZ{`{HFHb&AH~)CleD1$3%tCkH zxyZ%J{W7wjT+m>YYZ3b8sEW}mtB9Spik*MH?0TX9+2hOqrTf_aT6RxWe6h-yf2G`H z<$_`xu^9QykKE0bOusBw+V+QGt>Et!qV_Z0CtbA)vf-);-SdZcL2A|J+}V3CTfE!2 zoa1H6)=9@d1f2WR^7YSzt4r(~%oYpo(3-vU@UfVcZ~qvtZ(K0x^1{}Q6NO4I>sMUu vjN8v%J7Y=L=RF!F%eDAYpRDm)&E#Db>zAriETFgW%%7KYChX_skuC=Sk9BV% delta 721 zcmX@bc7$z0ef`0{+X@10?`>Fv^j|hc?R~aw)s{mMs~Z^&Q^4W56!Ah&wWw51tAv*vkOSRGqq!*oJ! za&KQlX7{=LD~bz5Ex&P1yLFYLex|9`;g8E!FEE`Q*`iS?WV+^V|8#u?BMp{3k7K)T zJm4zi^17(F;_Hfw4-Iza_$}($p0arFBaIZ{w`VQI{v_UyRbW|LelEjxa>|AB1&_K7 zUd(ZK)C-+hlNM`XRJHMQ+1ij95xFKsRxi)Ii0Z72+jZRBVx4Qxx$hejJ)H{zPT#K2 zcrq_X%c|t){Z-CuuPzWU_b&8we$I{wZH@q0zTPV;#bY*wx;D134H zgU_+UlQWJByTO)z5Zc^k3Ul^@V@r3Yq40R);6NGPGng*DpEt z)lj>xL^;UGSajnv_Z7W2+}Hj%X)|fbwZ=z*4^}_=DbJvLdG^}ZPv*82_Rm#%qSM`K zbBp`4@U_puVqSay{kYj<^+0R=Gd}6!rQ1HA-^0@6_3gOSE-$Yuy!MZeMw Get single user details""" client = app.test_client() resp_login = client.post( @@ -22,7 +22,7 @@ def test_single_user(app, user_1): content_type='application/json', ) response = client.get( - f'/api/users/{user_1.id}', + f'/api/users/{user_2.username}', content_type='application/json', headers=dict( Authorization='Bearer ' @@ -36,8 +36,8 @@ def test_single_user(app, user_1): assert len(data['data']['users']) == 1 user = data['data']['users'][0] - assert user['username'] == 'test' - assert user['email'] == 'test@test.com' + assert user['username'] == 'toto' + assert user['email'] == 'toto@toto.com' assert user['created_at'] assert not user['admin'] assert user['first_name'] is None @@ -71,7 +71,7 @@ def test_single_user_with_activities( content_type='application/json', ) response = client.get( - f'/api/users/{user_1.id}', + f'/api/users/{user_1.username}', content_type='application/json', headers=dict( Authorization='Bearer ' @@ -104,30 +104,7 @@ def test_single_user_with_activities( assert user['total_duration'] == '1:57:04' -def test_single_user_no_id(app, user_1): - """=> Ensure error is thrown if an id is not provided.""" - client = app.test_client() - resp_login = client.post( - '/api/auth/login', - data=json.dumps(dict(email='test@test.com', password='12345678')), - content_type='application/json', - ) - response = client.get( - '/api/users/blah', - content_type='application/json', - headers=dict( - Authorization='Bearer ' - + json.loads(resp_login.data.decode())['auth_token'] - ), - ) - data = json.loads(response.data.decode()) - - assert response.status_code == 404 - assert 'fail' in data['status'] - assert 'User does not exist.' in data['message'] - - -def test_single_user_wrong_id(app, user_1): +def test_single_user_no_existing(app, user_1): """=> Ensure error is thrown if the id does not exist.""" client = app.test_client() resp_login = client.post( @@ -136,7 +113,7 @@ def test_single_user_wrong_id(app, user_1): content_type='application/json', ) response = client.get( - '/api/users/99999999999', + '/api/users/not_existing', content_type='application/json', headers=dict( Authorization='Bearer ' diff --git a/fittrackee_api/fittrackee_api/users/users.py b/fittrackee_api/fittrackee_api/users/users.py index f6dbaf29..94e7c513 100644 --- a/fittrackee_api/fittrackee_api/users/users.py +++ b/fittrackee_api/fittrackee_api/users/users.py @@ -98,9 +98,9 @@ def get_users(auth_user_id): return jsonify(response_object), 200 -@users_blueprint.route('/users/', methods=['GET']) +@users_blueprint.route('/users/', methods=['GET']) @authenticate -def get_single_user(auth_user_id, user_id): +def get_single_user(auth_user_id, user_name): """ Get single user details @@ -149,7 +149,7 @@ def get_single_user(auth_user_id, user_id): } :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer user_id: user id + :param integer user_name: user name :reqheader Authorization: OAuth 2.0 Bearer Token @@ -164,7 +164,7 @@ def get_single_user(auth_user_id, user_id): response_object = {'status': 'fail', 'message': 'User does not exist.'} try: - user = User.query.filter_by(id=int(user_id)).first() + user = User.query.filter_by(username=user_name).first() if not user: return jsonify(response_object), 404 else: diff --git a/fittrackee_client/src/components/Admin/Users/index.jsx b/fittrackee_client/src/components/Admin/Users/index.jsx index f2a839ac..84d2d401 100644 --- a/fittrackee_client/src/components/Admin/Users/index.jsx +++ b/fittrackee_client/src/components/Admin/Users/index.jsx @@ -41,7 +41,9 @@ class AdminUsers extends React.Component { {user.id} - {user.username} + + {user.username} + {user.email} diff --git a/fittrackee_client/src/components/App.jsx b/fittrackee_client/src/components/App.jsx index b1f84c98..c97c9ff4 100644 --- a/fittrackee_client/src/components/App.jsx +++ b/fittrackee_client/src/components/App.jsx @@ -48,7 +48,7 @@ class App extends React.Component { - + diff --git a/fittrackee_client/src/components/User/UserProfile.jsx b/fittrackee_client/src/components/User/UserProfile.jsx index 67ec8cc1..87df437a 100644 --- a/fittrackee_client/src/components/User/UserProfile.jsx +++ b/fittrackee_client/src/components/User/UserProfile.jsx @@ -7,12 +7,12 @@ import { getOrUpdateData } from '../../actions' class UserProfile extends React.Component { componentDidMount() { - this.props.loadUser(this.props.match.params.userId) + this.props.loadUser(this.props.match.params.userName) } componentDidUpdate(prevProps) { - if (prevProps.match.params.userId !== this.props.match.params.userId) { - this.props.loadUser(this.props.match.params.userId) + if (prevProps.match.params.userName !== this.props.match.params.userName) { + this.props.loadUser(this.props.match.params.userName) } } @@ -40,8 +40,8 @@ export default withTranslation()( users: state.users.data, }), dispatch => ({ - loadUser: userId => { - dispatch(getOrUpdateData('getData', 'users', { id: userId })) + loadUser: userName => { + dispatch(getOrUpdateData('getData', 'users', { username: userName })) }, }) )(UserProfile) diff --git a/fittrackee_client/src/fitTrackeeApi/index.js b/fittrackee_client/src/fitTrackeeApi/index.js index 2d9d98a1..a8c9c668 100644 --- a/fittrackee_client/src/fitTrackeeApi/index.js +++ b/fittrackee_client/src/fitTrackeeApi/index.js @@ -3,8 +3,8 @@ import { createApiRequest } from '../utils' export default class FitTrackeeApi { static getData(target, data = {}) { let url = target - if (data.id) { - url = `${url}/${data.id}` + if (data.id || (target === 'users' && data.username)) { + url = `${url}/${data.username ? data.username : data.id}` } else if (Object.keys(data).length > 0) { url += '?' Object.keys(data).map(key => (url += `&${key}=${data[key]}`))