import sys import os import asyncio from aiohttp import web import logging from meta import conf from data import Database from utils.auth import key_auth_factory from datamodels import DataModel from constants import DATA_VERSION from modules.profiles.data import ProfileData from routes import dbvar, datamodelsv, profiledatav, register_routes sys.path.insert(0, os.path.join(os.getcwd())) sys.path.insert(0, os.path.join(os.getcwd(), "src")) logger = logging.getLogger(__name__) async def attach_db(app: web.Application): db = Database(conf.data['args']) async with db.open(): version = await db.version() if version.version != DATA_VERSION: error = f"Data model version is {version}, required version is {DATA_VERSION}! Please migrate." logger.critical(error) raise RuntimeError(error) datamodel = DataModel() db.load_registry(datamodel) await datamodel.init() profiledata = ProfileData() db.load_registry(profiledata) await profiledata.init() app[dbvar] = db app[datamodelsv] = datamodel app[profiledatav] = profiledata yield async def test(request: web.Request) -> web.Response: return web.Response(text="Welcome to the Dreamspace API. Please donate an important childhood memory to continue.") def app_factory(): auth = key_auth_factory(conf.API['TOKEN']) app = web.Application(middlewares=[auth]) app.cleanup_ctx.append(attach_db) app.router.add_get('/', test) register_routes(app.router) return app if __name__ == '__main__': app = app_factory() web.run_app(app, port=int(conf.API['PORT']))