Home

/api-save-data-to-json

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
from pathlib import Path
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

DATA_DIR = Path("temp/scraped_data/")
DATA_DIR.mkdir(exist_ok=True)


class Item(BaseModel):
    left: str
    right: str


class SaveRequest(BaseModel):
    id: str
    data: List[Item]


def get_next_filename() -> Path:
    existing:list[int] = []

    for f in DATA_DIR.glob("*.json"):
        try:
            existing.append(int(f.stem))
        except ValueError:
            pass

    next_number = max(existing, default=0) + 1
    return DATA_DIR / f"{next_number}.json"


import json
from collections import defaultdict

@app.post("/save")
async def save_data(req: SaveRequest):
    filename = get_next_filename().with_suffix(".json")

    result = {
        "id": req.id
    }

    grouped = defaultdict(list)

    for item in req.data:
        grouped[item.left].append(item.right)

    for key, values in grouped.items():
        result[key] = values[0] if len(values) == 1 else values

    with open(filename, "w", encoding="utf-8") as f:
        json.dump(result, f, ensure_ascii=False, indent=2)

    return {
        "success": True,
        "file": filename.name,
        "data": result
    }