Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion app/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,57 @@
from flask import Flask
from .db import db, migrate
from flask import Flask, request
from .models.stationery import Stationery

import os

def create_app():
app = Flask(__name__)

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('SQLALCHEMY_DATABASE_URI')

db.init_app(app)
migrate.init_app(app, db)

@app.get('/')
def index():
return {
"status": "ok"
}

@app.post('/items')
def create_item():
body = request.get_json()

required_fields = ["name", "category", "price"]
for field in required_fields:
if field not in body:
return { "error": f"Missing required field: {field}" }, 400

new_item = Stationery(
name=body["name"],
category=body["category"],
price=body["price"],
color=body.get("color"),
in_stock=body.get("in_stock", True),
)

db.session.add(new_item)
db.session.commit()

return new_item.to_dict(), 201


@app.get('/items')
def get_items():
query = db.select(Stationery).order_by(Stationery.id)
stationery_items = db.session.scalars(query)

items = []

for item in stationery_items:
items.append(item.to_dict())

return items

return app
6 changes: 6 additions & 0 deletions app/db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from .models.base import Base

db = SQLAlchemy(model_class=Base)
migrate = Migrate()
Empty file added app/models/__init__.py
Empty file.
4 changes: 4 additions & 0 deletions app/models/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from sqlalchemy.orm import DeclarativeBase

class Base(DeclarativeBase):
pass
30 changes: 30 additions & 0 deletions app/models/stationery.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from ..db import db
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy import Numeric
from datetime import datetime
from decimal import Decimal

class Stationery(db.Model):
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
name: Mapped[str]
category: Mapped[str]
price: Mapped[Decimal] = mapped_column(Numeric(10, 2))
color: Mapped[str | None]
in_stock: Mapped[bool] = mapped_column(default=True)
created_at: Mapped[datetime] = mapped_column(default=datetime.now())

def to_dict(self):
return {
"id": self.id,
"name": self.name,
"category": self.category,
"price": float(self.price),
"color": self.color,
"in_stock": self.in_stock,
"created_at": self.created_at.isoformat(),
}





30 changes: 30 additions & 0 deletions seed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from app import create_app, db
from app.models.stationery import Stationery
from dotenv import load_dotenv

load_dotenv()
app = create_app()

def seed_stationery():
items = [
Stationery(name="Strawberry Gel Pen", category="pen", price=2.99, color="pink"),
Stationery(name="Boba Tea Sticky Notes", category="notes", price=4.99, color="lavender"),
Stationery(name="Cloud Eraser Set", category="eraser", price=3.49, color="white"),
Stationery(name="Mushroom Washi Tape", category="tape", price=5.99, color="sage green"),
Stationery(name="Starry Night Highlighters", category="highlighter", price=6.99, color="multicolor"),
Stationery(name="Corgi Bookmark Set", category="bookmark", price=3.99, color="yellow"),
Stationery(name="Cherry Blossom Notebook", category="notebook", price=9.99, color="pink"),
Stationery(name="Rainbow Paperclip Set", category="clips", price=2.49, color="multicolor"),
Stationery(name="Frog Pencil Topper", category="pencil", price=1.99, color="green"),
Stationery(name="Cottagecore Sticker Sheet", category="sticker", price=3.49, color="multicolor"),
]

db.session.add_all(items)
db.session.commit()
print("Seeded stationery items!")

if __name__ == "__main__":
with app.app_context():
db.drop_all()
db.create_all()
seed_stationery()