35 lines
859 B
Python
35 lines
859 B
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from typing import List, Optional
|
||
|
|
|
||
|
|
import aiosqlite
|
||
|
|
from fastapi import APIRouter, Depends, Response
|
||
|
|
from pydantic import Field
|
||
|
|
|
||
|
|
import products
|
||
|
|
from common import ApiModel
|
||
|
|
from api.deps import get_db
|
||
|
|
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/products", tags=["products"])
|
||
|
|
|
||
|
|
|
||
|
|
class ProductUrl(ApiModel):
|
||
|
|
url: str
|
||
|
|
tags: List[str] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
@router.post(
|
||
|
|
"",
|
||
|
|
operation_id="createProduct",
|
||
|
|
summary="Create or fetch a product from a URL",
|
||
|
|
response_model=products.Product,
|
||
|
|
)
|
||
|
|
async def create_product(
|
||
|
|
url: ProductUrl, response: Response, conn: aiosqlite.Connection = Depends(get_db)
|
||
|
|
) -> Optional[products.Product]:
|
||
|
|
product = await products.get_or_create(conn, url.url, url.tags)
|
||
|
|
if product:
|
||
|
|
response.headers["Location"] = f"/api/v1/products/{product.id}"
|
||
|
|
return product
|