Add sub-projects

This commit is contained in:
2025-04-16 15:08:51 +02:00
parent 2dbf216d37
commit db538adfdd
22 changed files with 1157 additions and 0 deletions

View File

@ -0,0 +1,112 @@
"""Models for API views."""
import uuid
from datetime import datetime
from typing import Self, override
from sqlmodel import Field, SQLModel
from . import models
class ClientListResponse(SQLModel):
"""Model list responses."""
id: uuid.UUID
name: str
fingerprint: str
created_at: datetime
updated_at: datetime | None = None
@classmethod
def from_clients(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,
)
)
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,
created_at=client.created_at,
updated_at=client.updated_at or None,
)
if client.secrets:
view.secrets = [secret.name for secret in client.secrets]
return view
class ClientCreate(SQLModel):
"""Model to create a client."""
name: str
fingerprint: str
def to_client(self) -> models.Client:
"""Instantiate a client."""
return models.Client(name=self.name, fingerprint=self.fingerprint)
class ClientUpdate(SQLModel):
"""Model to update the client fingerprint."""
fingerprint: str
class BodyValue(SQLModel):
"""A generic model with just a value parameter."""
value: str
class ClientSecretPublic(SQLModel):
"""Public model to manage client secrets."""
name: str
secret: str
@classmethod
def from_client_secret(cls, client_secret: models.ClientSecret) -> Self:
"""Instantiate from ClientSecret."""
return cls(
name=client_secret.name,
secret=client_secret.secret,
)
class ClientSecretResponse(ClientSecretPublic):
"""A secret view."""
created_at: datetime
updated_at: datetime | None = None
@override
@classmethod
def from_client_secret(cls, client_secret: models.ClientSecret) -> Self:
"""Instantiate from ClientSecret."""
return cls(
name=client_secret.name,
secret=client_secret.secret,
created_at=client_secret.created_at,
updated_at=client_secret.updated_at,
)