from datetime import datetime from typing import Annotated, Any, Self from pydantic import BaseModel, Field, model_validator BaseModel.model_config["populate_by_name"] = True UrlPathLike = Annotated[str, Field(pattern="^[0-9a-zA-Z-]+$", min_length=5)] # Infra class HelloResponse(BaseModel): status: str = "ok" # Main class ShortenResponse(BaseModel): url: str short_url: str created_at: datetime additional_attributes: dict[str, Any] | None class BulkShortenResponseShortUrl(BaseModel): short_url: str additional_attributes: dict[str, Any] | None class BulkShortenResponse(BaseModel): url: str created_at: datetime short_urls: list[BulkShortenResponseShortUrl] class CheckPathResponse(BaseModel): is_available: bool class ShortenRequestBody(BaseModel): url: str domain: str path_length: int = Field(default=6, ge=6, le=15) path: UrlPathLike | None = None path_prefix: UrlPathLike | None = None additional_attributes: dict[str, Any] | None = None class BulkShortenRequestBody(BaseModel): url: str domain: str path_length: int = Field(default=6, ge=6, le=15) path_prefix: UrlPathLike | None = None urls_count: int = Field(default=1, ge=1, le=1000) additional_attributes: list[dict[str, Any]] | None = None @model_validator(mode="after") def check_additional_attributes_length(self) -> Self: if ( self.additional_attributes and len(self.additional_attributes) != self.urls_count ): raise ValueError( "Length of aditional_attributes should be equal to urls_count number" ) return self class CheckPathParams(BaseModel): path: UrlPathLike class DeletePathsRequestBody(BaseModel): paths: list[str] class UpdatePathRequestBody(BaseModel): url: str | None = None domain: str | None = None additional_attributes: dict[str, Any] | None = None