niming_backend/app.py
2024-11-18 18:19:25 +00:00

89 lines
2.9 KiB
Python

from flask import Flask, jsonify
# from dotenv import load_dotenv
# load_dotenv()
import os, hashlib
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from utils.pgclass import Base, SQLuser
from utils.platform_consts import pList_root
from utils.setting_loader import loadset, typechecker
from utils import logger
from bcrypt import checkpw, gensalt, hashpw
# blueprints
from blueprints.article import article
from blueprints.log import log
from blueprints.admin import admin
# Global Variables
PG_HOST = os.getenv("PG_HOST", None)
PG_PORT = os.getenv("PG_PORT", None)
PG_NAME = os.getenv("PG_NAME", None)
PG_USER = os.getenv("PG_USER", None)
PG_PASS = os.getenv("PG_PASS", None)
JWT_KEY = os.getenv("JWT_KEY", None)
PLATFORM_ROOT_PASSWORD = os.getenv("PLATFORM_ROOT_PASSWORD", None)
# env checker
errmsg = []
if JWT_KEY is None or len(JWT_KEY) == 0: errmsg.append("Invalid JWT_KEY")
if PLATFORM_ROOT_PASSWORD is None or len(PLATFORM_ROOT_PASSWORD) == 0: errmsg.append("Invalid PLATFORM_ROOT_PASSWORD")
if len(errmsg):
print(f"Env check failed: {errmsg}")
exit(0)
# settings checker
settings = loadset()
for s in settings:
if not typechecker(s, settings.get(s)):
print("Settings.json data type check failed: %s"%s)
exit(0)
# Postgresql
engine = create_engine('postgresql+psycopg2://%s:%s@%s:%s/%s'%(PG_USER, PG_PASS, PG_HOST, PG_PORT, PG_NAME))
Base.metadata.create_all(engine)
# root checker
pwhash = hashpw(PLATFORM_ROOT_PASSWORD.encode("utf-8"), gensalt()).decode("utf-8")
rootperm = pList_root
Session = sessionmaker(bind=engine)
session = Session()
root = session.query(SQLuser).filter(SQLuser.user=="root").first()
if (root is None):
session.add(SQLuser(user="root",password=pwhash, permission=rootperm))
elif ((not checkpw(PLATFORM_ROOT_PASSWORD.encode("utf-8"), root.password.encode("utf-8"))) or root.permission != rootperm):
session.delete(root)
session.add(SQLuser(user="root",password=pwhash, permission=rootperm))
session.commit()
session.close()
# shared class
class shared():
def __init__(self, engine):
self.engine = engine
sh = shared(engine)
# flask app
app = Flask(__name__)
app.config["SECRET_KEY"] = os.urandom(64)
app.shared_resource = sh
# register blueprints
app.register_blueprint(article, url_prefix = "/article")
app.register_blueprint(log , url_prefix = "/log")
app.register_blueprint(admin , url_prefix = "/admin")
# logger
logger.logger(engine, "server.start", "Server is running")
# index
@app.route("/", methods = ["GET", "POST"])
def index():
return "Hello! World!<br>Shirakami Fubuki: cutest fox!!!"
# global error handler
# @app.errorhandler(Exception)
# def handle_exception(e):
# return jsonify({"error": "Internal server error"}), 500
# app run
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=False)