netx/netx_api/auth_schemas.py
oliver 2d92dde8e5 Add filter-based topology bulk writes and refine API key scopes UX.
Filter add/layout/remove keeps MCP payloads small; tokens default MCP scopes and edit them in a modal with a compact help tip.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 07:39:14 +08:00

45 lines
1.5 KiB
Python

"""Pydantic schemas for auth / users / audit / API tokens."""
from __future__ import annotations
from pydantic import BaseModel, Field
class LoginRequest(BaseModel):
username: str = Field(min_length=1, max_length=64)
password: str = Field(min_length=1, max_length=256)
class ChangePasswordRequest(BaseModel):
old_password: str = Field(min_length=1, max_length=256)
new_password: str = Field(min_length=6, max_length=256)
class UserCreateRequest(BaseModel):
username: str = Field(min_length=2, max_length=64)
password: str = Field(min_length=6, max_length=256)
role: str = Field(default="user")
scopes: list[str] | None = None
class UserUpdateRequest(BaseModel):
is_active: bool | None = None
role: str | None = None
password: str | None = Field(default=None, min_length=6, max_length=256)
scopes: list[str] | None = None
class ApiTokenCreateRequest(BaseModel):
name: str = Field(default="default", max_length=128)
# Days until expiry; 0 / null = never expires.
expires_in_days: int | None = Field(default=90, ge=0, le=3650)
# Admin may create a token for another user; others ignored / forced to self.
user_id: str | None = None
# Explicit capability list; empty inherits owner scopes (legacy). Prefer non-empty.
scopes: list[str] | None = None
class ApiTokenUpdateRequest(BaseModel):
name: str | None = Field(default=None, max_length=128)
# Replace token scopes (capped to owner). Empty list clears to inherit owner scopes.
scopes: list[str] | None = None