[feat] add FOLLOWERS_ONLY visibility support
All checks were successful
/ run-pytest (push) Successful in 1m30s

This commit is contained in:
SouthFox 2024-03-17 16:46:03 +08:00
parent 253970094b
commit f82ffc5069
4 changed files with 50 additions and 10 deletions

View file

@ -438,6 +438,9 @@ async def _send_create(
elif visibility == ap.VisibilityEnum.UNLISTED:
to = [f"{BASE_URL}/followers"]
cc = [ap.AS_PUBLIC]
elif visibility == ap.VisibilityEnum.FOLLOWERS_ONLY:
to = [f"{BASE_URL}/followers"]
cc = []
else:
raise ValueError(f"Unsupport visibility {visibility}")

View file

@ -2,6 +2,7 @@
(import app [models])
(import app.database [async_session])
(import sqlalchemy [select])
(import app.activitypub [VisibilityEnum])
(import pprint [pprint])
@ -10,3 +11,12 @@
(.all (await (.scalars db
(.where (select models.InboxObject)
(= models.InboxObject.ap_type ap_type))))))
(defn/a get_index_status
[db]
(.all (await
(.scalars db
(.where (select models.OutboxObject)
(.in_ models.OutboxObject.visibility [VisibilityEnum.PUBLIC VisibilityEnum.UNLISTED])
(.is_ models.OutboxObject.is_deleted False))))))

View file

@ -30,6 +30,7 @@ from app.boxes import save_incoming
from app.activitypub import VisibilityEnum
from app.boxes import _send_create
from app.orgpython import to_html
from app.hysql import get_index_status
def _check_0rtt_early_data(request: Request) -> None:
@ -81,16 +82,7 @@ async def index(
if is_ap_requested(request):
return ActivityPubResponse(ME)
statues = (
await db_session.scalars(
select(models.OutboxObject)
.where(
models.OutboxObject.ap_type == "Note",
models.OutboxObject.is_deleted.is_(False),
)
.order_by(models.OutboxObject.created_at.desc())
)
).all()
statues = await get_index_status(db_session)
return templates.TemplateResponse(
request,

View file

@ -1,9 +1,12 @@
#!/usr/bin/env python3
import pytest
import httpx
import respx
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session
from app import activitypub as ap
from app.config import AP_CONTENT_TYPE
from tests.utils import build_remote_actor
_ACCEPTED_AP_HEADERS = [
@ -26,3 +29,35 @@ def test_index__ap(db: Session, client: TestClient, accept: str):
assert response.status_code == 200
assert response.headers["content-type"] == AP_CONTENT_TYPE
assert response.json() == ap.ME
@pytest.mark.asyncio
async def test_index_unlisted_statu(
db: Session,
async_db_session,
client: TestClient,
respx_mock: respx.MockRouter,
) -> None:
# build test actor
ra = build_remote_actor()
remote_ap_id = ra.ap_id # type: ignore
# mock request
respx_mock.get(remote_ap_id).mock(
return_value=httpx.Response(200,json=ra.ap_actor))
respx_mock.post(remote_ap_id + "/inbox").mock(
return_value=httpx.Response(202))
response = client.post(
"/outbox",
headers={"Authorization": "Basic test-token"},
content='{"visibility": "followers-only","content": "note content"}'
)
assert response.status_code == 200
# And the Note was not show in the index
indext_content = client.get("/").text
assert "note content" not in indext_content