feat: auto-create organization when user registers

This commit is contained in:
Ricel Leite 2026-02-18 23:22:17 -03:00
parent 9f73a48e56
commit 4e44c8f7be
1 changed files with 29 additions and 0 deletions

View File

@ -6,11 +6,20 @@ from sqlalchemy import select
from app.core.database import get_db from app.core.database import get_db
from app.core.security import verify_password, get_password_hash, create_access_token, create_refresh_token, decode_token from app.core.security import verify_password, get_password_hash, create_access_token, create_refresh_token, decode_token
from app.models.user import User from app.models.user import User
from app.models.organization import Organization, OrganizationMember, MemberRole
from app.schemas.user import UserCreate, UserRead, Token from app.schemas.user import UserCreate, UserRead, Token
from app.services.audit import AuditService from app.services.audit import AuditService
import re
router = APIRouter() router = APIRouter()
def slugify(text: str) -> str:
"""Convert text to URL-friendly slug."""
text = text.lower()
text = re.sub(r'[^\w\s-]', '', text)
text = re.sub(r'[-\s]+', '-', text)
return text.strip('-')
@router.post("/register", response_model=Token) @router.post("/register", response_model=Token)
async def register( async def register(
user_in: UserCreate, user_in: UserCreate,
@ -35,6 +44,26 @@ async def register(
db.add(user) db.add(user)
await db.flush() await db.flush()
# Create default organization for user
org_name = user_in.full_name or user_in.email.split('@')[0]
org_slug = slugify(org_name) + f"-{user.id}"
organization = Organization(
name=f"{org_name}'s Organization",
slug=org_slug
)
db.add(organization)
await db.flush()
# Add user as organization owner
membership = OrganizationMember(
organization_id=organization.id,
user_id=user.id,
role=MemberRole.OWNER
)
db.add(membership)
await db.flush()
# Audit log # Audit log
await AuditService.log( await AuditService.log(
db, db,