Files
platform-api/app/schemas/tenant.py
Platform CI f9bfc3afbd init
2026-02-21 17:54:44 -05:00

92 lines
2.6 KiB
Python

from pydantic import BaseModel, EmailStr, Field, field_validator
from typing import Optional
from datetime import datetime
from uuid import UUID
import re
def _validate_slug(v: str) -> str:
slug = re.sub(r"[^a-z0-9-]", "-", v.lower()).strip("-")
if len(slug) < 2:
raise ValueError("Company name too short")
if len(slug) > 40:
raise ValueError("Company name too long (max 40 chars)")
return slug
class SignUpRequest(BaseModel):
email: EmailStr
first_name: str = Field(..., min_length=1, max_length=100)
last_name: str = Field(..., min_length=1, max_length=100)
company_name: str = Field(..., min_length=2, max_length=100)
password: str = Field(..., min_length=8)
@field_validator("company_name")
@classmethod
def validate_company(cls, v: str) -> str:
return v # raw company name; slug derived server-side
class TenantResponse(BaseModel):
id: UUID
slug: str
company_name: str
status: str
plan_name: Optional[str] = None
trial_ends_at: Optional[datetime] = None
vcluster_status: str
vcluster_url: Optional[str] = None
data_plane_url: Optional[str] = None
tools_enabled: dict
keycloak_realm: Optional[str] = None
sso_type: str
created_at: datetime
class Config:
from_attributes = True
class ToolUpdateRequest(BaseModel):
superset: Optional[bool] = None
airflow: Optional[bool] = None
trino: Optional[bool] = None
nifi: Optional[bool] = None
spark: Optional[bool] = None
def to_dict(self, current: dict) -> dict:
updated = dict(current)
for tool in ["superset", "airflow", "trino", "nifi", "spark"]:
val = getattr(self, tool)
if val is not None:
updated[tool] = val
return updated
class CustomSSORequest(BaseModel):
alias: str = Field(..., min_length=1)
display_name: str = Field(..., min_length=1)
provider_id: str = Field(default="oidc", pattern="^(oidc|saml)$")
authorization_url: str = Field(...)
token_url: str = Field(...)
client_id: str = Field(...)
client_secret: str = Field(...)
class UserInviteRequest(BaseModel):
email: EmailStr
first_name: str = Field(..., min_length=1)
last_name: str = Field(..., min_length=1)
role: str = Field(default="member", pattern="^(admin|member|viewer)$")
class AdminTrialUpdateRequest(BaseModel):
trial_days: int = Field(..., ge=1, le=365)
class AdminPlanUpdateRequest(BaseModel):
plan_name: str
class PlatformSettingUpdate(BaseModel):
value: str