mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-06-02 21:25:45 -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:
parent
e686fa671c
commit
f42114e966
@ -33,6 +33,7 @@ export interface AppInfo {
|
|||||||
version: string;
|
version: string;
|
||||||
demoStatus: boolean;
|
demoStatus: boolean;
|
||||||
allowSignup: boolean;
|
allowSignup: boolean;
|
||||||
|
defaultGroupSlug?: string;
|
||||||
}
|
}
|
||||||
export interface AppStartupInfo {
|
export interface AppStartupInfo {
|
||||||
isFirstLogin: boolean;
|
isFirstLogin: boolean;
|
||||||
|
@ -4,17 +4,28 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, useContext, useRouter } from "@nuxtjs/composition-api";
|
import { computed, defineComponent, useContext, useRouter } from "@nuxtjs/composition-api";
|
||||||
|
import { AppInfo } from "~/lib/api/types/admin";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
layout: "blank",
|
layout: "blank",
|
||||||
setup() {
|
setup() {
|
||||||
const { $auth } = useContext();
|
const { $auth, $axios } = useContext();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const groupSlug = computed(() => $auth.user?.groupSlug);
|
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) {
|
if (groupSlug.value) {
|
||||||
router.push(`/g/${groupSlug.value}`);
|
router.push(`/g/${groupSlug.value}`);
|
||||||
} else {
|
} 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.core.settings.static import APP_VERSION
|
||||||
from mealie.db.db_setup import generate_session
|
from mealie.db.db_setup import generate_session
|
||||||
from mealie.db.models.users.users import User
|
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
|
from mealie.schema.admin.about import AppInfo, AppStartupInfo, AppTheme
|
||||||
|
|
||||||
router = APIRouter(prefix="/about")
|
router = APIRouter(prefix="/about")
|
||||||
|
|
||||||
|
|
||||||
@router.get("", response_model=AppInfo)
|
@router.get("", response_model=AppInfo)
|
||||||
def get_app_info():
|
def get_app_info(session: Session = Depends(generate_session)):
|
||||||
"""Get general application information"""
|
"""Get general application information"""
|
||||||
settings = get_app_settings()
|
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(
|
return AppInfo(
|
||||||
version=APP_VERSION,
|
version=APP_VERSION,
|
||||||
demo_status=settings.IS_DEMO,
|
demo_status=settings.IS_DEMO,
|
||||||
production=settings.PRODUCTION,
|
production=settings.PRODUCTION,
|
||||||
allow_signup=settings.ALLOW_SIGNUP,
|
allow_signup=settings.ALLOW_SIGNUP,
|
||||||
|
default_group_slug=default_group_slug,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ class AppInfo(MealieModel):
|
|||||||
version: str
|
version: str
|
||||||
demo_status: bool
|
demo_status: bool
|
||||||
allow_signup: bool
|
allow_signup: bool
|
||||||
|
default_group_slug: str | None = None
|
||||||
|
|
||||||
|
|
||||||
class AppTheme(MealieModel):
|
class AppTheme(MealieModel):
|
||||||
|
@ -1,11 +1,36 @@
|
|||||||
|
import pytest
|
||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
|
|
||||||
from mealie.core.config import get_app_settings
|
from mealie.core.config import get_app_settings
|
||||||
from mealie.core.settings.static import APP_VERSION
|
from mealie.core.settings.static import APP_VERSION
|
||||||
|
from mealie.repos.repository_factory import AllRepositories
|
||||||
from tests.utils import api_routes
|
from tests.utils import api_routes
|
||||||
from tests.utils.fixture_schemas import TestUser
|
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):
|
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)
|
response = api_client.get(api_routes.admin_about, headers=admin_user.token)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user