Complete backend
This commit is contained in:
@ -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]
|
||||
|
||||
Reference in New Issue
Block a user