[feat] show note in index
This commit is contained in:
parent
68ae04e72a
commit
abdf1fea0f
6 changed files with 81 additions and 5 deletions
18
app/ap_object.py
Normal file
18
app/ap_object.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
from app import activitypub as ap
|
||||||
|
|
||||||
|
from functools import cached_property
|
||||||
|
|
||||||
|
|
||||||
|
class BaseObject:
|
||||||
|
@property
|
||||||
|
def ap_object(self) -> ap.RawObject:
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def content(self) -> str | None:
|
||||||
|
content = self.ap_object.get("content")
|
||||||
|
if not content:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return content
|
23
app/main.py
23
app/main.py
|
@ -9,6 +9,7 @@ from fastapi import Depends
|
||||||
from fastapi import Request
|
from fastapi import Request
|
||||||
from fastapi import Response
|
from fastapi import Response
|
||||||
from fastapi.exceptions import HTTPException
|
from fastapi.exceptions import HTTPException
|
||||||
|
from fastapi.templating import Jinja2Templates
|
||||||
from starlette.responses import JSONResponse
|
from starlette.responses import JSONResponse
|
||||||
|
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
@ -43,6 +44,8 @@ app = FastAPI(
|
||||||
dependencies=[Depends(_check_0rtt_early_data)]
|
dependencies=[Depends(_check_0rtt_early_data)]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
templates = Jinja2Templates(directory="templates")
|
||||||
|
|
||||||
logger.remove()
|
logger.remove()
|
||||||
logger.add(sys.stdout, level="DEBUG" if DEBUG else "INFO")
|
logger.add(sys.stdout, level="DEBUG" if DEBUG else "INFO")
|
||||||
logger.add("output.log", level="DEBUG")
|
logger.add("output.log", level="DEBUG")
|
||||||
|
@ -71,13 +74,29 @@ def is_ap_requested(req: Request) -> bool:
|
||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
async def index(
|
async def index(
|
||||||
request: Request
|
request: Request,
|
||||||
|
db_session: AsyncSession = Depends(get_db_session),
|
||||||
):
|
):
|
||||||
"""Return index page."""
|
"""Return index page."""
|
||||||
if is_ap_requested(request):
|
if is_ap_requested(request):
|
||||||
return ActivityPubResponse(ME)
|
return ActivityPubResponse(ME)
|
||||||
|
|
||||||
return ME
|
statues = (
|
||||||
|
await db_session.scalars(
|
||||||
|
select(models.OutboxObject).where(
|
||||||
|
models.OutboxObject.ap_type == "Note",
|
||||||
|
models.OutboxObject.is_deleted.is_(False),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).all()
|
||||||
|
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
"index.html",
|
||||||
|
{
|
||||||
|
"request": request,
|
||||||
|
"statues": statues,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.post("/inbox")
|
@app.post("/inbox")
|
||||||
|
|
|
@ -8,6 +8,7 @@ from app import activitypub as ap
|
||||||
from app.database import Base
|
from app.database import Base
|
||||||
from app.database import metadata_obj
|
from app.database import metadata_obj
|
||||||
from app.activitypub import BaseActor
|
from app.activitypub import BaseActor
|
||||||
|
from app.ap_object import BaseObject
|
||||||
|
|
||||||
from sqlalchemy import Column
|
from sqlalchemy import Column
|
||||||
from sqlalchemy import Boolean
|
from sqlalchemy import Boolean
|
||||||
|
@ -42,7 +43,7 @@ class Actor(Base, BaseActor):
|
||||||
is_blocked = Column(Boolean, nullable=False, default=False, server_default="0")
|
is_blocked = Column(Boolean, nullable=False, default=False, server_default="0")
|
||||||
is_deleted = Column(Boolean, nullable=False, default=False, server_default="0")
|
is_deleted = Column(Boolean, nullable=False, default=False, server_default="0")
|
||||||
|
|
||||||
class InboxObject(Base):
|
class InboxObject(Base, BaseObject):
|
||||||
__tablename__ = "inbox"
|
__tablename__ = "inbox"
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, index=True)
|
id = Column(Integer, primary_key=True, index=True)
|
||||||
|
@ -89,7 +90,7 @@ class InboxObject(Base):
|
||||||
uselist=False,
|
uselist=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
class OutboxObject(Base):
|
class OutboxObject(Base, BaseObject):
|
||||||
__tablename__ = "outbox"
|
__tablename__ = "outbox"
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, index=True)
|
id = Column(Integer, primary_key=True, index=True)
|
||||||
|
|
11
templates/index.html
Normal file
11
templates/index.html
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Index</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Test</h1>
|
||||||
|
{% for status in statues recursive%}
|
||||||
|
{{ status.content | safe }}
|
||||||
|
{% endfor %}
|
||||||
|
</body>
|
||||||
|
</html>
|
25
templates/utils.html
Normal file
25
templates/utils.html
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html class="no-js" lang="">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
||||||
|
<title>Untitled</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||||
|
<!-- Place favicon.ico in the root directory -->
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!--[if lt IE 8]>
|
||||||
|
<p class="browserupgrade">
|
||||||
|
You are using an <strong>outdated</strong> browser. Please
|
||||||
|
<a href="http://browsehappy.com/">upgrade your browser</a> to improve
|
||||||
|
your experience.
|
||||||
|
</p>
|
||||||
|
<![endif]-->
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -13,10 +13,12 @@ _ACCEPTED_AP_HEADERS = [
|
||||||
'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
|
'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def test_index__html(client: TestClient):
|
def test_index__html(client: TestClient):
|
||||||
response = client.get("/")
|
response = client.get("/")
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert response.headers["content-type"] == "application/json"
|
assert response.headers["content-type"].startswith("text/html")
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("accept", _ACCEPTED_AP_HEADERS)
|
@pytest.mark.parametrize("accept", _ACCEPTED_AP_HEADERS)
|
||||||
def test_index__ap(db: Session, client: TestClient, accept: str):
|
def test_index__ap(db: Session, client: TestClient, accept: str):
|
||||||
|
|
Loading…
Reference in a new issue