def drug_courses(): if request.method == 'GET': limit = int(request.args.get('limit', 25)) if not 0 < limit <= 100: return jsonify({'error': '\'limit\' must be in (0, 100]..'}), 400 offset = int(request.args.get('offset', 0)) if not 0 <= offset: return jsonify({'error': '\'limit\' must be in [0, +inf).'}), 400 with db_connecton() as conn: res = r.table('drug_courses').pluck( 'id', 'drug_name', 'diagnosis_id', 'start_time', 'duration').skip(offset).limit(limit).run(conn) return jsonify({'drug_courses': list(res)}), 200 elif request.method == 'POST': if any(_ not in COURSE_FIELDS for _ in request.json): return jsonify({'error': 'JSON contains unsupported fields.'}), 400 course = request.json course.update({ 'user_phone_number': get_jwt_identity(), 'intakes': list() }) with db_connecton() as conn: res = r.table('drug_courses').insert(course).run(conn) if not db_operation_success(res): return jsonify({'error': 'An error occurred on server side.'}), 500 return jsonify({ 'success': True, 'drug_course_id': res['generated_keys'][0] }), 201
def course(course_id: str): with db_connecton() as conn: course_exists = r.table('drug_courses').get_all(course_id).count().eq( 1).run(conn) if not course_exists: return jsonify( {'error': 'Drug course with given ID do not exist.'}), 400 is_accessible = r.table('drug_courses').get( course_id)['user_phone_number'].eq(get_jwt_identity()).run(conn) if not is_accessible: return jsonify( {'error': 'You have no permissions to this course.'}), 403 if request.method == 'GET': c = r.table('drug_courses').get(course_id).run(conn) return jsonify({'drug_course': c}), 200 elif request.method == 'PATCH': if any(_ not in COURSE_FIELDS for _ in request.json): return jsonify({'error': 'JSON contains unsupported fields.'}), 400 res = r.table('drug_courses').get(course_id).update( request.json, return_changes=True).run(conn) if not db_operation_success(res): return jsonify({'error': 'An error occurred on server side.'}), 500 return jsonify({'drug_course': res['changes'][0]['new_val']}), 200 elif request.method == 'DELETE': res = r.table('drug_courses').get(course_id).delete().run(conn) if not db_operation_success(res): return jsonify({'error': 'An error occurred on server side.'}), 500 return jsonify({'success': True}), 200
def users(): if not request.is_json: return abort(400, 'Missing JSON in request') if not all(_ in request.json for _ in ('phone_number', 'first_name', 'last_name')): return abort(400, 'Request must contain \'phone_number\', \'first_name\', \'last_name\' fields.') phone_number = request.json['phone_number'] if not isinstance(phone_number, int): return abort(400, '\'phone_number\' is incorrect.') first_name = request.json['first_name'] last_name = request.json['last_name'] sms_code = generate_sms_code() with db_connecton() as conn: r.table('users').insert( { 'phone_number': phone_number, 'first_name': first_name, 'last_name': last_name, 'last_sms_code': sms_code, } ).run(conn) send_sms_code(phone_number, sms_code) return jsonify({ 'success': True })
def diagnoses(): if request.method == 'GET': limit = int(request.args.get('limit', 25)) if not 0 < limit <= 100: return jsonify({'error': '\'limit\' must be in (0, 100]..'}), 400 offset = int(request.args.get('offset', 0)) if not 0 <= offset: return jsonify({'error': '\'limit\' must be in [0, +inf).'}), 400 with db_connecton() as conn: res = r.table('diagnoses').filter({ 'user_phone_number': get_jwt_identity() }).skip(offset).limit(limit).pluck( 'id', 'name', 'created_at', 'symptoms' ).run(conn) return jsonify({ 'diagnoses': list(res) }), 200 elif request.method == 'POST': if any(_ not in DIAGNOSIS_FIELDS for _ in request.json): return jsonify({'error': 'JSON contains unsupported fields.'}), 400 diagnosis = request.json diagnosis.update({ 'user_phone_number': get_jwt_identity(), 'created_at': int(datetime.now().timestamp()) }) with db_connecton() as conn: res = r.table('diagnoses').insert(diagnosis).run(conn) if not db_operation_success(res): return jsonify({'error': 'An error occurred on server side.'}), 500 return jsonify({ 'success': True, 'diagnosis_id': res['generated_keys'][0] }), 201
def verify(): if not request.is_json: return jsonify({'error': 'Missing JSON in request.'}), 400 if not all(_ in request.json for _ in ('phone_number', 'sms_code')): return jsonify({'error': 'Request must contain \'phone_number\', \'sms_code\' fields.'}), 400 phone_number = request.json.get('phone_number') if not isinstance(phone_number, int): return jsonify({'error': '\'phone_number\' is incorrect.'}), 400 sms_code = request.json.get('sms_code') with db_connecton() as conn: is_good = r.table('users').get(phone_number)['last_sms_code'].eq(sms_code).run(conn) if not is_good: return jsonify({'error': 'Bad \'phone_number\' of \'sms_code\'.'}), 401 access_token = create_access_token(identity=phone_number, expires_delta=timedelta(days=365)) return jsonify(access_token=access_token)
def request_sms_code(): if not request.is_json: return jsonify({'error': 'Missing JSON in request.'}), 400 if 'phone_number' not in request.json: return jsonify({'error': 'Request must contain \'phone_number\' field.'}), 400 phone_number = request.json['phone_number'] if not isinstance(phone_number, int): return jsonify({'error': '\'phone_number\' is incorrect.'}), 400 sms_code = generate_sms_code() with db_connecton() as conn: r.table('users').get(phone_number).update({ 'last_sms_code': sms_code }).run(conn) send_sms_code(phone_number, sms_code) return jsonify({ 'success': True })
def intakes(course_id: str): with db_connecton() as conn: course_exists = r.table('drug_courses').get_all(course_id).count().eq( 1).run(conn) if not course_exists: return jsonify( {'error': 'Drug course with given ID do not exist.'}), 400 is_accessible = r.table('drug_courses').get( course_id)['user_phone_number'].eq(get_jwt_identity()).run(conn) if not is_accessible: return jsonify( {'error': 'You have no permissions to this course.'}), 403 if request.method == 'GET': limit = int(request.args.get('limit', 25)) if not 0 < limit <= 100: return jsonify({'error': '\'limit\' must be in (0, 100]..'}), 400 offset = int(request.args.get('offset', 0)) if not 0 <= offset: return jsonify({'error': '\'limit\' must be in [0, +inf).'}), 400 res = r.table('drug_courses').get(course_id)['intakes'].skip( offset).limit(limit).run(conn) return jsonify({'intakes': res}), 200 elif request.method == 'POST': if 'at' not in request.json or len(request.json) > 1: return jsonify({'error': 'JSON contains unsupported fields.'}), 400 at = request.json['at'] res = r.table('drug_courses').get(course_id).update({ 'intakes': r.row['intakes'].append(at) }).run(conn) if not db_operation_success(res): return jsonify({'error': 'An error occurred on server side.'}), 500 return jsonify({'success': True}), 200
def intakes_count(course_id: str): with db_connecton() as conn: count = r.table('drug_courses').get(course_id)['intakes'].count().run( conn) return jsonify({'intakes_count': count}), 200