Skip to content
Merged
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
8 changes: 4 additions & 4 deletions src/app/create_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
from sqlalchemy.exc import IntegrityError

from src.app.database import create_db_and_tables, engine
from src.app.models import (
Item,
from src.app.models.dqm1.item import Item
from src.app.models.dqm1.monster import (
MonsterBreedingLink,
MonsterDetail,
MonsterFamily,
MonsterSkillLink,
Skill,
SkillCombine,
)
from src.app.models.dqm1.skill import Skill, SkillCombine


current_dir = Path(__file__).resolve().parent
csv_dir = current_dir.parent / "csv_files"
Expand Down
7 changes: 6 additions & 1 deletion src/app/database.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from pathlib import Path

from sqlmodel import SQLModel, create_engine
from sqlmodel import Session, SQLModel, create_engine

app_dir = Path(__file__).resolve().parent
project_dir = app_dir.parent
Expand All @@ -13,3 +13,8 @@

def create_db_and_tables():
SQLModel.metadata.create_all(engine)


async def get_session():
with Session(engine) as session:
yield session
174 changes: 3 additions & 171 deletions src/app/main.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,8 @@
from typing import List, Optional

from fastapi import Depends, FastAPI, HTTPException
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from sqlmodel import Session, select

from src.app.database import engine
from src.app.model_enums import (
ItemCategory,
ItemSellLocation,
SkillCategory,
SkillFamily,
)
from src.app.models import (
Item,
MonsterBreedingLink,
MonsterBreedingLinkReadWithInfo,
MonsterDetail,
MonsterDetailSkill,
MonsterDetailWithFamily,
MonsterFamily,
MonsterFamilyReadWithMonsterDetail,
Skill,
SkillCombine,
SkillCombineRead,
SkillUpgradeRead,
)
from src.app.routers import dqm1_endpoints

tags_metadata = [
{
Expand Down Expand Up @@ -66,156 +43,11 @@
allow_headers=["*"],
)


async def get_session(): # place in database.py?
with Session(engine) as session:
yield session
app.include_router(dqm1_endpoints.router)


@app.get("/")
def root():
return {
"message": ("Welcome to the DQMonsters API. " "Go to the Swagger UI interface")
}


@app.get(
"/dqm1/monsters",
response_model=List[MonsterDetailWithFamily],
tags=["dqm1 monsters"],
)
async def read_monsters(
*, session: Session = Depends(get_session), family: Optional[int] = None
):
"""
**Parameter Descriptions** <br>
**new_name** : updated name used in later Dragon Quest games <br>
**old_name** : name used in the game <br>
**description** : in game beastiary description <br>
**family** : a monster is part of one of 10 different monster families <br>
"""
monsters = select(MonsterDetail)
if family:
monsters = monsters.where(MonsterDetail.family_id == family)
monsters_result = session.exec(monsters).all()
return monsters_result


@app.get(
"/dqm1/monsters/{monster_id}",
response_model=MonsterDetailWithFamily,
tags=["dqm1 monsters"],
)
async def read_monster(*, session: Session = Depends(get_session), monster_id: int):
monster = session.get(MonsterDetail, monster_id)
if not monster:
raise HTTPException(status_code=404, detail="Monster not found")
return monster


@app.get(
"/dqm1/monstersandskill/{monster_id}",
response_model=MonsterDetailSkill,
tags=["dqm1 monsters"],
)
async def read_monster_skill(
*, session: Session = Depends(get_session), monster_id: int
):
monster = session.get(MonsterDetail, monster_id)
if not monster:
raise HTTPException(status_code=404, detail="Monster not found")
return monster


@app.get(
"/dqm1/family/{family_id}",
response_model=MonsterFamilyReadWithMonsterDetail,
tags=["dqm1 monsters"],
)
async def read_family(*, session: Session = Depends(get_session), family_id: int):
family = session.get(MonsterFamily, family_id)
if not family:
raise HTTPException(status_code=404, detail="Family not found")
return family


@app.get("/dqm1/skills", tags=["dqm1 skills"])
async def read_skills(
*,
session: Session = Depends(get_session),
category: Optional[SkillCategory] = None,
skill_family: Optional[SkillFamily] = None,
):
skills = select(Skill)
if category:
skills = skills.where(Skill.category_type == category)
if skill_family:
skills = skills.where(Skill.family_type == skill_family)
skills_result = session.exec(skills).all()
return skills_result


@app.get(
"/dqm1/skills/{skill_id}", response_model=SkillUpgradeRead, tags=["dqm1 skills"]
)
async def read_skill(*, session: Session = Depends(get_session), skill_id: int):
skill = session.get(Skill, skill_id)
if not skill:
raise HTTPException(status_code=404, detail="Skill not found")
return skill


@app.get(
"/dqm1/skillcombine/{skill_id}",
response_model=List[SkillCombineRead],
tags=["dqm1 skills"],
)
async def get_skill_combo(*, session: Session = Depends(get_session), skill_id: int):
query = select(SkillCombine).where(SkillCombine.combo_skill_id == skill_id)
skill = session.exec(query).all()
return skill


@app.get("/dqm1/items", tags=["dqm1 items"])
async def read_items(
*,
session: Session = Depends(get_session),
category: Optional[ItemCategory] = None,
selllocation: Optional[ItemSellLocation] = None,
):
items = select(Item)
if category:
items = items.where(Item.item_category == category)
if selllocation:
items = items.where(Item.sell_location == selllocation)
items_result = session.exec(items).all()
return items_result


@app.get("/dqm1/items/{item_id}", tags=["dqm1 items"])
async def read_item(*, session: Session = Depends(get_session), item_id: int):
item = session.get(Item, item_id)
if not item:
raise HTTPException(status_code=404, detail="Item not found")
return item


@app.get(
"/dqm1/breeding/{monster_id}",
response_model=List[MonsterBreedingLinkReadWithInfo],
tags=["dqm1 monsters"],
)
async def get_breeding_combos(
*, session: Session = Depends(get_session), monster_id: int
):
"""
Given a monster_id, finds all breeding combination that results in
the target monster or uses the target monster as a parent
"""
query = select(MonsterBreedingLink).where(
(MonsterBreedingLink.child_id == monster_id)
| (MonsterBreedingLink.pedigree_id == monster_id)
| (MonsterBreedingLink.parent2_id == monster_id)
)
breeding_combos = session.exec(query).all()
return breeding_combos
Empty file added src/app/models/__init__.py
Empty file.
Empty file added src/app/models/dqm1/__init__.py
Empty file.
File renamed without changes.
17 changes: 17 additions & 0 deletions src/app/models/dqm1/item.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Optional

from sqlmodel import Field, SQLModel


class Item(SQLModel, table=True):
"""
Lists all items sold in shops and found in the field
"""

id: Optional[int] = Field(default=None, primary_key=True)
item_name: str
item_category: str
item_description: str
price: Optional[int] = Field(default=None)
sell_price: Optional[int] = Field(default=None)
sell_location: str
Loading