async def update_user_image( id: str, profile_image: UploadFile = File(...), current_user: UserInDB = Depends(get_current_user), ): """ Updates a User Image """ extension = profile_image.filename.split(".")[-1] app_dirs.USER_DIR.joinpath(id).mkdir(parents=True, exist_ok=True) try: [ x.unlink() for x in app_dirs.USER_DIR.join(id).glob("profile_image.*") ] except: pass dest = app_dirs.USER_DIR.joinpath(id, f"profile_image.{extension}") with dest.open("wb") as buffer: shutil.copyfileobj(profile_image.file, buffer) if dest.is_file: return SnackResponse.success("File uploaded") else: return SnackResponse.error("Failure uploading file")
def create_theme(data: SiteTheme, session: Session = Depends(generate_session), current_user=Depends(get_current_user)): """ Creates a site color theme database entry """ db.themes.create(session, data.dict()) return SnackResponse.success("Theme Saved")
def get_token( data: OAuth2PasswordRequestForm = Depends(), session: Session = Depends(generate_session), ): email = data.username password = data.password user = authenticate_user(session, email, password) if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token = security.create_access_token(dict(sub=email), timedelta(hours=2)) return SnackResponse.success( "User Successfully Logged In", { "access_token": access_token, "token_type": "bearer" }, )
def create_meal_plan( data: MealPlanIn, session: Session = Depends(generate_session), current_user=Depends(get_current_user) ): """ Creates a meal plan database entry """ processed_plan = process_meals(session, data) db.meals.create(session, processed_plan.dict()) return SnackResponse.success("Mealplan Created")
async def update_multiple_pages( pages: list[CustomPageOut], session: Session = Depends(generate_session), current_user: UserInDB = Depends(get_current_user), ): """ Update multiple custom pages """ for page in pages: db.custom_pages.update(session, page.id, page.dict()) return SnackResponse.success("Pages Updated")
def update_settings( data: SiteSettings, session: Session = Depends(generate_session), current_user=Depends(get_current_user), ): """ Returns Site Settings """ db.settings.update(session, 1, data.dict()) return SnackResponse.success("Settings Updated")
async def reset_user_password( id: int, current_user: UserInDB = Depends(get_current_user), session: Session = Depends(generate_session), ): new_password = get_password_hash(settings.DEFAULT_PASSWORD) db.users.update_password(session, id, new_password) return SnackResponse.success("Users Password Reset")
def scrape_image_url( recipe_slug: str, url: RecipeURLIn, current_user=Depends(get_current_user), ): """ Removes an existing image and replaces it with the incoming file. """ scrape_image(url.url, recipe_slug) return SnackResponse.success("Recipe Image Updated")
async def create_new_page( new_page: CustomPageBase, session: Session = Depends(generate_session), current_user: UserInDB = Depends(get_current_user), ): """ Creates a new Custom Page """ db.custom_pages.create(session, new_page.dict()) return SnackResponse.success("New Page Created")
async def update_group_data( id: int, group_data: UpdateGroup, current_user=Depends(get_current_user), session: Session = Depends(generate_session), ): """ Updates a User Group """ db.groups.update(session, id, group_data.dict()) return SnackResponse.success("Group Settings Updated")
async def create_user( new_user: UserIn, current_user=Depends(get_current_user), session: Session = Depends(generate_session), ): new_user.password = get_password_hash(new_user.password) data = db.users.create(session, new_user.dict()) return SnackResponse.success(f"User Created: {new_user.full_name}", data)
def upload_backup_file(archive: UploadFile = File(...)): """ Upload a .zip File to later be imported into Mealie """ dest = app_dirs.BACKUP_DIR.joinpath(archive.filename) with dest.open("wb") as buffer: shutil.copyfileobj(archive.file, buffer) if dest.is_file: return SnackResponse.success("Backup uploaded") else: return SnackResponse.error("Failure uploading file")
async def create_group( group_data: GroupBase, current_user=Depends(get_current_user), session: Session = Depends(generate_session), ): """ Creates a Group in the Database """ try: db.groups.create(session, group_data.dict()) return SnackResponse.success("User Group Created", {"created": True}) except: return SnackResponse.error("User Group Creation Failed")
def upload_nextcloud_zipfile(type: str, archive: UploadFile = File(...)): """ Upload a .zip File to later be imported into Mealie """ dir = app_dirs.MIGRATION_DIR.joinpath(type) dir.mkdir(parents=True, exist_ok=True) dest = dir.joinpath(archive.filename) with dest.open("wb") as buffer: shutil.copyfileobj(archive.file, buffer) if dest.is_file: return SnackResponse.success("Migration data uploaded") else: return SnackResponse.error("Failure uploading file")
async def update_user( id: int, new_data: UserBase, current_user: UserInDB = Depends(get_current_user), session: Session = Depends(generate_session), ): token = None if current_user.id == id or current_user.admin: db.users.update(session, id, new_data.dict()) if current_user.id == id: access_token = security.create_access_token(data=dict( sub=new_data.email)) token = {"access_token": access_token, "token_type": "bearer"} return SnackResponse.success("User Updated", token)
async def update_password( id: int, password_change: ChangePassword, current_user: UserInDB = Depends(get_current_user), session: Session = Depends(generate_session), ): """ Resets the User Password""" match_passwords = verify_password(password_change.current_password, current_user.password) match_id = current_user.id == id if match_passwords and match_id: new_password = get_password_hash(password_change.new_password) db.users.update_password(session, id, new_password) return SnackResponse.success("Password Updated") else: return SnackResponse.error("Existing password does not match")
def export_database(data: BackupJob, session: Session = Depends(generate_session)): """Generates a backup of the recipe database in json format.""" export_path = backup_all( session=session, tag=data.tag, templates=data.templates, export_recipes=data.options.recipes, export_settings=data.options.settings, export_pages=data.options.pages, export_themes=data.options.themes, export_users=data.options.users, export_groups=data.options.groups, ) try: return SnackResponse.success("Backup Created at " + export_path) except: HTTPException( status_code=400, detail=SnackResponse.error("Error Creating Backup. See Log File"), )
async def create_user_with_token( token: str, new_user: UserIn, session: Session = Depends(generate_session), ): """ Creates a user with a valid sign up token """ # Validate Token db_entry: SignUpOut = db.sign_ups.get(session, token, limit=1) if not db_entry: return SnackResponse.error("Invalid Token") # Create User new_user.admin = db_entry.admin new_user.password = get_password_hash(new_user.password) data = db.users.create(session, new_user.dict()) # DeleteToken db.sign_ups.delete(session, token) # Respond return SnackResponse.success(f"User Created: {new_user.full_name}", data)