Make post/profile page redirection work when web client service is enabled
This commit is contained in:
parent
dea6bcad2a
commit
7494d62858
|
@ -14,7 +14,7 @@ use crate::database::{get_database_client, DbPool};
|
||||||
use crate::errors::HttpError;
|
use crate::errors::HttpError;
|
||||||
use crate::models::posts::helpers::{add_related_posts, can_view_post};
|
use crate::models::posts::helpers::{add_related_posts, can_view_post};
|
||||||
use crate::models::posts::queries::{get_post_by_id, get_posts_by_author};
|
use crate::models::posts::queries::{get_post_by_id, get_posts_by_author};
|
||||||
use crate::models::users::queries::{get_user_by_id, get_user_by_name};
|
use crate::models::users::queries::get_user_by_name;
|
||||||
use crate::web_client::urls::{get_post_page_url, get_profile_page_url};
|
use crate::web_client::urls::{get_post_page_url, get_profile_page_url};
|
||||||
use super::actors::types::{get_local_actor, get_instance_actor};
|
use super::actors::types::{get_local_actor, get_instance_actor};
|
||||||
use super::builders::create_note::{build_note, build_create_note};
|
use super::builders::create_note::{build_note, build_create_note};
|
||||||
|
@ -27,10 +27,8 @@ use super::constants::{AP_MEDIA_TYPE, AS_MEDIA_TYPE};
|
||||||
use super::identifiers::{
|
use super::identifiers::{
|
||||||
local_actor_followers,
|
local_actor_followers,
|
||||||
local_actor_following,
|
local_actor_following,
|
||||||
local_actor_id,
|
|
||||||
local_actor_subscribers,
|
local_actor_subscribers,
|
||||||
local_actor_outbox,
|
local_actor_outbox,
|
||||||
local_object_id,
|
|
||||||
};
|
};
|
||||||
use super::receiver::receive_activity;
|
use super::receiver::receive_activity;
|
||||||
|
|
||||||
|
@ -330,39 +328,6 @@ pub async fn object_view(
|
||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/profile/{profile_id}")]
|
|
||||||
pub async fn frontend_profile_redirect(
|
|
||||||
config: web::Data<Config>,
|
|
||||||
db_pool: web::Data<DbPool>,
|
|
||||||
profile_id: web::Path<Uuid>,
|
|
||||||
) -> Result<HttpResponse, HttpError> {
|
|
||||||
let db_client = &**get_database_client(&db_pool).await?;
|
|
||||||
let user = get_user_by_id(db_client, &profile_id).await?;
|
|
||||||
let actor_id = local_actor_id(
|
|
||||||
&config.instance_url(),
|
|
||||||
&user.profile.username,
|
|
||||||
);
|
|
||||||
let response = HttpResponse::Found()
|
|
||||||
.append_header(("Location", actor_id))
|
|
||||||
.finish();
|
|
||||||
Ok(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[get("/post/{object_id}")]
|
|
||||||
pub async fn frontend_post_redirect(
|
|
||||||
config: web::Data<Config>,
|
|
||||||
internal_object_id: web::Path<Uuid>,
|
|
||||||
) -> Result<HttpResponse, HttpError> {
|
|
||||||
let object_id = local_object_id(
|
|
||||||
&config.instance_url(),
|
|
||||||
&internal_object_id,
|
|
||||||
);
|
|
||||||
let response = HttpResponse::Found()
|
|
||||||
.append_header(("Location", object_id))
|
|
||||||
.finish();
|
|
||||||
Ok(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use actix_web::http::{
|
use actix_web::http::{
|
||||||
|
|
13
src/main.rs
13
src/main.rs
|
@ -33,7 +33,7 @@ use mitra::mastodon_api::timelines::views::timeline_api_scope;
|
||||||
use mitra::mastodon_api::UPLOAD_MAX_SIZE;
|
use mitra::mastodon_api::UPLOAD_MAX_SIZE;
|
||||||
use mitra::nodeinfo::views as nodeinfo;
|
use mitra::nodeinfo::views as nodeinfo;
|
||||||
use mitra::webfinger::views as webfinger;
|
use mitra::webfinger::views as webfinger;
|
||||||
use mitra::web_client::views::web_client_service;
|
use mitra::web_client::views as web_client;
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
async fn main() -> std::io::Result<()> {
|
async fn main() -> std::io::Result<()> {
|
||||||
|
@ -158,7 +158,9 @@ async fn main() -> std::io::Result<()> {
|
||||||
.service(activitypub::object_view)
|
.service(activitypub::object_view)
|
||||||
.service(atom::get_atom_feed)
|
.service(atom::get_atom_feed)
|
||||||
.service(nodeinfo::get_nodeinfo)
|
.service(nodeinfo::get_nodeinfo)
|
||||||
.service(nodeinfo::get_nodeinfo_2_0);
|
.service(nodeinfo::get_nodeinfo_2_0)
|
||||||
|
.service(web_client::profile_page_redirect())
|
||||||
|
.service(web_client::post_page_redirect());
|
||||||
if let Some(blockchain_config) = config.blockchain() {
|
if let Some(blockchain_config) = config.blockchain() {
|
||||||
if let Some(ethereum_config) = blockchain_config.ethereum_config() {
|
if let Some(ethereum_config) = blockchain_config.ethereum_config() {
|
||||||
// Serve artifacts if available
|
// Serve artifacts if available
|
||||||
|
@ -169,12 +171,7 @@ async fn main() -> std::io::Result<()> {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
if let Some(ref web_client_dir) = config.web_client_dir {
|
if let Some(ref web_client_dir) = config.web_client_dir {
|
||||||
app = app.service(web_client_service(web_client_dir));
|
app = app.service(web_client::static_service(web_client_dir));
|
||||||
} else {
|
|
||||||
// Enable redirects only when serving of web client is disabled
|
|
||||||
app = app
|
|
||||||
.service(activitypub::frontend_profile_redirect)
|
|
||||||
.service(activitypub::frontend_post_redirect)
|
|
||||||
};
|
};
|
||||||
app
|
app
|
||||||
})
|
})
|
||||||
|
|
|
@ -2,13 +2,25 @@ use std::path::Path;
|
||||||
|
|
||||||
use actix_files::{Files, NamedFile};
|
use actix_files::{Files, NamedFile};
|
||||||
use actix_web::{
|
use actix_web::{
|
||||||
|
guard,
|
||||||
|
web,
|
||||||
|
HttpResponse,
|
||||||
|
Resource,
|
||||||
dev::{fn_service, ServiceRequest, ServiceResponse},
|
dev::{fn_service, ServiceRequest, ServiceResponse},
|
||||||
web::Data,
|
web::Data,
|
||||||
};
|
};
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
use crate::activitypub::{
|
||||||
|
constants::{AP_MEDIA_TYPE, AS_MEDIA_TYPE},
|
||||||
|
identifiers::{local_actor_id, local_object_id},
|
||||||
|
};
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
|
use crate::database::{get_database_client, DbPool};
|
||||||
|
use crate::errors::HttpError;
|
||||||
|
use crate::models::users::queries::get_user_by_id;
|
||||||
|
|
||||||
pub fn web_client_service(web_client_dir: &Path) -> Files {
|
pub fn static_service(web_client_dir: &Path) -> Files {
|
||||||
Files::new("/", web_client_dir)
|
Files::new("/", web_client_dir)
|
||||||
.index_file("index.html")
|
.index_file("index.html")
|
||||||
.prefer_utf8(true)
|
.prefer_utf8(true)
|
||||||
|
@ -27,3 +39,52 @@ pub fn web_client_service(web_client_dir: &Path) -> Files {
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn profile_page_redirect_view(
|
||||||
|
config: web::Data<Config>,
|
||||||
|
db_pool: web::Data<DbPool>,
|
||||||
|
profile_id: web::Path<Uuid>,
|
||||||
|
) -> Result<HttpResponse, HttpError> {
|
||||||
|
let db_client = &**get_database_client(&db_pool).await?;
|
||||||
|
let user = get_user_by_id(db_client, &profile_id).await?;
|
||||||
|
let actor_id = local_actor_id(
|
||||||
|
&config.instance_url(),
|
||||||
|
&user.profile.username,
|
||||||
|
);
|
||||||
|
let response = HttpResponse::Found()
|
||||||
|
.append_header(("Location", actor_id))
|
||||||
|
.finish();
|
||||||
|
Ok(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn profile_page_redirect() -> Resource {
|
||||||
|
web::resource("/profile/{profile_id}")
|
||||||
|
.guard(
|
||||||
|
guard::Any(guard::Header("Accept", AP_MEDIA_TYPE))
|
||||||
|
.or(guard::Header("Accept", AS_MEDIA_TYPE))
|
||||||
|
)
|
||||||
|
.route(web::get().to(profile_page_redirect_view))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn post_page_redirect_view(
|
||||||
|
config: web::Data<Config>,
|
||||||
|
internal_object_id: web::Path<Uuid>,
|
||||||
|
) -> Result<HttpResponse, HttpError> {
|
||||||
|
let object_id = local_object_id(
|
||||||
|
&config.instance_url(),
|
||||||
|
&internal_object_id,
|
||||||
|
);
|
||||||
|
let response = HttpResponse::Found()
|
||||||
|
.append_header(("Location", object_id))
|
||||||
|
.finish();
|
||||||
|
Ok(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn post_page_redirect() -> Resource {
|
||||||
|
web::resource("/post/{object_id}")
|
||||||
|
.guard(
|
||||||
|
guard::Any(guard::Header("Accept", AP_MEDIA_TYPE))
|
||||||
|
.or(guard::Header("Accept", AS_MEDIA_TYPE))
|
||||||
|
)
|
||||||
|
.route(web::get().to(post_page_redirect_view))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue