117 lines
3.8 KiB
Python
117 lines
3.8 KiB
Python
|
|
"""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
|