Add sub-projects
This commit is contained in:
112
packages/sshecret-backend/src/sshecret_backend/view_models.py
Normal file
112
packages/sshecret-backend/src/sshecret_backend/view_models.py
Normal 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,
|
||||
)
|
||||
Reference in New Issue
Block a user