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
|
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> {
|
pub fn notifications(user: i64, show_seen: bool) -> Select<model::notification::Entity> {
|
||||||
let mut select =
|
let mut select =
|
||||||
model::notification::Entity::find()
|
model::notification::Entity::find()
|
||||||
|
|
|
@ -5,6 +5,7 @@ pub mod object;
|
||||||
pub mod activity;
|
pub mod activity;
|
||||||
pub mod application;
|
pub mod application;
|
||||||
pub mod auth;
|
pub mod auth;
|
||||||
|
pub mod tags;
|
||||||
pub mod well_known;
|
pub mod well_known;
|
||||||
|
|
||||||
use axum::{http::StatusCode, response::IntoResponse, routing::{get, patch, post, put}, Router};
|
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))
|
// .route("/actors/:id/audience/page", get(ap::actor::audience::page))
|
||||||
// activities
|
// activities
|
||||||
.route("/activities/:id", get(ap::activity::view))
|
.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
|
// specific object routes
|
||||||
.route("/objects/:id", get(ap::object::view))
|
.route("/objects/:id", get(ap::object::view))
|
||||||
.route("/objects/:id/replies", get(ap::object::replies::get))
|
.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