utp_service/backend/app/schemas/object.py

154 lines
3.9 KiB
Python

from datetime import datetime
from typing import Optional
from pydantic import BaseModel
from app.schemas.tag import TagRead
from app.schemas.ssh_key import (
ObjectSSHCredentialCreate,
ObjectSSHCredentialRead,
ObjectCategoryCredentialCreate,
ObjectCategoryCredentialRead,
)
class ObjectCreate(BaseModel):
name: str
description: Optional[str] = None
server_ip: Optional[str] = None
city: Optional[str] = None
client: Optional[str] = None
# Object DB sync settings
db_host: Optional[str] = None
db_port: int = 5432
db_name: Optional[str] = None
db_user: Optional[str] = None
db_password: Optional[str] = None # plaintext, encrypted on write
db_table: Optional[str] = None
db_col_ip: Optional[str] = None
db_col_type: Optional[str] = None
db_via_tunnel: bool = False
# SSH defaults
ssh_user: Optional[str] = None
ssh_password: Optional[str] = None # plaintext, encrypted on write
ssh_port: int = 22
notes: Optional[str] = None
is_active: bool = True
tag_ids: list[int] = []
ssh_credentials: list[ObjectSSHCredentialCreate] = []
category_credentials: list[ObjectCategoryCredentialCreate] = []
class ObjectUpdate(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
server_ip: Optional[str] = None
city: Optional[str] = None
client: Optional[str] = None
db_host: Optional[str] = None
db_port: Optional[int] = None
db_name: Optional[str] = None
db_user: Optional[str] = None
db_password: Optional[str] = None
db_table: Optional[str] = None
db_col_ip: Optional[str] = None
db_col_type: Optional[str] = None
db_via_tunnel: Optional[bool] = None
ssh_user: Optional[str] = None
ssh_password: Optional[str] = None
ssh_port: Optional[int] = None
notes: Optional[str] = None
is_active: Optional[bool] = None
tag_ids: Optional[list[int]] = None
ssh_credentials: Optional[list[ObjectSSHCredentialCreate]] = None
category_credentials: Optional[list[ObjectCategoryCredentialCreate]] = None
class ObjectRead(BaseModel):
id: int
name: str
description: Optional[str] = None
server_ip: Optional[str] = None
city: Optional[str] = None
client: Optional[str] = None
db_host: Optional[str] = None
db_port: int
db_name: Optional[str] = None
db_user: Optional[str] = None
db_table: Optional[str] = None
db_col_ip: Optional[str] = None
db_col_type: Optional[str] = None
db_via_tunnel: bool
ssh_user: Optional[str] = None
ssh_port: int
notes: Optional[str] = None
is_active: bool
created_at: datetime
updated_at: datetime
tags: list[TagRead] = []
ssh_credentials: list[ObjectSSHCredentialRead] = []
category_credentials: list[ObjectCategoryCredentialRead] = []
device_count: int = 0
model_config = {"from_attributes": True}
class ObjectMetaResponse(BaseModel):
cities: list[str]
clients: list[str]
# --- Import from xlsx ---
class ObjectImportRow(BaseModel):
row: int
name: str
city: str
server_ip: str
client: Optional[str] = None
description: Optional[str] = None
notes: Optional[str] = None
ssh_user: str
db_via_tunnel: bool
class ObjectImportSkipped(BaseModel):
row: int
name: str
server_ip: str
reason: str
class ObjectImportError(BaseModel):
row: int
reason: str
class ObjectImportPreview(BaseModel):
would_create: list[ObjectImportRow]
would_skip: list[ObjectImportSkipped]
errors: list[ObjectImportError]
class ObjectImportResult(BaseModel):
created: int
skipped: int
errors: list[ObjectImportError]
class SyncResult(BaseModel):
created: int
updated: int
skipped: int
errors: list[str] = []
class DiscoveryStarted(BaseModel):
task_id: str
running: bool = True
already_running: bool = False
class DiscoveryStatus(BaseModel):
task_id: str
running: bool