Spaces:
Running
Running
import pathlib | |
from contextlib import asynccontextmanager | |
from datetime import datetime | |
from typing import Annotated | |
from fastapi import FastAPI, Request | |
from fastapi.middleware.cors import CORSMiddleware | |
from fastapi.params import Depends | |
from fastapi.staticfiles import StaticFiles | |
import app | |
import app.Controllers.admin as admin_controller | |
import app.Controllers.images as images_controller | |
import app.Controllers.search as search_controller | |
from app.Services.authentication import permissive_access_token_verify, permissive_admin_token_verify | |
from app.Services.provider import ServiceProvider | |
from app.config import config | |
from .Models.api_response.base import WelcomeApiResponse, WelcomeApiAuthenticationResponse, \ | |
WelcomeApiAdminPortalAuthenticationResponse | |
from .util.fastapi_log_handler import init_logging | |
async def lifespan(_: FastAPI): | |
provider = ServiceProvider() | |
await provider.onload() | |
search_controller.services = provider | |
admin_controller.services = provider | |
images_controller.services = provider | |
yield | |
await provider.onexit() | |
app = FastAPI(lifespan=lifespan, title=app.__title__, description=app.__description__, version=app.__version__) | |
init_logging() | |
# noinspection PyTypeChecker | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=config.cors_origins, | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
app.include_router(search_controller.search_router, prefix="/search") | |
app.include_router(images_controller.images_router, prefix="/images") | |
if config.admin_api_enable: | |
app.include_router(admin_controller.admin_router, prefix="/admin") | |
if config.storage.method == "local": | |
# Since we will check & create the static directory soon later when the StorageService initialized, we don't need to | |
# check it here. | |
app.mount("/static", StaticFiles(directory=pathlib.Path(config.storage.local.path), check_dir=False), name="static") | |
def welcome(request: Request, | |
token_passed: Annotated[bool, Depends(permissive_access_token_verify)], | |
admin_token_passed: Annotated[bool, Depends(permissive_admin_token_verify)], | |
) -> WelcomeApiResponse: | |
root_path: str = request.scope.get('root_path').rstrip('/') | |
return WelcomeApiResponse( | |
message="Ciallo~ Welcome to NekoImageGallery API!", | |
server_time=datetime.now(), | |
wiki={ | |
"openAPI": f"{root_path}/openapi.json", | |
"swagger UI": f"{root_path}/docs", | |
"redoc": f"{root_path}/redoc" | |
}, | |
admin_api=WelcomeApiAdminPortalAuthenticationResponse(available=config.admin_api_enable, | |
passed=admin_token_passed), | |
authorization=WelcomeApiAuthenticationResponse(required=config.access_protected, passed=token_passed), | |
available_basis=["vision", "ocr"] if config.ocr_search.enable else ["vision"] | |
) | |