From 207e3f5b51db4ce433635ececea9990bca95345d Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Thu, 4 Sep 2025 15:05:09 -0500 Subject: [PATCH] API up and running. --- muck/app.py | 35 +++++++++++++++++++++++++++++++++-- muck/models/program.py | 3 ++- muck/models/thing.py | 9 +++++---- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/muck/app.py b/muck/app.py index f2134f6..f419bf5 100644 --- a/muck/app.py +++ b/muck/app.py @@ -1,10 +1,22 @@ +from flask import Flask + from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session -from muck.models.dbref import Base +from crudkit.api.flask_api import generate_crud_blueprint +from crudkit.core.service import CRUDService + +from muck.models.dbref import Base, Dbref +from muck.models.exit import Exit +from muck.models.player import Player +from muck.models.program import Program +from muck.models.room import Room +from muck.models.thing import Thing from muck.init import bootstrap_world -engine = create_engine("sqlite:///muck.db", echo=True) +DATABASE_URL = "sqlite:///muck.db" + +engine = create_engine(DATABASE_URL, echo=True) SessionLocal = scoped_session(sessionmaker(bind=engine)) Base.metadata.create_all(engine) @@ -12,3 +24,22 @@ Base.metadata.create_all(engine) session = SessionLocal() bootstrap_world(session) + +app = Flask(__name__) + +dbref_service = CRUDService(Dbref, session) +exit_service = CRUDService(Exit, session) +player_service = CRUDService(Player, session) +program_service = CRUDService(Program, session) +room_service = CRUDService(Room, session) +thing_service = CRUDService(Thing, session) + +app.register_blueprint(generate_crud_blueprint(Dbref, dbref_service), url_prefix="/api/dbref") +app.register_blueprint(generate_crud_blueprint(Exit, exit_service), url_prefix="/api/exits") +app.register_blueprint(generate_crud_blueprint(Player, player_service), url_prefix="/api/players") +app.register_blueprint(generate_crud_blueprint(Program, program_service), url_prefix="/api/programs") +app.register_blueprint(generate_crud_blueprint(Room, room_service), url_prefix="/api/rooms") +app.register_blueprint(generate_crud_blueprint(Thing, thing_service), url_prefix="/api/things") + +if __name__ == "__main__": + app.run(debug=True) diff --git a/muck/models/program.py b/muck/models/program.py index b6f375f..14548cb 100644 --- a/muck/models/program.py +++ b/muck/models/program.py @@ -8,5 +8,6 @@ class Program(Dbref): id = Column(Integer, ForeignKey("dbref.id"), primary_key=True) __mapper_args__ = { - "polymorphic_identity": ObjectType.PROGRAM + "polymorphic_identity": ObjectType.PROGRAM, + "inherit_condition": id == Dbref.id } diff --git a/muck/models/thing.py b/muck/models/thing.py index 1725208..c67bc27 100644 --- a/muck/models/thing.py +++ b/muck/models/thing.py @@ -1,5 +1,5 @@ from sqlalchemy import Column, Integer, ForeignKey -from sqlalchemy.orm import relationship +from sqlalchemy.orm import relationship, foreign, remote from crudkit.core.base import CRUDMixin @@ -12,9 +12,10 @@ class Thing(Dbref): value = Column(Integer, nullable=False, default=0) - home_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) - home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id]) + home_id = Column(Integer, ForeignKey("dbref.id"), nullable=True) + home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id], primaryjoin=lambda: foreign(Thing.home_id) == remote(Dbref.id)) __mapper_args__ = { - "polymorphic_identity": ObjectType.THING + "polymorphic_identity": ObjectType.THING, + "inherit_condition": id == Dbref.id }