backend.md 2.5 KB

Backend Development Guide

The backend is a FastAPI application providing a RESTful API and WebSocket support for the Radionica 3D platform.

Key Technologies

  • FastAPI: High-performance Python framework.
  • SQLite: Local database, chosen for simplicity and zero-latency access on small/medium traffic.
  • Pydantic: Data validation and serialization.
  • JWT: Token-based authentication.
  • WebSockets: Real-time communication for the order chat.

API Structure (backend/routers/)

  • auth.py: Login, Registration, Password Reset, and Token management.
  • orders.py: Order creation, tracking, and management.
  • admin.py: High-privileged endpoints for managing users, reviews, and site settings.
  • files.py: Handling uploads and serving protected files (STL models, invoice PDFs).
  • warehouse.py: Inventory management for materials and filaments.

Business Logic (backend/services/)

We avoid putting heavy logic in routers. Use services instead:

  • AuditService: Logs every state change (e.g., when an admin changes an order price).
  • FiscalService: Implements the Montenegrin Electronic Fiscalization (EFI). Generates JIKR/IKOF codes and signed XMLs.
  • PricingService: Calculates the quote based on print time, material usage, and fixed costs.

Database Management

The project uses raw SQL for schema definitions (schema.sql) and migrations.

  • Initialization: init_db.py (archived in legacy/) was used initially.
  • Migrations: New changes are added via SQL files in backend/migrations/ and executed via run_migrations.py.

Authentication

We use a custom dependency get_current_user in backend/auth_utils.py to protect routes. Example usage:

@router.get("/my-orders")
async def get_orders(current_user: User = Depends(get_current_user)):
    return await order_service.get_for_user(current_user.id)

Running the Backend

  1. Ensure the virtual environment is activated:

    # Windows
    backend\.venv\Scripts\activate
    
  2. Install dependencies: pip install -r backend/requirements.txt

  3. Run with Uvicorn:

    python -m uvicorn main:app --app-dir backend --port 8000 --reload
    

Adding a New Feature

  1. Define Schema: Add a Pydantic model in backend/schemas.py.
  2. Define Logic: Create a new service or add a method to an existing one in backend/services/.
  3. Define Endpoint: Create a route in the appropriate router file.
  4. Register Router: Ensure the router is included in backend/main.py.