mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-30 17:53:31 -04:00 
			
		
		
		
	feat: Redirect Logged Out Users to Default Group, If It's Public (#2772)
* add default group slug to app info if public * redirect public user to default group * added tests --------- Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
This commit is contained in:
		| @@ -33,6 +33,7 @@ export interface AppInfo { | ||||
|   version: string; | ||||
|   demoStatus: boolean; | ||||
|   allowSignup: boolean; | ||||
|   defaultGroupSlug?: string; | ||||
| } | ||||
| export interface AppStartupInfo { | ||||
|   isFirstLogin: boolean; | ||||
|   | ||||
| @@ -4,17 +4,28 @@ | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { computed, defineComponent, useContext, useRouter } from "@nuxtjs/composition-api"; | ||||
| import { AppInfo } from "~/lib/api/types/admin"; | ||||
|  | ||||
| export default defineComponent({ | ||||
|   layout: "blank", | ||||
|   setup() { | ||||
|     const { $auth } = useContext(); | ||||
|     const { $auth, $axios } = useContext(); | ||||
|     const router = useRouter(); | ||||
|     const groupSlug = computed(() => $auth.user?.groupSlug); | ||||
|  | ||||
|     async function redirectPublicUserToDefaultGroup() { | ||||
|       const { data } = await $axios.get<AppInfo>("/api/app/about"); | ||||
|       if (data?.defaultGroupSlug) { | ||||
|         router.push(`/g/${data.defaultGroupSlug}`); | ||||
|       } else { | ||||
|         router.push("/login"); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (groupSlug.value) { | ||||
|       router.push(`/g/${groupSlug.value}`); | ||||
|     } else { | ||||
|       router.push("/login"); | ||||
|       redirectPublicUserToDefaultGroup(); | ||||
|     } | ||||
|   } | ||||
| }); | ||||
|   | ||||
| @@ -5,21 +5,30 @@ from mealie.core.config import get_app_settings | ||||
| from mealie.core.settings.static import APP_VERSION | ||||
| from mealie.db.db_setup import generate_session | ||||
| from mealie.db.models.users.users import User | ||||
| from mealie.repos.all_repositories import get_repositories | ||||
| from mealie.schema.admin.about import AppInfo, AppStartupInfo, AppTheme | ||||
|  | ||||
| router = APIRouter(prefix="/about") | ||||
|  | ||||
|  | ||||
| @router.get("", response_model=AppInfo) | ||||
| def get_app_info(): | ||||
| def get_app_info(session: Session = Depends(generate_session)): | ||||
|     """Get general application information""" | ||||
|     settings = get_app_settings() | ||||
|  | ||||
|     repos = get_repositories(session) | ||||
|     default_group = repos.groups.get_by_name(settings.DEFAULT_GROUP) | ||||
|     if default_group and default_group.preferences and not default_group.preferences.private_group: | ||||
|         default_group_slug = default_group.slug | ||||
|     else: | ||||
|         default_group_slug = None | ||||
|  | ||||
|     return AppInfo( | ||||
|         version=APP_VERSION, | ||||
|         demo_status=settings.IS_DEMO, | ||||
|         production=settings.PRODUCTION, | ||||
|         allow_signup=settings.ALLOW_SIGNUP, | ||||
|         default_group_slug=default_group_slug, | ||||
|     ) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,7 @@ class AppInfo(MealieModel): | ||||
|     version: str | ||||
|     demo_status: bool | ||||
|     allow_signup: bool | ||||
|     default_group_slug: str | None = None | ||||
|  | ||||
|  | ||||
| class AppTheme(MealieModel): | ||||
|   | ||||
| @@ -1,11 +1,36 @@ | ||||
| import pytest | ||||
| from fastapi.testclient import TestClient | ||||
|  | ||||
| from mealie.core.config import get_app_settings | ||||
| from mealie.core.settings.static import APP_VERSION | ||||
| from mealie.repos.repository_factory import AllRepositories | ||||
| from tests.utils import api_routes | ||||
| from tests.utils.fixture_schemas import TestUser | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize("is_private_group", [True, False], ids=["private group", "public group"]) | ||||
| def test_public_about_get_app_info(api_client: TestClient, is_private_group: bool, database: AllRepositories): | ||||
|     settings = get_app_settings() | ||||
|     group = database.groups.get_by_name(settings.DEFAULT_GROUP) | ||||
|     assert group and group.preferences | ||||
|  | ||||
|     group.preferences.private_group = is_private_group | ||||
|     database.group_preferences.update(group.id, group.preferences) | ||||
|  | ||||
|     response = api_client.get(api_routes.app_about) | ||||
|     as_dict = response.json() | ||||
|  | ||||
|     assert as_dict["production"] == settings.PRODUCTION | ||||
|     assert as_dict["version"] == APP_VERSION | ||||
|     assert as_dict["demoStatus"] == settings.IS_DEMO | ||||
|     assert as_dict["allowSignup"] == settings.ALLOW_SIGNUP | ||||
|  | ||||
|     if is_private_group: | ||||
|         assert as_dict["defaultGroupSlug"] == None | ||||
|     else: | ||||
|         assert as_dict["defaultGroupSlug"] == group.slug | ||||
|  | ||||
|  | ||||
| def test_admin_about_get_app_info(api_client: TestClient, admin_user: TestUser): | ||||
|     response = api_client.get(api_routes.admin_about, headers=admin_user.token) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user