From 4e44c8f7be26d3396489d25a9dbac505a90d7a0a Mon Sep 17 00:00:00 2001 From: Ricel Leite Date: Wed, 18 Feb 2026 23:22:17 -0300 Subject: [PATCH] feat: auto-create organization when user registers --- app/api/auth.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/api/auth.py b/app/api/auth.py index 6884c71..93d1d5d 100644 --- a/app/api/auth.py +++ b/app/api/auth.py @@ -6,11 +6,20 @@ from sqlalchemy import select 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.models.user import User +from app.models.organization import Organization, OrganizationMember, MemberRole from app.schemas.user import UserCreate, UserRead, Token from app.services.audit import AuditService +import re 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) async def register( user_in: UserCreate, @@ -35,6 +44,26 @@ async def register( db.add(user) 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 await AuditService.log( db,