async def find_user(self, username: str): try: session = Session() user = session.query(Users).filter_by( username=username).one_or_none() session.commit() except exc.SQLAlchemyError: return JSONResponse({ "message": "Database failure", "code": "1" }, status_code=404) return user
async def add_friends(request): data = await request.json() year, month, day = data["birthdate"].split('-') birthdate = date(int(year), int(month), int(day)) newFriend = Friends( name=data["name"], genre=data["genre"], birthdate=birthdate, idUser=request.user.id, ) try: session = Session() session.add(newFriend) session.commit() except exc.SQLAlchemyError: return JSONResponse({ "message": "name already used", "code": "1" }, status_code=409) return JSONResponse({ "id": newFriend.id, "name": newFriend.name, "genre": newFriend.genre, "birthdate": data["birthdate"], #newFriend.birthdate.format("%y-%m-%d"), "idUser": newFriend.idUser, })
async def authenticate(self, request): #print (request.cookies) #.get("token") inputToken = request.cookies.get("token") if inputToken is None: return None try: session = Session() token = session.query(Tokens).filter_by( token=inputToken).one_or_none() session.commit() except exc.SQLAlchemyError: return JSONResponse({ "message": "Database failure", "code": "1" }, status_code=404) if token is None: return None return AuthCredentials(["authenticated"]), token.user
async def delete_user(request): try: session = Session() session.query(Users).filter_by(id=request.user.id).delete() session.commit() except exc.SQLAlchemyError: return JSONResponse({ "message": "Database failure", "code": "1" }, status_code=404) return JSONResponse({"message": "success"}, status_code=201)
async def logout_user(request): response = JSONResponse({"message": "success"}, status_code=200) response.delete_cookie(key="token", path="/") try: session = Session() session.query(Tokens).filter_by(idUser=request.user.id).delete() session.commit() except exc.SQLAlchemyError: return JSONResponse({ "message": "Failed to logout", "code": "1" }, status_code=404) return response
async def del_friends(request): #for myFriend in request.user.friends: # if myFriend.name == request.path_params['name']: # del myFriend # ORM should clean up the database but it does not work as intended. # return JSONResponse({"message": "delete completed", "code": "0"}) #return JSONResponse({"message": "friend not found", "code": "1"}, status_code=404) try: session = Session() session.query(Friends).filter_by( idUser=request.user.id, name=request.path_params['name']).delete() session.commit() except exc.SQLAlchemyError: return JSONResponse({ "message": "friend does not exist", "code": "1" }, status_code=404) return JSONResponse({"message": "delete completed", "code": "0"})
async def register_user(request): credentials = await request.json() user = Users(username=credentials["username"], username_canonical=credentials["username"].lower(), email=credentials["email"], email_canonical=credentials["email"].lower(), enabled=1, password=await hasher.make(credentials["password"]), last_login=datetime.now()) try: session = Session() session.add(user) session.commit() except exc.SQLAlchemyError: return JSONResponse( { "message": "username or email already used", "code": "1" }, status_code=409) return JSONResponse({"username": user.username}, status_code=201)
async def login_user(request): # TODO: oauth2-jwt: https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/ # Is data signed? try: session = Session() token = session.query(Tokens).filter_by( idUser=request.user.id).one_or_none() session.commit() except exc.SQLAlchemyError: return JSONResponse({ "message": "Database failure", "code": "1" }, status_code=404) if not token: try: session = Session() token = Tokens(idUser=request.user.id, ) session.add(token) session.commit() except exc.SQLAlchemyError: return JSONResponse( { "message": "Failed to generate token", "code": "1" }, status_code=409) response = JSONResponse({"message": "success"}, status_code=201) response.set_cookie( key="token", value=token.token, max_age=300, path="/", secure=True, # assert it's only valid through SSL/HTTPS samesite="strict", ) return response