From 1200b0f91676d96a7ea93597796f7f9534d585cb Mon Sep 17 00:00:00 2001 From: Mikelle Date: Mon, 23 Mar 2026 18:57:42 -0400 Subject: [PATCH] implements code for POST and GET routes for AWS RDS --- app/__init__.py | 47 +++++++++++++++++++++++++++++++++++++++- app/db.py | 6 +++++ app/models/__init__.py | 0 app/models/base.py | 4 ++++ app/models/stationery.py | 30 +++++++++++++++++++++++++ seed.py | 30 +++++++++++++++++++++++++ 6 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 app/db.py create mode 100644 app/models/__init__.py create mode 100644 app/models/base.py create mode 100644 app/models/stationery.py create mode 100644 seed.py diff --git a/app/__init__.py b/app/__init__.py index 737a7b0..fed5a52 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -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 \ No newline at end of file diff --git a/app/db.py b/app/db.py new file mode 100644 index 0000000..3ada8d1 --- /dev/null +++ b/app/db.py @@ -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() \ No newline at end of file diff --git a/app/models/__init__.py b/app/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/models/base.py b/app/models/base.py new file mode 100644 index 0000000..2278416 --- /dev/null +++ b/app/models/base.py @@ -0,0 +1,4 @@ +from sqlalchemy.orm import DeclarativeBase + +class Base(DeclarativeBase): + pass \ No newline at end of file diff --git a/app/models/stationery.py b/app/models/stationery.py new file mode 100644 index 0000000..6810011 --- /dev/null +++ b/app/models/stationery.py @@ -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(), + } + + + + + \ No newline at end of file diff --git a/seed.py b/seed.py new file mode 100644 index 0000000..034396b --- /dev/null +++ b/seed.py @@ -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() \ No newline at end of file