diff --git a/app/admin/router.py b/app/admin/router.py index f486acc..ca95d34 100644 --- a/app/admin/router.py +++ b/app/admin/router.py @@ -1,7 +1,7 @@ from jinja2 import Environment, FileSystemLoader -from fastapi import APIRouter, Request -from fastapi.responses import HTMLResponse +from fastapi import APIRouter, Form, Request +from fastapi.responses import HTMLResponse, RedirectResponse from sqlalchemy import func, select from app.database import async_session_factory @@ -13,6 +13,7 @@ from app.repositories.payment import PaymentRepository from app.repositories.server import ServerRepository from app.repositories.tariff import TariffRepository from app.repositories.user import UserRepository +from app.services.user import UserService router = APIRouter(prefix="/admin", tags=["admin"]) @@ -66,16 +67,49 @@ async def dashboard(request: Request): @router.get("/users", response_class=HTMLResponse) -async def users_page(request: Request): +async def users_page(request: Request, error: str = ""): async with async_session_factory() as session: repo = UserRepository(session) users = await repo.get_all() return HTMLResponse( - _render("users.html", request=request, users=users) + _render("users.html", request=request, users=users, error=error) ) +@router.post("/users/create", response_class=HTMLResponse) +async def users_create( + request: Request, + telegram_id: int = Form(...), + username: str = Form(""), + full_name: str = Form(""), + language_code: str = Form("ru"), +): + async with async_session_factory() as session: + user_repo = UserRepository(session) + user_service = UserService(user_repo) + + existing = await user_repo.get_by_telegram_id(telegram_id) + if existing is not None: + return HTMLResponse( + _render( + "users.html", + request=request, + users=await user_repo.get_all(), + error=f"User with telegram_id {telegram_id} already exists", + ) + ) + + await user_service.register( + telegram_id=telegram_id, + username=username or None, + full_name=full_name or str(telegram_id), + language_code=language_code, + ) + + return RedirectResponse(url="/admin/users", status_code=303) + + @router.get("/payments", response_class=HTMLResponse) async def payments_page(request: Request): async with async_session_factory() as session: diff --git a/app/templates/users.html b/app/templates/users.html index d588541..0848438 100644 --- a/app/templates/users.html +++ b/app/templates/users.html @@ -2,6 +2,42 @@ {% block title %}Users — VPN Control Panel{% endblock %} {% block content %}