|
| 1 | +from app import __version__ |
| 2 | +import os, time |
| 3 | +import csv |
| 4 | +from fastapi import APIRouter, status |
| 5 | +from app.api.db import get_db_connection |
| 6 | + |
| 7 | +router = APIRouter() |
| 8 | + |
| 9 | +CSV_PATH = os.path.join(os.path.dirname(__file__), 'start_data.csv') |
| 10 | +CSV_PATH = os.path.abspath(CSV_PATH) |
| 11 | + |
| 12 | +@router.get("/products/seed", status_code=status.HTTP_200_OK) |
| 13 | +def seed_products() -> dict: |
| 14 | + """Delete and recreate the product table, then seed with CSV data.""" |
| 15 | + conn_gen = get_db_connection() |
| 16 | + conn = next(conn_gen) |
| 17 | + cur = conn.cursor() |
| 18 | + # Drop and recreate table with all CSV columns |
| 19 | + cur.execute(''' |
| 20 | + DROP TABLE IF EXISTS product; |
| 21 | + CREATE TABLE product ( |
| 22 | + id SERIAL PRIMARY KEY, |
| 23 | + Params TEXT, |
| 24 | + item INTEGER, |
| 25 | + title TEXT, |
| 26 | + UOS TEXT, |
| 27 | + Pack_Description TEXT, |
| 28 | + Hierarchy1 TEXT, |
| 29 | + Hierarchy2 TEXT, |
| 30 | + Hierarchy3 TEXT, |
| 31 | + UOP TEXT, |
| 32 | + sSell1 NUMERIC(10,2), |
| 33 | + sSell2 NUMERIC(10,2), |
| 34 | + sSell3 NUMERIC(10,2), |
| 35 | + sSell4 NUMERIC(10,2), |
| 36 | + sSell5 NUMERIC(10,2), |
| 37 | + pack1 INTEGER, |
| 38 | + pack2 INTEGER, |
| 39 | + pack3 INTEGER, |
| 40 | + pack4 INTEGER, |
| 41 | + pack5 INTEGER, |
| 42 | + EAN TEXT |
| 43 | + ); |
| 44 | + ''') |
| 45 | + # Read and insert CSV data |
| 46 | + with open(CSV_PATH, newline='') as csvfile: |
| 47 | + reader = csv.DictReader(csvfile) |
| 48 | + rows = [row for row in reader] |
| 49 | + for row in rows: |
| 50 | + # Map 'desc' from CSV to 'title' for DB |
| 51 | + row['title'] = row.pop('desc') |
| 52 | + cur.execute( |
| 53 | + """ |
| 54 | + INSERT INTO product ( |
| 55 | + Params, item, title, UOS, Pack_Description, Hierarchy1, Hierarchy2, Hierarchy3, UOP, |
| 56 | + sSell1, sSell2, sSell3, sSell4, sSell5, pack1, pack2, pack3, pack4, pack5, EAN |
| 57 | + ) VALUES ( |
| 58 | + %(Params)s, %(item)s, %(title)s, %(UOS)s, %(Pack_Description)s, %(Hierarchy1)s, %(Hierarchy2)s, %(Hierarchy3)s, %(UOP)s, |
| 59 | + %(sSell1)s, %(sSell2)s, %(sSell3)s, %(sSell4)s, %(sSell5)s, %(pack1)s, %(pack2)s, %(pack3)s, %(pack4)s, %(pack5)s, %(EAN)s |
| 60 | + ) |
| 61 | + """, |
| 62 | + row |
| 63 | + ) |
| 64 | + conn.commit() |
| 65 | + cur.execute('SELECT * FROM product;') |
| 66 | + if cur.description is None: |
| 67 | + products = [] |
| 68 | + else: |
| 69 | + columns = [desc[0] for desc in cur.description] |
| 70 | + products = [dict(zip(columns, row)) for row in cur.fetchall()] |
| 71 | + cur.close() |
| 72 | + conn.close() |
| 73 | + |
| 74 | + base_url = os.getenv("BASE_URL", "http://localhost:8000") |
| 75 | + epoch = int(time.time() * 1000) |
| 76 | + meta = { |
| 77 | + "severity": "success", |
| 78 | + "title": "Product table seeded", |
| 79 | + "version": __version__, |
| 80 | + "base_url": base_url, |
| 81 | + "time": epoch, |
| 82 | + } |
| 83 | + return {"meta": meta, "data": products} |
0 commit comments