attachment.clear_all attachment.convert_pdf attachment.delete attachment.upload campaign.cancel campaign.clear_all campaign.create campaign.delete campaign.patch campaign.pause campaign.resume campaign.start gmail.authorized gmail.clear_all gmail.delete gmail.disconnect gmail.test oauth_config.imported phone.add phone.clear_all phone.delete phone.import phone.patch recipients.import recipients.manual_add settings.reset settings.reset_all settings.save settings.save_batch suppression.add suppression.bulk suppression.clear_all suppression.delete suppression.import test_send.error test_send.failed test_send.success user.register === log_audit def === 66:async def log_audit(db: AsyncSession, user_id: Optional[int], action: str, 67- entity: Optional[str] = None, entity_id: Optional[int] = None, 68- detail: Optional[dict] = None, ip: Optional[str] = None) -> None: 69- """Audit log with automatic secret redaction. Imported lazily to avoid cycles.""" 70- from app.models import AuditLog 71- db.add(AuditLog( 72- user_id=user_id, action=action, entity=entity, entity_id=entity_id, 73- detail=sanitize_log_payload(detail or {}), ip_address=ip, 74- created_at=datetime.now(timezone.utc), 75- )) 76- await db.commit() 77- 78-