Overview
The three main facets of this project have needed considerable reworking since I first published this to GitHub. The server, the web interface, and the python interface all had significant shortcomings and oddities that were introduced by myself years ago when I first developed this. The web interface was revamped a few months ago to leverage `next.js` and TypeScript which really improved performance and maintainability (as well as introducing a much better design...)
However, the server and the python interface still needed work. These are both addressed in this release.
The Server
I completely gutted the server architecture and introduced a few things that I feel will improve the maintainability and robustness of this project for a while.
FastAPI
I exchanged the Flask server framework for [FastAPI](https://fastapi.tiangolo.com/). While Flask is great, I feel that FastAPI is just a little better and has a much better developer experience. I set up dependency injection and data validation and many points in the server to
prevent errors and provide users with as much information as possible.
SQLAlchemy
I swapped out the raw `SQL` queries I was making for an ORM -- [SQLAlchemy](https://www.sqlalchemy.org/). Some may think that an ORM is overkill for a small project like this, but I think it can really go a long way to, again, improve the developer experience as well as maintain code readability and type hinting.
Core Engine Updates
The core engine itself was not touched. That code is pretty impenetrable. Rather, all wrappers around it and data-fetching functions were updated to support the above changes and get rid of some **very old** (like 3 years) legacy code that was left-over from another lifetime.
The Python Interface
I watered down the python interface just a bit as I realized it didn't need to be so complex. I also added type hints, function return models, and some example code. I believe I introduced some better data validation and error handling as well.
Conclusion
Hopefully, these changes make the code easier to navigate, easier to debug, and most importantly, easier to maintain in the future.