working dev environment

This commit is contained in:
2026-06-18 08:29:03 +00:00
parent 6fc00b8ce9
commit 57b882128d
21 changed files with 200 additions and 210 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+26
View File
@@ -0,0 +1,26 @@
from fastapi import APIRouter
from app.config import settings
from app.database import get_session
from app.models import DonationTier, Event, Program
router = APIRouter()
@router.post("/reset")
async def reset_database():
"""Truncate all tables and re-seed. Dev-only — disabled in production."""
if settings.ENV == "production":
return {"error": "Admin reset is disabled in production"}
from app.database import async_session
from seed import seed as run_seed
async with async_session() as session:
await session.execute(Program.__table__.delete())
await session.execute(Event.__table__.delete())
await session.execute(DonationTier.__table__.delete())
await session.commit()
await run_seed()
return {"status": "reset complete"}
+1
View File
@@ -4,6 +4,7 @@ from pydantic_settings import BaseSettings
class Settings(BaseSettings):
DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/kmountain"
CORS_ORIGINS: list[str] = ["http://localhost:4200", "http://localhost:3000"]
ENV: str = "development"
model_config = {"env_prefix": "KMTN_"}
+19 -3
View File
@@ -2,18 +2,29 @@ from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy import func, select
from app.config import settings
from app.database import engine
from app.models import Base
from app.database import async_session, engine
from app.models import Base, Program
from app.api import programs, events, tiers
@asynccontextmanager
async def lifespan(app: FastAPI):
# Create tables on startup (seed.py handles data seeding)
# Create tables on startup
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
# Auto-seed if database is empty
async with async_session() as session:
result = await session.execute(select(func.count(Program.id)))
count = result.scalar()
if count == 0:
print(" → Database is empty — running seed...")
from seed import seed as run_seed
await run_seed()
yield
@@ -36,3 +47,8 @@ app.add_middleware(
app.include_router(programs.router, prefix="/api/programs", tags=["programs"])
app.include_router(events.router, prefix="/api/events", tags=["events"])
app.include_router(tiers.router, prefix="/api/tiers", tags=["tiers"])
# Dev-only admin router (disabled in production)
if settings.ENV != "production":
from app.api import admin
app.include_router(admin.router, prefix="/api/admin", tags=["admin"])
+2 -2
View File
@@ -6,7 +6,7 @@ from sqlalchemy import (
Numeric,
Boolean,
Date,
ARRAY,
JSON,
)
from sqlalchemy.orm import DeclarativeBase
@@ -47,5 +47,5 @@ class DonationTier(Base):
name = Column(String(50), unique=True, nullable=False)
amount = Column(Numeric(10, 2), nullable=False)
icon = Column(String(10), nullable=False)
benefits = Column(ARRAY(Text), nullable=False)
benefits = Column(JSON, nullable=False)
display_order = Column(Integer, nullable=False)