Jun 27 MT-3 fix error

This commit is contained in:
2026-06-27 10:15:00 -04:00
parent d202b517f6
commit 9f0f7d2f18
+28 -13
View File
@@ -190,18 +190,28 @@ def seed_admin(db_uri, email, username=None, full_name=None, expires_hours=72):
# ── domain registration ────────────────────────────────────────────────────── # ── domain registration ──────────────────────────────────────────────────────
def _upsert_domain(session, tenant_id, domain, kind, is_primary, verified,
tls_status, verification_token=None):
"""Delete any stale row for this domain then insert fresh. Handles orphans
from failed partial runs that left domain rows behind."""
existing = session.query(TenantDomain).filter_by(domain=domain).first()
if existing is not None:
session.delete(existing)
session.flush()
session.add(TenantDomain(
tenant_id=tenant_id, domain=domain, kind=kind, is_primary=is_primary,
verified=verified, verification_token=verification_token,
tls_status=tls_status, created_at=now_eastern()))
def _add_domains(session, tenant_id, slug, base_domain, custom_domain=None): def _add_domains(session, tenant_id, slug, base_domain, custom_domain=None):
primary = f'{slug}.{base_domain}'.lower() primary = f'{slug}.{base_domain}'.lower()
session.add(TenantDomain( _upsert_domain(session, tenant_id, primary, 'subdomain',
tenant_id=tenant_id, domain=primary, kind='subdomain', is_primary=True, verified=True, tls_status='pending')
is_primary=True, verified=True, tls_status='pending',
created_at=now_eastern()))
if custom_domain: if custom_domain:
session.add(TenantDomain( _upsert_domain(session, tenant_id, custom_domain.lower(), 'custom',
tenant_id=tenant_id, domain=custom_domain.lower(), kind='custom', is_primary=False, verified=False, tls_status='pending',
is_primary=False, verified=False, verification_token=secrets.token_hex(16))
verification_token=secrets.token_hex(16),
tls_status='pending', created_at=now_eastern()))
return primary return primary
@@ -332,10 +342,8 @@ def register_tenant_zero(slug, name, plan_code, db_host, db_name, db_user,
primary = _add_domains(s, tenant_id, slug, base, None) primary = _add_domains(s, tenant_id, slug, base, None)
if custom_domain: if custom_domain:
# tenant-zero's existing domain is trusted/verified (already live) # tenant-zero's existing domain is trusted/verified (already live)
s.add(TenantDomain( _upsert_domain(s, tenant_id, custom_domain.lower(), 'custom',
tenant_id=tenant_id, domain=custom_domain.lower(), kind='custom', is_primary=False, verified=True, tls_status='active')
is_primary=False, verified=True, tls_status='active',
created_at=now_eastern()))
s.add(ProvisioningJob(tenant_id=tenant_id, action='create_db', status='ok', s.add(ProvisioningJob(tenant_id=tenant_id, action='create_db', status='ok',
created_at=now_eastern(), finished_at=now_eastern(), created_at=now_eastern(), finished_at=now_eastern(),
log=f'registered tenant-zero {slug} in place (head={head})')) log=f'registered tenant-zero {slug} in place (head={head})'))
@@ -374,11 +382,18 @@ def delete_tenant(slug, drop_db=False, user_host='%'):
dropped = True dropped = True
with control_session() as s: with control_session() as s:
# Delete by tenant_id (normal path) AND by domain string (catches orphans
# from partial failed runs where the tenant row was rolled back but domain
# rows were already flushed to disk).
s.query(TenantDomain).filter_by(tenant_id=tenant_id).delete() s.query(TenantDomain).filter_by(tenant_id=tenant_id).delete()
s.query(ProvisioningJob).filter_by(tenant_id=tenant_id).delete() s.query(ProvisioningJob).filter_by(tenant_id=tenant_id).delete()
t = s.get(Tenant, tenant_id) t = s.get(Tenant, tenant_id)
if t: if t:
s.delete(t) s.delete(t)
# Purge any orphan domain rows for this slug's derived domains.
for orphan_domain in [f'{slug}.{os.environ.get("TENANT_BASE_DOMAIN", "")}']:
if orphan_domain.strip('.'):
s.query(TenantDomain).filter_by(domain=orphan_domain.lower()).delete()
return {'slug': slug, 'tenant_id': tenant_id, 'db_dropped': dropped, return {'slug': slug, 'tenant_id': tenant_id, 'db_dropped': dropped,
'db_name': db_name} 'db_name': db_name}