- FastAPI backend: PostGIS estimator + 3 scrapers (Avito/Cian/Yandex)
- Next.js 15 frontend: tradein.html mockup design, basePath=/trade-in
- WeasyPrint PDF (Брусника-style 4-page report)
- Address autocomplete с typo-tolerance + 6 EKB presets
- Изолированный docker stack gendesign-tradein (отдельная postgres БД)
- Caddy inline routes: gendsgn.ru/trade-in/* и /trade-in/api/v1/*
- Forgejo Actions: .forgejo/workflows/deploy-tradein.yml (shell-based GHCR login)
- Триггер только по paths: tradein-mvp/** (не пересекается с deploy.yml)
- Образы: ghcr.io/lekss361/gendesign-tradein-{backend,frontend}:latest
Первый запуск на сервере (вручную, один раз):
- создать /opt/gendesign/tradein-mvp/.env.runtime (postgres pwd, contact email)
- docker network create gendesign_shared (если нет)
- docker compose -p gendesign-tradein up -d
- docker compose -p gendesign exec caddy caddy reload
22 lines
639 B
Python
22 lines
639 B
Python
"""Brand endpoint — frontend дёргает чтобы получить логотип/цвет для white-label."""
|
||
|
||
from __future__ import annotations
|
||
|
||
from typing import Annotated
|
||
|
||
from fastapi import APIRouter, Depends
|
||
from sqlalchemy.orm import Session
|
||
|
||
from app.core.db import get_db
|
||
from app.services.brand import Brand, get_brand
|
||
|
||
router = APIRouter()
|
||
|
||
|
||
@router.get("/{slug}", response_model=Brand)
|
||
def lookup(slug: str, db: Annotated[Session, Depends(get_db)]) -> Brand:
|
||
"""GET /api/v1/brand/prinzip → {slug, name, primary_color, ...}.
|
||
|
||
Не найден → fallback generic.
|
||
"""
|
||
return get_brand(slug, db)
|