## Copyright © 2026 Olaf Kolkman ## SPDX-License-Identifier: GPL-3.0-or-later from fastapi import FastAPI from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from starlette.requests import Request from backend.app.api.admin import router as admin_router from backend.app.api.auth import router as auth_router from backend.app.api.links import router as links_router from backend.app.api.public import router as public_router from backend.app.api.user_config import router as user_config_router from backend.app.database import AVATARS_DIR from backend.app.services.link_service import list_public_links app = FastAPI(title='LinkLog API') app.mount('/static', StaticFiles(directory='frontend/static'), name='static') app.mount('/media', StaticFiles(directory=AVATARS_DIR), name='media') app.include_router(auth_router, prefix='/api/auth') app.include_router(links_router, prefix='/api') app.include_router(public_router, prefix='/api/public') app.include_router(admin_router, prefix='/api/admin') app.include_router(user_config_router, prefix='/api/user') templates = Jinja2Templates(directory='frontend/templates') @app.get('/', response_class=HTMLResponse) async def public_root(request: Request): feed = list_public_links() return templates.TemplateResponse(request, 'feed.html', {'feed': feed}) @app.get('/admin', response_class=HTMLResponse) async def admin_dashboard(request: Request): return templates.TemplateResponse(request, 'admin.html', {}) @app.get('/profile', response_class=HTMLResponse) async def user_profile_page(request: Request): return templates.TemplateResponse(request, 'user_profile.html', {}) @app.get('/labels', response_class=HTMLResponse) async def labels_page(request: Request): return templates.TemplateResponse(request, 'labels.html', {}) @app.get('/about', response_class=HTMLResponse) async def about_page(request: Request): return templates.TemplateResponse(request, 'about.html', {}) @app.get('/login', response_class=HTMLResponse) async def login_page(request: Request): return templates.TemplateResponse(request, 'login.html', {}) @app.get('/health') def health_check(): return {'status': 'ok'} @app.get('/{username}', response_class=HTMLResponse) @app.get('/{username}/', response_class=HTMLResponse) async def public_user_feed(request: Request, username: str): feed = list_public_links(username) profile = None if feed: profile = { 'username': feed[0]['username'], 'avatar_url': feed[0]['avatar_url'], 'bio': feed[0]['bio'], } return templates.TemplateResponse( request, 'feed.html', {'feed': feed, 'profile': profile, 'user_filter': username}, )