SPB Git forge

spb/hfmarketdata

Public

Open high-frequency market data platform — FirstRate full-history downloader, DuckDB/Parquet lake, open REST API and React docs platform (www.hfmarketdata.io)

127commits 1branches 0releases
24.7 MBsize
maindefault branch
11 days agolast push
JavaScript 53.7% Python 38.3% CSS 4.6% TypeScript 3.1%

accounts: le niveau unlimited est accepté par le service, l'admin et les modèles

Simon-Pierre Boucher committed 20 days ago (Sep 5, 2026) parent c721a35

3 changed files +6 −6

modified hfmarketdata/api/accounts/models.py +1 −1
@@ -12,7 +12,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
12 12 from core.db import Base, create_all
13 13
14 14 ROLES = ("user", "admin")
15 −TIERS = ("free", "high_usage")
15 +TIERS = ("free", "high_usage", "unlimited")
16 16 USER_STATUSES = ("invited", "active", "disabled")
17 17 KEY_STATUSES = ("active", "revoked")
18 18 TOKEN_KINDS = ("verify", "reset", "invite")
modified hfmarketdata/api/accounts/routes_admin.py +3 −3
@@ -31,7 +31,7 @@ ADMIN_ERRORS = ["AUTH_REQUIRED", "FORBIDDEN"]
31 31 class UserCreateBody(BaseModel):
32 32 email: str = Field(..., examples=["ada@example.com"])
33 33 name: str = Field("", max_length=200)
34 − tier: Literal["free", "high_usage"] = "free"
34 + tier: Literal["free", "high_usage", "unlimited"] = "free"
35 35 role: Literal["user", "admin"] = "user"
36 36 password: str | None = Field(None, description="Optional. Without it the user is *invited* (e-mail with a set-password link) "
37 37 "and receives an active API key.")
@@ -40,14 +40,14 @@ class UserCreateBody(BaseModel):
40 40
41 41 class UserUpdateBody(BaseModel):
42 42 name: str | None = Field(None, max_length=200)
43 − tier: Literal["free", "high_usage"] | None = None
43 + tier: Literal["free", "high_usage", "unlimited"] | None = None
44 44 role: Literal["user", "admin"] | None = None
45 45 status: Literal["invited", "active", "disabled"] | None = None
46 46
47 47
48 48 class KeyCreateBody(BaseModel):
49 49 name: str = Field("default", max_length=100)
50 − tier_override: Literal["free", "high_usage"] | None = None
50 + tier_override: Literal["free", "high_usage", "unlimited"] | None = None
51 51
52 52
53 53 def _actor(admin: User) -> str:
modified hfmarketdata/api/accounts/service.py +2 −2
@@ -126,7 +126,7 @@ def create_user(s: Session, email: str, name: str, *, password: str | None = Non
126 126 email = normalize_email(email)
127 127 if get_user_by_email(s, email):
128 128 raise ApiError(409, "EMAIL_TAKEN", "An account with this e-mail already exists. Sign in or reset your password.")
129 − if tier not in ("free", "high_usage"):
129 + if tier not in ("free", "high_usage", "unlimited"):
130 130 raise ApiError(400, "INVALID_PARAMETER", "tier must be free or high_usage")
131 131 if role not in ("user", "admin"):
132 132 raise ApiError(400, "INVALID_PARAMETER", "role must be user or admin")
@@ -234,7 +234,7 @@ def reset_password(s: Session, raw_token: str, password: str) -> User:
234 234
235 235 def update_user(s: Session, u: User, *, actor: str, name: str | None = None, tier: str | None = None,
236 236 role: str | None = None, status: str | None = None) -> User:
237 − allowed = {"tier": ("free", "high_usage"), "role": ("user", "admin"), "status": ("invited", "active", "disabled")}
237 + allowed = {"tier": ("free", "high_usage", "unlimited"), "role": ("user", "admin"), "status": ("invited", "active", "disabled")}
238 238 changes: dict = {}
239 239 if name is not None:
240 240 changes["name"] = name.strip()[:200]
241 241