Files
personal-ai-assistant/backend/scripts/seed_admin.py
dolgolyov.alexei 7c752cae6b Phase 1: Foundation — backend auth, frontend shell, Docker setup
Backend (FastAPI):
- App factory with async SQLAlchemy 2.0 + PostgreSQL
- Alembic migration for users and sessions tables
- JWT auth (access + refresh tokens, bcrypt passwords)
- Auth endpoints: register, login, refresh, logout, me
- Admin seed script, role-based access deps

Frontend (React + TypeScript):
- Vite + Tailwind CSS + shadcn/ui theme (health-oriented palette)
- i18n with English and Russian translations
- Zustand auth/UI stores with localStorage persistence
- Axios client with automatic token refresh on 401
- Login/register pages, protected routing
- App layout: collapsible sidebar, header with theme/language toggles
- Dashboard with placeholder stats

Infrastructure:
- Docker Compose (postgres, backend, frontend, nginx)
- Nginx reverse proxy with WebSocket support
- Dev override with hot reload

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:25:02 +03:00

36 lines
1.0 KiB
Python

"""Create the initial admin user if it doesn't already exist."""
import asyncio
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.config import settings
from app.core.security import hash_password
from app.database import async_session_factory
from app.models.user import User
async def seed_admin() -> None:
async with async_session_factory() as db:
result = await db.execute(select(User).where(User.email == settings.FIRST_ADMIN_EMAIL))
existing = result.scalar_one_or_none()
if existing:
print(f"Admin user already exists: {existing.email}")
return
admin = User(
email=settings.FIRST_ADMIN_EMAIL,
username=settings.FIRST_ADMIN_USERNAME,
hashed_password=hash_password(settings.FIRST_ADMIN_PASSWORD),
full_name="Administrator",
role="admin",
)
db.add(admin)
await db.commit()
print(f"Admin user created: {admin.email}")
if __name__ == "__main__":
asyncio.run(seed_admin())