Skip to main content

Overview

The Zarna backend is organized into 25+ routers, each handling a specific domain of functionality. Location: api/app/routers/

Router Organization

CRM Routers

companies.py

Company CRUD, search, analytics

contacts.py

Contact management and relationships

deals.py

Deal pipeline and forecasting

interactions.py

Meetings, calls, email tracking

financials.py

Financial records and metrics

notes.py

Notes and observations

File Management Routers

files.py

File upload, processing, extraction

drive.py

Google Drive integration

sharepoint.py

SharePoint integration

egnyte.py

Egnyte file management

basecamp.py

Basecamp project integration

Communication Routers

emails.py

Email tracking and history

email_bot.py

Automated email handling

calendar.py

Google Calendar integration

AI & Analytics Routers

reports.py

AI-powered report generation

sourcing.py

AI company sourcing with Exa

agentic_chat.py

Multi-agent chat system

prompts.py

AI prompt operations

Management Routers

users.py

User management

firms.py

Firm management

staffing.py

Team staffing and workload

utilities.py

Utility endpoints

chat_history.py

Chat conversation history

meeting_interactions.py

Meeting analysis and export

Router Structure

Standard Pattern

from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from typing import List, Optional

router = APIRouter(
    prefix="/api/companies",
    tags=["CRM: Companies"]
)

class CompanyCreate(BaseModel):
    name: str
    industry: Optional[str] = None

class CompanyResponse(BaseModel):
    id: str
    name: str
    industry: Optional[str]

@router.get("/", response_model=List[CompanyResponse])
async def list_companies():
    """List all companies"""
    pass

@router.post("/", response_model=CompanyResponse, status_code=201)
async def create_company(company: CompanyCreate):
    """Create new company"""
    pass

@router.get("/{company_id}", response_model=CompanyResponse)
async def get_company(company_id: str):
    """Get company by ID"""
    pass

@router.patch("/{company_id}", response_model=CompanyResponse)
async def update_company(company_id: str, company: CompanyUpdate):
    """Update company"""
    pass

@router.delete("/{company_id}", status_code=204)
async def delete_company(company_id: str):
    """Delete company"""
    pass

Router Registration

Main Application

# api/app/main.py
from fastapi import FastAPI
from app.routers import (
    companies, contacts, deals, files, reports,
    email_bot, calendar, drive, agentic_chat
)

app = FastAPI(title="Zarna API")

# Register routers
app.include_router(companies.router)
app.include_router(contacts.router)
app.include_router(deals.router)
app.include_router(files.router)
# ... 20+ more routers

OpenAPI Tags

Routers are organized with tags for documentation:
openapi_tags = [
    {"name": "CRM: Companies", "description": "Company management"},
    {"name": "CRM: Contacts", "description": "Contact management"},
    {"name": "CRM: Deals", "description": "Deal pipeline"},
    {"name": "CRM: Files", "description": "File operations"},
    # ... more tags
]

Next Steps