# TicketHub - Developer Guide ## Overview TicketHub is a lightweight, enterprise-grade open-source ticket and issue tracking system. Built with a modern React frontend and Python FastAPI backend. ## Architecture ``` ┌─────────────────────────────────────────────────────────────┐ │ TicketHub │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ Frontend (React) │ │ │ │ Dashboard │ Tickets │ Board │ Projects │ Settings │ │ │ └─────────────────────────┬─────────────────────────────┘ │ │ │ │ │ REST API │ │ │ │ │ ┌─────────────────────────▼─────────────────────────────┐ │ │ │ Backend (FastAPI) │ │ │ │ /api/projects │ /api/tickets │ /api/webhooks │ │ │ └─────────────────────────┬─────────────────────────────┘ │ │ │ │ │ ┌─────────────────────────▼─────────────────────────────┐ │ │ │ SQLite Database │ │ │ └───────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ## Tech Stack ### Frontend - **React 18** - UI library - **TypeScript** - Type safety - **TailwindCSS** - Styling - **React Router** - Navigation - **React Query** - Data fetching - **Vite** - Build tool ### Backend - **Python 3.11** - Language - **FastAPI** - Web framework - **SQLite** - Database (dev) - **PostgreSQL** - Database (prod) ## Project Structure ``` tickethub/ ├── backend/ │ └── app/ │ └── main.py # FastAPI application ├── frontend/ │ ├── src/ │ │ ├── components/ │ │ │ ├── ui/ # Reusable UI components │ │ │ └── Layout.tsx # Main layout │ │ ├── pages/ # Route pages │ │ ├── services/ │ │ │ └── api.ts # API client │ │ ├── App.tsx # Router setup │ │ └── main.tsx # Entry point │ ├── index.html │ ├── package.json │ ├── tailwind.config.js │ └── vite.config.ts ├── docs/ └── README.md ``` ## Frontend Development ### Component Library TicketHub includes a custom component library: ```typescript // Available components import { Card, Button, Input, Select, Badge, Modal, Tabs, TabsList, TabsTrigger, TabsContent, Table, TableHeader, TableHead, TableBody, TableRow, TableCell, Avatar } from '../components/ui' ``` ### Adding a New Page 1. Create component in `src/pages/`: ```typescript // src/pages/MyPage.tsx import { Card, Button } from '../components/ui' export default function MyPage() { return (

My Page

Content here

) } ``` 2. Add route in `App.tsx`: ```typescript import MyPage from './pages/MyPage' // Inside Routes } /> ``` 3. Add to sidebar in `Layout.tsx` ### API Integration Use React Query for data fetching: ```typescript import { useQuery, useMutation } from '@tanstack/react-query' import { ticketsApi } from '../services/api' function MyComponent() { // Fetch data const { data: tickets, isLoading } = useQuery({ queryKey: ['tickets'], queryFn: () => ticketsApi.list() }) // Mutate data const createMutation = useMutation({ mutationFn: ticketsApi.create, onSuccess: () => queryClient.invalidateQueries(['tickets']) }) } ``` ## Backend Development ### API Structure ```python # Models class Ticket(BaseModel): id: int key: str project_id: int title: str description: str status: Literal['open', 'in_progress', 'resolved', 'closed'] priority: Literal['low', 'medium', 'high', 'critical'] assignee: Optional[str] reporter: Optional[str] created_at: datetime updated_at: datetime # Endpoints GET /api/projects POST /api/projects GET /api/projects/{id} PATCH /api/projects/{id} DELETE /api/projects/{id} GET /api/tickets POST /api/tickets GET /api/tickets/{id} PATCH /api/tickets/{id} DELETE /api/tickets/{id} GET /api/tickets/{id}/comments POST /api/tickets/{id}/comments ``` ### Adding a New Endpoint ```python @app.post("/api/myresource") async def create_myresource(data: MyModel): # Validate # Save to database # Return response return {"id": new_id, **data.dict()} ``` ### Webhook System TicketHub sends webhooks on ticket events: ```python async def send_webhook(project_id: int, event: str, data: dict): project = await get_project(project_id) if project.webhook_url: payload = { "event": event, # ticket.created, ticket.updated, etc. "timestamp": datetime.utcnow().isoformat(), "data": data } await httpx.post(project.webhook_url, json=payload) ``` ## Running Locally ### Backend ```bash cd backend pip install -r requirements.txt uvicorn app.main:app --reload --port 8001 ``` ### Frontend ```bash cd frontend npm install npm run dev ``` ### Full Stack (Development) ```bash # Terminal 1: Backend cd backend && uvicorn app.main:app --reload --port 8001 # Terminal 2: Frontend (proxies /api to backend) cd frontend && npm run dev ``` ## Building for Production ### Frontend Build ```bash cd frontend npm run build # Output: dist/ ``` ### Docker Deploy ```yaml version: '3.8' services: api: image: python:3.11-slim command: uvicorn app.main:app --host 0.0.0.0 --port 8000 web: image: nginx:alpine volumes: - ./frontend/dist:/usr/share/nginx/html ``` ## Testing ### Backend Tests ```bash cd backend pytest tests/ ``` ### Frontend Tests ```bash cd frontend npm test ``` ### API Testing ```bash # Create project curl -X POST http://localhost:8001/api/projects \ -H "Content-Type: application/json" \ -d '{"name": "Test Project", "key": "TEST"}' # Create ticket curl -X POST http://localhost:8001/api/tickets \ -H "Content-Type: application/json" \ -d '{ "project_id": 1, "title": "Test ticket", "description": "Test description", "priority": "medium" }' ``` ## Contributing 1. Fork the repository 2. Create feature branch: `git checkout -b feature/my-feature` 3. Make changes 4. Run tests 5. Submit pull request ## License MIT License - StartData 2026