name = "lemmy_server"
version = "0.0.1"
dependencies = [
+ "activitystreams",
"actix",
"actix-files",
+ "actix-rt",
"actix-web",
"actix-web-actors",
"anyhow",
"reqwest",
"rss",
"serde 1.0.117",
+ "serde_json",
"sha2",
"strum",
"tokio 0.3.1",
sha2 = "0.9"
anyhow = "1.0"
reqwest = { version = "0.10", features = ["json"] }
+activitystreams = "0.7.0-alpha.4"
+actix-rt = { version = "1.1", default-features = false }
+serde_json = { version = "1.0", features = ["preserve_order"]}
[dev-dependencies.cargo-husky]
version = "1"
})
.await??;
- if !activity.local || activity.sensitive {
+ let sensitive = activity.sensitive.unwrap_or(true);
+ if !activity.local || sensitive {
Ok(HttpResponse::NotFound().finish())
} else {
Ok(create_apub_response(&activity.data))
#[table_name = "activity"]
pub struct Activity {
pub id: i32,
- pub ap_id: String,
pub data: Value,
pub local: bool,
- pub sensitive: bool,
pub published: chrono::NaiveDateTime,
pub updated: Option<chrono::NaiveDateTime>,
+ pub ap_id: Option<String>,
+ pub sensitive: Option<bool>,
}
#[derive(Insertable, AsChangeset)]
#[table_name = "activity"]
pub struct ActivityForm {
- pub ap_id: String,
pub data: Value,
pub local: bool,
- pub sensitive: bool,
pub updated: Option<chrono::NaiveDateTime>,
+ pub ap_id: String,
+ pub sensitive: bool,
}
impl Crud<ActivityForm> for Activity {
.set(new_activity)
.get_result::<Self>(conn)
}
+ fn delete(conn: &PgConnection, activity_id: i32) -> Result<usize, Error> {
+ use crate::schema::activity::dsl::*;
+ diesel::delete(activity.find(activity_id)).execute(conn)
+ }
}
impl Activity {
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
let expected_activity = Activity {
- ap_id: ap_id.to_string(),
+ ap_id: Some(ap_id.to_string()),
id: inserted_activity.id,
data: test_json,
local: true,
- sensitive: false,
+ sensitive: Some(false),
published: inserted_activity.published,
updated: None,
};
let read_activity = Activity::read(&conn, inserted_activity.id).unwrap();
let read_activity_by_apub_id = Activity::read_from_apub_id(&conn, ap_id).unwrap();
User_::delete(&conn, inserted_creator.id).unwrap();
+ Activity::delete(&conn, inserted_activity.id).unwrap();
assert_eq!(expected_activity, read_activity);
assert_eq!(expected_activity, read_activity_by_apub_id);
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
pub id: i32,
pub community_id: i32,
pub user_id: i32,
- pub pending: bool,
pub published: chrono::NaiveDateTime,
+ pub pending: Option<bool>,
}
#[derive(Insertable, AsChangeset, Clone)]
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
let community_follower_form = CommunityFollowerForm {
community_id: inserted_community.id,
user_id: inserted_user.id,
+ pending: false,
};
let inserted_community_follower =
id: inserted_community_follower.id,
community_id: inserted_community.id,
user_id: inserted_user.id,
+ pending: Some(false),
published: inserted_community_follower.published,
};
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
published: None,
updated: None,
admin: false,
- banned: false,
+ banned: Some(false),
show_nsfw: false,
theme: "browser".into(),
default_sort_type: SortType::Hot as i16,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
table! {
activity (id) {
id -> Int4,
- ap_id -> Text,
data -> Jsonb,
local -> Bool,
- sensitive -> Bool,
published -> Timestamp,
updated -> Nullable<Timestamp>,
+ ap_id -> Nullable<Text>,
+ sensitive -> Nullable<Bool>,
}
}
id -> Int4,
community_id -> Int4,
user_id -> Int4,
- pending -> Bool,
published -> Timestamp,
+ pending -> Nullable<Bool>,
}
}
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
published: None,
updated: None,
show_nsfw: false,
export DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy
diesel migration run
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy
-RUST_TEST_THREADS=1 cargo test --workspace --no-fail-fast
+# Integration tests only work on stable due to a bug in config-rs
+# https://github.com/mehcode/config-rs/issues/158
+RUST_BACKTRACE=1 RUST_TEST_THREADS=1 \
+ cargo +stable test --workspace --no-fail-fast
PgConnection,
};
use http_signature_normalization_actix::PrepareVerifyError;
+use lemmy_api::match_websocket_operation;
+use lemmy_apub::{
+ activity_queue::create_activity_queue,
+ inbox::{
+ community_inbox,
+ community_inbox::community_inbox,
+ shared_inbox,
+ shared_inbox::shared_inbox,
+ user_inbox,
+ user_inbox::user_inbox,
+ },
+};
use lemmy_db::{
community::{Community, CommunityForm},
user::{User_, *},
SortType,
};
use lemmy_rate_limit::{rate_limiter::RateLimiter, RateLimit};
-use lemmy_server::{
- apub::{
- activity_queue::create_activity_queue,
- inbox::{
- community_inbox,
- community_inbox::community_inbox,
- shared_inbox,
- shared_inbox::shared_inbox,
- user_inbox,
- user_inbox::user_inbox,
- },
- },
- websocket::chat_server::ChatServer,
- LemmyContext,
-};
use lemmy_utils::{apub::generate_actor_keypair, settings::Settings};
+use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
use reqwest::Client;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
let chat_server = ChatServer::startup(
pool.clone(),
rate_limiter.clone(),
+ |c, i, o, d| Box::pin(match_websocket_operation(c, i, o, d)),
Client::default(),
activity_queue.clone(),
)
.start();
- LemmyContext::new(
+ LemmyContext::create(
pool,
chat_server,
Client::default(),
avatar: None,
banner: None,
admin: false,
- banned: false,
+ banned: Some(false),
updated: None,
published: None,
show_nsfw: false,
let connection = &context.pool().get().unwrap();
let user = create_user(connection, "user_inbox_cgsax");
let activity =
- create_activity::<CreateType, ActorAndObject<user_inbox::ValidTypes>>(user.actor_id);
+ create_activity::<CreateType, ActorAndObject<user_inbox::UserValidTypes>>(user.actor_id);
let path = Path::<String> {
0: "username".to_string(),
};
let user = create_user(connection, "community_inbox_hrxa");
let community = create_community(connection, user.id);
let request = create_http_request();
- let activity =
- create_activity::<FollowType, ActorAndObject<community_inbox::ValidTypes>>(user.actor_id);
+ let activity = create_activity::<FollowType, ActorAndObject<community_inbox::CommunityValidTypes>>(
+ user.actor_id,
+ );
let path = Path::<String> { 0: community.name };
let response = community_inbox(request, activity, path, web::Data::new(context)).await;
assert_eq!(