async def list_transactions(request): group_id: int = int(request.match_info["group_id"]) min_last_changed = request.query.get("min_last_changed") if min_last_changed: try: min_last_changed = datetime.fromisoformat(min_last_changed) except ValueError: raise web.HTTPBadRequest( reason= "Invalid query param 'min_last_changed', must be a valid ISO timestamp." ) forced_transaction_ids = request.query.get("transaction_ids") if forced_transaction_ids: try: forced_transaction_ids = [ int(x) for x in forced_transaction_ids.split(",") ] except ValueError: raise web.HTTPBadRequest( reason= "Invalid query param 'transaction_ids', must be a comma separated list of integers" ) transactions = await request.app["transaction_service"].list_transactions( user_id=request["user"]["user_id"], group_id=group_id, min_last_changed=min_last_changed, additional_transactions=forced_transaction_ids, ) serializer = TransactionSchema() return json_response(data=serializer.dump(transactions, many=True))
async def _account_response(request, account_id: int) -> web.Response: account = await request.app["account_service"].get_account( user_id=request["user"]["user_id"], account_id=account_id ) serializer = AccountSchema() return json_response(data=serializer.dump(account))
async def profile(request): user = await request.app["user_service"].get_user( user_id=request["user"]["user_id"]) serializer = UserSchema() return json_response(data=serializer.dump(user))
async def get_transaction(request: Request): transaction = await request.app["transaction_service"].get_transaction( user_id=request["user"]["user_id"], transaction_id=int(request.match_info["transaction_id"]), ) serializer = TransactionSchema() return json_response(data=serializer.dump(transaction))
async def rename_session(request): data = request["json"] await request.app["user_service"].rename_session( user_id=request["user"]["user_id"], session_id=data["session_id"], name=data["name"], ) return json_response(status=web.HTTPNoContent.status_code)
async def confirm_password_recovery(request): data = request["json"] try: await request.app["user_service"].confirm_password_recovery( token=data["token"], new_password=data["new_password"]) except PermissionError as e: raise web.HTTPBadRequest(reason=str(e)) return json_response(status=web.HTTPNoContent.status_code)
async def recover_password(request): data = request["json"] try: await request.app["user_service"].request_password_recovery( email=data["email"], ) except InvalidPassword as e: raise web.HTTPBadRequest(reason=str(e)) return json_response(status=web.HTTPNoContent.status_code)
async def confirm_registration(request): data = request["json"] try: await request.app["user_service"].confirm_registration( token=data["token"]) except (PermissionError, InvalidCommand) as e: raise web.HTTPBadRequest(reason=str(e)) return json_response(status=web.HTTPNoContent.status_code)
async def list_accounts(request): try: accounts = await request.app["account_service"].list_accounts( user_id=request["user"]["user_id"], group_id=int(request.match_info["group_id"]), ) except PermissionError: raise web.HTTPForbidden(reason="permission denied") serializer = AccountSchema() return json_response(data=serializer.dump(accounts, many=True))
async def change_email(request): data = request["json"] try: await request.app["user_service"].request_email_change( user_id=request["user"]["user_id"], email=data["email"], password=data["password"], ) except InvalidPassword as e: raise web.HTTPBadRequest(reason=str(e)) return json_response(status=web.HTTPNoContent.status_code)
async def change_password(request): data = request["json"] try: await request.app["user_service"].change_password( user_id=request["user"]["user_id"], new_password=data["new_password"], old_password=data["old_password"], ) except InvalidPassword as e: raise web.HTTPBadRequest(reason=str(e)) return json_response(status=web.HTTPNoContent.status_code)
async def register(request): data = request["json"] if request.app["config"]["demo"]["enabled"]: user_id = await request.app["user_service"].demo_register_user( username=data["username"], password=data["password"], email=data["email"], ) else: user_id = await request.app["user_service"].register_user( username=data["username"], password=data["password"], email=data["email"], ) return json_response(data={"user_id": str(user_id)})
async def fetch_access_token(request): data = request["json"] row = await request.app["user_service"].is_session_token_valid( token=data["token"]) if row is None: raise web.HTTPBadRequest(reason="invalid session token") user_id, session_id = row token = token_for_user(user_id=user_id, session_id=session_id, secret_key=request.app["secret_key"]) return json_response(data={ "user_id": user_id, "access_token": token, })
async def login(request): data = request["json"] user_id, session_id, session_token = await request.app[ "user_service"].login_user( username=data["username"], password=data["password"], session_name=data["session_name"], ) token = token_for_user(user_id=user_id, session_id=session_id, secret_key=request.app["secret_key"]) return json_response( data={ "user_id": user_id, "access_token": token, "session_token": session_token, })
async def _transaction_response(request, transaction_id: int) -> web.Response: transaction = await request.app["transaction_service"].get_transaction( user_id=request["user"]["user_id"], transaction_id=transaction_id) serializer = TransactionSchema() return json_response(data=serializer.dump(transaction))
async def confirm_email_change(request): data = request["json"] await request.app["user_service"].confirm_email_change(token=data["token"]) return json_response(status=web.HTTPNoContent.status_code)