async def users_login_get(request: Request) -> Response: session_maker = request.app['db_session_manager'] log.debug(request.headers) if not request.headers['X-Login'] == request.match_info['login']: return HTTPForbidden() session: Session = session_maker() try: user = session.query(Users).filter_by( login=request.match_info['login']).first() if not user: return HTTPNotFound() params = request.rel_url.query.get('output') if params: output = [x.strip() for x in params.split(',')] user_serialized = UsersSchema(only=output).dump(user) else: user_serialized = UsersSchema().dump(user) return Response(body=json.dumps(user_serialized), headers={'content-type': 'application/json'}) finally: session.close()
async def users_put(request: Request) -> Response: session_maker = request.app['db_session_manager'] if not request.headers['X-Login'] == request.match_info['login']: return HTTPForbidden() session: Session = session_maker() try: data = await request.json() if data: user = session.query(Users).filter_by( login=request.match_info['login']).first() if not user: return HTTPNotFound() user_put = UsersSchema().load(data, session=session, partial=True) user.first_name = user_put.first_name user.last_name = user_put.last_name user.email = user_put.email user.phone = user_put.phone session.commit() return HTTPNoContent(headers={'Location': f"/users/{user.login}"}) else: session.close() return HTTPBadRequest() except Exception: session.rollback() raise finally: session.close()
async def users_post(request: Request) -> Response: session_maker = request.app['db_session_manager'] session: Session = session_maker() try: data = await request.json() if data: user = session.query(Users).filter_by(login=data['login']).first() if user: return HTTPConflict() user = UsersSchema().load(data, session=session) session.add(user) session.commit() return HTTPCreated(headers={ 'Location': f"/users/{user.login}", 'Content-Type': 'application/json' }, body=json.dumps({'id': user.id})) else: return HTTPBadRequest() except Exception: session.rollback() raise finally: session.close()
async def users_get(request: Request) -> Response: session_maker = request.app['db_session_manager'] session: Session = session_maker() try: users = session.query(Users).all() params = request.rel_url.query.get('output') if params: output = [x.strip() for x in params.split(',')] users_serialized = UsersSchema(only=output, many=True).dump(users) else: users_serialized = UsersSchema(many=True).dump(users) return Response(body=json.dumps(users_serialized), headers={'content-type': 'application/json'}) finally: session.close()
async def registration(request: Request): if 'X-UserId' in request.headers: return HTTPNotAcceptable() session_maker = request.app['db_session_manager'] session: Session = session_maker() try: data = await request.json() if data: user_db = session.query(Users).filter_by(login=data['login']).first() if user_db: return HTTPConflict() data_without_password = dict(data) data_without_password.pop('password') data_for_auth = {'login': data['login'], 'password': data['password']} if 'account_manager' in request.app['config']['app']: url = request.app['config']['app']['account_manager']['url'] async with aiohttp.ClientSession(raise_for_status=True) as http_client_session: async with http_client_session.post(url, json=data_without_password) as \ resp: account_manager_resp = await resp.json() data_for_auth['id'] = account_manager_resp['id'] user_serializer = UsersSchema().load(data_for_auth, session=session) else: user_serializer = UsersSchema().load(data_for_auth, session=session) session.add(user_serializer) session.commit() return HTTPCreated(headers={'Location': f"/users/{user_serializer.login}"}) else: return HTTPBadRequest() except InvalidURL as ex: raise Exception(f"""Invalid url account_manager:{str(ex)}""") except ClientResponseError: return HTTPConflict() except ClientError as ex: raise Exception(f"""Can't connect to account_manager:{str(ex)}""") except Exception: session.rollback() raise finally: session.close()