feat: add account Pydantic schemas

This commit is contained in:
agatha 2026-03-14 16:32:55 -04:00
parent 2aa3a61ed4
commit f65179bd0b
3 changed files with 93 additions and 1 deletions

View File

@ -12,6 +12,7 @@ dependencies = [
"alembic>=1.18.4", "alembic>=1.18.4",
"arq>=0.27.0", "arq>=0.27.0",
"asyncpg>=0.31.0", "asyncpg>=0.31.0",
"email-validator>=2.3.0",
"fastapi>=0.135.1", "fastapi>=0.135.1",
"httpx[socks]>=0.28.1", "httpx[socks]>=0.28.1",
"pydantic>=2.12.5", "pydantic>=2.12.5",
@ -57,4 +58,4 @@ extend-immutable-calls = ["Depends", "fastapi.Depends", "Query", "fastapi.Query"
[tool.mypy] [tool.mypy]
plugins = ["pydantic.mypy"] plugins = ["pydantic.mypy"]
strict = true strict = true

View File

@ -0,0 +1,67 @@
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, EmailStr, Field
from proxy_pool.accounts.models import CreditTxType
class UserCreate(BaseModel):
email: EmailStr
display_name: str | None = Field(default=None, max_length=128)
class UserResponse(BaseModel):
model_config = {"from_attributes": True}
id: UUID
email: str
display_name: str | None
is_active: bool
created_at: datetime
class ApiKeyResponse(BaseModel):
model_config = {"from_attributes": True}
id: UUID
prefix: str
label: str | None
is_active: bool
last_used_at: datetime | None
expires_at: datetime | None
created_at: datetime
class ApiKeyCreated(BaseModel):
"""Returned only at key creation time — includes the raw key."""
id: UUID
key: str
prefix: str
label: str | None
class RegisterResponse(BaseModel):
user: UserResponse
api_key: ApiKeyCreated
class ApiKeyCreate(BaseModel):
label: str | None = Field(default=None, max_length=128)
class CreditTransactionResponse(BaseModel):
model_config = {"from_attributes": True}
id: UUID
amount: int
tx_type: CreditTxType
description: str | None
reference_id: UUID | None
created_at: datetime
class CreditBalanceResponse(BaseModel):
balance: int
recent_transactions: list[CreditTransactionResponse]

24
uv.lock generated
View File

@ -223,6 +223,28 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" },
] ]
[[package]]
name = "dnspython"
version = "2.8.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" },
]
[[package]]
name = "email-validator"
version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "dnspython" },
{ name = "idna" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" },
]
[[package]] [[package]]
name = "factory-boy" name = "factory-boy"
version = "3.3.3" version = "3.3.3"
@ -668,6 +690,7 @@ dependencies = [
{ name = "alembic" }, { name = "alembic" },
{ name = "arq" }, { name = "arq" },
{ name = "asyncpg" }, { name = "asyncpg" },
{ name = "email-validator" },
{ name = "fastapi" }, { name = "fastapi" },
{ name = "httpx", extra = ["socks"] }, { name = "httpx", extra = ["socks"] },
{ name = "pydantic" }, { name = "pydantic" },
@ -695,6 +718,7 @@ requires-dist = [
{ name = "alembic", specifier = ">=1.18.4" }, { name = "alembic", specifier = ">=1.18.4" },
{ name = "arq", specifier = ">=0.27.0" }, { name = "arq", specifier = ">=0.27.0" },
{ name = "asyncpg", specifier = ">=0.31.0" }, { name = "asyncpg", specifier = ">=0.31.0" },
{ name = "email-validator", specifier = ">=2.3.0" },
{ name = "fastapi", specifier = ">=0.135.1" }, { name = "fastapi", specifier = ">=0.135.1" },
{ name = "httpx", extras = ["socks"], specifier = ">=0.28.1" }, { name = "httpx", extras = ["socks"], specifier = ">=0.28.1" },
{ name = "pydantic", specifier = ">=2.12.5" }, { name = "pydantic", specifier = ">=2.12.5" },