forked from alemi/upub
feat: added hashtags collections routes
This commit is contained in:
parent
0e3d97ae97
commit
2836ec2b37
3 changed files with 71 additions and 0 deletions
|
@ -90,6 +90,21 @@ impl Query {
|
|||
select
|
||||
}
|
||||
|
||||
// TODO this double join is probably not the best way to query for this...
|
||||
pub fn hashtags() -> Select<model::hashtag::Entity> {
|
||||
let mut select =
|
||||
model::hashtag::Entity::find()
|
||||
.join(sea_orm::JoinType::InnerJoin, model::hashtag::Relation::Objects.def())
|
||||
.join(sea_orm::JoinType::InnerJoin, model::object::Relation::Addressing.def())
|
||||
.select_only();
|
||||
|
||||
for col in model::object::Column::iter() {
|
||||
select = select.select_column_as(col, format!("{}{}", model::object::Entity.table_name(), col.to_string()));
|
||||
}
|
||||
|
||||
select
|
||||
}
|
||||
|
||||
pub fn notifications(user: i64, show_seen: bool) -> Select<model::notification::Entity> {
|
||||
let mut select =
|
||||
model::notification::Entity::find()
|
||||
|
|
|
@ -5,6 +5,7 @@ pub mod object;
|
|||
pub mod activity;
|
||||
pub mod application;
|
||||
pub mod auth;
|
||||
pub mod tags;
|
||||
pub mod well_known;
|
||||
|
||||
use axum::{http::StatusCode, response::IntoResponse, routing::{get, patch, post, put}, Router};
|
||||
|
@ -59,6 +60,9 @@ impl ActivityPubRouter for Router<upub::Context> {
|
|||
// .route("/actors/:id/audience/page", get(ap::actor::audience::page))
|
||||
// activities
|
||||
.route("/activities/:id", get(ap::activity::view))
|
||||
// hashtags
|
||||
.route("/tags/:id", get(ap::tags::get))
|
||||
.route("/tags/:id/page", get(ap::tags::page))
|
||||
// specific object routes
|
||||
.route("/objects/:id", get(ap::object::view))
|
||||
.route("/objects/:id/replies", get(ap::object::replies::get))
|
||||
|
|
52
upub/routes/src/activitypub/tags.rs
Normal file
52
upub/routes/src/activitypub/tags.rs
Normal file
|
@ -0,0 +1,52 @@
|
|||
use axum::extract::{Path, Query, State};
|
||||
use sea_orm::{QueryFilter, QuerySelect, ColumnTrait};
|
||||
|
||||
use upub::{selector::{BatchFillable, RichActivity}, 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, "/tags/{id}"),
|
||||
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>> {
|
||||
let limit = page.batch.unwrap_or(20).min(50);
|
||||
let offset = page.offset.unwrap_or(0);
|
||||
|
||||
let objects = upub::Query::hashtags()
|
||||
.filter(auth.filter())
|
||||
.filter(upub::model::hashtag::Column::Name.eq(&id))
|
||||
.limit(limit)
|
||||
.offset(offset)
|
||||
.into_model::<RichActivity>()
|
||||
.all(ctx.db())
|
||||
.await?
|
||||
.with_batched::<upub::model::attachment::Entity>(ctx.db())
|
||||
.await?
|
||||
.with_batched::<upub::model::mention::Entity>(ctx.db())
|
||||
.await?
|
||||
.with_batched::<upub::model::hashtag::Entity>(ctx.db())
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|x| x.ap())
|
||||
.collect();
|
||||
|
||||
crate::builders::collection_page(
|
||||
&upub::url!(ctx, "/tags/{id}/page"),
|
||||
offset,
|
||||
limit,
|
||||
objects,
|
||||
)
|
||||
|
||||
}
|
Loading…
Reference in a new issue