diff --git a/packages/sshecret-admin/src/sshecret_admin/api/endpoints/auth.py b/packages/sshecret-admin/src/sshecret_admin/api/endpoints/auth.py index 2ca67ec..d71ff42 100644 --- a/packages/sshecret-admin/src/sshecret_admin/api/endpoints/auth.py +++ b/packages/sshecret-admin/src/sshecret_admin/api/endpoints/auth.py @@ -189,7 +189,9 @@ def create_router(dependencies: AdminDependencies) -> APIRouter: ) path = f"/auth_cb#access_token={access_token}&refresh_token={refresh_token}" - callback_url = os.path.join(dependencies.settings.frontend_url, path) + callback_url = os.path.join("admin", path) + if dependencies.settings.frontend_test_url: + callback_url = os.path.join(dependencies.settings.frontend_test_url, path) origin = "UNKNOWN" if request.client: origin = request.client.host diff --git a/packages/sshecret-admin/src/sshecret_admin/core/app.py b/packages/sshecret-admin/src/sshecret_admin/core/app.py index f63b32a..5a41f5f 100644 --- a/packages/sshecret-admin/src/sshecret_admin/core/app.py +++ b/packages/sshecret-admin/src/sshecret_admin/core/app.py @@ -4,12 +4,14 @@ # from collections.abc import AsyncGenerator import logging +import pathlib from contextlib import asynccontextmanager from fastapi import FastAPI, Request, status from fastapi.encoders import jsonable_encoder from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse +from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware from sqlalchemy.ext.asyncio import AsyncSession @@ -29,6 +31,28 @@ from .settings import AdminServerSettings LOG = logging.getLogger(__name__) +def valid_frontend_directory(frontend_dir: pathlib.Path) -> bool: + """Validate frontend dir.""" + if not frontend_dir.exists(): + return False + if not frontend_dir.is_dir(): + return False + if (frontend_dir / "index.html").exists(): + return True + return False + + +def setup_frontend(app: FastAPI, settings: AdminServerSettings) -> None: + """Setup frontend.""" + if not settings.frontend_dir: + return + if not valid_frontend_directory(settings.frontend_dir): + LOG.error("Error: Not a valid frontend directory: %s", settings.frontend_dir) + return + frontend = StaticFiles(directory=settings.frontend_dir) + app.mount("/admin", frontend, name="frontend") + + def create_admin_app( settings: AdminServerSettings, create_db: bool = False, @@ -104,5 +128,6 @@ def create_admin_app( dependencies = BaseDependencies(settings, get_db_session, get_async_session) app.include_router(api.create_api_router(dependencies)) + setup_frontend(app, settings) return app diff --git a/packages/sshecret-admin/src/sshecret_admin/core/settings.py b/packages/sshecret-admin/src/sshecret_admin/core/settings.py index 8178cfe..df49ab7 100644 --- a/packages/sshecret-admin/src/sshecret_admin/core/settings.py +++ b/packages/sshecret-admin/src/sshecret_admin/core/settings.py @@ -40,7 +40,8 @@ class AdminServerSettings(BaseSettings): password_manager_directory: Path | None = None oidc: OidcSettings | None = None frontend_origin: str = Field(default="*") - frontend_url: str + frontend_test_url: str | None = Field(default=None) + frontend_dir: Path | None = None @property def admin_db(self) -> URL: diff --git a/packages/sshecret-frontend/src/api/validation.ts b/packages/sshecret-frontend/src/api/validation.ts index 91138dd..852fee2 100644 --- a/packages/sshecret-frontend/src/api/validation.ts +++ b/packages/sshecret-frontend/src/api/validation.ts @@ -1,9 +1,12 @@ import type { Ref } from 'vue' -import SlInput from '@shoelace-style/shoelace/dist/components/input/input.js' +//import SlInput from '@shoelace-style/shoelace/dist/components/input/input.js' -export function setFieldValidation(field: Ref, errorMessage: string = '') { +export function setFieldValidation(field: Ref, errorMessage: string = '') { // Set validation on a field + if (!field.value) { + return + } field.value?.setCustomValidity(errorMessage) field.value?.reportValidity() } diff --git a/packages/sshecret-frontend/src/components/__tests__/HelloWorld.spec.ts b/packages/sshecret-frontend/src/components/__tests__/HelloWorld.spec.ts deleted file mode 100644 index 2533202..0000000 --- a/packages/sshecret-frontend/src/components/__tests__/HelloWorld.spec.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { describe, it, expect } from 'vitest' - -import { mount } from '@vue/test-utils' -import HelloWorld from '../HelloWorld.vue' - -describe('HelloWorld', () => { - it('renders properly', () => { - const wrapper = mount(HelloWorld, { props: { msg: 'Hello Vitest' } }) - expect(wrapper.text()).toContain('Hello Vitest') - }) -}) diff --git a/packages/sshecret-frontend/src/components/audit/AuditFilters.vue b/packages/sshecret-frontend/src/components/audit/AuditFilters.vue index f6d4a75..93415a3 100644 --- a/packages/sshecret-frontend/src/components/audit/AuditFilters.vue +++ b/packages/sshecret-frontend/src/components/audit/AuditFilters.vue @@ -1,7 +1,7 @@