Refactor frontend views
All checks were successful
Build and push image / build-containers (push) Successful in 10m14s

This commit is contained in:
2025-06-14 21:56:17 +02:00
parent b3debd3ed2
commit bce372a1d1
32 changed files with 1230 additions and 458 deletions

View File

@ -4,6 +4,7 @@
import logging
from typing import Any
import uuid
from fastapi import APIRouter, Depends
from pydantic import BaseModel, Field, TypeAdapter
from sqlalchemy import select, func, and_
@ -28,9 +29,9 @@ class AuditFilter(BaseModel):
limit: int = Field(100, le=100)
subsystem: SubSystem | None = None
operation: Operation | None = None
client_id: str | None = None
client_id: uuid.UUID | None = None
client_name: str | None = None
secret_id: str | None = None
secret_id: uuid.UUID | None = None
secret_name: str | None = None
origin: str | None = None

View File

@ -247,6 +247,26 @@ class ClientOperations:
return ClientPolicyView.from_client(db_client)
def resolve_order(statement: Select[Any], order_by: str, reversed: bool) -> Select[Any]:
"""Resolve ordering."""
LOG.info("Resolve order called")
param_map = {
"name": Client.name,
"description": Client.description,
"created_at": Client.created_at,
"updated_at": Client.updated_at,
}
if column := param_map.get(order_by):
if reversed:
statement = statement.order_by(column.desc())
else:
statement = statement.order_by(column.asc())
#FIXME: Remove
LOG.info("Ordered by %s (%r)", order_by, reversed)
return statement
LOG.warning("Unsupported order field: %s", order_by)
return statement
def filter_client_statement(
statement: Select[Any], params: ClientListParams, ignore_limits: bool = False
) -> Select[Any]:
@ -260,6 +280,8 @@ def filter_client_statement(
statement = statement.where(Client.name.like(params.name__like))
elif params.name__contains:
statement = statement.where(Client.name.contains(params.name__contains))
statement = resolve_order(statement, params.order_by, params.order_reverse)
LOG.info("statement: %s", statement)
if ignore_limits:
return statement

View File

@ -26,6 +26,7 @@ class ClientView(BaseModel):
description: str | None = None
public_key: str
policies: list[str] = ["0.0.0.0/0", "::/0"]
version: int
is_active: bool = True
is_deleted: bool = False
secrets: list[str] = Field(default_factory=list)
@ -52,6 +53,7 @@ class ClientView(BaseModel):
created_at=client.created_at,
updated_at=client.updated_at or None,
deleted_at=client.deleted_at or None,
version=client.version,
is_active=client.is_active,
is_deleted=client.is_deleted,
)
@ -86,6 +88,8 @@ class ClientListParams(BaseModel):
name: str | None = None
name__like: str | None = None
name__contains: str | None = None
order_by: str = "created_at"
order_reverse: bool = True
@model_validator(mode="after")
def validate_expressions(self) -> Self:

View File

@ -1,6 +1,7 @@
"""CLI and main entry point."""
import code
import logging
import os
from pathlib import Path
from typing import Literal, cast
@ -24,6 +25,17 @@ from .models import (
)
from .settings import BackendSettings
handler = logging.StreamHandler()
formatter = logging.Formatter(
"%(asctime)s [%(processName)s: %(process)d] [%(threadName)s: %(thread)d] [%(levelname)s] %(name)s: %(message)s"
)
handler.setFormatter(formatter)
LOG = logging.getLogger()
LOG.addHandler(handler)
LOG.setLevel(logging.INFO)
DEFAULT_LISTEN = "127.0.0.1"
DEFAULT_PORT = 8022
@ -32,6 +44,7 @@ WORKDIR = Path(os.getcwd())
load_dotenv()
def generate_token(
settings: BackendSettings, subsystem: Literal["admin", "sshd"]
) -> str:
@ -73,9 +86,12 @@ def add_system_tokens(settings: BackendSettings) -> None:
@click.group()
@click.option("--database", help="Path to the sqlite database file.")
@click.option("--debug", is_flag=True)
@click.pass_context
def cli(ctx: click.Context, database: str) -> None:
def cli(ctx: click.Context, database: str, debug: bool) -> None:
"""CLI group."""
if debug:
LOG.setLevel(logging.DEBUG)
if database:
settings = BackendSettings(database=str(Path(database).absolute()))
else: