1
0
Fork 0
forked from alemi/upub

feat: added hashtags collections routes

This commit is contained in:
əlemi 2024-07-04 02:59:22 +02:00
parent 0e3d97ae97
commit 2836ec2b37
Signed by: alemi
GPG key ID: A4895B84D311642C
3 changed files with 71 additions and 0 deletions

View file

@ -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()

View file

@ -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))

View 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,
)
}