[feat] support unlisted visibility note
All checks were successful
/ run-pytest (push) Successful in 1m28s
All checks were successful
/ run-pytest (push) Successful in 1m28s
This commit is contained in:
parent
eff8338f80
commit
c97581278d
4 changed files with 43 additions and 6 deletions
|
@ -435,6 +435,9 @@ async def _send_create(
|
|||
if visibility == ap.VisibilityEnum.PUBLIC:
|
||||
to = [ap.AS_PUBLIC]
|
||||
cc = [f"{BASE_URL}/followers"]
|
||||
elif visibility == ap.VisibilityEnum.UNLISTED:
|
||||
to = [f"{BASE_URL}/followers"]
|
||||
cc = [ap.AS_PUBLIC]
|
||||
else:
|
||||
raise ValueError(f"Unsupport visibility {visibility}")
|
||||
|
||||
|
|
11
app/main.py
11
app/main.py
|
@ -126,9 +126,8 @@ async def outbox(
|
|||
db_session: AsyncSession = Depends(get_db_session),
|
||||
) -> Response:
|
||||
"""ActivityPub outbox endpoint, now only process client post request."""
|
||||
payload = await request.body()
|
||||
content = payload.decode("utf-8")
|
||||
logger.info(content)
|
||||
payload = await request.json()
|
||||
logger.info(payload)
|
||||
post_token = request.headers.get("Authorization")
|
||||
|
||||
def _check_post_token() -> bool:
|
||||
|
@ -144,13 +143,13 @@ async def outbox(
|
|||
return Response(status_code=406)
|
||||
|
||||
logger.info("True token")
|
||||
content = to_html(content).replace("\n", "")
|
||||
note_content = to_html(payload["content"]).replace("\n", "")
|
||||
|
||||
await _send_create(
|
||||
db_session,
|
||||
"Note",
|
||||
content,
|
||||
VisibilityEnum.PUBLIC
|
||||
note_content,
|
||||
payload["visibility"]
|
||||
)
|
||||
return Response(status_code=200)
|
||||
|
||||
|
|
|
@ -10,3 +10,5 @@ debug = true
|
|||
|
||||
# In-mem DB
|
||||
sqlalchemy_database = "file:pytest?mode=memory&cache=shared&uri=true"
|
||||
|
||||
post_token = "test-token"
|
||||
|
|
|
@ -155,3 +155,36 @@ async def test_outbox_send_create_activity(
|
|||
outbox_object = db.execute(select(models.OutboxObject)).scalar_one()
|
||||
assert outbox_object.ap_type == "Note"
|
||||
assert outbox_object.ap_object["content"] == content
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_outbox_send_unlisted_note(
|
||||
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))
|
||||
|
||||
from app.activitypub import VisibilityEnum
|
||||
|
||||
|
||||
response = client.post(
|
||||
"/outbox",
|
||||
headers={"Authorization": "Basic test-token"},
|
||||
content='{"visibility": "unlisted","content": "note content"}'
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
# And the Follow activity was created in the outbox
|
||||
outbox_object = db.execute(select(models.OutboxObject)).scalar_one()
|
||||
assert outbox_object.ap_type == "Note"
|
||||
assert outbox_object.visibility == VisibilityEnum.UNLISTED
|
||||
|
|
Loading…
Reference in a new issue