Complete backend

This commit is contained in:
2025-04-18 16:39:05 +02:00
parent 83551ffb4a
commit ec90fb7680
11 changed files with 561 additions and 121 deletions

View File

@ -1,57 +1,48 @@
"""Models for API views."""
import ipaddress
import uuid
from datetime import datetime
from typing import Self, override
from typing import Annotated, Any, Self, override
from sqlmodel import Field, SQLModel
from pydantic import IPvAnyAddress, IPvAnyNetwork
from . import models
class ClientListResponse(SQLModel):
"""Model list responses."""
class ClientView(SQLModel):
"""View for a single client."""
id: uuid.UUID
name: str
fingerprint: str
public_key: str
policies: list[str] = ["0.0.0.0/0", "::/0"]
secrets: list[str] = Field(default_factory=list)
created_at: datetime
updated_at: datetime | None = None
@classmethod
def from_clients(cls, clients: list[models.Client]) -> list[Self]:
def from_client_list(cls, clients: list[models.Client]) -> list[Self]:
"""Generate a list of responses from a list of clients."""
responses: list[Self] = []
for client in clients:
responses.append(
cls(
id=client.id,
name=client.name,
fingerprint=client.fingerprint,
created_at=client.created_at,
updated_at=client.updated_at or None,
)
)
responses: list[Self] = [cls.from_client(client) for client in clients]
return responses
class ClientView(ClientListResponse):
"""View for a single client."""
secrets: list[str] = Field(default_factory=list)
@classmethod
def from_client(cls, client: models.Client) -> Self:
"""Instantiate from a client."""
view = cls(
id=client.id,
name=client.name,
fingerprint=client.fingerprint,
public_key=client.public_key,
created_at=client.created_at,
updated_at=client.updated_at or None,
)
if client.secrets:
view.secrets = [secret.name for secret in client.secrets]
if client.policies:
view.policies = [policy.source for policy in client.policies]
return view
@ -59,17 +50,20 @@ class ClientCreate(SQLModel):
"""Model to create a client."""
name: str
fingerprint: str
public_key: str
def to_client(self) -> models.Client:
"""Instantiate a client."""
return models.Client(name=self.name, fingerprint=self.fingerprint)
public_key = self.public_key
return models.Client(
name=self.name, public_key=public_key
)
class ClientUpdate(SQLModel):
"""Model to update the client fingerprint."""
"""Model to update the client public key."""
fingerprint: str
public_key: str
class BodyValue(SQLModel):
@ -110,3 +104,22 @@ class ClientSecretResponse(ClientSecretPublic):
created_at=client_secret.created_at,
updated_at=client_secret.updated_at,
)
class ClientPolicyView(SQLModel):
"""Update object for client policy."""
sources: list[str] = ["0.0.0.0/0", "::/0"]
@classmethod
def from_client(cls, client: models.Client) -> Self:
"""Create from client."""
if not client.policies:
return cls()
return cls(sources=[policy.source for policy in client.policies])
class ClientPolicyUpdate(SQLModel):
"""Model for updating policies."""
sources: list[IPvAnyAddress | IPvAnyNetwork]