92 lines
2.6 KiB
Python
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
|