Files
leocrm/app/plugins/builtins/marketplace/schemas.py
T

117 lines
3.8 KiB
Python
Raw Normal View History

"""Pydantic schemas for the Marketplace plugin."""
from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel, Field
class MarketplaceListingRead(BaseModel):
"""Response schema for a marketplace listing."""
id: str
name: str
display_name: str
description: str
version: str
author: str
homepage: str
download_url: str
icon: str
screenshots: list[str] = Field(default_factory=list)
tags: list[str] = Field(default_factory=list)
price: float = 0.0
is_verified: bool = False
download_count: int = 0
min_app_version: str = "0.0.0"
license: str = "MIT"
created_at: datetime | None = None
updated_at: datetime | None = None
class MarketplaceListingCreate(BaseModel):
"""Schema for creating a marketplace listing (admin)."""
name: str = Field(..., min_length=1, max_length=80, pattern=r"^[a-z][a-z0-9_]*$")
display_name: str = Field(..., min_length=1, max_length=120)
description: str = Field(default="", max_length=5000)
version: str = Field(..., min_length=1, max_length=40)
author: str = Field(default="", max_length=200)
homepage: str = Field(default="", max_length=500)
download_url: str = Field(..., min_length=1, max_length=1024)
signature_public_key: str = Field(default="", max_length=5000)
icon: str = Field(default="", max_length=500)
screenshots: list[str] = Field(default_factory=list)
tags: list[str] = Field(default_factory=list)
price: float = Field(default=0.0, ge=0.0)
is_verified: bool = False
min_app_version: str = Field(default="0.0.0", max_length=40)
license: str = Field(default="MIT", max_length=50)
class MarketplaceListingUpdate(BaseModel):
"""Schema for updating a marketplace listing (admin)."""
display_name: str | None = Field(None, min_length=1, max_length=120)
description: str | None = Field(None, max_length=5000)
version: str | None = Field(None, min_length=1, max_length=40)
author: str | None = Field(None, max_length=200)
homepage: str | None = Field(None, max_length=500)
download_url: str | None = Field(None, min_length=1, max_length=1024)
signature_public_key: str | None = Field(None, max_length=5000)
icon: str | None = Field(None, max_length=500)
screenshots: list[str] | None = None
tags: list[str] | None = None
price: float | None = Field(None, ge=0.0)
is_verified: bool | None = None
min_app_version: str | None = Field(None, max_length=40)
license: str | None = Field(None, max_length=50)
class MarketplaceInstallRequest(BaseModel):
"""Request schema for installing a plugin from the marketplace."""
name: str = Field(..., min_length=1, max_length=80)
signature: str | None = Field(None, description="Ed25519 signature (hex) for verification")
public_key: str | None = Field(None, description="Ed25519 public key for verification")
activate: bool = Field(default=False, description="Whether to activate after installation")
class MarketplaceInstallResponse(BaseModel):
"""Response schema for marketplace install result."""
success: bool
name: str
display_name: str
version: str
installed: bool
activated: bool = False
message: str = ""
error: str | None = None
class MarketplaceVerifyResponse(BaseModel):
"""Response schema for signature verification result."""
name: str
version: str
signature_valid: bool
message: str
class MarketplaceListResponse(BaseModel):
"""Response schema for listing marketplace plugins."""
listings: list[MarketplaceListingRead]
total: int
page: int = 1
page_size: int = 20
class MarketplaceCategoriesResponse(BaseModel):
"""Response schema for listing all categories/tags."""
categories: list[str]
total: int