Files
Choreus/backend/main.py
T
2026-08-09 21:45:06 -04:00

105 lines
4.6 KiB
Python

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from backend.database import engine, Base, SessionLocal
from backend.models import User, ChoreType, ChoreCompletion, UserRole, RecurrenceType
from backend.routers import auth, users, chores, reports
from backend.config import get_current_week_identifier
from datetime import datetime, timezone, timedelta
def seed_initial_data():
Base.metadata.create_all(bind=engine)
db = SessionLocal()
try:
# Seed Users if empty
if db.query(User).count() == 0:
admin_user = User(
email="admin@choreus.app",
name="Sarah (Admin)",
avatar_url="https://api.dicebear.com/7.x/bottts/svg?seed=SarahAdmin",
role=UserRole.ADMIN.value,
weekly_star_quota=20
)
kid_user1 = User(
email="leo@choreus.app",
name="Leo",
avatar_url="https://api.dicebear.com/7.x/bottts/svg?seed=LeoKid",
role=UserRole.REGULAR.value,
weekly_star_quota=15
)
kid_user2 = User(
email="maya@choreus.app",
name="Maya",
avatar_url="https://api.dicebear.com/7.x/bottts/svg?seed=MayaKid",
role=UserRole.REGULAR.value,
weekly_star_quota=15
)
db.add_all([admin_user, kid_user1, kid_user2])
db.commit()
# Seed Chores if empty
if db.query(ChoreType).count() == 0:
chores_list = [
ChoreType(title="Empty & fill dishwasher", description="Clear dishes, load dirty ones and start cycle", star_reward=1, recurrence=RecurrenceType.DAILY.value, icon="Utensils"),
ChoreType(title="Take out trash & recycling", description="Empty kitchen bin and carry bins to curb", star_reward=1, recurrence=RecurrenceType.DAILY.value, icon="Trash2"),
ChoreType(title="Vacuum living room", description="Vacuum carpet and couch cushions thoroughly", star_reward=3, recurrence=RecurrenceType.WEEKLY.value, icon="Broom"),
ChoreType(title="Clean bathroom", description="Scrub sink, mirror, toilet, and wipe floor", star_reward=4, recurrence=RecurrenceType.WEEKLY.value, icon="Sparkles"),
ChoreType(title="Clear snow from driveway", description="Shovel front driveway and salt walkways after snow fall", star_reward=5, recurrence=RecurrenceType.SPONTANEOUS.value, icon="Snowflake"),
ChoreType(title="Go buy groceries", description="Pick up weekly groceries from list", star_reward=4, recurrence=RecurrenceType.SPONTANEOUS.value, icon="ShoppingBag"),
]
db.add_all(chores_list)
db.commit()
# Seed sample completions if none exist
if db.query(ChoreCompletion).count() == 0:
users_list = db.query(User).all()
chores_types = db.query(ChoreType).all()
current_week = get_current_week_identifier()
if len(users_list) >= 3 and len(chores_types) >= 3:
c1 = ChoreCompletion(
chore_type_id=chores_types[0].id,
user_id=users_list[1].id, # Leo
stars_earned=chores_types[0].star_reward,
week_identifier=current_week,
completed_at=datetime.now(timezone.utc) - timedelta(hours=5),
notes="All clean!"
)
c2 = ChoreCompletion(
chore_type_id=chores_types[2].id,
user_id=users_list[2].id, # Maya
stars_earned=chores_types[2].star_reward,
week_identifier=current_week,
completed_at=datetime.now(timezone.utc) - timedelta(hours=2),
notes="Living room carpet looks great"
)
db.add_all([c1, c2])
db.commit()
finally:
db.close()
@asynccontextmanager
async def lifespan(app: FastAPI):
seed_initial_data()
yield
app = FastAPI(title="ChoreUS API", version="1.0.0", description="Home Chore Manager API", lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(auth.router)
app.include_router(users.router)
app.include_router(chores.router)
app.include_router(reports.router)
@app.get("/")
def root():
return {"message": "Welcome to ChoreUS Home Chore Manager API", "status": "running"}