From 1156bc315eda641fb869e5db537eae2aeb5e5cb0 Mon Sep 17 00:00:00 2001 From: Allan Eising Date: Thu, 17 Jul 2025 20:47:03 +0200 Subject: [PATCH] Fix type errors --- .../src/sshecret_admin/api/endpoints/auth.py | 4 +- .../src/sshecret_admin/core/app.py | 25 ++++ .../src/sshecret_admin/core/settings.py | 3 +- .../sshecret-frontend/src/api/validation.ts | 7 +- .../components/__tests__/HelloWorld.spec.ts | 11 -- .../src/components/audit/AuditFilters.vue | 4 +- .../src/components/audit/AuditSkeleton.vue | 5 +- .../src/components/audit/AuditTable.vue | 48 +++++--- .../src/components/auth/ChangePassword.vue | 12 +- .../src/components/auth/OidcCallback.vue | 9 +- .../src/components/clients/ClientDetail.vue | 22 ++-- .../src/components/clients/ClientForm.vue | 26 +++-- .../clients/ClientSelectDropdown.vue | 2 +- .../src/components/clients/CreateClient.vue | 53 +++++---- .../src/components/common/AlertToast.vue | 10 +- .../src/components/common/Dialog.vue | 3 +- .../src/components/common/Drawer.vue | 3 +- .../common/MasterDetailWorkspace.vue | 109 ------------------ .../src/components/common/PageNumbers.vue | 6 +- .../src/components/secrets/AddGroup.vue | 10 +- .../src/components/secrets/GroupDetail.vue | 12 +- .../src/components/secrets/GroupMoveTree.vue | 14 ++- .../components/secrets/MoveSecretGroup.vue | 17 ++- .../src/components/secrets/SecretDetail.vue | 22 ++-- .../src/components/secrets/SecretForm.vue | 33 ++++-- .../src/components/secrets/SecretGroup.vue | 2 +- .../secrets/SecretGroupTreeEntry.vue | 2 +- packages/sshecret-frontend/src/main.ts | 5 +- .../sshecret-frontend/src/router/index.ts | 2 +- packages/sshecret-frontend/src/store/auth.ts | 6 + .../src/store/useAlertsStore.ts | 2 +- .../sshecret-frontend/src/views/Dashboard.vue | 6 +- .../src/views/WorkspaceView.vue | 6 - .../src/views/audit/AuditPage.vue | 2 - .../src/views/audit/AuditView.vue | 2 +- .../src/views/clients/ClientDetailView.vue | 18 +-- .../src/views/clients/ClientPage.vue | 4 +- .../src/views/clients/ClientTreeList.vue | 39 ++++--- .../src/views/secrets/SecretDetailView.vue | 73 +++++++++--- .../src/views/secrets/SecretPage.vue | 2 - .../src/views/secrets/SecretTreeList.vue | 28 +++-- packages/sshecret-frontend/tsconfig.json | 24 ++-- packages/sshecret-frontend/vite.config.ts | 2 + 43 files changed, 372 insertions(+), 323 deletions(-) delete mode 100644 packages/sshecret-frontend/src/components/__tests__/HelloWorld.spec.ts delete mode 100644 packages/sshecret-frontend/src/components/common/MasterDetailWorkspace.vue delete mode 100644 packages/sshecret-frontend/src/views/WorkspaceView.vue 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 @@