Initial commit: site monorepo with API, web, and infra.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
"""WESP-shaped auth endpoints for copied static UI (/api/auth/*)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, Response, status
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from app.core.dependencies import get_current_user
|
||||
from app.modules.auth.router import _set_refresh_cookie
|
||||
from app.modules.auth.service import login as auth_login
|
||||
from app.modules.users.models import User
|
||||
|
||||
router = APIRouter(prefix="/auth", tags=["zootech-wesp-auth"])
|
||||
|
||||
_USER_RULES = {
|
||||
"password_min_len": 8,
|
||||
"login_min_len": 3,
|
||||
}
|
||||
|
||||
|
||||
class WespLoginIn(BaseModel):
|
||||
login: str = Field(min_length=1)
|
||||
password: str = Field(min_length=1)
|
||||
remember: bool = False
|
||||
|
||||
|
||||
@router.post("/login")
|
||||
def wesp_auth_login(payload: WespLoginIn, response: Response):
|
||||
email = payload.login.strip()
|
||||
if "@" not in email:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail={"status": "error", "message": "Используйте email (admin@compton.example)"},
|
||||
)
|
||||
try:
|
||||
access_token, refresh_token, user = auth_login(email, payload.password)
|
||||
except ValueError:
|
||||
return {"status": "error", "message": "Неверный логин или пароль"}
|
||||
except PermissionError as exc:
|
||||
detail = str(exc)
|
||||
if detail == "EMAIL_NOT_VERIFIED":
|
||||
return {"status": "error", "message": "Email не подтверждён"}
|
||||
if detail == "ACCOUNT_BLOCKED":
|
||||
return {"status": "error", "message": "Учётная запись заблокирована"}
|
||||
return {"status": "error", "message": "Вход временно недоступен"}
|
||||
|
||||
_set_refresh_cookie(response, refresh_token)
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Авторизация успешна",
|
||||
"authenticated": True,
|
||||
"user_login": user.email,
|
||||
"access_token": access_token,
|
||||
"user": {
|
||||
"id": user.id,
|
||||
"email": user.email,
|
||||
"role": user.role,
|
||||
"is_superuser": user.is_superuser,
|
||||
"status": user.status,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@router.get("/check")
|
||||
def wesp_auth_check(user: User = Depends(get_current_user)):
|
||||
return {
|
||||
"status": "success",
|
||||
"authenticated": True,
|
||||
"user_login": user.email,
|
||||
"remember_login": False,
|
||||
"is_superuser": bool(user.is_superuser),
|
||||
"can_lab": bool(user.is_superuser),
|
||||
"user_rules": _USER_RULES,
|
||||
}
|
||||
|
||||
|
||||
@router.get("/get_current_credentials")
|
||||
def wesp_get_current_credentials(user: User = Depends(get_current_user)):
|
||||
return {
|
||||
"status": "success",
|
||||
"login": user.email,
|
||||
"password": "",
|
||||
"user_rules": _USER_RULES,
|
||||
}
|
||||
|
||||
|
||||
@router.post("/logout")
|
||||
def wesp_logout():
|
||||
return {"status": "success", "message": "Выход выполнен успешно"}
|
||||
Reference in New Issue
Block a user