forked from alemi/upub
feat: add streams and move feed to its own field
This commit is contained in:
parent
20e5a3c104
commit
40392aef56
4 changed files with 50 additions and 4 deletions
|
@ -43,6 +43,8 @@ pub trait Actor : Object {
|
|||
fn following_me(&self) -> Field<bool> { Err(FieldErr("followingMe")) }
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
fn followed_by_me(&self) -> Field<bool> { Err(FieldErr("followedByMe")) }
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
fn feed(&self) -> Node<Self::Collection> { Node::Empty }
|
||||
|
||||
#[cfg(feature = "activitypub-counters")]
|
||||
fn followers_count(&self) -> Field<u64> { Err(FieldErr("followersCount")) }
|
||||
|
@ -96,6 +98,8 @@ pub trait ActorMut : ObjectMut {
|
|||
fn set_following_me(self, val: Option<bool>) -> Self;
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
fn set_followed_by_me(self, val: Option<bool>) -> Self;
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
fn set_feed(self, val: Node<Self::Collection>) -> Self;
|
||||
|
||||
#[cfg(feature = "activitypub-counters")]
|
||||
fn set_followers_count(self, val: Option<u64>) -> Self;
|
||||
|
@ -150,6 +154,8 @@ impl Actor for serde_json::Value {
|
|||
crate::getter! { followingMe -> bool }
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
crate::getter! { followedByMe -> bool }
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
crate::getter! { feed -> node Self::Collection }
|
||||
|
||||
#[cfg(feature = "activitypub-counters")]
|
||||
crate::getter! { followingCount -> u64 }
|
||||
|
@ -199,6 +205,8 @@ impl ActorMut for serde_json::Value {
|
|||
crate::setter! { followingMe -> bool }
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
crate::setter! { followedByMe -> bool }
|
||||
#[cfg(feature = "activitypub-fe")]
|
||||
crate::setter! { feed -> node Self::Collection }
|
||||
|
||||
#[cfg(feature = "activitypub-counters")]
|
||||
crate::setter! { followingCount -> u64 }
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
pub mod inbox;
|
||||
|
||||
pub mod outbox;
|
||||
|
||||
pub mod following;
|
||||
|
||||
pub mod feed;
|
||||
pub mod streams;
|
||||
|
||||
use axum::extract::{Path, Query, State};
|
||||
|
||||
|
@ -60,7 +58,7 @@ pub async fn view(
|
|||
let mut user = user_model.ap()
|
||||
.set_inbox(Node::link(upub::url!(ctx, "/actors/{id}/inbox")))
|
||||
.set_outbox(Node::link(upub::url!(ctx, "/actors/{id}/outbox")))
|
||||
.set_streams(Node::link(upub::url!(ctx, "/actors/{id}/feed")))
|
||||
.set_streams(Node::link(upub::url!(ctx, "/actors/{id}/streams")))
|
||||
.set_following(Node::link(upub::url!(ctx, "/actors/{id}/following")))
|
||||
.set_followers(Node::link(upub::url!(ctx, "/actors/{id}/followers")))
|
||||
.set_following_me(following_me)
|
||||
|
@ -72,6 +70,10 @@ pub async fn view(
|
|||
.set_proxy_url(Some(&upub::url!(ctx, "/proxy")))
|
||||
));
|
||||
|
||||
if auth.is(&uid) {
|
||||
user = user.set_feed(Node::link(upub::url!(ctx, "/actors/{id}/feed")));
|
||||
}
|
||||
|
||||
if !auth.is(&uid) && !cfg.show_followers_count {
|
||||
user = user.set_followers_count(None);
|
||||
}
|
||||
|
@ -91,6 +93,8 @@ pub async fn view(
|
|||
user_model.ap()
|
||||
.set_following_me(following_me)
|
||||
.set_followed_by_me(followed_by_me)
|
||||
// TODO should we set streams?? we offer this collection but actor is remote
|
||||
.set_streams(Node::link(upub::url!(ctx, "/actors/{id}/streams")))
|
||||
.ld_context()
|
||||
)),
|
||||
None => Err(crate::ApiError::not_found()),
|
||||
|
|
32
upub/routes/src/activitypub/actor/streams.rs
Normal file
32
upub/routes/src/activitypub/actor/streams.rs
Normal file
|
@ -0,0 +1,32 @@
|
|||
use axum::extract::{Path, Query, State};
|
||||
use sea_orm::{ColumnTrait, Condition};
|
||||
|
||||
use upub::Context;
|
||||
|
||||
use crate::{activitypub::Pagination, builders::JsonLD, AuthIdentity};
|
||||
|
||||
pub async fn get(
|
||||
State(ctx): State<Context>,
|
||||
Path(id): Path<String>,
|
||||
) -> crate::ApiResult<JsonLD<serde_json::Value>> {
|
||||
crate::builders::collection(&upub::url!(ctx, "/actors/{id}/streams"), None)
|
||||
}
|
||||
|
||||
pub async fn page(
|
||||
State(ctx): State<Context>,
|
||||
Path(id): Path<String>,
|
||||
AuthIdentity(auth): AuthIdentity,
|
||||
Query(page): Query<Pagination>,
|
||||
) -> crate::ApiResult<JsonLD<serde_json::Value>> {
|
||||
crate::builders::paginate_objects(
|
||||
upub::url!(ctx, "/actors/{id}/streams/page"),
|
||||
Condition::all()
|
||||
.add(auth.filter_objects())
|
||||
.add(upub::model::object::Column::AttributedTo.eq(ctx.uid(&id))),
|
||||
ctx.db(),
|
||||
page,
|
||||
auth.my_id(),
|
||||
false,
|
||||
)
|
||||
.await
|
||||
}
|
|
@ -51,6 +51,8 @@ impl ActivityPubRouter for Router<upub::Context> {
|
|||
.route("/actors/:id/outbox", post(ap::actor::outbox::post))
|
||||
.route("/actors/:id/outbox", get(ap::actor::outbox::get))
|
||||
.route("/actors/:id/outbox/page", get(ap::actor::outbox::page))
|
||||
.route("/actors/:id/streams", get(ap::actor::streams::get))
|
||||
.route("/actors/:id/streams/page", get(ap::actor::streams::page))
|
||||
.route("/actors/:id/feed", get(ap::actor::feed::get))
|
||||
.route("/actors/:id/feed/page", get(ap::actor::feed::page))
|
||||
.route("/actors/:id/followers", get(ap::actor::following::get::<false>))
|
||||
|
|
Loading…
Reference in a new issue