Refactor frontend views
All checks were successful
Build and push image / build-containers (push) Successful in 10m14s
All checks were successful
Build and push image / build-containers (push) Successful in 10m14s
This commit is contained in:
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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:
|
||||
|
||||
Reference in New Issue
Block a user