|
1 | 1 | from typing import ClassVar, Self
|
2 | 2 |
|
| 3 | +from fastapi import Response |
| 4 | +from pydantic import HttpUrl |
3 | 5 | from sqlalchemy.ext.asyncio import AsyncSession
|
4 | 6 | from starlette.requests import Request
|
5 | 7 |
|
| 8 | +from futuramaapi.core import settings |
6 | 9 | from futuramaapi.helpers.pydantic import BaseModel, Field
|
7 | 10 | from futuramaapi.mixins.pydantic import BaseModelTemplateMixin
|
8 | 11 | from futuramaapi.repositories.base import FilterStatementKwargs
|
@@ -46,3 +49,34 @@ class UserAuth(BaseModel, BaseModelTemplateMixin):
|
46 | 49 | @classmethod
|
47 | 50 | async def from_request(cls, session: AsyncSession, request: Request, /) -> Self:
|
48 | 51 | return cls()
|
| 52 | + |
| 53 | + |
| 54 | +class SiteMap(BaseModel): |
| 55 | + _header: ClassVar[str] = '<?xml version="1.0" encoding="UTF-8"?>' |
| 56 | + _media_type: ClassVar[str] = "application/xml" |
| 57 | + _url_tag: ClassVar[str] = """<url><loc>%s</loc></url>""" |
| 58 | + _url_set_tag: ClassVar[str] = """<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">%s</urlset>""" |
| 59 | + |
| 60 | + base_url: HttpUrl = settings.build_url(is_static=False) |
| 61 | + urls: list[str] |
| 62 | + |
| 63 | + async def get_response(self) -> Response: |
| 64 | + urls: str = "" |
| 65 | + for url in self.urls: |
| 66 | + urls += self._url_tag % settings.build_url( |
| 67 | + path=url, |
| 68 | + is_static=False, |
| 69 | + ) |
| 70 | + url_set: str = self._url_set_tag % urls |
| 71 | + return Response( |
| 72 | + content=f"""{self._header}{url_set}""", |
| 73 | + media_type=self._media_type, |
| 74 | + ) |
| 75 | + |
| 76 | + @classmethod |
| 77 | + async def from_request(cls, request: Request) -> Self: |
| 78 | + from futuramaapi.apps.app import futurama_api |
| 79 | + |
| 80 | + return cls( |
| 81 | + urls=[url.path for url in futurama_api.public_urls], |
| 82 | + ) |
0 commit comments