From 88e34c281670831ef24eb1bfdd8cce79c9c1072b Mon Sep 17 00:00:00 2001 From: Kelly Lockhart <2926089+kelockhart@users.noreply.github.com> Date: Thu, 25 May 2023 18:11:31 -0400 Subject: [PATCH 1/2] Added endpoint to enable/disable all myADS for a user --- requirements.txt | 2 +- vault_service/tests/test_user.py | 94 ++++++++++++++++++++++++++++++++ vault_service/views/user.py | 38 +++++++++++++ 3 files changed, 133 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 75e1190..1fb87a3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -git+https://github.com/adsabs/ADSMicroserviceUtils.git@v1.1.9 +git+https://github.com/adsabs/ADSMicroserviceUtils.git@v1.2.3 git+https://github.com/adsabs/ADSParser.git@v1.0.4 alembic==0.8.9 psycopg2==2.8.6 diff --git a/vault_service/tests/test_user.py b/vault_service/tests/test_user.py index 0167a53..0676203 100644 --- a/vault_service/tests/test_user.py +++ b/vault_service/tests/test_user.py @@ -775,5 +775,99 @@ def test_myads_import(self): self.assertEqual(len(r.json['new']), 1) self.assertEqual(len(r.json['existing']), 0) + @httpretty.activate + def test_myads_status_update(self): + with self.app.session_scope() as session: + q = session.query(Query).first() + + qid = q.qid + + # make sure no setups exist + r = self.client.get(url_for('user.myads_notifications'), + headers={'Authorization': 'secret', 'X-Adsws-Uid': '33'}) + + self.assertStatus(r, 204) + + # this shouldn't do anything since there are no setups + # r = self.client.put(url_for('user.myads_status', user_id=33), + # headers={'Authorization': 'secret'}, + # data=json.dumps({'active': False}), + # content_type='application/json') + # + # self.assertStatus(r, 204) + + # save some queries + r = self.client.post(url_for('user.myads_notifications'), + headers={'Authorization': 'secret', 'X-Adsws-Uid': '33'}, + data=json.dumps({'name': 'Query 1', 'qid': qid, 'stateful': True, + 'frequency': 'daily', 'type': 'query'}), + content_type='application/json') + + self.assertStatus(r, 200) + self.assertTrue(r.json['active']) + + r = self.client.post(url_for('user.myads_notifications'), + headers={'Authorization': 'secret', 'X-Adsws-Uid': '33'}, + data=json.dumps({'name': 'Query 2', 'qid': qid, 'stateful': True, + 'frequency': 'daily', 'type': 'query'}), + content_type='application/json') + + self.assertStatus(r, 200) + self.assertTrue(r.json['active']) + + # send a bad request + r = self.client.put(url_for('user.myads_status', user_id=33), + headers={'Authorization': 'secret'}, + data=json.dumps({'stateful': False}), + content_type='application/json') + + self.assertStatus(r, 400) + + # try to send extra keys + r = self.client.put(url_for('user.myads_status', user_id=33), + headers={'Authorization': 'secret'}, + data=json.dumps({'frequency': 'weekly', 'active': True}), + content_type='application/json') + + self.assertStatus(r, 200) + + r = self.client.get(url_for('user.myads_notifications'), + headers={'Authorization': 'secret', 'X-Adsws-Uid': '33'}) + self.assertStatus(r, 200) + + for setup in r.json: + # status should be unchanged + self.assertTrue(setup['active']) + # frequency should also be unchanged + self.assertEqual(setup['frequency'], 'daily') + + # disable all notifications + r = self.client.put(url_for('user.myads_status', user_id=33), + headers={'Authorization': 'secret'}, + data=json.dumps({'active': False}), + content_type='application/json') + + self.assertStatus(r, 200) + + r = self.client.get(url_for('user.myads_notifications'), + headers={'Authorization': 'secret', 'X-Adsws-Uid': '33'}) + + for setup in r.json: + self.assertFalse(setup['active']) + + # enable all notifications + r = self.client.put(url_for('user.myads_status', user_id=33), + headers={'Authorization': 'secret'}, + data=json.dumps({'active': True}), + content_type='application/json') + + self.assertStatus(r, 200) + + r = self.client.get(url_for('user.myads_notifications'), + headers={'Authorization': 'secret', 'X-Adsws-Uid': '33'}) + + for setup in r.json: + self.assertTrue(setup['active']) + if __name__ == '__main__': unittest.main() diff --git a/vault_service/views/user.py b/vault_service/views/user.py index 21966b9..e1f569d 100644 --- a/vault_service/views/user.py +++ b/vault_service/views/user.py @@ -806,6 +806,44 @@ def export(iso_datestring): return json.dumps({'users': output}), 200 +@advertise(scopes=['ads-consumer:myads'], rate_limit = [1000, 3600*24]) +@bp.route('/myads-status-update/', methods=['PUT']) +def myads_status(user_id): + """ + Enable/disable all myADS notifications for a given user + + payload: {'active': True/False} + + :param user_id: ID of user to update + :return: + """ + try: + payload, headers = check_request(request) + except Exception as e: + return json.dumps({'msg': e.message or e.description}), 400 + + + if 'active' in payload: + status = {'active': payload['active']} + else: + return 'Only status updates allowed', 400 + + with current_app.session_scope() as session: + all_setups = session.query(MyADS).filter_by(user_id=user_id).order_by(MyADS.id.asc()).all() + if len(all_setups) == 0: + return '{}', 204 + ids = [s.id for s in all_setups] + + for s in ids: + msg, status_code = _edit_myads_notification(status, headers, user_id, s) + if status_code != 200: + outmsg = 'Error %s while updating status for setup %s for user %s. Error message: %s',\ + status_code, s, user_id, msg + return json.dumps({'msg': outmsg}), 500 + + return '{}', 200 + + @advertise(scopes=[], rate_limit=[1000, 3600*24]) @bp.route('/myads-import', methods=['GET']) def import_myads(): From cc713fb5b14cb41e161ff766f8dbbd558eef51e3 Mon Sep 17 00:00:00 2001 From: Kelly Lockhart <2926089+kelockhart@users.noreply.github.com> Date: Thu, 25 May 2023 18:12:54 -0400 Subject: [PATCH 2/2] Uncommented out a code block --- vault_service/tests/test_user.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vault_service/tests/test_user.py b/vault_service/tests/test_user.py index 0676203..078cc78 100644 --- a/vault_service/tests/test_user.py +++ b/vault_service/tests/test_user.py @@ -789,12 +789,12 @@ def test_myads_status_update(self): self.assertStatus(r, 204) # this shouldn't do anything since there are no setups - # r = self.client.put(url_for('user.myads_status', user_id=33), - # headers={'Authorization': 'secret'}, - # data=json.dumps({'active': False}), - # content_type='application/json') - # - # self.assertStatus(r, 204) + r = self.client.put(url_for('user.myads_status', user_id=33), + headers={'Authorization': 'secret'}, + data=json.dumps({'active': False}), + content_type='application/json') + + self.assertStatus(r, 204) # save some queries r = self.client.post(url_for('user.myads_notifications'),