+1
-15
@@ -14,20 +14,7 @@ from classquiz.db import database
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
|
||||||
from classquiz.oauth import rememberme_middleware
|
from classquiz.oauth import rememberme_middleware
|
||||||
from classquiz.routers import (
|
from classquiz.routers import users, quiz, utils, stats, storage, search, testing_routes, editor, live, eximport, login
|
||||||
users,
|
|
||||||
quiz,
|
|
||||||
utils,
|
|
||||||
stats,
|
|
||||||
storage,
|
|
||||||
search,
|
|
||||||
testing_routes,
|
|
||||||
editor,
|
|
||||||
live,
|
|
||||||
eximport,
|
|
||||||
login,
|
|
||||||
sitemap,
|
|
||||||
)
|
|
||||||
from classquiz.socket_server import sio
|
from classquiz.socket_server import sio
|
||||||
from classquiz.helpers import meilisearch_init, telemetry_ping, bg_tasks
|
from classquiz.helpers import meilisearch_init, telemetry_ping, bg_tasks
|
||||||
from scheduler.asyncio import Scheduler
|
from scheduler.asyncio import Scheduler
|
||||||
@@ -95,5 +82,4 @@ app.include_router(
|
|||||||
)
|
)
|
||||||
app.include_router(editor.router, tags=["editor"], prefix="/api/v1/editor", include_in_schema=True)
|
app.include_router(editor.router, tags=["editor"], prefix="/api/v1/editor", include_in_schema=True)
|
||||||
app.include_router(eximport.router, tags=["export", "import"], prefix="/api/v1/eximport", include_in_schema=True)
|
app.include_router(eximport.router, tags=["export", "import"], prefix="/api/v1/eximport", include_in_schema=True)
|
||||||
app.include_router(sitemap.router, tags=["sitemap"], prefix="/api/v1/sitemap", include_in_schema=True)
|
|
||||||
app.mount("/", ASGIApp(sio))
|
app.mount("/", ASGIApp(sio))
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
import datetime
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
from fastapi import APIRouter, Response
|
|
||||||
from jinja2 import Template
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from classquiz.config import redis, settings
|
|
||||||
from classquiz.db import database
|
|
||||||
|
|
||||||
settings = settings()
|
|
||||||
router = APIRouter()
|
|
||||||
|
|
||||||
|
|
||||||
sitemap_template = """<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
||||||
{% for entry in pages -%}
|
|
||||||
<url>
|
|
||||||
<loc>{{ root_address}}/view/{{ entry.id.hex }}</loc>
|
|
||||||
{%- if entry.updated_at != None -%}
|
|
||||||
<lastmod>{{ entry.updated_at.strftime("%Y-%m-%d") }}</lastmod>
|
|
||||||
{% endif %}
|
|
||||||
</url>
|
|
||||||
{%- endfor %}
|
|
||||||
</urlset>"""
|
|
||||||
|
|
||||||
|
|
||||||
sql_statement_metadata = """
|
|
||||||
SELECT id, title, description, updated_at from quiz where public ='t'
|
|
||||||
"""
|
|
||||||
|
|
||||||
sql_statement_id_and_modified_only = """
|
|
||||||
SELECT id, updated_at from quiz where public ='t'
|
|
||||||
"""
|
|
||||||
|
|
||||||
template = Template(sitemap_template, enable_async=True)
|
|
||||||
|
|
||||||
|
|
||||||
class SitemapQuiz(BaseModel):
|
|
||||||
id: uuid.UUID
|
|
||||||
updated_at: datetime.datetime
|
|
||||||
|
|
||||||
class Config:
|
|
||||||
orm_mode = True
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/get")
|
|
||||||
async def get_sitemap():
|
|
||||||
redis_cache_resp = await redis.get("sitemap")
|
|
||||||
if redis_cache_resp is None:
|
|
||||||
res = await database.fetch_all(sql_statement_id_and_modified_only)
|
|
||||||
entries = []
|
|
||||||
for i in res:
|
|
||||||
entries.append(SitemapQuiz.from_orm(i))
|
|
||||||
rendered_sitemap = await template.render_async({"pages": entries, "root_address": settings.root_address})
|
|
||||||
await redis.set("sitemap", rendered_sitemap, ex=86400)
|
|
||||||
return Response(content=rendered_sitemap, media_type="application/xml")
|
|
||||||
else:
|
|
||||||
return Response(content=redis_cache_resp, media_type="application/xml")
|
|
||||||
Reference in New Issue
Block a user