feat: deploy infrastructure + disk/drive, calendar, presentation, workspaces, onboarding, demo user

This commit is contained in:
2026-05-19 16:26:26 +03:00
parent 688d043dad
commit 3529c39b22
304 changed files with 18826 additions and 1176 deletions
+27 -1
View File
@@ -1,18 +1,22 @@
"""Seed data for VoIdeaAI.
Called from app lifespan when DB tables are empty.
Creates default tariff plans and sets system owner by email.
Creates default tariff plans, demo user, and sets system owner by email.
"""
import json
from datetime import datetime, timezone
from pathlib import Path
from uuid import uuid4
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.config import get_settings
from app.core.security import get_password_hash
from app.models.agent import AgentConfig
from app.models.tariff import TariffPlan
from app.models.user import User
from app.services.user_service import UserService
settings = get_settings()
@@ -60,6 +64,7 @@ async def seed_database(db: AsyncSession) -> None:
"""Seed initial data if tables are empty."""
await _seed_tariff_plans(db)
await _seed_agent_descriptions(db)
await _seed_demo_user(db)
await _seed_owner(db)
@@ -118,6 +123,27 @@ async def _seed_agent_descriptions(db: AsyncSession) -> None:
await db.commit()
async def _seed_demo_user(db: AsyncSession) -> None:
"""Create demo@voidea.app / demo1234 if not exists."""
result = await db.execute(select(User).where(User.email == "demo@voidea.app"))
if result.scalar_one_or_none():
return
demo = User(
id=uuid4(),
email="demo@voidea.app",
password_hash=get_password_hash("demo1234"),
display_name="Demo User",
is_active=True,
is_superuser=True,
role="admin",
accepted_terms_at=datetime.now(timezone.utc),
accepted_terms_version=settings.accepted_terms_version,
)
db.add(demo)
await db.commit()
async def _seed_owner(db: AsyncSession) -> None:
"""Set system owner by SYSTEM_OWNER_EMAIL if configured."""
if not settings.system_owner_email: