accounts: le niveau unlimited est accepté par le service, l'admin et les modèles
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 | |