Create a new company and generate an admin invitation code (max_uses=1).
(
data: CompanyCreateRequest,
current_user: User = Depends(require_role("platform_admin")),
db: AsyncSession = Depends(get_db),
)
| 139 | |
| 140 | @router.post("/companies", response_model=CompanyCreateResponse, status_code=201) |
| 141 | async def create_company( |
| 142 | data: CompanyCreateRequest, |
| 143 | current_user: User = Depends(require_role("platform_admin")), |
| 144 | db: AsyncSession = Depends(get_db), |
| 145 | ): |
| 146 | """Create a new company and generate an admin invitation code (max_uses=1).""" |
| 147 | import re |
| 148 | |
| 149 | slug = re.sub(r"[^a-z0-9]+", "-", data.name.lower().strip()).strip("-")[:40] |
| 150 | if not slug: |
| 151 | slug = "company" |
| 152 | slug = f"{slug}-{secrets.token_hex(3)}" |
| 153 | |
| 154 | tenant = Tenant(name=data.name, slug=slug, im_provider="web_only") |
| 155 | db.add(tenant) |
| 156 | await db.flush() |
| 157 | |
| 158 | # Generate admin invitation code (single-use) |
| 159 | code_str = secrets.token_urlsafe(12)[:16].upper() |
| 160 | invite = InvitationCode( |
| 161 | code=code_str, |
| 162 | tenant_id=tenant.id, |
| 163 | max_uses=1, |
| 164 | created_by=current_user.id, |
| 165 | ) |
| 166 | db.add(invite) |
| 167 | await db.flush() |
| 168 | |
| 169 | return CompanyCreateResponse( |
| 170 | company=CompanyStats( |
| 171 | id=tenant.id, |
| 172 | name=tenant.name, |
| 173 | slug=tenant.slug, |
| 174 | is_active=tenant.is_active, |
| 175 | created_at=tenant.created_at, |
| 176 | ), |
| 177 | admin_invitation_code=code_str, |
| 178 | ) |
| 179 | |
| 180 | |
| 181 | @router.put("/companies/{company_id}/toggle") |
nothing calls this directly
no test coverage detected