From cc091cb82d4d78f07b76218263c610bc59a91591 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Thu, 22 Dec 2022 18:51:24 +0100 Subject: [PATCH] Revert "Revert ":sparkles: Added sitemap"" This reverts commit 3e1a61ffe08277e9590efe3db35361c069991e18. --- classquiz/__init__.py | 16 +++++++++- classquiz/routers/sitemap.py | 61 ++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 classquiz/routers/sitemap.py diff --git a/classquiz/__init__.py b/classquiz/__init__.py index 6171ee9..92f44dd 100644 --- a/classquiz/__init__.py +++ b/classquiz/__init__.py @@ -14,7 +14,20 @@ from classquiz.db import database from datetime import timedelta from classquiz.oauth import rememberme_middleware -from classquiz.routers import users, quiz, utils, stats, storage, search, testing_routes, editor, live, eximport, login +from classquiz.routers import ( + users, + quiz, + utils, + stats, + storage, + search, + testing_routes, + editor, + live, + eximport, + login, + sitemap, +) from classquiz.socket_server import sio from classquiz.helpers import meilisearch_init, telemetry_ping, bg_tasks from scheduler.asyncio import Scheduler @@ -82,4 +95,5 @@ app.include_router( ) 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(sitemap.router, tags=["sitemap"], prefix="/api/v1/sitemap", include_in_schema=True) app.mount("/", ASGIApp(sio)) diff --git a/classquiz/routers/sitemap.py b/classquiz/routers/sitemap.py new file mode 100644 index 0000000..f75165f --- /dev/null +++ b/classquiz/routers/sitemap.py @@ -0,0 +1,61 @@ +# 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 = """ + +{% for entry in pages -%} + + {{ root_address}}/view/{{ entry.id.hex }} + {%- if entry.updated_at != None -%} + {{ entry.updated_at.strftime("%Y-%m-%d") }} + {% endif %} + + {%- endfor %} +""" + + +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")