arbret/backend/seed.py

94 lines
2.9 KiB
Python
Raw Normal View History

2025-12-18 23:33:32 +01:00
"""Seed the database with roles, permissions, and dev users."""
2025-12-18 22:42:32 +01:00
import asyncio
import os
2025-12-18 23:33:32 +01:00
from typing import List
2025-12-18 22:42:32 +01:00
from sqlalchemy import select
from database import engine, async_session, Base
2025-12-18 23:33:32 +01:00
from models import User, Role, Permission, role_permissions, ROLE_DEFINITIONS
2025-12-18 22:42:32 +01:00
from auth import get_password_hash
DEV_USER_EMAIL = os.environ["DEV_USER_EMAIL"]
DEV_USER_PASSWORD = os.environ["DEV_USER_PASSWORD"]
2025-12-18 23:33:32 +01:00
DEV_ADMIN_EMAIL = os.environ["DEV_ADMIN_EMAIL"]
DEV_ADMIN_PASSWORD = os.environ["DEV_ADMIN_PASSWORD"]
async def upsert_role(db, name: str, description: str, permissions: List[Permission]) -> Role:
"""Create or update a role with the given permissions."""
result = await db.execute(select(Role).where(Role.name == name))
role = result.scalar_one_or_none()
if role:
role.description = description
print(f"Updated role: {name}")
else:
role = Role(name=name, description=description)
db.add(role)
await db.flush() # Get the role ID
print(f"Created role: {name}")
# Set permissions for the role
await role.set_permissions(db, permissions)
print(f" Permissions: {', '.join(p.value for p in permissions)}")
return role
async def upsert_user(db, email: str, password: str, role_names: List[str]) -> User:
"""Create or update a user with the given credentials and roles."""
result = await db.execute(select(User).where(User.email == email))
user = result.scalar_one_or_none()
# Get roles
roles = []
for role_name in role_names:
result = await db.execute(select(Role).where(Role.name == role_name))
role = result.scalar_one_or_none()
if role:
roles.append(role)
if user:
user.hashed_password = get_password_hash(password)
user.roles = roles
print(f"Updated user: {email} with roles: {role_names}")
else:
user = User(
email=email,
hashed_password=get_password_hash(password),
roles=roles,
)
db.add(user)
print(f"Created user: {email} with roles: {role_names}")
return user
2025-12-18 22:42:32 +01:00
async def seed():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with async_session() as db:
2025-12-18 23:33:32 +01:00
print("\n=== Seeding Roles ===")
for role_name, role_config in ROLE_DEFINITIONS.items():
await upsert_role(
db,
role_name,
role_config["description"],
role_config["permissions"],
2025-12-18 22:42:32 +01:00
)
2025-12-18 23:33:32 +01:00
print("\n=== Seeding Users ===")
# Create regular dev user
await upsert_user(db, DEV_USER_EMAIL, DEV_USER_PASSWORD, ["regular"])
# Create admin dev user
await upsert_user(db, DEV_ADMIN_EMAIL, DEV_ADMIN_PASSWORD, ["admin"])
await db.commit()
print("\n=== Seeding Complete ===\n")
2025-12-18 22:42:32 +01:00
if __name__ == "__main__":
asyncio.run(seed())