This commit is contained in:
kristof de spiegeleer 2024-09-05 08:46:30 +02:00
parent da627a9c48
commit e001971596
2 changed files with 63 additions and 3 deletions

View File

@ -1,5 +1,5 @@
from fastapi import FastAPI, Form, Request, Depends, HTTPException
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.responses import HTMLResponse, RedirectResponse, FileResponse
from fastapi_mail import FastMail, MessageSchema, ConnectionConfig
from fastapi.templating import Jinja2Templates
import jwt
@ -10,6 +10,8 @@ from pydantic import BaseModel, EmailStr
from starlette.middleware.sessions import SessionMiddleware
from starlette.responses import Response
from utils.auth import create_access_token, verify_access_token
from utils.model import FileSystemDatabase, ObjNotFound
import os
# Initialize FastAPI app
app = FastAPI()
@ -36,6 +38,9 @@ SECRET_KEY = "your_jwt_secret_key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
# Initialize FileSystemDatabase
fs_db = FileSystemDatabase(base_dir="data")
# Step 1: Render login page to accept email
@app.get("/", response_class=HTMLResponse)
async def login_form(request: Request):
@ -49,10 +54,10 @@ async def login_form(request: Request):
# Step 2: Handle form submission, generate token, send login email
@app.post("/loginsubmit")
async def send_login_email(request: Request, email: str = Form(...)):
if not email:
# Redirect to signup page if email is not provided
return RedirectResponse(url="/signup")
return RedirectResponse(url="/signup")
# Generate the access token and email link
access_token = create_access_token({"sub": email})
email_link = f"http://verse.tf:8000/register?token={access_token}"
@ -101,3 +106,20 @@ async def get_user_info(request: Request):
return RedirectResponse(url="/signup")
return templates.TemplateResponse("info.html", {"request": request, "email": email})
@app.get("/{infoname}/{relative_path:path}", response_class=HTMLResponse)
async def serve_file(request: Request, infoname: str, relative_path: str):
try:
info = fs_db.info_get(infoname)
except ObjNotFound:
raise HTTPException(status_code=404, detail="Info not found")
file_path = os.path.join(info.path, relative_path)
if not os.path.exists(file_path):
raise HTTPException(status_code=404, detail="File not found")
if file_path.endswith(".pdf"):
return templates.TemplateResponse("pdf_viewer.html", {"request": request, "pdf_url": f"/static/{relative_path}"})
else:
return FileResponse(file_path)

View File

@ -0,0 +1,38 @@
<!doctype html>
<html>
<head>
<title>PDF Viewer</title>
<link
rel="stylesheet"
href="https://mozilla.github.io/pdf.js/web/viewer.css"
/>
</head>
<body>
<div id="viewerContainer" class="pdfViewer singlePageView">
<div id="viewer" class="pdfViewer"></div>
</div>
<script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>
<script src="https://mozilla.github.io/pdf.js/web/viewer.js"></script>
<script>
const url = "{{ pdf_url }}";
const loadingTask = pdfjsLib.getDocument(url);
loadingTask.promise.then(function (pdf) {
const viewer = document.getElementById("viewer");
for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
pdf.getPage(pageNum).then(function (page) {
const viewport = page.getViewport({ scale: 1.5 });
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
canvas.height = viewport.height;
canvas.width = viewport.width;
viewer.appendChild(canvas);
page.render({
canvasContext: context,
viewport: viewport,
});
});
}
});
</script>
</body>
</html>