2024-04-18 04:48:49 +02:00
|
|
|
use axum::extract::{Path, Query, State};
|
2024-04-12 22:21:23 +02:00
|
|
|
use sea_orm::{ColumnTrait, QueryFilter};
|
2024-04-18 05:25:56 +02:00
|
|
|
use crate::{errors::UpubError, model::{self, addressing::EmbeddedActivity}, server::{auth::AuthIdentity, fetcher::Fetcher, Context}};
|
2024-03-20 05:44:50 +01:00
|
|
|
|
2024-04-18 04:48:49 +02:00
|
|
|
use super::{jsonld::LD, JsonLD, TryFetch};
|
2024-03-20 05:44:50 +01:00
|
|
|
|
2024-04-12 22:21:23 +02:00
|
|
|
pub async fn view(
|
|
|
|
State(ctx): State<Context>,
|
|
|
|
Path(id): Path<String>,
|
|
|
|
AuthIdentity(auth): AuthIdentity,
|
2024-04-18 04:48:49 +02:00
|
|
|
Query(query): Query<TryFetch>,
|
|
|
|
) -> crate::Result<JsonLD<serde_json::Value>> {
|
2024-04-15 21:36:31 +02:00
|
|
|
let aid = if id.starts_with('+') {
|
|
|
|
format!("https://{}", id.replacen('+', "", 1).replace('@', "/"))
|
|
|
|
} else {
|
|
|
|
ctx.aid(id.clone())
|
|
|
|
};
|
2024-04-19 05:26:51 +02:00
|
|
|
if auth.is_local() && query.fetch && !ctx.is_local(&aid) {
|
|
|
|
ctx.fetch_activity(&aid).await?;
|
|
|
|
}
|
|
|
|
|
2024-04-12 22:21:23 +02:00
|
|
|
match model::addressing::Entity::find_activities()
|
2024-04-18 04:48:49 +02:00
|
|
|
.filter(model::activity::Column::Id.eq(&aid))
|
2024-04-12 22:21:23 +02:00
|
|
|
.filter(auth.filter_condition())
|
|
|
|
.into_model::<EmbeddedActivity>()
|
2024-03-21 01:42:29 +01:00
|
|
|
.one(ctx.db())
|
2024-04-18 04:48:49 +02:00
|
|
|
.await?
|
2024-03-21 01:42:29 +01:00
|
|
|
{
|
2024-04-21 23:19:26 +02:00
|
|
|
Some(activity) => Ok(JsonLD(
|
|
|
|
activity.ap_filled(ctx.db()).await?.ld_context()
|
|
|
|
)),
|
2024-04-19 05:26:51 +02:00
|
|
|
None => Err(UpubError::not_found()),
|
2024-03-20 05:44:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|