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 zcmV;|0x12&2FeDIe}6r1+b|G@cm4_jU7Udxx@HRs1jtYzXwuoBrL#m-5(Vm1B>%po z_+g5a9l3EALp;9k!{doOx!{8+c!}bVKmj9d5QqC3kba}fnXe6Y?H4`6n4Vyfg^^+n zGRW~9#Y}ySDR!dAdpCaHi|WpTD`)}X4BAenaAr_!f!e&>Re#0!%t8alvN=~VGk2TC zin8Gf_Z3HelMS+ncir;E2z3WNT9F&vtng7@%(1N~UT90g_3(C^gbZlog8#WRdWCCh z(($3#>7Rd1KwDYx=lEXkLyfQO8q9e;bi$@+Wi9%grl&HFjxj4w0CK`?qXBT*qVpSd z3>ZX-lY+H&6@MU$MrAnObQZK_Gpi6KkD`UG`|L;;n+E0VD;HoIb+f?A9SYC9@8 z9Hx~0QPk;{Y;;l_h3u2PIme1W?z=05sP!%xgXpsirV&(n5oVq9C@7_>vd^pwCq^%J z-f@r$GpmgzPA6R$T`MuqYxnp9$F+#y{1_XTGzLetynl>F?#ZU2b5}gP?`K_>xY4G0 zo0w&LKMVfLYoO@h6HCnY#R|M_xATnHx#y#_<$PIT>?(F)M~e=!fy06|?Ikg}=N;T# z%d{p&l0SIO^dXFi?+}^AcMbZWpY&%;l=J;1*^N$}`E{q?>WVMpV@KDbDg!TN8)ucawHlq=^Dx0Ol#$2iG z{4=kCppw&}g|U$mb<;0+)rnre2Yr~Niu1fEbf+o~W#p_*s{%`UT~1{za}X|}%>3z` JkiQKK8+VU&Zz2Ey delta 721 zcmV;?0xtc^2E+!Ce}BP_+aM5z?>q%kFX@3=z2>&6w9+0bt-9NDMC^%;>KF@;tIgXN z4A>Z)tliCCA~XE|$1sL*GTw@e=P3RP6wuKMvE7$|^gEr;e5>$Wf6+6H=?NBC7|E6( zt?aH*%+&jsY$qDryYb~9imw)2Kn)02&~`G0GlOC?)avCn6@TL+3$+~c>RQFj+XDrD#%`o=P}6#;iO7$R3l8j(};4&TrHq zpcOgx3YOZ{2!EM1D#P)ntDrTTS%fHg5;d&dkC!hXGAIOYNXEL@;0kdHO3@*x^{CO| zFu80_qKvm>qrKuNWE1VpITrk3-(4UCt#{67MU!OEcc9{nFzB2|K`vF1d}duZGJ3J| zcCA#HSZy?NI_b>lT8VjHy2m#-u0@Q__pxC~LvT>b+ka@}o@^>Qbj9Q4FzAxRjW*8P z#4OwU+33H$28uI$V2Qy#TY=a0dY%zG_i&WfoG&X3UD?j3wA#-m%Q9)+i#8F1t`z-I z?6BAuGN){@`bpZ{Sk%+f@lhOi=9KzE&BXK z^-OO*o_~|eU);zS-g5fO4oGmbBYALf=*#d-#>10n#}h?gOd_4GgO%IU5y_{QMt_?} zqW>#3CFoCCs2qc?I>V6aF*yM@FLcKBF)My_BT_;$6|v?=sEyc1t@z12lBCvw;!)tM z;`tu{Ez_H=>*Sq=agUuM 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]}`))