Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7f58cc9
Added Vercel website to CORS origins
cmsato09 Nov 13, 2024
6ec16fb
Replaced Readme screenshot images
cmsato09 Feb 3, 2025
429267d
Fixed screenshot image src link in README
cmsato09 Feb 3, 2025
d60b472
Moved get_session from main.py to database.py
cmsato09 Jun 24, 2025
ebb24f7
Moved read_monsters endpoints to dqm1_endpoint router from main.py
cmsato09 Jun 24, 2025
3f46428
Moved read_family endpoints from main.py to dqm1 router
cmsato09 Jun 24, 2025
285c314
Moved read_skill endpoints from main.py to dqm1 router
cmsato09 Jun 24, 2025
fdc0897
Moved read_skill endpoints from main.py to dqm1 router
cmsato09 Jun 24, 2025
55c1ad7
Moved read_item endpoints from main.py to dqm1 router
cmsato09 Jun 24, 2025
4450901
Moved breading combos endpoints from main.py to dqm1 router
cmsato09 Jun 24, 2025
be8c8cf
Removed unused imports in main.py
cmsato09 Jun 24, 2025
86bd51e
Removed tags_metadata since it's needed in main.py
cmsato09 Jun 24, 2025
9b2c6ff
refactor (models): Relocate DQM1 models to dedicated directory
cmsato09 Jul 1, 2025
8e23113
refactor: change model imports
cmsato09 Jul 2, 2025
d32fc63
refactor: change model imports in create_database.py
cmsato09 Jul 2, 2025
b8c7d2b
refactor: change model imports in create_database.py
cmsato09 Jul 2, 2025
8f10546
refactor: change model import statements for conftest.py
cmsato09 Jul 2, 2025
9836f2a
refactor: change model import statements for test_insert_data.py
cmsato09 Jul 2, 2025
e014502
refactor: Moved models_enums.py to src/app/models/dqm1 directory
cmsato09 Jul 2, 2025
a8b2d9d
Merge pull request #53 from cmsato09/2025-06-23-router
cmsato09 Jul 2, 2025
4b6c466
refactor(family model): Moved MonsterFamily models to separate file
cmsato09 Jul 4, 2025
896bd2d
Update MonsterFamily import statements across all files
cmsato09 Jul 4, 2025
69cfd24
refactor(models): Moved API read models to schemas
cmsato09 Jul 7, 2025
b73a70f
refactor(models): Removed MonsterDetailRead model
cmsato09 Jul 7, 2025
90edae9
refactor(models): Removed MonsterFamilyRead class
cmsato09 Jul 8, 2025
1872eae
refactor(models): Moved SkillRead to schemas.py
cmsato09 Jul 8, 2025
29c3f3b
refactor(models): Isolate association table to fix circular import
cmsato09 Jul 8, 2025
a12e9f7
fix import statements
cmsato09 Jul 8, 2025
8c7ea9f
Merge pull request #54 from cmsato09/2025-07-03-model-reorganize
cmsato09 Jul 8, 2025
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
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@ This repo is deployed on [Google Cloud Run](hhttps://cloud.google.com/run/)

Access the Swagger UI interface of this FastAPI at https://dqmonstersdb-api-743047725852.us-central1.run.app/docs

![Swagger UI homepage](static/images/readme/FastAPI-readme-1.jpg)
![Trying out a endpoint](static/images/readme/FastAPI-readme-2.jpg)
![Swagger UI homepage](src/static/images/readme/FastAPI-screenshot-1.jpg)

![Trying out a endpoint](src/static/images/readme/FastAPI-screenshot-2.jpg)

## How to Run Locally
1. Clone this repo onto your local machine.
Expand Down
180 changes: 88 additions & 92 deletions src/app/create_database.py
Original file line number Diff line number Diff line change
@@ -1,92 +1,88 @@
import csv
from pathlib import Path

from sqlmodel import Session, select
from sqlalchemy.exc import IntegrityError

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

current_dir = Path(__file__).resolve().parent
csv_dir = current_dir.parent / "csv_files"


def _insert_data(csv_file, Model):
"""
helper function that uses dictionary unpacking to add csv file data
into database
"""
with Session(engine) as session:
with open(csv_file, encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
# replace empty string with None
row = {k: (None if v == "" else v) for k, v in row.items()}
if "id" in row:
existing_entry = session.exec(
select(Model).where(Model.id == row["id"])
).first()

if existing_entry:
print(
f"Entry with id {row['id']} already exists. Skipping insertion."
)
continue
try:
session.add(Model(**row))
except IntegrityError as e:
session.rollback()
print(f"IntegrityError has occurred: {e.orig}")

session.commit()


def create_item_csv():
_insert_data(csv_dir / "DQM1_items.csv", Item)


def create_monster_family_csv():
_insert_data(csv_dir / "DQM1_monster_family.csv", MonsterFamily)


def create_skill_csv():
_insert_data(csv_dir / "DQM1_skills.csv", Skill)


def create_skillcombo_csv():
_insert_data(csv_dir / "DQM1_skill_combo.csv", SkillCombine)


def create_monster_detail_csv():
_insert_data(csv_dir / "DQM1_monsterdetails.csv", MonsterDetail)


def create_breed_combo():
_insert_data(csv_dir / "DQM1_breeding_combo.csv", MonsterBreedingLink)


def create_monster_skill_link():
_insert_data(csv_dir / "DQM1_monster_skill_link.csv", MonsterSkillLink)


def load_all_csv_data():
create_db_and_tables()
create_item_csv()
create_monster_family_csv()
create_skill_csv()
create_skillcombo_csv()
create_monster_detail_csv()
create_breed_combo()
create_monster_skill_link()


if __name__ == "__main__":
load_all_csv_data()
import csv
from pathlib import Path

from sqlalchemy.exc import IntegrityError
from sqlmodel import Session, select

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

current_dir = Path(__file__).resolve().parent
csv_dir = current_dir.parent / "csv_files"


def _insert_data(csv_file, Model):
"""
helper function that uses dictionary unpacking to add csv file data
into database
"""
with Session(engine) as session:
with open(csv_file, encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
# replace empty string with None
row = {k: (None if v == "" else v) for k, v in row.items()}
if "id" in row:
existing_entry = session.exec(
select(Model).where(Model.id == row["id"])
).first()

if existing_entry:
print(
f"Entry with id {row['id']} already exists. Skipping insertion."
)
continue
try:
session.add(Model(**row))
except IntegrityError as e:
session.rollback()
print(f"IntegrityError has occurred: {e.orig}")

session.commit()


def create_item_csv():
_insert_data(csv_dir / "DQM1_items.csv", Item)


def create_monster_family_csv():
_insert_data(csv_dir / "DQM1_monster_family.csv", MonsterFamily)


def create_skill_csv():
_insert_data(csv_dir / "DQM1_skills.csv", Skill)


def create_skillcombo_csv():
_insert_data(csv_dir / "DQM1_skill_combo.csv", SkillCombine)


def create_monster_detail_csv():
_insert_data(csv_dir / "DQM1_monsterdetails.csv", MonsterDetail)


def create_breed_combo():
_insert_data(csv_dir / "DQM1_breeding_combo.csv", MonsterBreedingLink)


def create_monster_skill_link():
_insert_data(csv_dir / "DQM1_monster_skill_link.csv", MonsterSkillLink)


def load_all_csv_data():
create_db_and_tables()
create_item_csv()
create_monster_family_csv()
create_skill_csv()
create_skillcombo_csv()
create_monster_detail_csv()
create_breed_combo()
create_monster_skill_link()


if __name__ == "__main__":
load_all_csv_data()
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
Loading