Add diesel_async, get rid of blocking function (#2510)

* Moving settings to Database.

- Moves many settings into the database. Fixes #2285
- Adds a local_site and instance table. Fixes #2365 . Fixes #2368
- Separates SQL update an insert forms, to avoid runtime errors.
- Adds TypedBuilder to all the SQL forms, instead of default.

* Fix weird clippy issue.

* Removing extra lines.

* Some fixes from suggestions.

* Fixing apub tests.

* Using instance creation helper function.

* Move forms to their own line.

* Trying to fix local_site_data, still broken.

* Testing out async

* Testing out async 2

* Fixing federation tests.

* Trying to fix check features 1.

* Starting on adding diesel async. 1/4th done.

* Added async to views and schema.

* Adding some more async

* Compiling now.

* Added diesel async. Fixes #2465

* Running clippy --fix

* Trying to fix cargo test on drone.

* Trying new muslrust.

* Trying a custom dns

* Trying a custom dns 2

* Trying a custom dns 3

* Trying a custom dns 4

* Trying a custom dns 5

* Trying a custom dns 6

* Trying a custom dns 7

* Addressing PR comments.

* Adding check_apub to all verify functions.

* Reverting back drone.

* Fixing merge

* Fix docker images.

* Adding missing discussion_languages.

* Trying to fix federation tests.

* Fix site setup user creation.

* Fix clippy

* Fix clippy 2

* Test api faster

* Try to fix 1

* Try to fix 2

* What are these lines about

* Trying to fix 3

* Moving federation test back to top.

* Remove logging cat.
pull/2549/head
Dessalines 2 years ago committed by GitHub
parent ceae0f5993
commit 5d837780f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -10,8 +10,7 @@ steps:
# use minimum supported rust version for most steps # use minimum supported rust version for most steps
- name: prepare repo - name: prepare repo
image: clux/muslrust:1.59.0 image: clux/muslrust:1.64.0
user: root
commands: commands:
- git fetch --tags - git fetch --tags
- git submodule init - git submodule init
@ -34,7 +33,7 @@ steps:
- cargo clippy --workspace --all-features -- -D clippy::unwrap_used - cargo clippy --workspace --all-features -- -D clippy::unwrap_used
- name: cargo test - name: cargo test
image: clux/muslrust:1.59.0 image: clux/muslrust:1.64.0
environment: environment:
LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
LEMMY_CONFIG_LOCATION: ../../config/config.hjson LEMMY_CONFIG_LOCATION: ../../config/config.hjson
@ -46,20 +45,20 @@ steps:
- cargo test --workspace --no-fail-fast --all-features - cargo test --workspace --no-fail-fast --all-features
- name: check defaults.hjson updated - name: check defaults.hjson updated
image: clux/muslrust:1.59.0 image: clux/muslrust:1.64.0
commands: commands:
- ./scripts/update_config_defaults.sh config/defaults_current.hjson - ./scripts/update_config_defaults.sh config/defaults_current.hjson
- diff config/defaults.hjson config/defaults_current.hjson - diff config/defaults.hjson config/defaults_current.hjson
- name: check with different features - name: check with different features
image: clux/muslrust:1.59.0 image: clux/muslrust:1.64.0
commands: commands:
- cargo install cargo-workspaces - cargo install cargo-workspaces
- cargo workspaces exec cargo check --no-default-features - cargo workspaces exec cargo check --no-default-features
- cargo workspaces exec cargo check --all-features - cargo workspaces exec cargo check --all-features
- name: cargo build - name: cargo build
image: clux/muslrust:1.59.0 image: clux/muslrust:1.64.0
commands: commands:
- cargo build - cargo build
- mv target/x86_64-unknown-linux-musl/debug/lemmy_server target/lemmy_server - mv target/x86_64-unknown-linux-musl/debug/lemmy_server target/lemmy_server

895
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -50,9 +50,10 @@ lemmy_api_common = { version = "=0.16.5", path = "crates/api_common" }
lemmy_websocket = { version = "=0.16.5", path = "./crates/websocket" } lemmy_websocket = { version = "=0.16.5", path = "./crates/websocket" }
lemmy_routes = { version = "=0.16.5", path = "./crates/routes" } lemmy_routes = { version = "=0.16.5", path = "./crates/routes" }
activitypub_federation = "0.2.3" activitypub_federation = "0.2.3"
diesel = "2.0.0" diesel = "2.0.2"
diesel_migrations = "2.0.0" diesel_migrations = "2.0.0"
serde = { version = "1.0.145", features = ["derive"] } diesel-async = "0.1.1"
serde = { version = "1.0.147", features = ["derive"] }
actix = "0.13.0" actix = "0.13.0"
actix-web = { version = "4.2.1", default-features = false, features = ["macros", "rustls"] } actix-web = { version = "4.2.1", default-features = false, features = ["macros", "rustls"] }
tracing = "0.1.36" tracing = "0.1.36"

@ -20,7 +20,7 @@
"eslint": "^8.25.0", "eslint": "^8.25.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.0.0",
"jest": "^27.0.6", "jest": "^27.0.6",
"lemmy-js-client": "0.17.0-rc.47", "lemmy-js-client": "0.17.0-rc.48",
"node-fetch": "^2.6.1", "node-fetch": "^2.6.1",
"prettier": "^2.7.1", "prettier": "^2.7.1",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",

@ -31,41 +31,35 @@ killall lemmy_server || true
echo "$PWD" echo "$PWD"
echo "start alpha" echo "start alpha"
LEMMY_HOSTNAME=lemmy-alpha:8541 \ LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_alpha.hjson \
LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_alpha.hjson \ LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_alpha" \
LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_alpha" \ target/lemmy_server >/tmp/lemmy_alpha.out 2>&1 &
LEMMY_HOSTNAME="lemmy-alpha:8541" \
target/lemmy_server >/tmp/lemmy_alpha.out 2>&1 &
echo "start beta" echo "start beta"
LEMMY_HOSTNAME=lemmy-beta:8551 \ LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_beta.hjson \
LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_beta.hjson \ LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_beta" \
LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_beta" \ target/lemmy_server >/tmp/lemmy_beta.out 2>&1 &
target/lemmy_server >/tmp/lemmy_beta.out 2>&1 &
echo "start gamma" echo "start gamma"
LEMMY_HOSTNAME=lemmy-gamma:8561 \ LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_gamma.hjson \
LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_gamma.hjson \ LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_gamma" \
LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_gamma" \ target/lemmy_server >/tmp/lemmy_gamma.out 2>&1 &
target/lemmy_server >/tmp/lemmy_gamma.out 2>&1 &
echo "start delta" echo "start delta"
# An instance with only an allowlist for beta # An instance with only an allowlist for beta
LEMMY_HOSTNAME=lemmy-delta:8571 \ LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_delta.hjson \
LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_delta.hjson \ LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_delta" \
LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_delta" \ target/lemmy_server >/tmp/lemmy_delta.out 2>&1 &
target/lemmy_server >/tmp/lemmy_delta.out 2>&1 &
echo "start epsilon" echo "start epsilon"
# An instance who has a blocklist, with lemmy-alpha blocked # An instance who has a blocklist, with lemmy-alpha blocked
LEMMY_HOSTNAME=lemmy-epsilon:8581 \ LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_epsilon.hjson \
LEMMY_CONFIG_LOCATION=./docker/federation/lemmy_epsilon.hjson \ LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_epsilon" \
LEMMY_DATABASE_URL="${LEMMY_DATABASE_URL}/lemmy_epsilon" \ target/lemmy_server >/tmp/lemmy_epsilon.out 2>&1 &
target/lemmy_server >/tmp/lemmy_epsilon.out 2>&1 &
echo "wait for all instances to start" echo "wait for all instances to start"
while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8541/api/v3/site')" != "200" ]]; do sleep 1; done while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'lemmy-alpha:8541/api/v3/site')" != "200" ]]; do sleep 1; done
while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8551/api/v3/site')" != "200" ]]; do sleep 1; done while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'lemmy-beta:8551/api/v3/site')" != "200" ]]; do sleep 1; done
while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8561/api/v3/site')" != "200" ]]; do sleep 1; done while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'lemmy-gamma:8561/api/v3/site')" != "200" ]]; do sleep 1; done
while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8571/api/v3/site')" != "200" ]]; do sleep 1; done while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'lemmy-delta:8571/api/v3/site')" != "200" ]]; do sleep 1; done
while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8581/api/v3/site')" != "200" ]]; do sleep 1; done while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'lemmy-epsilon:8581/api/v3/site')" != "200" ]]; do sleep 1; done

@ -2373,10 +2373,10 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
lemmy-js-client@0.17.0-rc.47: lemmy-js-client@0.17.0-rc.48:
version "0.17.0-rc.47" version "0.17.0-rc.48"
resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.17.0-rc.47.tgz#6094657d2868767532c0e837a31f9af6273b345b" resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.17.0-rc.48.tgz#6085812d4901b7d12b3fca237d8aced7f5210eac"
integrity sha512-Pc1wyr6sX4Z6LS75NVu46WAXeci5G80+Y9ZBXEAmgM+OZGuOCLUq8lAHRvTwr7M0pj0gxo5yP+i3qPVmTPf+EA== integrity sha512-Lz8Nzq/kczQtDj6STlbhxoEarFHtTCoWcWBabyPs6X6em/pfK/cnZqx1mMn7EaBSDUVQ+WL8UNFjQiqjhR4kww==
leven@^3.1.0: leven@^3.1.0:
version "3.1.0" version "3.1.0"

@ -23,15 +23,19 @@ lemmy_db_views_actor = { version = "=0.16.5", path = "../db_views_actor", featur
lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["full"] } lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["full"] }
lemmy_websocket = { version = "=0.16.5", path = "../websocket" } lemmy_websocket = { version = "=0.16.5", path = "../websocket" }
activitypub_federation = "0.2.3" activitypub_federation = "0.2.3"
diesel = "2.0.0" diesel = "2.0.2"
bcrypt = "0.13.0" bcrypt = "0.13.0"
chrono = { version = "0.4.22", features = ["serde"], default-features = false } chrono = { version = "0.4.22", features = ["serde"], default-features = false }
serde_json = { version = "1.0.85", features = ["preserve_order"] } serde_json = { version = "1.0.87", features = ["preserve_order"] }
serde = { version = "1.0.145", features = ["derive"] } serde = { version = "1.0.147", features = ["derive"] }
actix-web = { version = "4.2.1", default-features = false } actix-web = { version = "4.2.1", default-features = false }
base64 = "0.13.0" base64 = "0.13.1"
uuid = { version = "1.1.2", features = ["serde", "v4"] } uuid = { version = "1.2.1", features = ["serde", "v4"] }
async-trait = "0.1.57" async-trait = "0.1.58"
captcha = "0.0.9" captcha = "0.0.9"
anyhow = "1.0.65" anyhow = "1.0.66"
tracing = "0.1.36" tracing = "0.1.37"
[dev-dependencies]
serial_test = "0.9.0"
tokio = "1.21.2"

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentResponse, CreateCommentLike}, comment::{CommentResponse, CreateCommentLike},
utils::{blocking, check_community_ban, check_downvotes_enabled, get_local_user_view_from_jwt}, utils::{check_community_ban, check_downvotes_enabled, get_local_user_view_from_jwt},
}; };
use lemmy_apub::{ use lemmy_apub::{
fetcher::post_or_comment::PostOrComment, fetcher::post_or_comment::PostOrComment,
@ -36,7 +36,7 @@ impl Perform for CreateCommentLike {
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<CommentResponse, LemmyError> { ) -> Result<CommentResponse, LemmyError> {
let data: &CreateCommentLike = self; let data: &CreateCommentLike = self;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
@ -46,10 +46,7 @@ impl Perform for CreateCommentLike {
check_downvotes_enabled(data.score, &local_site)?; check_downvotes_enabled(data.score, &local_site)?;
let comment_id = data.comment_id; let comment_id = data.comment_id;
let orig_comment = blocking(context.pool(), move |conn| { let orig_comment = CommentView::read(context.pool(), comment_id, None).await?;
CommentView::read(conn, comment_id, None)
})
.await??;
check_community_ban( check_community_ban(
local_user_view.person.id, local_user_view.person.id,
@ -59,17 +56,10 @@ impl Perform for CreateCommentLike {
.await?; .await?;
// Add parent poster or commenter to recipients // Add parent poster or commenter to recipients
let comment_reply = blocking(context.pool(), move |conn| { let comment_reply = CommentReply::read_by_comment(context.pool(), comment_id).await;
CommentReply::read_by_comment(conn, comment_id)
})
.await?;
if let Ok(reply) = comment_reply { if let Ok(reply) = comment_reply {
let recipient_id = reply.recipient_id; let recipient_id = reply.recipient_id;
if let Ok(local_recipient) = blocking(context.pool(), move |conn| { if let Ok(local_recipient) = LocalUserView::read_person(context.pool(), recipient_id).await {
LocalUserView::read_person(conn, recipient_id)
})
.await?
{
recipient_ids.push(local_recipient.local_user.id); recipient_ids.push(local_recipient.local_user.id);
} }
} }
@ -83,10 +73,8 @@ impl Perform for CreateCommentLike {
// Remove any likes first // Remove any likes first
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
blocking(context.pool(), move |conn| {
CommentLike::remove(conn, person_id, comment_id) CommentLike::remove(context.pool(), person_id, comment_id).await?;
})
.await??;
// Only add the like if the score isnt 0 // Only add the like if the score isnt 0
let comment = orig_comment.comment; let comment = orig_comment.comment;
@ -94,9 +82,8 @@ impl Perform for CreateCommentLike {
let do_add = like_form.score != 0 && (like_form.score == 1 || like_form.score == -1); let do_add = like_form.score != 0 && (like_form.score == 1 || like_form.score == -1);
if do_add { if do_add {
let like_form2 = like_form.clone(); let like_form2 = like_form.clone();
let like = move |conn: &mut _| CommentLike::like(conn, &like_form2); CommentLike::like(context.pool(), &like_form2)
blocking(context.pool(), like) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_like_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_like_comment"))?;
Vote::send( Vote::send(

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentResponse, SaveComment}, comment::{CommentResponse, SaveComment},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::comment::{CommentSaved, CommentSavedForm}, source::comment::{CommentSaved, CommentSavedForm},
@ -32,23 +32,18 @@ impl Perform for SaveComment {
}; };
if data.save { if data.save {
let save_comment = move |conn: &mut _| CommentSaved::save(conn, &comment_saved_form); CommentSaved::save(context.pool(), &comment_saved_form)
blocking(context.pool(), save_comment) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_save_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_save_comment"))?;
} else { } else {
let unsave_comment = move |conn: &mut _| CommentSaved::unsave(conn, &comment_saved_form); CommentSaved::unsave(context.pool(), &comment_saved_form)
blocking(context.pool(), unsave_comment) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_save_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_save_comment"))?;
} }
let comment_id = data.comment_id; let comment_id = data.comment_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let comment_view = blocking(context.pool(), move |conn| { let comment_view = CommentView::read(context.pool(), comment_id, Some(person_id)).await?;
CommentView::read(conn, comment_id, Some(person_id))
})
.await??;
Ok(CommentResponse { Ok(CommentResponse {
comment_view, comment_view,

@ -3,7 +3,7 @@ use activitypub_federation::core::object_id::ObjectId;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentReportResponse, CreateCommentReport}, comment::{CommentReportResponse, CreateCommentReport},
utils::{blocking, check_community_ban, get_local_user_view_from_jwt}, utils::{check_community_ban, get_local_user_view_from_jwt},
}; };
use lemmy_apub::protocol::activities::community::report::Report; use lemmy_apub::protocol::activities::community::report::Report;
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -31,17 +31,14 @@ impl Perform for CreateCommentReport {
let data: &CreateCommentReport = self; let data: &CreateCommentReport = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let reason = self.reason.trim(); let reason = self.reason.trim();
check_report_reason(reason, &local_site)?; check_report_reason(reason, &local_site)?;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let comment_id = data.comment_id; let comment_id = data.comment_id;
let comment_view = blocking(context.pool(), move |conn| { let comment_view = CommentView::read(context.pool(), comment_id, None).await?;
CommentView::read(conn, comment_id, None)
})
.await??;
check_community_ban(person_id, comment_view.community.id, context.pool()).await?; check_community_ban(person_id, comment_view.community.id, context.pool()).await?;
@ -52,16 +49,11 @@ impl Perform for CreateCommentReport {
reason: reason.to_owned(), reason: reason.to_owned(),
}; };
let report = blocking(context.pool(), move |conn| { let report = CommentReport::report(context.pool(), &report_form)
CommentReport::report(conn, &report_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_report"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_create_report"))?;
let comment_report_view = blocking(context.pool(), move |conn| { let comment_report_view = CommentReportView::read(context.pool(), report.id, person_id).await?;
CommentReportView::read(conn, report.id, person_id)
})
.await??;
let res = CommentReportResponse { let res = CommentReportResponse {
comment_report_view, comment_report_view,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{ListCommentReports, ListCommentReportsResponse}, comment::{ListCommentReports, ListCommentReportsResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_views::comment_report_view::CommentReportQuery; use lemmy_db_views::comment_report_view::CommentReportQuery;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -31,19 +31,17 @@ impl Perform for ListCommentReports {
let page = data.page; let page = data.page;
let limit = data.limit; let limit = data.limit;
let comment_reports = blocking(context.pool(), move |conn| { let comment_reports = CommentReportQuery::builder()
CommentReportQuery::builder() .pool(context.pool())
.conn(conn) .my_person_id(person_id)
.my_person_id(person_id) .admin(admin)
.admin(admin) .community_id(community_id)
.community_id(community_id) .unresolved_only(unresolved_only)
.unresolved_only(unresolved_only) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
let res = ListCommentReportsResponse { comment_reports }; let res = ListCommentReportsResponse { comment_reports };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentReportResponse, ResolveCommentReport}, comment::{CommentReportResponse, ResolveCommentReport},
utils::{blocking, get_local_user_view_from_jwt, is_mod_or_admin}, utils::{get_local_user_view_from_jwt, is_mod_or_admin},
}; };
use lemmy_db_schema::{source::comment_report::CommentReport, traits::Reportable}; use lemmy_db_schema::{source::comment_report::CommentReport, traits::Reportable};
use lemmy_db_views::structs::CommentReportView; use lemmy_db_views::structs::CommentReportView;
@ -26,32 +26,23 @@ impl Perform for ResolveCommentReport {
let report_id = data.report_id; let report_id = data.report_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let report = blocking(context.pool(), move |conn| { let report = CommentReportView::read(context.pool(), report_id, person_id).await?;
CommentReportView::read(conn, report_id, person_id)
})
.await??;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
is_mod_or_admin(context.pool(), person_id, report.community.id).await?; is_mod_or_admin(context.pool(), person_id, report.community.id).await?;
let resolved = data.resolved; if data.resolved {
let resolve_fun = move |conn: &mut _| { CommentReport::resolve(context.pool(), report_id, person_id)
if resolved { .await
CommentReport::resolve(conn, report_id, person_id) .map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
} else { } else {
CommentReport::unresolve(conn, report_id, person_id) CommentReport::unresolve(context.pool(), report_id, person_id)
} .await
}; .map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
}
blocking(context.pool(), resolve_fun)
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
let report_id = data.report_id; let report_id = data.report_id;
let comment_report_view = blocking(context.pool(), move |conn| { let comment_report_view = CommentReportView::read(context.pool(), report_id, person_id).await?;
CommentReportView::read(conn, report_id, person_id)
})
.await??;
let res = CommentReportResponse { let res = CommentReportResponse {
comment_report_view, comment_report_view,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{AddModToCommunity, AddModToCommunityResponse}, community::{AddModToCommunity, AddModToCommunityResponse},
utils::{blocking, get_local_user_view_from_jwt, is_mod_or_admin}, utils::{get_local_user_view_from_jwt, is_mod_or_admin},
}; };
use lemmy_apub::{ use lemmy_apub::{
objects::{community::ApubCommunity, person::ApubPerson}, objects::{community::ApubCommunity, person::ApubPerson},
@ -38,10 +38,7 @@ impl Perform for AddModToCommunity {
// Verify that only mods or admins can add mod // Verify that only mods or admins can add mod
is_mod_or_admin(context.pool(), local_user_view.person.id, community_id).await?; is_mod_or_admin(context.pool(), local_user_view.person.id, community_id).await?;
let community = blocking(context.pool(), move |conn| { let community = Community::read(context.pool(), community_id).await?;
Community::read(conn, community_id)
})
.await??;
if local_user_view.person.admin && !community.local { if local_user_view.person.admin && !community.local {
return Err(LemmyError::from_message("not_a_moderator")); return Err(LemmyError::from_message("not_a_moderator"));
} }
@ -52,14 +49,12 @@ impl Perform for AddModToCommunity {
person_id: data.person_id, person_id: data.person_id,
}; };
if data.added { if data.added {
let join = move |conn: &mut _| CommunityModerator::join(conn, &community_moderator_form); CommunityModerator::join(context.pool(), &community_moderator_form)
blocking(context.pool(), join) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?;
} else { } else {
let leave = move |conn: &mut _| CommunityModerator::leave(conn, &community_moderator_form); CommunityModerator::leave(context.pool(), &community_moderator_form)
blocking(context.pool(), leave) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?;
} }
@ -70,18 +65,12 @@ impl Perform for AddModToCommunity {
community_id: data.community_id, community_id: data.community_id,
removed: Some(!data.added), removed: Some(!data.added),
}; };
blocking(context.pool(), move |conn| {
ModAddCommunity::create(conn, &form) ModAddCommunity::create(context.pool(), &form).await?;
})
.await??;
// Send to federated instances // Send to federated instances
let updated_mod_id = data.person_id; let updated_mod_id = data.person_id;
let updated_mod: ApubPerson = blocking(context.pool(), move |conn| { let updated_mod: ApubPerson = Person::read(context.pool(), updated_mod_id).await?.into();
Person::read(conn, updated_mod_id)
})
.await??
.into();
let community: ApubCommunity = community.into(); let community: ApubCommunity = community.into();
if data.added { if data.added {
AddMod::send( AddMod::send(
@ -104,10 +93,7 @@ impl Perform for AddModToCommunity {
// Note: in case a remote mod is added, this returns the old moderators list, it will only get // Note: in case a remote mod is added, this returns the old moderators list, it will only get
// updated once we receive an activity from the community (like `Announce/Add/Moderator`) // updated once we receive an activity from the community (like `Announce/Add/Moderator`)
let community_id = data.community_id; let community_id = data.community_id;
let moderators = blocking(context.pool(), move |conn| { let moderators = CommunityModeratorView::for_community(context.pool(), community_id).await?;
CommunityModeratorView::for_community(conn, community_id)
})
.await??;
let res = AddModToCommunityResponse { moderators }; let res = AddModToCommunityResponse { moderators };
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{BanFromCommunity, BanFromCommunityResponse}, community::{BanFromCommunity, BanFromCommunityResponse},
utils::{blocking, get_local_user_view_from_jwt, is_mod_or_admin, remove_user_data_in_community}, utils::{get_local_user_view_from_jwt, is_mod_or_admin, remove_user_data_in_community},
}; };
use lemmy_apub::{ use lemmy_apub::{
activities::block::SiteOrCommunity, activities::block::SiteOrCommunity,
@ -55,21 +55,12 @@ impl Perform for BanFromCommunity {
expires: Some(expires), expires: Some(expires),
}; };
let community: ApubCommunity = blocking(context.pool(), move |conn: &mut _| { let community: ApubCommunity = Community::read(context.pool(), community_id).await?.into();
Community::read(conn, community_id) let banned_person: ApubPerson = Person::read(context.pool(), banned_person_id).await?.into();
})
.await??
.into();
let banned_person: ApubPerson = blocking(context.pool(), move |conn: &mut _| {
Person::read(conn, banned_person_id)
})
.await??
.into();
if data.ban { if data.ban {
let ban = move |conn: &mut _| CommunityPersonBan::ban(conn, &community_user_ban_form); CommunityPersonBan::ban(context.pool(), &community_user_ban_form)
blocking(context.pool(), ban) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_user_already_banned"))?; .map_err(|e| LemmyError::from_error_message(e, "community_user_already_banned"))?;
// Also unsubscribe them from the community, if they are subscribed // Also unsubscribe them from the community, if they are subscribed
@ -78,11 +69,10 @@ impl Perform for BanFromCommunity {
person_id: banned_person_id, person_id: banned_person_id,
pending: false, pending: false,
}; };
blocking(context.pool(), move |conn: &mut _| {
CommunityFollower::unfollow(conn, &community_follower_form) CommunityFollower::unfollow(context.pool(), &community_follower_form)
}) .await
.await? .ok();
.ok();
BlockUser::send( BlockUser::send(
&SiteOrCommunity::Community(community), &SiteOrCommunity::Community(community),
@ -95,9 +85,8 @@ impl Perform for BanFromCommunity {
) )
.await?; .await?;
} else { } else {
let unban = move |conn: &mut _| CommunityPersonBan::unban(conn, &community_user_ban_form); CommunityPersonBan::unban(context.pool(), &community_user_ban_form)
blocking(context.pool(), unban) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_user_already_banned"))?; .map_err(|e| LemmyError::from_error_message(e, "community_user_already_banned"))?;
UndoBlockUser::send( UndoBlockUser::send(
&SiteOrCommunity::Community(community), &SiteOrCommunity::Community(community),
@ -123,16 +112,11 @@ impl Perform for BanFromCommunity {
banned: Some(data.ban), banned: Some(data.ban),
expires, expires,
}; };
blocking(context.pool(), move |conn| {
ModBanFromCommunity::create(conn, &form) ModBanFromCommunity::create(context.pool(), &form).await?;
})
.await??;
let person_id = data.person_id; let person_id = data.person_id;
let person_view = blocking(context.pool(), move |conn| { let person_view = PersonViewSafe::read(context.pool(), person_id).await?;
PersonViewSafe::read(conn, person_id)
})
.await??;
let res = BanFromCommunityResponse { let res = BanFromCommunityResponse {
person_view, person_view,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{BlockCommunity, BlockCommunityResponse}, community::{BlockCommunity, BlockCommunityResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_apub::protocol::activities::following::undo_follow::UndoFollowCommunity; use lemmy_apub::protocol::activities::following::undo_follow::UndoFollowCommunity;
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -38,9 +38,8 @@ impl Perform for BlockCommunity {
}; };
if data.block { if data.block {
let block = move |conn: &mut _| CommunityBlock::block(conn, &community_block_form); CommunityBlock::block(context.pool(), &community_block_form)
blocking(context.pool(), block) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_block_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_block_already_exists"))?;
// Also, unfollow the community, and send a federated unfollow // Also, unfollow the community, and send a federated unfollow
@ -49,27 +48,19 @@ impl Perform for BlockCommunity {
person_id, person_id,
pending: false, pending: false,
}; };
blocking(context.pool(), move |conn: &mut _| {
CommunityFollower::unfollow(conn, &community_follower_form) CommunityFollower::unfollow(context.pool(), &community_follower_form)
}) .await
.await? .ok();
.ok(); let community = Community::read(context.pool(), community_id).await?;
let community = blocking(context.pool(), move |conn| {
Community::read(conn, community_id)
})
.await??;
UndoFollowCommunity::send(&local_user_view.person.into(), &community.into(), context).await?; UndoFollowCommunity::send(&local_user_view.person.into(), &community.into(), context).await?;
} else { } else {
let unblock = move |conn: &mut _| CommunityBlock::unblock(conn, &community_block_form); CommunityBlock::unblock(context.pool(), &community_block_form)
blocking(context.pool(), unblock) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_block_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_block_already_exists"))?;
} }
let community_view = blocking(context.pool(), move |conn| { let community_view = CommunityView::read(context.pool(), community_id, Some(person_id)).await?;
CommunityView::read(conn, community_id, Some(person_id))
})
.await??;
Ok(BlockCommunityResponse { Ok(BlockCommunityResponse {
blocked: data.block, blocked: data.block,

@ -2,12 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{CommunityResponse, FollowCommunity}, community::{CommunityResponse, FollowCommunity},
utils::{ utils::{check_community_ban, check_community_deleted_or_removed, get_local_user_view_from_jwt},
blocking,
check_community_ban,
check_community_deleted_or_removed,
get_local_user_view_from_jwt,
},
}; };
use lemmy_apub::{ use lemmy_apub::{
objects::community::ApubCommunity, objects::community::ApubCommunity,
@ -39,11 +34,7 @@ impl Perform for FollowCommunity {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let community_id = data.community_id; let community_id = data.community_id;
let community: ApubCommunity = blocking(context.pool(), move |conn| { let community: ApubCommunity = Community::read(context.pool(), community_id).await?.into();
Community::read(conn, community_id)
})
.await??
.into();
let community_follower_form = CommunityFollowerForm { let community_follower_form = CommunityFollowerForm {
community_id: data.community_id, community_id: data.community_id,
person_id: local_user_view.person.id, person_id: local_user_view.person.id,
@ -55,15 +46,12 @@ impl Perform for FollowCommunity {
check_community_ban(local_user_view.person.id, community_id, context.pool()).await?; check_community_ban(local_user_view.person.id, community_id, context.pool()).await?;
check_community_deleted_or_removed(community_id, context.pool()).await?; check_community_deleted_or_removed(community_id, context.pool()).await?;
let follow = move |conn: &mut _| CommunityFollower::follow(conn, &community_follower_form); CommunityFollower::follow(context.pool(), &community_follower_form)
blocking(context.pool(), follow) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
} else { } else {
let unfollow = CommunityFollower::unfollow(context.pool(), &community_follower_form)
move |conn: &mut _| CommunityFollower::unfollow(conn, &community_follower_form); .await
blocking(context.pool(), unfollow)
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
} }
} else if data.follow { } else if data.follow {
@ -74,19 +62,14 @@ impl Perform for FollowCommunity {
} else { } else {
UndoFollowCommunity::send(&local_user_view.person.clone().into(), &community, context) UndoFollowCommunity::send(&local_user_view.person.clone().into(), &community, context)
.await?; .await?;
let unfollow = CommunityFollower::unfollow(context.pool(), &community_follower_form)
move |conn: &mut _| CommunityFollower::unfollow(conn, &community_follower_form); .await
blocking(context.pool(), unfollow)
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
} }
let community_id = data.community_id; let community_id = data.community_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let community_view = blocking(context.pool(), move |conn| { let community_view = CommunityView::read(context.pool(), community_id, Some(person_id)).await?;
CommunityView::read(conn, community_id, Some(person_id))
})
.await??;
Ok(Self::Response { community_view }) Ok(Self::Response { community_view })
} }

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{CommunityResponse, HideCommunity}, community::{CommunityResponse, HideCommunity},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_apub::protocol::activities::community::update::UpdateCommunity; use lemmy_apub::protocol::activities::community::update::UpdateCommunity;
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -44,16 +44,11 @@ impl Perform for HideCommunity {
}; };
let community_id = data.community_id; let community_id = data.community_id;
let updated_community = blocking(context.pool(), move |conn| { let updated_community = Community::update(context.pool(), community_id, &community_form)
Community::update(conn, community_id, &community_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community_hidden_status"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community_hidden_status"))?;
blocking(context.pool(), move |conn| { ModHideCommunity::create(context.pool(), &mod_hide_community_form).await?;
ModHideCommunity::create(conn, &mod_hide_community_form)
})
.await??;
UpdateCommunity::send( UpdateCommunity::send(
updated_community.into(), updated_community.into(),

@ -3,7 +3,7 @@ use actix_web::web::Data;
use anyhow::Context; use anyhow::Context;
use lemmy_api_common::{ use lemmy_api_common::{
community::{GetCommunityResponse, TransferCommunity}, community::{GetCommunityResponse, TransferCommunity},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -32,14 +32,12 @@ impl Perform for TransferCommunity {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let admins = blocking(context.pool(), PersonViewSafe::admins).await??; let admins = PersonViewSafe::admins(context.pool()).await?;
// Fetch the community mods // Fetch the community mods
let community_id = data.community_id; let community_id = data.community_id;
let mut community_mods = blocking(context.pool(), move |conn| { let mut community_mods =
CommunityModeratorView::for_community(conn, community_id) CommunityModeratorView::for_community(context.pool(), community_id).await?;
})
.await??;
// Make sure transferrer is either the top community mod, or an admin // Make sure transferrer is either the top community mod, or an admin
if local_user_view.person.id != community_mods[0].moderator.id if local_user_view.person.id != community_mods[0].moderator.id
@ -62,10 +60,8 @@ impl Perform for TransferCommunity {
// Delete all the mods // Delete all the mods
let community_id = data.community_id; let community_id = data.community_id;
blocking(context.pool(), move |conn| {
CommunityModerator::delete_for_community(conn, community_id) CommunityModerator::delete_for_community(context.pool(), community_id).await?;
})
.await??;
// TODO: this should probably be a bulk operation // TODO: this should probably be a bulk operation
// Re-add the mods, in the new order // Re-add the mods, in the new order
@ -75,9 +71,8 @@ impl Perform for TransferCommunity {
person_id: cmod.moderator.id, person_id: cmod.moderator.id,
}; };
let join = move |conn: &mut _| CommunityModerator::join(conn, &community_moderator_form); CommunityModerator::join(context.pool(), &community_moderator_form)
blocking(context.pool(), join) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?;
} }
@ -88,25 +83,19 @@ impl Perform for TransferCommunity {
community_id: data.community_id, community_id: data.community_id,
removed: Some(false), removed: Some(false),
}; };
blocking(context.pool(), move |conn| {
ModTransferCommunity::create(conn, &form) ModTransferCommunity::create(context.pool(), &form).await?;
})
.await??;
let community_id = data.community_id; let community_id = data.community_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let community_view = blocking(context.pool(), move |conn| { let community_view = CommunityView::read(context.pool(), community_id, Some(person_id))
CommunityView::read(conn, community_id, Some(person_id)) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
let community_id = data.community_id; let community_id = data.community_id;
let moderators = blocking(context.pool(), move |conn| { let moderators = CommunityModeratorView::for_community(context.pool(), community_id)
CommunityModeratorView::for_community(conn, community_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
// Return the jwt // Return the jwt
Ok(GetCommunityResponse { Ok(GetCommunityResponse {

@ -253,17 +253,19 @@ mod tests {
secret::Secret, secret::Secret,
}, },
traits::Crud, traits::Crud,
utils::establish_unpooled_connection, utils::build_db_pool_for_tests,
}; };
use lemmy_utils::{claims::Claims, settings::SETTINGS}; use lemmy_utils::{claims::Claims, settings::SETTINGS};
use serial_test::serial;
#[test] #[tokio::test]
fn test_should_not_validate_user_token_after_password_change() { #[serial]
let conn = &mut establish_unpooled_connection(); async fn test_should_not_validate_user_token_after_password_change() {
let secret = Secret::init(conn).unwrap(); let pool = &build_db_pool_for_tests().await;
let secret = Secret::init(pool).await.unwrap();
let settings = &SETTINGS.to_owned(); let settings = &SETTINGS.to_owned();
let inserted_instance = Instance::create(conn, "my_domain.tld").unwrap(); let inserted_instance = Instance::create(pool, "my_domain.tld").await.unwrap();
let new_person = PersonInsertForm::builder() let new_person = PersonInsertForm::builder()
.name("Gerry9812".into()) .name("Gerry9812".into())
@ -271,14 +273,14 @@ mod tests {
.instance_id(inserted_instance.id) .instance_id(inserted_instance.id)
.build(); .build();
let inserted_person = Person::create(conn, &new_person).unwrap(); let inserted_person = Person::create(pool, &new_person).await.unwrap();
let local_user_form = LocalUserInsertForm::builder() let local_user_form = LocalUserInsertForm::builder()
.person_id(inserted_person.id) .person_id(inserted_person.id)
.password_encrypted("123456".to_string()) .password_encrypted("123456".to_string())
.build(); .build();
let inserted_local_user = LocalUser::create(conn, &local_user_form).unwrap(); let inserted_local_user = LocalUser::create(pool, &local_user_form).await.unwrap();
let jwt = Claims::jwt( let jwt = Claims::jwt(
inserted_local_user.id.0, inserted_local_user.id.0,
@ -292,11 +294,13 @@ mod tests {
// The check should fail, since the validator time is now newer than the jwt issue time // The check should fail, since the validator time is now newer than the jwt issue time
let updated_local_user = let updated_local_user =
LocalUser::update_password(conn, inserted_local_user.id, "password111").unwrap(); LocalUser::update_password(pool, inserted_local_user.id, "password111")
.await
.unwrap();
let check_after = check_validator_time(&updated_local_user.validator_time, &claims); let check_after = check_validator_time(&updated_local_user.validator_time, &claims);
assert!(check_after.is_err()); assert!(check_after.is_err());
let num_deleted = Person::delete(conn, inserted_person.id).unwrap(); let num_deleted = Person::delete(pool, inserted_person.id).await.unwrap();
assert_eq!(1, num_deleted); assert_eq!(1, num_deleted);
} }
} }

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{AddAdmin, AddAdminResponse}, person::{AddAdmin, AddAdminResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -34,14 +34,12 @@ impl Perform for AddAdmin {
let added = data.added; let added = data.added;
let added_person_id = data.person_id; let added_person_id = data.person_id;
let added_admin = blocking(context.pool(), move |conn| { let added_admin = Person::update(
Person::update( context.pool(),
conn, added_person_id,
added_person_id, &PersonUpdateForm::builder().admin(Some(added)).build(),
&PersonUpdateForm::builder().admin(Some(added)).build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_user"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_user"))?;
// Mod tables // Mod tables
@ -51,9 +49,9 @@ impl Perform for AddAdmin {
removed: Some(!data.added), removed: Some(!data.added),
}; };
blocking(context.pool(), move |conn| ModAdd::create(conn, &form)).await??; ModAdd::create(context.pool(), &form).await?;
let admins = blocking(context.pool(), PersonViewSafe::admins).await??; let admins = PersonViewSafe::admins(context.pool()).await?;
let res = AddAdminResponse { admins }; let res = AddAdminResponse { admins };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{BanPerson, BanPersonResponse}, person::{BanPerson, BanPersonResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin, remove_user_data}, utils::{get_local_user_view_from_jwt, is_admin, remove_user_data},
}; };
use lemmy_apub::{ use lemmy_apub::{
activities::block::SiteOrCommunity, activities::block::SiteOrCommunity,
@ -41,17 +41,15 @@ impl Perform for BanPerson {
let banned_person_id = data.person_id; let banned_person_id = data.person_id;
let expires = data.expires.map(naive_from_unix); let expires = data.expires.map(naive_from_unix);
let person = blocking(context.pool(), move |conn| { let person = Person::update(
Person::update( context.pool(),
conn, banned_person_id,
banned_person_id, &PersonUpdateForm::builder()
&PersonUpdateForm::builder() .banned(Some(ban))
.banned(Some(ban)) .ban_expires(Some(expires))
.ban_expires(Some(expires)) .build(),
.build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_user"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_user"))?;
// Remove their data if that's desired // Remove their data if that's desired
@ -75,20 +73,12 @@ impl Perform for BanPerson {
expires, expires,
}; };
blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??; ModBan::create(context.pool(), &form).await?;
let person_id = data.person_id; let person_id = data.person_id;
let person_view = blocking(context.pool(), move |conn| { let person_view = PersonViewSafe::read(context.pool(), person_id).await?;
PersonViewSafe::read(conn, person_id)
})
.await??;
let site = SiteOrCommunity::Site( let site = SiteOrCommunity::Site(SiteView::read_local(context.pool()).await?.site.into());
blocking(context.pool(), SiteView::read_local)
.await??
.site
.into(),
);
// if the action affects a local user, federate to other instances // if the action affects a local user, federate to other instances
if person.local { if person.local {
if ban { if ban {

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{BlockPerson, BlockPersonResponse}, person::{BlockPerson, BlockPersonResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::person_block::{PersonBlock, PersonBlockForm}, source::person_block::{PersonBlock, PersonBlockForm},
@ -39,24 +39,19 @@ impl Perform for BlockPerson {
target_id, target_id,
}; };
let target_person_view = blocking(context.pool(), move |conn| { let target_person_view = PersonViewSafe::read(context.pool(), target_id).await?;
PersonViewSafe::read(conn, target_id)
})
.await??;
if target_person_view.person.admin { if target_person_view.person.admin {
return Err(LemmyError::from_message("cant_block_admin")); return Err(LemmyError::from_message("cant_block_admin"));
} }
if data.block { if data.block {
let block = move |conn: &mut _| PersonBlock::block(conn, &person_block_form); PersonBlock::block(context.pool(), &person_block_form)
blocking(context.pool(), block) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
} else { } else {
let unblock = move |conn: &mut _| PersonBlock::unblock(conn, &person_block_form); PersonBlock::unblock(context.pool(), &person_block_form)
blocking(context.pool(), unblock) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
} }

@ -3,7 +3,7 @@ use actix_web::web::Data;
use bcrypt::verify; use bcrypt::verify;
use lemmy_api_common::{ use lemmy_api_common::{
person::{ChangePassword, LoginResponse}, person::{ChangePassword, LoginResponse},
utils::{blocking, get_local_user_view_from_jwt, password_length_check}, utils::{get_local_user_view_from_jwt, password_length_check},
}; };
use lemmy_db_schema::source::local_user::LocalUser; use lemmy_db_schema::source::local_user::LocalUser;
use lemmy_utils::{claims::Claims, error::LemmyError, ConnectionId}; use lemmy_utils::{claims::Claims, error::LemmyError, ConnectionId};
@ -42,10 +42,8 @@ impl Perform for ChangePassword {
let local_user_id = local_user_view.local_user.id; let local_user_id = local_user_view.local_user.id;
let new_password = data.new_password.to_owned(); let new_password = data.new_password.to_owned();
let updated_local_user = blocking(context.pool(), move |conn| { let updated_local_user =
LocalUser::update_password(conn, local_user_id, &new_password) LocalUser::update_password(context.pool(), local_user_id, &new_password).await?;
})
.await??;
// Return the jwt // Return the jwt
Ok(LoginResponse { Ok(LoginResponse {

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{LoginResponse, PasswordChangeAfterReset}, person::{LoginResponse, PasswordChangeAfterReset},
utils::{blocking, password_length_check}, utils::password_length_check,
}; };
use lemmy_db_schema::source::{ use lemmy_db_schema::source::{
local_user::LocalUser, local_user::LocalUser,
@ -25,10 +25,9 @@ impl Perform for PasswordChangeAfterReset {
// Fetch the user_id from the token // Fetch the user_id from the token
let token = data.token.clone(); let token = data.token.clone();
let local_user_id = blocking(context.pool(), move |conn| { let local_user_id = PasswordResetRequest::read_from_token(context.pool(), &token)
PasswordResetRequest::read_from_token(conn, &token).map(|p| p.local_user_id) .await
}) .map(|p| p.local_user_id)?;
.await??;
password_length_check(&data.password)?; password_length_check(&data.password)?;
@ -39,11 +38,9 @@ impl Perform for PasswordChangeAfterReset {
// Update the user with the new password // Update the user with the new password
let password = data.password.clone(); let password = data.password.clone();
let updated_local_user = blocking(context.pool(), move |conn| { let updated_local_user = LocalUser::update_password(context.pool(), local_user_id, &password)
LocalUser::update_password(conn, local_user_id, &password) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_user"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_user"))?;
// Return the jwt // Return the jwt
Ok(LoginResponse { Ok(LoginResponse {

@ -2,10 +2,7 @@ use crate::{captcha_as_wav_base64, Perform};
use actix_web::web::Data; use actix_web::web::Data;
use captcha::{gen, Difficulty}; use captcha::{gen, Difficulty};
use chrono::Duration; use chrono::Duration;
use lemmy_api_common::{ use lemmy_api_common::person::{CaptchaResponse, GetCaptcha, GetCaptchaResponse};
person::{CaptchaResponse, GetCaptcha, GetCaptchaResponse},
utils::blocking,
};
use lemmy_db_schema::{source::local_site::LocalSite, utils::naive_now}; use lemmy_db_schema::{source::local_site::LocalSite, utils::naive_now};
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
use lemmy_websocket::{messages::CaptchaItem, LemmyContext}; use lemmy_websocket::{messages::CaptchaItem, LemmyContext};
@ -20,7 +17,7 @@ impl Perform for GetCaptcha {
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
_websocket_id: Option<ConnectionId>, _websocket_id: Option<ConnectionId>,
) -> Result<Self::Response, LemmyError> { ) -> Result<Self::Response, LemmyError> {
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
if !local_site.captcha_enabled { if !local_site.captcha_enabled {
return Ok(GetCaptchaResponse { ok: None }); return Ok(GetCaptchaResponse { ok: None });

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{BannedPersonsResponse, GetBannedPersons}, person::{BannedPersonsResponse, GetBannedPersons},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_views_actor::structs::PersonViewSafe; use lemmy_db_views_actor::structs::PersonViewSafe;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -24,7 +24,7 @@ impl Perform for GetBannedPersons {
// Make sure user is an admin // Make sure user is an admin
is_admin(&local_user_view)?; is_admin(&local_user_view)?;
let banned = blocking(context.pool(), PersonViewSafe::banned).await??; let banned = PersonViewSafe::banned(context.pool()).await?;
let res = Self::Response { banned }; let res = Self::Response { banned };

@ -3,7 +3,7 @@ use actix_web::web::Data;
use bcrypt::verify; use bcrypt::verify;
use lemmy_api_common::{ use lemmy_api_common::{
person::{Login, LoginResponse}, person::{Login, LoginResponse},
utils::{blocking, check_registration_application, check_user_valid}, utils::{check_registration_application, check_user_valid},
}; };
use lemmy_db_schema::source::local_site::LocalSite; use lemmy_db_schema::source::local_site::LocalSite;
use lemmy_db_views::structs::LocalUserView; use lemmy_db_views::structs::LocalUserView;
@ -22,15 +22,13 @@ impl Perform for Login {
) -> Result<LoginResponse, LemmyError> { ) -> Result<LoginResponse, LemmyError> {
let data: &Login = self; let data: &Login = self;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
// Fetch that username / email // Fetch that username / email
let username_or_email = data.username_or_email.clone(); let username_or_email = data.username_or_email.clone();
let local_user_view = blocking(context.pool(), move |conn| { let local_user_view = LocalUserView::find_by_email_or_name(context.pool(), &username_or_email)
LocalUserView::find_by_email_or_name(conn, &username_or_email) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_that_username_or_email"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_that_username_or_email"))?;
// Verify the password // Verify the password
let valid: bool = verify( let valid: bool = verify(

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{GetPersonMentions, GetPersonMentionsResponse}, person::{GetPersonMentions, GetPersonMentionsResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_views_actor::person_mention_view::PersonMentionQuery; use lemmy_db_views_actor::person_mention_view::PersonMentionQuery;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -29,20 +29,18 @@ impl Perform for GetPersonMentions {
let person_id = Some(local_user_view.person.id); let person_id = Some(local_user_view.person.id);
let show_bot_accounts = Some(local_user_view.local_user.show_bot_accounts); let show_bot_accounts = Some(local_user_view.local_user.show_bot_accounts);
let mentions = blocking(context.pool(), move |conn| { let mentions = PersonMentionQuery::builder()
PersonMentionQuery::builder() .pool(context.pool())
.conn(conn) .recipient_id(person_id)
.recipient_id(person_id) .my_person_id(person_id)
.my_person_id(person_id) .sort(sort)
.sort(sort) .unread_only(unread_only)
.unread_only(unread_only) .show_bot_accounts(show_bot_accounts)
.show_bot_accounts(show_bot_accounts) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
Ok(GetPersonMentionsResponse { mentions }) Ok(GetPersonMentionsResponse { mentions })
} }

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{GetReplies, GetRepliesResponse}, person::{GetReplies, GetRepliesResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_views_actor::comment_reply_view::CommentReplyQuery; use lemmy_db_views_actor::comment_reply_view::CommentReplyQuery;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -29,20 +29,18 @@ impl Perform for GetReplies {
let person_id = Some(local_user_view.person.id); let person_id = Some(local_user_view.person.id);
let show_bot_accounts = Some(local_user_view.local_user.show_bot_accounts); let show_bot_accounts = Some(local_user_view.local_user.show_bot_accounts);
let replies = blocking(context.pool(), move |conn| { let replies = CommentReplyQuery::builder()
CommentReplyQuery::builder() .pool(context.pool())
.conn(conn) .recipient_id(person_id)
.recipient_id(person_id) .my_person_id(person_id)
.my_person_id(person_id) .sort(sort)
.sort(sort) .unread_only(unread_only)
.unread_only(unread_only) .show_bot_accounts(show_bot_accounts)
.show_bot_accounts(show_bot_accounts) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
Ok(GetRepliesResponse { replies }) Ok(GetRepliesResponse { replies })
} }

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{GetRepliesResponse, MarkAllAsRead}, person::{GetRepliesResponse, MarkAllAsRead},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::source::{ use lemmy_db_schema::source::{
comment_reply::CommentReply, comment_reply::CommentReply,
@ -28,25 +28,19 @@ impl Perform for MarkAllAsRead {
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
// Mark all comment_replies as read // Mark all comment_replies as read
blocking(context.pool(), move |conn| { CommentReply::mark_all_as_read(context.pool(), person_id)
CommentReply::mark_all_as_read(conn, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
// Mark all user mentions as read // Mark all user mentions as read
blocking(context.pool(), move |conn| { PersonMention::mark_all_as_read(context.pool(), person_id)
PersonMention::mark_all_as_read(conn, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
// Mark all private_messages as read // Mark all private_messages as read
blocking(context.pool(), move |conn| { PrivateMessage::mark_all_as_read(context.pool(), person_id)
PrivateMessage::mark_all_as_read(conn, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
Ok(GetRepliesResponse { replies: vec![] }) Ok(GetRepliesResponse { replies: vec![] })
} }

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{MarkPersonMentionAsRead, PersonMentionResponse}, person::{MarkPersonMentionAsRead, PersonMentionResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::person_mention::{PersonMention, PersonMentionUpdateForm}, source::person_mention::{PersonMention, PersonMentionUpdateForm},
@ -27,10 +27,7 @@ impl Perform for MarkPersonMentionAsRead {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let person_mention_id = data.person_mention_id; let person_mention_id = data.person_mention_id;
let read_person_mention = blocking(context.pool(), move |conn| { let read_person_mention = PersonMention::read(context.pool(), person_mention_id).await?;
PersonMention::read(conn, person_mention_id)
})
.await??;
if local_user_view.person.id != read_person_mention.recipient_id { if local_user_view.person.id != read_person_mention.recipient_id {
return Err(LemmyError::from_message("couldnt_update_comment")); return Err(LemmyError::from_message("couldnt_update_comment"));
@ -38,18 +35,18 @@ impl Perform for MarkPersonMentionAsRead {
let person_mention_id = read_person_mention.id; let person_mention_id = read_person_mention.id;
let read = Some(data.read); let read = Some(data.read);
blocking(context.pool(), move |conn| { PersonMention::update(
PersonMention::update(conn, person_mention_id, &PersonMentionUpdateForm { read }) context.pool(),
}) person_mention_id,
.await? &PersonMentionUpdateForm { read },
)
.await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
let person_mention_id = read_person_mention.id; let person_mention_id = read_person_mention.id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let person_mention_view = blocking(context.pool(), move |conn| { let person_mention_view =
PersonMentionView::read(conn, person_mention_id, Some(person_id)) PersonMentionView::read(context.pool(), person_mention_id, Some(person_id)).await?;
})
.await??;
Ok(PersonMentionResponse { Ok(PersonMentionResponse {
person_mention_view, person_mention_view,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{CommentReplyResponse, MarkCommentReplyAsRead}, person::{CommentReplyResponse, MarkCommentReplyAsRead},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::comment_reply::{CommentReply, CommentReplyUpdateForm}, source::comment_reply::{CommentReply, CommentReplyUpdateForm},
@ -27,10 +27,7 @@ impl Perform for MarkCommentReplyAsRead {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let comment_reply_id = data.comment_reply_id; let comment_reply_id = data.comment_reply_id;
let read_comment_reply = blocking(context.pool(), move |conn| { let read_comment_reply = CommentReply::read(context.pool(), comment_reply_id).await?;
CommentReply::read(conn, comment_reply_id)
})
.await??;
if local_user_view.person.id != read_comment_reply.recipient_id { if local_user_view.person.id != read_comment_reply.recipient_id {
return Err(LemmyError::from_message("couldnt_update_comment")); return Err(LemmyError::from_message("couldnt_update_comment"));
@ -38,18 +35,19 @@ impl Perform for MarkCommentReplyAsRead {
let comment_reply_id = read_comment_reply.id; let comment_reply_id = read_comment_reply.id;
let read = Some(data.read); let read = Some(data.read);
blocking(context.pool(), move |conn| {
CommentReply::update(conn, comment_reply_id, &CommentReplyUpdateForm { read }) CommentReply::update(
}) context.pool(),
.await? comment_reply_id,
&CommentReplyUpdateForm { read },
)
.await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
let comment_reply_id = read_comment_reply.id; let comment_reply_id = read_comment_reply.id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let comment_reply_view = blocking(context.pool(), move |conn| { let comment_reply_view =
CommentReplyView::read(conn, comment_reply_id, Some(person_id)) CommentReplyView::read(context.pool(), comment_reply_id, Some(person_id)).await?;
})
.await??;
Ok(CommentReplyResponse { comment_reply_view }) Ok(CommentReplyResponse { comment_reply_view })
} }

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{GetUnreadCount, GetUnreadCountResponse}, person::{GetUnreadCount, GetUnreadCountResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_views::structs::PrivateMessageView; use lemmy_db_views::structs::PrivateMessageView;
use lemmy_db_views_actor::structs::{CommentReplyView, PersonMentionView}; use lemmy_db_views_actor::structs::{CommentReplyView, PersonMentionView};
@ -25,20 +25,12 @@ impl Perform for GetUnreadCount {
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let replies = blocking(context.pool(), move |conn| { let replies = CommentReplyView::get_unread_replies(context.pool(), person_id).await?;
CommentReplyView::get_unread_replies(conn, person_id)
})
.await??;
let mentions = blocking(context.pool(), move |conn| { let mentions = PersonMentionView::get_unread_mentions(context.pool(), person_id).await?;
PersonMentionView::get_unread_mentions(conn, person_id)
})
.await??;
let private_messages = blocking(context.pool(), move |conn| { let private_messages =
PrivateMessageView::get_unread_messages(conn, person_id) PrivateMessageView::get_unread_messages(context.pool(), person_id).await?;
})
.await??;
let res = Self::Response { let res = Self::Response {
replies, replies,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{GetReportCount, GetReportCountResponse}, person::{GetReportCount, GetReportCountResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_views::structs::{CommentReportView, PostReportView, PrivateMessageReportView}; use lemmy_db_views::structs::{CommentReportView, PostReportView, PrivateMessageReportView};
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -26,23 +26,14 @@ impl Perform for GetReportCount {
let admin = local_user_view.person.admin; let admin = local_user_view.person.admin;
let community_id = data.community_id; let community_id = data.community_id;
let comment_reports = blocking(context.pool(), move |conn| { let comment_reports =
CommentReportView::get_report_count(conn, person_id, admin, community_id) CommentReportView::get_report_count(context.pool(), person_id, admin, community_id).await?;
})
.await??;
let post_reports = blocking(context.pool(), move |conn| { let post_reports =
PostReportView::get_report_count(conn, person_id, admin, community_id) PostReportView::get_report_count(context.pool(), person_id, admin, community_id).await?;
})
.await??;
let private_message_reports = if admin && community_id.is_none() { let private_message_reports = if admin && community_id.is_none() {
Some( Some(PrivateMessageReportView::get_report_count(context.pool()).await?)
blocking(context.pool(), move |conn| {
PrivateMessageReportView::get_report_count(conn)
})
.await??,
)
} else { } else {
None None
}; };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{PasswordReset, PasswordResetResponse}, person::{PasswordReset, PasswordResetResponse},
utils::{blocking, send_password_reset_email}, utils::send_password_reset_email,
}; };
use lemmy_db_views::structs::LocalUserView; use lemmy_db_views::structs::LocalUserView;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -22,11 +22,9 @@ impl Perform for PasswordReset {
// Fetch that email // Fetch that email
let email = data.email.to_lowercase(); let email = data.email.to_lowercase();
let local_user_view = blocking(context.pool(), move |conn| { let local_user_view = LocalUserView::find_by_email(context.pool(), &email)
LocalUserView::find_by_email(conn, &email) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_that_username_or_email"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_that_username_or_email"))?;
// Email the pure token to the user. // Email the pure token to the user.
send_password_reset_email(&local_user_view, context.pool(), context.settings()).await?; send_password_reset_email(&local_user_view, context.pool(), context.settings()).await?;

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{LoginResponse, SaveUserSettings}, person::{LoginResponse, SaveUserSettings},
utils::{blocking, get_local_user_view_from_jwt, send_verification_email}, utils::{get_local_user_view_from_jwt, send_verification_email},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -35,7 +35,7 @@ impl Perform for SaveUserSettings {
let data: &SaveUserSettings = self; let data: &SaveUserSettings = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let avatar = diesel_option_overwrite_to_url(&data.avatar)?; let avatar = diesel_option_overwrite_to_url(&data.avatar)?;
let banner = diesel_option_overwrite_to_url(&data.banner)?; let banner = diesel_option_overwrite_to_url(&data.banner)?;
@ -97,17 +97,12 @@ impl Perform for SaveUserSettings {
.banner(banner) .banner(banner)
.build(); .build();
blocking(context.pool(), move |conn| { Person::update(context.pool(), person_id, &person_form)
Person::update(conn, person_id, &person_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "user_already_exists"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "user_already_exists"))?;
if let Some(discussion_languages) = data.discussion_languages.clone() { if let Some(discussion_languages) = data.discussion_languages.clone() {
blocking(context.pool(), move |conn| { LocalUserLanguage::update(context.pool(), discussion_languages, local_user_id).await?;
LocalUserLanguage::update(conn, discussion_languages, local_user_id)
})
.await??;
} }
let local_user_form = LocalUserUpdateForm::builder() let local_user_form = LocalUserUpdateForm::builder()
@ -125,10 +120,7 @@ impl Perform for SaveUserSettings {
.interface_language(data.interface_language.to_owned()) .interface_language(data.interface_language.to_owned())
.build(); .build();
let local_user_res = blocking(context.pool(), move |conn| { let local_user_res = LocalUser::update(context.pool(), local_user_id, &local_user_form).await;
LocalUser::update(conn, local_user_id, &local_user_form)
})
.await?;
let updated_local_user = match local_user_res { let updated_local_user = match local_user_res {
Ok(u) => u, Ok(u) => u,
Err(e) => { Err(e) => {

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{VerifyEmail, VerifyEmailResponse}, person::{VerifyEmail, VerifyEmailResponse},
utils::{blocking, send_email_verification_success}, utils::send_email_verification_success,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -25,11 +25,9 @@ impl Perform for VerifyEmail {
_websocket_id: Option<usize>, _websocket_id: Option<usize>,
) -> Result<Self::Response, LemmyError> { ) -> Result<Self::Response, LemmyError> {
let token = self.token.clone(); let token = self.token.clone();
let verification = blocking(context.pool(), move |conn| { let verification = EmailVerification::read_for_token(context.pool(), &token)
EmailVerification::read_for_token(conn, &token) .await
}) .map_err(|e| LemmyError::from_error_message(e, "token_not_found"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "token_not_found"))?;
let form = LocalUserUpdateForm::builder() let form = LocalUserUpdateForm::builder()
// necessary in case this is a new signup // necessary in case this is a new signup
@ -38,22 +36,14 @@ impl Perform for VerifyEmail {
.email(Some(Some(verification.email))) .email(Some(Some(verification.email)))
.build(); .build();
let local_user_id = verification.local_user_id; let local_user_id = verification.local_user_id;
blocking(context.pool(), move |conn| {
LocalUser::update(conn, local_user_id, &form)
})
.await??;
let local_user_view = blocking(context.pool(), move |conn| { LocalUser::update(context.pool(), local_user_id, &form).await?;
LocalUserView::read(conn, local_user_id)
}) let local_user_view = LocalUserView::read(context.pool(), local_user_id).await?;
.await??;
send_email_verification_success(&local_user_view, context.settings())?; send_email_verification_success(&local_user_view, context.settings())?;
blocking(context.pool(), move |conn| { EmailVerification::delete_old_tokens_for_local_user(context.pool(), local_user_id).await?;
EmailVerification::delete_old_tokens_for_local_user(conn, local_user_id)
})
.await??;
Ok(VerifyEmailResponse {}) Ok(VerifyEmailResponse {})
} }

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{CreatePostLike, PostResponse}, post::{CreatePostLike, PostResponse},
utils::{ utils::{
blocking,
check_community_ban, check_community_ban,
check_community_deleted_or_removed, check_community_deleted_or_removed,
check_downvotes_enabled, check_downvotes_enabled,
@ -42,16 +41,14 @@ impl Perform for CreatePostLike {
let data: &CreatePostLike = self; let data: &CreatePostLike = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
// Don't do a downvote if site has downvotes disabled // Don't do a downvote if site has downvotes disabled
check_downvotes_enabled(data.score, &local_site)?; check_downvotes_enabled(data.score, &local_site)?;
// Check for a community ban // Check for a community ban
let post_id = data.post_id; let post_id = data.post_id;
let post: ApubPost = blocking(context.pool(), move |conn| Post::read(conn, post_id)) let post: ApubPost = Post::read(context.pool(), post_id).await?.into();
.await??
.into();
check_community_ban(local_user_view.person.id, post.community_id, context.pool()).await?; check_community_ban(local_user_view.person.id, post.community_id, context.pool()).await?;
check_community_deleted_or_removed(post.community_id, context.pool()).await?; check_community_deleted_or_removed(post.community_id, context.pool()).await?;
@ -64,10 +61,8 @@ impl Perform for CreatePostLike {
// Remove any likes first // Remove any likes first
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
blocking(context.pool(), move |conn| {
PostLike::remove(conn, person_id, post_id) PostLike::remove(context.pool(), person_id, post_id).await?;
})
.await??;
let community_id = post.community_id; let community_id = post.community_id;
let object = PostOrComment::Post(Box::new(post)); let object = PostOrComment::Post(Box::new(post));
@ -76,9 +71,8 @@ impl Perform for CreatePostLike {
let do_add = like_form.score != 0 && (like_form.score == 1 || like_form.score == -1); let do_add = like_form.score != 0 && (like_form.score == 1 || like_form.score == -1);
if do_add { if do_add {
let like_form2 = like_form.clone(); let like_form2 = like_form.clone();
let like = move |conn: &mut _| PostLike::like(conn, &like_form2); PostLike::like(context.pool(), &like_form2)
blocking(context.pool(), like) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_like_post"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_like_post"))?;
Vote::send( Vote::send(

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{LockPost, PostResponse}, post::{LockPost, PostResponse},
utils::{ utils::{
blocking,
check_community_ban, check_community_ban,
check_community_deleted_or_removed, check_community_deleted_or_removed,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
@ -39,7 +38,7 @@ impl Perform for LockPost {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let post_id = data.post_id; let post_id = data.post_id;
let orig_post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let orig_post = Post::read(context.pool(), post_id).await?;
check_community_ban( check_community_ban(
local_user_view.person.id, local_user_view.person.id,
@ -60,14 +59,12 @@ impl Perform for LockPost {
// Update the post // Update the post
let post_id = data.post_id; let post_id = data.post_id;
let locked = data.locked; let locked = data.locked;
let updated_post: ApubPost = blocking(context.pool(), move |conn| { let updated_post: ApubPost = Post::update(
Post::update( context.pool(),
conn, post_id,
post_id, &PostUpdateForm::builder().locked(Some(locked)).build(),
&PostUpdateForm::builder().locked(Some(locked)).build(), )
) .await?
})
.await??
.into(); .into();
// Mod tables // Mod tables
@ -76,7 +73,7 @@ impl Perform for LockPost {
post_id: data.post_id, post_id: data.post_id,
locked: Some(locked), locked: Some(locked),
}; };
blocking(context.pool(), move |conn| ModLockPost::create(conn, &form)).await??; ModLockPost::create(context.pool(), &form).await?;
// apub updates // apub updates
CreateOrUpdatePost::send( CreateOrUpdatePost::send(

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{MarkPostAsRead, PostResponse}, post::{MarkPostAsRead, PostResponse},
utils::{blocking, get_local_user_view_from_jwt, mark_post_as_read, mark_post_as_unread}, utils::{get_local_user_view_from_jwt, mark_post_as_read, mark_post_as_unread},
}; };
use lemmy_db_views::structs::PostView; use lemmy_db_views::structs::PostView;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -33,10 +33,7 @@ impl Perform for MarkPostAsRead {
} }
// Fetch it // Fetch it
let post_view = blocking(context.pool(), move |conn| { let post_view = PostView::read(context.pool(), post_id, Some(person_id)).await?;
PostView::read(conn, post_id, Some(person_id))
})
.await??;
let res = Self::Response { post_view }; let res = Self::Response { post_view };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{PostResponse, SavePost}, post::{PostResponse, SavePost},
utils::{blocking, get_local_user_view_from_jwt, mark_post_as_read}, utils::{get_local_user_view_from_jwt, mark_post_as_read},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::post::{PostSaved, PostSavedForm}, source::post::{PostSaved, PostSavedForm},
@ -32,23 +32,18 @@ impl Perform for SavePost {
}; };
if data.save { if data.save {
let save = move |conn: &mut _| PostSaved::save(conn, &post_saved_form); PostSaved::save(context.pool(), &post_saved_form)
blocking(context.pool(), save) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_save_post"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_save_post"))?;
} else { } else {
let unsave = move |conn: &mut _| PostSaved::unsave(conn, &post_saved_form); PostSaved::unsave(context.pool(), &post_saved_form)
blocking(context.pool(), unsave) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_save_post"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_save_post"))?;
} }
let post_id = data.post_id; let post_id = data.post_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let post_view = blocking(context.pool(), move |conn| { let post_view = PostView::read(context.pool(), post_id, Some(person_id)).await?;
PostView::read(conn, post_id, Some(person_id))
})
.await??;
// Mark the post as read // Mark the post as read
mark_post_as_read(person_id, post_id, context.pool()).await?; mark_post_as_read(person_id, post_id, context.pool()).await?;

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{PostResponse, StickyPost}, post::{PostResponse, StickyPost},
utils::{ utils::{
blocking,
check_community_ban, check_community_ban,
check_community_deleted_or_removed, check_community_deleted_or_removed,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
@ -39,7 +38,7 @@ impl Perform for StickyPost {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let post_id = data.post_id; let post_id = data.post_id;
let orig_post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let orig_post = Post::read(context.pool(), post_id).await?;
check_community_ban( check_community_ban(
local_user_view.person.id, local_user_view.person.id,
@ -60,14 +59,12 @@ impl Perform for StickyPost {
// Update the post // Update the post
let post_id = data.post_id; let post_id = data.post_id;
let stickied = data.stickied; let stickied = data.stickied;
let updated_post: ApubPost = blocking(context.pool(), move |conn| { let updated_post: ApubPost = Post::update(
Post::update( context.pool(),
conn, post_id,
post_id, &PostUpdateForm::builder().stickied(Some(stickied)).build(),
&PostUpdateForm::builder().stickied(Some(stickied)).build(), )
) .await?
})
.await??
.into(); .into();
// Mod tables // Mod tables
@ -76,10 +73,8 @@ impl Perform for StickyPost {
post_id: data.post_id, post_id: data.post_id,
stickied: Some(stickied), stickied: Some(stickied),
}; };
blocking(context.pool(), move |conn| {
ModStickyPost::create(conn, &form) ModStickyPost::create(context.pool(), &form).await?;
})
.await??;
// Apub updates // Apub updates
// TODO stickied should pry work like locked for ease of use // TODO stickied should pry work like locked for ease of use

@ -3,7 +3,7 @@ use activitypub_federation::core::object_id::ObjectId;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{CreatePostReport, PostReportResponse}, post::{CreatePostReport, PostReportResponse},
utils::{blocking, check_community_ban, get_local_user_view_from_jwt}, utils::{check_community_ban, get_local_user_view_from_jwt},
}; };
use lemmy_apub::protocol::activities::community::report::Report; use lemmy_apub::protocol::activities::community::report::Report;
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -31,17 +31,14 @@ impl Perform for CreatePostReport {
let data: &CreatePostReport = self; let data: &CreatePostReport = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let reason = self.reason.trim(); let reason = self.reason.trim();
check_report_reason(reason, &local_site)?; check_report_reason(reason, &local_site)?;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let post_id = data.post_id; let post_id = data.post_id;
let post_view = blocking(context.pool(), move |conn| { let post_view = PostView::read(context.pool(), post_id, None).await?;
PostView::read(conn, post_id, None)
})
.await??;
check_community_ban(person_id, post_view.community.id, context.pool()).await?; check_community_ban(person_id, post_view.community.id, context.pool()).await?;
@ -54,16 +51,11 @@ impl Perform for CreatePostReport {
reason: reason.to_owned(), reason: reason.to_owned(),
}; };
let report = blocking(context.pool(), move |conn| { let report = PostReport::report(context.pool(), &report_form)
PostReport::report(conn, &report_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_report"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_create_report"))?;
let post_report_view = blocking(context.pool(), move |conn| { let post_report_view = PostReportView::read(context.pool(), report.id, person_id).await?;
PostReportView::read(conn, report.id, person_id)
})
.await??;
let res = PostReportResponse { post_report_view }; let res = PostReportResponse { post_report_view };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{ListPostReports, ListPostReportsResponse}, post::{ListPostReports, ListPostReportsResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_views::post_report_view::PostReportQuery; use lemmy_db_views::post_report_view::PostReportQuery;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -31,19 +31,17 @@ impl Perform for ListPostReports {
let page = data.page; let page = data.page;
let limit = data.limit; let limit = data.limit;
let post_reports = blocking(context.pool(), move |conn| { let post_reports = PostReportQuery::builder()
PostReportQuery::builder() .pool(context.pool())
.conn(conn) .my_person_id(person_id)
.my_person_id(person_id) .admin(admin)
.admin(admin) .community_id(community_id)
.community_id(community_id) .unresolved_only(unresolved_only)
.unresolved_only(unresolved_only) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
let res = ListPostReportsResponse { post_reports }; let res = ListPostReportsResponse { post_reports };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{PostReportResponse, ResolvePostReport}, post::{PostReportResponse, ResolvePostReport},
utils::{blocking, get_local_user_view_from_jwt, is_mod_or_admin}, utils::{get_local_user_view_from_jwt, is_mod_or_admin},
}; };
use lemmy_db_schema::{source::post_report::PostReport, traits::Reportable}; use lemmy_db_schema::{source::post_report::PostReport, traits::Reportable};
use lemmy_db_views::structs::PostReportView; use lemmy_db_views::structs::PostReportView;
@ -26,31 +26,22 @@ impl Perform for ResolvePostReport {
let report_id = data.report_id; let report_id = data.report_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let report = blocking(context.pool(), move |conn| { let report = PostReportView::read(context.pool(), report_id, person_id).await?;
PostReportView::read(conn, report_id, person_id)
})
.await??;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
is_mod_or_admin(context.pool(), person_id, report.community.id).await?; is_mod_or_admin(context.pool(), person_id, report.community.id).await?;
let resolved = data.resolved; if data.resolved {
let resolve_fun = move |conn: &mut _| { PostReport::resolve(context.pool(), report_id, person_id)
if resolved { .await
PostReport::resolve(conn, report_id, person_id) .map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
} else { } else {
PostReport::unresolve(conn, report_id, person_id) PostReport::unresolve(context.pool(), report_id, person_id)
} .await
}; .map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
}
blocking(context.pool(), resolve_fun)
.await? let post_report_view = PostReportView::read(context.pool(), report_id, person_id).await?;
.map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
let post_report_view = blocking(context.pool(), move |conn| {
PostReportView::read(conn, report_id, person_id)
})
.await??;
let res = PostReportResponse { post_report_view }; let res = PostReportResponse { post_report_view };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{MarkPrivateMessageAsRead, PrivateMessageResponse}, private_message::{MarkPrivateMessageAsRead, PrivateMessageResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::private_message::{PrivateMessage, PrivateMessageUpdateForm}, source::private_message::{PrivateMessage, PrivateMessageUpdateForm},
@ -27,10 +27,7 @@ impl Perform for MarkPrivateMessageAsRead {
// Checking permissions // Checking permissions
let private_message_id = data.private_message_id; let private_message_id = data.private_message_id;
let orig_private_message = blocking(context.pool(), move |conn| { let orig_private_message = PrivateMessage::read(context.pool(), private_message_id).await?;
PrivateMessage::read(conn, private_message_id)
})
.await??;
if local_user_view.person.id != orig_private_message.recipient_id { if local_user_view.person.id != orig_private_message.recipient_id {
return Err(LemmyError::from_message("couldnt_update_private_message")); return Err(LemmyError::from_message("couldnt_update_private_message"));
} }
@ -38,14 +35,12 @@ impl Perform for MarkPrivateMessageAsRead {
// Doing the update // Doing the update
let private_message_id = data.private_message_id; let private_message_id = data.private_message_id;
let read = data.read; let read = data.read;
blocking(context.pool(), move |conn| { PrivateMessage::update(
PrivateMessage::update( context.pool(),
conn, private_message_id,
private_message_id, &PrivateMessageUpdateForm::builder().read(Some(read)).build(),
&PrivateMessageUpdateForm::builder().read(Some(read)).build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
// No need to send an apub update // No need to send an apub update

@ -2,7 +2,7 @@ use crate::{check_report_reason, Perform};
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{CreatePrivateMessageReport, PrivateMessageReportResponse}, private_message::{CreatePrivateMessageReport, PrivateMessageReportResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
newtypes::CommunityId, newtypes::CommunityId,
@ -29,17 +29,14 @@ impl Perform for CreatePrivateMessageReport {
) -> Result<Self::Response, LemmyError> { ) -> Result<Self::Response, LemmyError> {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&self.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&self.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let reason = self.reason.trim(); let reason = self.reason.trim();
check_report_reason(reason, &local_site)?; check_report_reason(reason, &local_site)?;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let private_message_id = self.private_message_id; let private_message_id = self.private_message_id;
let private_message = blocking(context.pool(), move |conn| { let private_message = PrivateMessage::read(context.pool(), private_message_id).await?;
PrivateMessage::read(conn, private_message_id)
})
.await??;
let report_form = PrivateMessageReportForm { let report_form = PrivateMessageReportForm {
creator_id: person_id, creator_id: person_id,
@ -48,16 +45,12 @@ impl Perform for CreatePrivateMessageReport {
reason: reason.to_owned(), reason: reason.to_owned(),
}; };
let report = blocking(context.pool(), move |conn| { let report = PrivateMessageReport::report(context.pool(), &report_form)
PrivateMessageReport::report(conn, &report_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_report"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_create_report"))?;
let private_message_report_view = blocking(context.pool(), move |conn| { let private_message_report_view =
PrivateMessageReportView::read(conn, report.id) PrivateMessageReportView::read(context.pool(), report.id).await?;
})
.await??;
let res = PrivateMessageReportResponse { let res = PrivateMessageReportResponse {
private_message_report_view, private_message_report_view,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{ListPrivateMessageReports, ListPrivateMessageReportsResponse}, private_message::{ListPrivateMessageReports, ListPrivateMessageReportsResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_views::private_message_report_view::PrivateMessageReportQuery; use lemmy_db_views::private_message_report_view::PrivateMessageReportQuery;
use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_utils::{error::LemmyError, ConnectionId};
@ -26,16 +26,14 @@ impl Perform for ListPrivateMessageReports {
let unresolved_only = self.unresolved_only; let unresolved_only = self.unresolved_only;
let page = self.page; let page = self.page;
let limit = self.limit; let limit = self.limit;
let private_message_reports = blocking(context.pool(), move |conn| { let private_message_reports = PrivateMessageReportQuery::builder()
PrivateMessageReportQuery::builder() .pool(context.pool())
.conn(conn) .unresolved_only(unresolved_only)
.unresolved_only(unresolved_only) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
let res = ListPrivateMessageReportsResponse { let res = ListPrivateMessageReportsResponse {
private_message_reports, private_message_reports,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{PrivateMessageReportResponse, ResolvePrivateMessageReport}, private_message::{PrivateMessageReportResponse, ResolvePrivateMessageReport},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
newtypes::CommunityId, newtypes::CommunityId,
@ -28,25 +28,20 @@ impl Perform for ResolvePrivateMessageReport {
is_admin(&local_user_view)?; is_admin(&local_user_view)?;
let resolved = self.resolved;
let report_id = self.report_id; let report_id = self.report_id;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let resolve_fn = move |conn: &mut _| { if self.resolved {
if resolved { PrivateMessageReport::resolve(context.pool(), report_id, person_id)
PrivateMessageReport::resolve(conn, report_id, person_id) .await
} else { .map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
PrivateMessageReport::unresolve(conn, report_id, person_id) } else {
} PrivateMessageReport::unresolve(context.pool(), report_id, person_id)
}; .await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?;
blocking(context.pool(), resolve_fn) }
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_resolve_report"))?; let private_message_report_view =
PrivateMessageReportView::read(context.pool(), report_id).await?;
let private_message_report_view = blocking(context.pool(), move |conn| {
PrivateMessageReportView::read(conn, report_id)
})
.await??;
let res = PrivateMessageReportResponse { let res = PrivateMessageReportResponse {
private_message_report_view, private_message_report_view,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{GetSiteResponse, LeaveAdmin}, site::{GetSiteResponse, LeaveAdmin},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -35,20 +35,18 @@ impl Perform for LeaveAdmin {
is_admin(&local_user_view)?; is_admin(&local_user_view)?;
// Make sure there isn't just one admin (so if one leaves, there will still be one left) // Make sure there isn't just one admin (so if one leaves, there will still be one left)
let admins = blocking(context.pool(), PersonViewSafe::admins).await??; let admins = PersonViewSafe::admins(context.pool()).await?;
if admins.len() == 1 { if admins.len() == 1 {
return Err(LemmyError::from_message("cannot_leave_admin")); return Err(LemmyError::from_message("cannot_leave_admin"));
} }
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
blocking(context.pool(), move |conn| { Person::update(
Person::update( context.pool(),
conn, person_id,
person_id, &PersonUpdateForm::builder().admin(Some(false)).build(),
&PersonUpdateForm::builder().admin(Some(false)).build(), )
) .await?;
})
.await??;
// Mod tables // Mod tables
let form = ModAddForm { let form = ModAddForm {
@ -57,14 +55,14 @@ impl Perform for LeaveAdmin {
removed: Some(true), removed: Some(true),
}; };
blocking(context.pool(), move |conn| ModAdd::create(conn, &form)).await??; ModAdd::create(context.pool(), &form).await?;
// Reread site and admins // Reread site and admins
let site_view = blocking(context.pool(), SiteView::read_local).await??; let site_view = SiteView::read_local(context.pool()).await?;
let admins = blocking(context.pool(), PersonViewSafe::admins).await??; let admins = PersonViewSafe::admins(context.pool()).await?;
let all_languages = blocking(context.pool(), Language::read_all).await??; let all_languages = Language::read_all(context.pool()).await?;
let discussion_languages = blocking(context.pool(), SiteLanguage::read_local).await??; let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
Ok(GetSiteResponse { Ok(GetSiteResponse {
site_view, site_view,

@ -2,13 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{GetModlog, GetModlogResponse}, site::{GetModlog, GetModlogResponse},
utils::{ utils::{check_private_instance, get_local_user_view_from_jwt_opt, is_admin, is_mod_or_admin},
blocking,
check_private_instance,
get_local_user_view_from_jwt_opt,
is_admin,
is_mod_or_admin,
},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
newtypes::{CommunityId, PersonId}, newtypes::{CommunityId, PersonId},
@ -52,7 +46,7 @@ impl Perform for GetModlog {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
@ -88,81 +82,43 @@ impl Perform for GetModlog {
hide_modlog_names, hide_modlog_names,
}; };
let removed_posts = match type_ { let removed_posts = match type_ {
All | ModRemovePost => { All | ModRemovePost => ModRemovePostView::list(context.pool(), params).await?,
blocking(context.pool(), move |conn| {
ModRemovePostView::list(conn, params)
})
.await??
}
_ => Default::default(), _ => Default::default(),
}; };
let locked_posts = match type_ { let locked_posts = match type_ {
All | ModLockPost => { All | ModLockPost => ModLockPostView::list(context.pool(), params).await?,
blocking(context.pool(), move |conn| {
ModLockPostView::list(conn, params)
})
.await??
}
_ => Default::default(), _ => Default::default(),
}; };
let stickied_posts = match type_ { let stickied_posts = match type_ {
All | ModStickyPost => { All | ModStickyPost => ModStickyPostView::list(context.pool(), params).await?,
blocking(context.pool(), move |conn| {
ModStickyPostView::list(conn, params)
})
.await??
}
_ => Default::default(), _ => Default::default(),
}; };
let removed_comments = match type_ { let removed_comments = match type_ {
All | ModRemoveComment => { All | ModRemoveComment => ModRemoveCommentView::list(context.pool(), params).await?,
blocking(context.pool(), move |conn| {
ModRemoveCommentView::list(conn, params)
})
.await??
}
_ => Default::default(), _ => Default::default(),
}; };
let banned_from_community = match type_ { let banned_from_community = match type_ {
All | ModBanFromCommunity => { All | ModBanFromCommunity => ModBanFromCommunityView::list(context.pool(), params).await?,
blocking(context.pool(), move |conn| {
ModBanFromCommunityView::list(conn, params)
})
.await??
}
_ => Default::default(), _ => Default::default(),
}; };
let added_to_community = match type_ { let added_to_community = match type_ {
All | ModAddCommunity => { All | ModAddCommunity => ModAddCommunityView::list(context.pool(), params).await?,
blocking(context.pool(), move |conn| {
ModAddCommunityView::list(conn, params)
})
.await??
}
_ => Default::default(), _ => Default::default(),
}; };
let transferred_to_community = match type_ { let transferred_to_community = match type_ {
All | ModTransferCommunity => { All | ModTransferCommunity => ModTransferCommunityView::list(context.pool(), params).await?,
blocking(context.pool(), move |conn| {
ModTransferCommunityView::list(conn, params)
})
.await??
}
_ => Default::default(), _ => Default::default(),
}; };
let hidden_communities = match type_ { let hidden_communities = match type_ {
All | ModHideCommunity if other_person_id.is_none() => { All | ModHideCommunity if other_person_id.is_none() => {
blocking(context.pool(), move |conn| { ModHideCommunityView::list(context.pool(), params).await?
ModHideCommunityView::list(conn, params)
})
.await??
} }
_ => Default::default(), _ => Default::default(),
}; };
@ -177,49 +133,46 @@ impl Perform for GetModlog {
admin_purged_posts, admin_purged_posts,
admin_purged_comments, admin_purged_comments,
) = if data.community_id.is_none() { ) = if data.community_id.is_none() {
blocking(context.pool(), move |conn| { (
Ok(( match type_ {
match type_ { All | ModBan => ModBanView::list(context.pool(), params).await?,
All | ModBan => ModBanView::list(conn, params)?, _ => Default::default(),
_ => Default::default(), },
}, match type_ {
match type_ { All | ModAdd => ModAddView::list(context.pool(), params).await?,
All | ModAdd => ModAddView::list(conn, params)?, _ => Default::default(),
_ => Default::default(), },
}, match type_ {
match type_ { All | ModRemoveCommunity if other_person_id.is_none() => {
All | ModRemoveCommunity if other_person_id.is_none() => { ModRemoveCommunityView::list(context.pool(), params).await?
ModRemoveCommunityView::list(conn, params)? }
} _ => Default::default(),
_ => Default::default(), },
}, match type_ {
match type_ { All | AdminPurgePerson if other_person_id.is_none() => {
All | AdminPurgePerson if other_person_id.is_none() => { AdminPurgePersonView::list(context.pool(), params).await?
AdminPurgePersonView::list(conn, params)? }
} _ => Default::default(),
_ => Default::default(), },
}, match type_ {
match type_ { All | AdminPurgeCommunity if other_person_id.is_none() => {
All | AdminPurgeCommunity if other_person_id.is_none() => { AdminPurgeCommunityView::list(context.pool(), params).await?
AdminPurgeCommunityView::list(conn, params)? }
} _ => Default::default(),
_ => Default::default(), },
}, match type_ {
match type_ { All | AdminPurgePost if other_person_id.is_none() => {
All | AdminPurgePost if other_person_id.is_none() => { AdminPurgePostView::list(context.pool(), params).await?
AdminPurgePostView::list(conn, params)? }
} _ => Default::default(),
_ => Default::default(), },
}, match type_ {
match type_ { All | AdminPurgeComment if other_person_id.is_none() => {
All | AdminPurgeComment if other_person_id.is_none() => { AdminPurgeCommentView::list(context.pool(), params).await?
AdminPurgeCommentView::list(conn, params)? }
} _ => Default::default(),
_ => Default::default(), },
}, )
)) as Result<_, LemmyError>
})
.await??
} else { } else {
Default::default() Default::default()
}; };

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{PurgeComment, PurgeItemResponse}, site::{PurgeComment, PurgeItemResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -34,16 +34,13 @@ impl Perform for PurgeComment {
let comment_id = data.comment_id; let comment_id = data.comment_id;
// Read the comment to get the post_id // Read the comment to get the post_id
let comment = blocking(context.pool(), move |conn| Comment::read(conn, comment_id)).await??; let comment = Comment::read(context.pool(), comment_id).await?;
let post_id = comment.post_id; let post_id = comment.post_id;
// TODO read comments for pictrs images and purge them // TODO read comments for pictrs images and purge them
blocking(context.pool(), move |conn| { Comment::delete(context.pool(), comment_id).await?;
Comment::delete(conn, comment_id)
})
.await??;
// Mod tables // Mod tables
let reason = data.reason.to_owned(); let reason = data.reason.to_owned();
@ -53,10 +50,7 @@ impl Perform for PurgeComment {
post_id, post_id,
}; };
blocking(context.pool(), move |conn| { AdminPurgeComment::create(context.pool(), &form).await?;
AdminPurgeComment::create(conn, &form)
})
.await??;
Ok(PurgeItemResponse { success: true }) Ok(PurgeItemResponse { success: true })
} }

@ -3,7 +3,7 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
request::purge_image_from_pictrs, request::purge_image_from_pictrs,
site::{PurgeCommunity, PurgeItemResponse}, site::{PurgeCommunity, PurgeItemResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin, purge_image_posts_for_community}, utils::{get_local_user_view_from_jwt, is_admin, purge_image_posts_for_community},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -35,10 +35,7 @@ impl Perform for PurgeCommunity {
let community_id = data.community_id; let community_id = data.community_id;
// Read the community to get its images // Read the community to get its images
let community = blocking(context.pool(), move |conn| { let community = Community::read(context.pool(), community_id).await?;
Community::read(conn, community_id)
})
.await??;
if let Some(banner) = community.banner { if let Some(banner) = community.banner {
purge_image_from_pictrs(context.client(), context.settings(), &banner) purge_image_from_pictrs(context.client(), context.settings(), &banner)
@ -60,10 +57,7 @@ impl Perform for PurgeCommunity {
) )
.await?; .await?;
blocking(context.pool(), move |conn| { Community::delete(context.pool(), community_id).await?;
Community::delete(conn, community_id)
})
.await??;
// Mod tables // Mod tables
let reason = data.reason.to_owned(); let reason = data.reason.to_owned();
@ -72,10 +66,7 @@ impl Perform for PurgeCommunity {
reason, reason,
}; };
blocking(context.pool(), move |conn| { AdminPurgeCommunity::create(context.pool(), &form).await?;
AdminPurgeCommunity::create(conn, &form)
})
.await??;
Ok(PurgeItemResponse { success: true }) Ok(PurgeItemResponse { success: true })
} }

@ -3,7 +3,7 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
request::purge_image_from_pictrs, request::purge_image_from_pictrs,
site::{PurgeItemResponse, PurgePerson}, site::{PurgeItemResponse, PurgePerson},
utils::{blocking, get_local_user_view_from_jwt, is_admin, purge_image_posts_for_person}, utils::{get_local_user_view_from_jwt, is_admin, purge_image_posts_for_person},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -34,7 +34,7 @@ impl Perform for PurgePerson {
// Read the person to get their images // Read the person to get their images
let person_id = data.person_id; let person_id = data.person_id;
let person = blocking(context.pool(), move |conn| Person::read(conn, person_id)).await??; let person = Person::read(context.pool(), person_id).await?;
if let Some(banner) = person.banner { if let Some(banner) = person.banner {
purge_image_from_pictrs(context.client(), context.settings(), &banner) purge_image_from_pictrs(context.client(), context.settings(), &banner)
@ -56,7 +56,7 @@ impl Perform for PurgePerson {
) )
.await?; .await?;
blocking(context.pool(), move |conn| Person::delete(conn, person_id)).await??; Person::delete(context.pool(), person_id).await?;
// Mod tables // Mod tables
let reason = data.reason.to_owned(); let reason = data.reason.to_owned();
@ -65,10 +65,7 @@ impl Perform for PurgePerson {
reason, reason,
}; };
blocking(context.pool(), move |conn| { AdminPurgePerson::create(context.pool(), &form).await?;
AdminPurgePerson::create(conn, &form)
})
.await??;
Ok(PurgeItemResponse { success: true }) Ok(PurgeItemResponse { success: true })
} }

@ -3,7 +3,7 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
request::purge_image_from_pictrs, request::purge_image_from_pictrs,
site::{PurgeItemResponse, PurgePost}, site::{PurgeItemResponse, PurgePost},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -35,7 +35,7 @@ impl Perform for PurgePost {
let post_id = data.post_id; let post_id = data.post_id;
// Read the post to get the community_id // Read the post to get the community_id
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let post = Post::read(context.pool(), post_id).await?;
// Purge image // Purge image
if let Some(url) = post.url { if let Some(url) = post.url {
@ -52,7 +52,7 @@ impl Perform for PurgePost {
let community_id = post.community_id; let community_id = post.community_id;
blocking(context.pool(), move |conn| Post::delete(conn, post_id)).await??; Post::delete(context.pool(), post_id).await?;
// Mod tables // Mod tables
let reason = data.reason.to_owned(); let reason = data.reason.to_owned();
@ -62,10 +62,7 @@ impl Perform for PurgePost {
community_id, community_id,
}; };
blocking(context.pool(), move |conn| { AdminPurgePost::create(context.pool(), &form).await?;
AdminPurgePost::create(conn, &form)
})
.await??;
Ok(PurgeItemResponse { success: true }) Ok(PurgeItemResponse { success: true })
} }

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{ApproveRegistrationApplication, RegistrationApplicationResponse}, site::{ApproveRegistrationApplication, RegistrationApplicationResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin, send_application_approved_email}, utils::{get_local_user_view_from_jwt, is_admin, send_application_approved_email},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
@ -41,10 +41,8 @@ impl Perform for ApproveRegistrationApplication {
deny_reason, deny_reason,
}; };
let registration_application = blocking(context.pool(), move |conn| { let registration_application =
RegistrationApplication::update(conn, app_id, &app_form) RegistrationApplication::update(context.pool(), app_id, &app_form).await?;
})
.await??;
// Update the local_user row // Update the local_user row
let local_user_form = LocalUserUpdateForm::builder() let local_user_form = LocalUserUpdateForm::builder()
@ -52,16 +50,10 @@ impl Perform for ApproveRegistrationApplication {
.build(); .build();
let approved_user_id = registration_application.local_user_id; let approved_user_id = registration_application.local_user_id;
blocking(context.pool(), move |conn| { LocalUser::update(context.pool(), approved_user_id, &local_user_form).await?;
LocalUser::update(conn, approved_user_id, &local_user_form)
})
.await??;
if data.approve { if data.approve {
let approved_local_user_view = blocking(context.pool(), move |conn| { let approved_local_user_view = LocalUserView::read(context.pool(), approved_user_id).await?;
LocalUserView::read(conn, approved_user_id)
})
.await??;
if approved_local_user_view.local_user.email.is_some() { if approved_local_user_view.local_user.email.is_some() {
send_application_approved_email(&approved_local_user_view, context.settings())?; send_application_approved_email(&approved_local_user_view, context.settings())?;
@ -69,10 +61,8 @@ impl Perform for ApproveRegistrationApplication {
} }
// Read the view // Read the view
let registration_application = blocking(context.pool(), move |conn| { let registration_application =
RegistrationApplicationView::read(conn, app_id) RegistrationApplicationView::read(context.pool(), app_id).await?;
})
.await??;
Ok(Self::Response { Ok(Self::Response {
registration_application, registration_application,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{ListRegistrationApplications, ListRegistrationApplicationsResponse}, site::{ListRegistrationApplications, ListRegistrationApplicationsResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_schema::source::local_site::LocalSite; use lemmy_db_schema::source::local_site::LocalSite;
use lemmy_db_views::registration_application_view::RegistrationApplicationQuery; use lemmy_db_views::registration_application_view::RegistrationApplicationQuery;
@ -22,7 +22,7 @@ impl Perform for ListRegistrationApplications {
let data = self; let data = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
// Make sure user is an admin // Make sure user is an admin
is_admin(&local_user_view)?; is_admin(&local_user_view)?;
@ -32,17 +32,15 @@ impl Perform for ListRegistrationApplications {
let page = data.page; let page = data.page;
let limit = data.limit; let limit = data.limit;
let registration_applications = blocking(context.pool(), move |conn| { let registration_applications = RegistrationApplicationQuery::builder()
RegistrationApplicationQuery::builder() .pool(context.pool())
.conn(conn) .unread_only(unread_only)
.unread_only(unread_only) .verified_email_only(Some(verified_email_only))
.verified_email_only(Some(verified_email_only)) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
let res = Self::Response { let res = Self::Response {
registration_applications, registration_applications,

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{GetUnreadRegistrationApplicationCount, GetUnreadRegistrationApplicationCountResponse}, site::{GetUnreadRegistrationApplicationCount, GetUnreadRegistrationApplicationCountResponse},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_db_schema::source::local_site::LocalSite; use lemmy_db_schema::source::local_site::LocalSite;
use lemmy_db_views::structs::RegistrationApplicationView; use lemmy_db_views::structs::RegistrationApplicationView;
@ -21,17 +21,15 @@ impl Perform for GetUnreadRegistrationApplicationCount {
let data = self; let data = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
// Only let admins do this // Only let admins do this
is_admin(&local_user_view)?; is_admin(&local_user_view)?;
let verified_email_only = local_site.require_email_verification; let verified_email_only = local_site.require_email_verification;
let registration_applications = blocking(context.pool(), move |conn| { let registration_applications =
RegistrationApplicationView::get_unread_count(conn, verified_email_only) RegistrationApplicationView::get_unread_count(context.pool(), verified_email_only).await?;
})
.await??;
Ok(Self::Response { Ok(Self::Response {
registration_applications, registration_applications,

@ -3,7 +3,7 @@ use actix_web::web::Data;
use diesel::NotFound; use diesel::NotFound;
use lemmy_api_common::{ use lemmy_api_common::{
site::{ResolveObject, ResolveObjectResponse}, site::{ResolveObject, ResolveObjectResponse},
utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, utils::{check_private_instance, get_local_user_view_from_jwt_opt},
}; };
use lemmy_apub::fetcher::search::{search_query_to_object_id, SearchableObjects}; use lemmy_apub::fetcher::search::{search_query_to_object_id, SearchableObjects};
use lemmy_db_schema::{newtypes::PersonId, source::local_site::LocalSite, utils::DbPool}; use lemmy_db_schema::{newtypes::PersonId, source::local_site::LocalSite, utils::DbPool};
@ -25,7 +25,7 @@ impl Perform for ResolveObject {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(self.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(self.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
let res = search_query_to_object_id(&self.q, local_user_view.is_none(), context) let res = search_query_to_object_id(&self.q, local_user_view.is_none(), context)
@ -53,20 +53,19 @@ async fn convert_response(
match object { match object {
Person(p) => { Person(p) => {
removed_or_deleted = p.deleted; removed_or_deleted = p.deleted;
res.person = Some(blocking(pool, move |conn| PersonViewSafe::read(conn, p.id)).await??) res.person = Some(PersonViewSafe::read(pool, p.id).await?)
} }
Community(c) => { Community(c) => {
removed_or_deleted = c.deleted || c.removed; removed_or_deleted = c.deleted || c.removed;
res.community = res.community = Some(CommunityView::read(pool, c.id, user_id).await?)
Some(blocking(pool, move |conn| CommunityView::read(conn, c.id, user_id)).await??)
} }
Post(p) => { Post(p) => {
removed_or_deleted = p.deleted || p.removed; removed_or_deleted = p.deleted || p.removed;
res.post = Some(blocking(pool, move |conn| PostView::read(conn, p.id, user_id)).await??) res.post = Some(PostView::read(pool, p.id, user_id).await?)
} }
Comment(c) => { Comment(c) => {
removed_or_deleted = c.deleted || c.removed; removed_or_deleted = c.deleted || c.removed;
res.comment = Some(blocking(pool, move |conn| CommentView::read(conn, c.id, user_id)).await??) res.comment = Some(CommentView::read(pool, c.id, user_id).await?)
} }
}; };
// if the object was deleted from database, dont return it // if the object was deleted from database, dont return it

@ -2,7 +2,7 @@ use crate::Perform;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{Search, SearchResponse}, site::{Search, SearchResponse},
utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, utils::{check_private_instance, get_local_user_view_from_jwt_opt},
}; };
use lemmy_apub::{fetcher::resolve_actor_identifier, objects::community::ApubCommunity}; use lemmy_apub::{fetcher::resolve_actor_identifier, objects::community::ApubCommunity};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -31,7 +31,7 @@ impl Perform for Search {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
@ -63,68 +63,60 @@ impl Perform for Search {
let creator_id = data.creator_id; let creator_id = data.creator_id;
match search_type { match search_type {
SearchType::Posts => { SearchType::Posts => {
posts = blocking(context.pool(), move |conn| { posts = PostQuery::builder()
PostQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort)
.sort(sort) .listing_type(listing_type)
.listing_type(listing_type) .community_id(community_id)
.community_id(community_id) .community_actor_id(community_actor_id)
.community_actor_id(community_actor_id) .creator_id(creator_id)
.creator_id(creator_id) .local_user(local_user.as_ref())
.local_user(local_user.as_ref()) .search_term(Some(q))
.search_term(Some(q)) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
} }
SearchType::Comments => { SearchType::Comments => {
comments = blocking(context.pool(), move |conn| { comments = CommentQuery::builder()
CommentQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort.map(post_to_comment_sort_type))
.sort(sort.map(post_to_comment_sort_type)) .listing_type(listing_type)
.listing_type(listing_type) .search_term(Some(q))
.search_term(Some(q)) .community_id(community_id)
.community_id(community_id) .community_actor_id(community_actor_id)
.community_actor_id(community_actor_id) .creator_id(creator_id)
.creator_id(creator_id) .local_user(local_user.as_ref())
.local_user(local_user.as_ref()) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
} }
SearchType::Communities => { SearchType::Communities => {
communities = blocking(context.pool(), move |conn| { communities = CommunityQuery::builder()
CommunityQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort)
.sort(sort) .listing_type(listing_type)
.listing_type(listing_type) .search_term(Some(q))
.search_term(Some(q)) .local_user(local_user.as_ref())
.local_user(local_user.as_ref()) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
} }
SearchType::Users => { SearchType::Users => {
users = blocking(context.pool(), move |conn| { users = PersonQuery::builder()
PersonQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort)
.sort(sort) .search_term(Some(q))
.search_term(Some(q)) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
} }
SearchType::All => { SearchType::All => {
// If the community or creator is included, dont search communities or users // If the community or creator is included, dont search communities or users
@ -133,62 +125,56 @@ impl Perform for Search {
let community_actor_id_2 = community_actor_id.to_owned(); let community_actor_id_2 = community_actor_id.to_owned();
let local_user_ = local_user.clone(); let local_user_ = local_user.clone();
posts = blocking(context.pool(), move |conn| { posts = PostQuery::builder()
PostQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort)
.sort(sort) .listing_type(listing_type)
.listing_type(listing_type) .community_id(community_id)
.community_id(community_id) .community_actor_id(community_actor_id_2)
.community_actor_id(community_actor_id_2) .creator_id(creator_id)
.creator_id(creator_id) .local_user(local_user_.as_ref())
.local_user(local_user_.as_ref()) .search_term(Some(q))
.search_term(Some(q)) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
let q = data.q.to_owned(); let q = data.q.to_owned();
let community_actor_id = community_actor_id.to_owned(); let community_actor_id = community_actor_id.to_owned();
let local_user_ = local_user.clone(); let local_user_ = local_user.clone();
comments = blocking(context.pool(), move |conn| { comments = CommentQuery::builder()
CommentQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort.map(post_to_comment_sort_type))
.sort(sort.map(post_to_comment_sort_type)) .listing_type(listing_type)
.listing_type(listing_type) .search_term(Some(q))
.search_term(Some(q)) .community_id(community_id)
.community_id(community_id) .community_actor_id(community_actor_id)
.community_actor_id(community_actor_id) .creator_id(creator_id)
.creator_id(creator_id) .local_user(local_user_.as_ref())
.local_user(local_user_.as_ref()) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
let q = data.q.to_owned(); let q = data.q.to_owned();
communities = if community_or_creator_included { communities = if community_or_creator_included {
vec![] vec![]
} else { } else {
blocking(context.pool(), move |conn| { CommunityQuery::builder()
CommunityQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort)
.sort(sort) .listing_type(listing_type)
.listing_type(listing_type) .search_term(Some(q))
.search_term(Some(q)) .local_user(local_user.as_ref())
.local_user(local_user.as_ref()) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?
})
.await??
}; };
let q = data.q.to_owned(); let q = data.q.to_owned();
@ -196,35 +182,31 @@ impl Perform for Search {
users = if community_or_creator_included { users = if community_or_creator_included {
vec![] vec![]
} else { } else {
blocking(context.pool(), move |conn| { PersonQuery::builder()
PersonQuery::builder() .pool(context.pool())
.conn(conn)
.sort(sort)
.search_term(Some(q))
.page(page)
.limit(limit)
.build()
.list()
})
.await??
};
}
SearchType::Url => {
posts = blocking(context.pool(), move |conn| {
PostQuery::builder()
.conn(conn)
.sort(sort) .sort(sort)
.listing_type(listing_type) .search_term(Some(q))
.community_id(community_id)
.community_actor_id(community_actor_id)
.creator_id(creator_id)
.url_search(Some(q))
.page(page) .page(page)
.limit(limit) .limit(limit)
.build() .build()
.list() .list()
}) .await?
.await??; };
}
SearchType::Url => {
posts = PostQuery::builder()
.pool(context.pool())
.sort(sort)
.listing_type(listing_type)
.community_id(community_id)
.community_actor_id(community_actor_id)
.creator_id(creator_id)
.url_search(Some(q))
.page(page)
.limit(limit)
.build()
.list()
.await?;
} }
}; };

@ -24,11 +24,11 @@ lemmy_db_views_moderator = { version = "=0.16.5", path = "../db_views_moderator"
lemmy_db_views_actor = { version = "=0.16.5", path = "../db_views_actor" } lemmy_db_views_actor = { version = "=0.16.5", path = "../db_views_actor" }
lemmy_db_schema = { version = "=0.16.5", path = "../db_schema", default-features = false } lemmy_db_schema = { version = "=0.16.5", path = "../db_schema", default-features = false }
lemmy_utils = { version = "=0.16.5", path = "../utils", optional = true } lemmy_utils = { version = "=0.16.5", path = "../utils", optional = true }
serde = { version = "1.0.145", features = ["derive"] } serde = { version = "1.0.147", features = ["derive"] }
url = "2.3.1" url = "2.3.1"
actix-web = { version = "4.2.1", default-features = false, features = ["cookies"], optional = true } actix-web = { version = "4.2.1", default-features = false, features = ["cookies"], optional = true }
chrono = { version = "0.4.22", features = ["serde"], optional = true } chrono = { version = "0.4.22", features = ["serde"], optional = true }
diesel = { version = "2.0.0", optional = true } diesel = { version = "2.0.2", optional = true }
tracing = { version = "0.1.36", optional = true } tracing = { version = "0.1.36", optional = true }
rosetta-i18n = { version = "0.1.2", optional = true } rosetta-i18n = { version = "0.1.2", optional = true }
percent-encoding = { version = "2.2.0", optional = true } percent-encoding = { version = "2.2.0", optional = true }

@ -125,10 +125,10 @@ pub struct CreateSite {
pub private_instance: Option<bool>, pub private_instance: Option<bool>,
pub default_theme: Option<String>, pub default_theme: Option<String>,
pub default_post_listing_type: Option<String>, pub default_post_listing_type: Option<String>,
pub legal_information: Option<String>,
pub application_email_admins: Option<bool>, pub application_email_admins: Option<bool>,
pub auth: Sensitive<String>,
pub hide_modlog_mod_names: Option<bool>, pub hide_modlog_mod_names: Option<bool>,
pub legal_information: Option<String>, pub discussion_languages: Option<Vec<LanguageId>>,
pub slur_filter_regex: Option<String>, pub slur_filter_regex: Option<String>,
pub actor_name_max_length: Option<i32>, pub actor_name_max_length: Option<i32>,
pub rate_limit_message: Option<i32>, pub rate_limit_message: Option<i32>,
@ -152,6 +152,7 @@ pub struct CreateSite {
pub captcha_difficulty: Option<String>, pub captcha_difficulty: Option<String>,
pub allowed_instances: Option<Vec<String>>, pub allowed_instances: Option<Vec<String>>,
pub blocked_instances: Option<Vec<String>>, pub blocked_instances: Option<Vec<String>>,
pub auth: Sensitive<String>,
} }
#[derive(Debug, Serialize, Deserialize, Clone, Default)] #[derive(Debug, Serialize, Deserialize, Clone, Default)]

@ -44,33 +44,13 @@ use rosetta_i18n::{Language, LanguageId};
use std::str::FromStr; use std::str::FromStr;
use tracing::warn; use tracing::warn;
pub async fn blocking<F, T>(pool: &DbPool, f: F) -> Result<T, LemmyError>
where
F: FnOnce(&mut diesel::PgConnection) -> T + Send + 'static,
T: Send + 'static,
{
let pool = pool.clone();
let blocking_span = tracing::info_span!("blocking operation");
actix_web::web::block(move || {
let entered = blocking_span.enter();
let mut conn = pool.get()?;
let res = (f)(&mut conn);
drop(entered);
Ok(res) as Result<T, LemmyError>
})
.await?
}
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
pub async fn is_mod_or_admin( pub async fn is_mod_or_admin(
pool: &DbPool, pool: &DbPool,
person_id: PersonId, person_id: PersonId,
community_id: CommunityId, community_id: CommunityId,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let is_mod_or_admin = blocking(pool, move |conn| { let is_mod_or_admin = CommunityView::is_mod_or_admin(pool, person_id, community_id).await?;
CommunityView::is_mod_or_admin(conn, person_id, community_id)
})
.await?;
if !is_mod_or_admin { if !is_mod_or_admin {
return Err(LemmyError::from_message("not_a_mod_or_admin")); return Err(LemmyError::from_message("not_a_mod_or_admin"));
} }
@ -86,8 +66,8 @@ pub fn is_admin(local_user_view: &LocalUserView) -> Result<(), LemmyError> {
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
pub async fn get_post(post_id: PostId, pool: &DbPool) -> Result<Post, LemmyError> { pub async fn get_post(post_id: PostId, pool: &DbPool) -> Result<Post, LemmyError> {
blocking(pool, move |conn| Post::read(conn, post_id)) Post::read(pool, post_id)
.await? .await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post")) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))
} }
@ -99,11 +79,9 @@ pub async fn mark_post_as_read(
) -> Result<PostRead, LemmyError> { ) -> Result<PostRead, LemmyError> {
let post_read_form = PostReadForm { post_id, person_id }; let post_read_form = PostReadForm { post_id, person_id };
blocking(pool, move |conn| { PostRead::mark_as_read(pool, &post_read_form)
PostRead::mark_as_read(conn, &post_read_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_mark_post_as_read"))
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_mark_post_as_read"))
} }
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
@ -114,11 +92,9 @@ pub async fn mark_post_as_unread(
) -> Result<usize, LemmyError> { ) -> Result<usize, LemmyError> {
let post_read_form = PostReadForm { post_id, person_id }; let post_read_form = PostReadForm { post_id, person_id };
blocking(pool, move |conn| { PostRead::mark_as_unread(pool, &post_read_form)
PostRead::mark_as_unread(conn, &post_read_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_mark_post_as_read"))
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_mark_post_as_read"))
} }
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
@ -131,8 +107,7 @@ pub async fn get_local_user_view_from_jwt(
.map_err(|e| e.with_message("not_logged_in"))? .map_err(|e| e.with_message("not_logged_in"))?
.claims; .claims;
let local_user_id = LocalUserId(claims.sub); let local_user_id = LocalUserId(claims.sub);
let local_user_view = let local_user_view = LocalUserView::read(pool, local_user_id).await?;
blocking(pool, move |conn| LocalUserView::read(conn, local_user_id)).await??;
check_user_valid( check_user_valid(
local_user_view.person.banned, local_user_view.person.banned,
local_user_view.person.ban_expires, local_user_view.person.ban_expires,
@ -181,10 +156,7 @@ pub async fn get_local_user_settings_view_from_jwt_opt(
.map_err(|e| e.with_message("not_logged_in"))? .map_err(|e| e.with_message("not_logged_in"))?
.claims; .claims;
let local_user_id = LocalUserId(claims.sub); let local_user_id = LocalUserId(claims.sub);
let local_user_view = blocking(pool, move |conn| { let local_user_view = LocalUserSettingsView::read(pool, local_user_id).await?;
LocalUserSettingsView::read(conn, local_user_id)
})
.await??;
check_user_valid( check_user_valid(
local_user_view.person.banned, local_user_view.person.banned,
local_user_view.person.ban_expires, local_user_view.person.ban_expires,
@ -222,9 +194,10 @@ pub async fn check_community_ban(
community_id: CommunityId, community_id: CommunityId,
pool: &DbPool, pool: &DbPool,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let is_banned = let is_banned = CommunityPersonBanView::get(pool, person_id, community_id)
move |conn: &mut _| CommunityPersonBanView::get(conn, person_id, community_id).is_ok(); .await
if blocking(pool, is_banned).await? { .is_ok();
if is_banned {
Err(LemmyError::from_message("community_ban")) Err(LemmyError::from_message("community_ban"))
} else { } else {
Ok(()) Ok(())
@ -236,8 +209,8 @@ pub async fn check_community_deleted_or_removed(
community_id: CommunityId, community_id: CommunityId,
pool: &DbPool, pool: &DbPool,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let community = blocking(pool, move |conn| Community::read(conn, community_id)) let community = Community::read(pool, community_id)
.await? .await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
if community.deleted || community.removed { if community.deleted || community.removed {
Err(LemmyError::from_message("deleted")) Err(LemmyError::from_message("deleted"))
@ -260,8 +233,10 @@ pub async fn check_person_block(
potential_blocker_id: PersonId, potential_blocker_id: PersonId,
pool: &DbPool, pool: &DbPool,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let is_blocked = move |conn: &mut _| PersonBlock::read(conn, potential_blocker_id, my_id).is_ok(); let is_blocked = PersonBlock::read(pool, potential_blocker_id, my_id)
if blocking(pool, is_blocked).await? { .await
.is_ok();
if is_blocked {
Err(LemmyError::from_message("person_block")) Err(LemmyError::from_message("person_block"))
} else { } else {
Ok(()) Ok(())
@ -294,9 +269,9 @@ pub async fn build_federated_instances(
) -> Result<Option<FederatedInstances>, LemmyError> { ) -> Result<Option<FederatedInstances>, LemmyError> {
if local_site.federation_enabled { if local_site.federation_enabled {
// TODO I hate that this requires 3 queries // TODO I hate that this requires 3 queries
let linked = blocking(pool, Instance::linked).await??; let linked = Instance::linked(pool).await?;
let allowed = blocking(pool, Instance::allowlist).await??; let allowed = Instance::allowlist(pool).await?;
let blocked = blocking(pool, Instance::blocklist).await??; let blocked = Instance::blocklist(pool).await?;
// These can return empty vectors, so convert them to options // These can return empty vectors, so convert them to options
let allowed = (!allowed.is_empty()).then(|| allowed); let allowed = (!allowed.is_empty()).then(|| allowed);
@ -374,10 +349,7 @@ pub async fn send_password_reset_email(
// Insert the row // Insert the row
let token2 = token.clone(); let token2 = token.clone();
let local_user_id = user.local_user.id; let local_user_id = user.local_user.id;
blocking(pool, move |conn| { PasswordResetRequest::create_token(pool, local_user_id, &token2).await?;
PasswordResetRequest::create_token(conn, local_user_id, &token2)
})
.await??;
let email = &user.local_user.email.to_owned().expect("email"); let email = &user.local_user.email.to_owned().expect("email");
let lang = get_interface_language(user); let lang = get_interface_language(user);
@ -405,7 +377,7 @@ pub async fn send_verification_email(
settings.get_protocol_and_hostname(), settings.get_protocol_and_hostname(),
&form.verification_token &form.verification_token
); );
blocking(pool, move |conn| EmailVerification::create(conn, &form)).await??; EmailVerification::create(pool, &form).await?;
let lang = get_interface_language(user); let lang = get_interface_language(user);
let subject = lang.verify_email_subject(&settings.hostname); let subject = lang.verify_email_subject(&settings.hostname);
@ -491,10 +463,7 @@ pub async fn send_new_applicant_email_to_admins(
settings: &Settings, settings: &Settings,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
// Collect the admins with emails // Collect the admins with emails
let admins = blocking(pool, move |conn| { let admins = LocalUserSettingsView::list_admins_with_emails(pool).await?;
LocalUserSettingsView::list_admins_with_emails(conn)
})
.await??;
let applications_link = &format!( let applications_link = &format!(
"{}/registration_applications", "{}/registration_applications",
@ -522,10 +491,7 @@ pub async fn check_registration_application(
{ {
// Fetch the registration, see if its denied // Fetch the registration, see if its denied
let local_user_id = local_user_view.local_user.id; let local_user_id = local_user_view.local_user.id;
let registration = blocking(pool, move |conn| { let registration = RegistrationApplication::find_by_local_user_id(pool, local_user_id).await?;
RegistrationApplication::find_by_local_user_id(conn, local_user_id)
})
.await??;
if let Some(deny_reason) = registration.deny_reason { if let Some(deny_reason) = registration.deny_reason {
let lang = get_interface_language(local_user_view); let lang = get_interface_language(local_user_view);
let registration_denied_message = format!("{}: {}", lang.registration_denied(), &deny_reason); let registration_denied_message = format!("{}: {}", lang.registration_denied(), &deny_reason);
@ -554,10 +520,7 @@ pub async fn purge_image_posts_for_person(
settings: &Settings, settings: &Settings,
client: &ClientWithMiddleware, client: &ClientWithMiddleware,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let posts = blocking(pool, move |conn: &mut _| { let posts = Post::fetch_pictrs_posts_for_creator(pool, banned_person_id).await?;
Post::fetch_pictrs_posts_for_creator(conn, banned_person_id)
})
.await??;
for post in posts { for post in posts {
if let Some(url) = post.url { if let Some(url) = post.url {
purge_image_from_pictrs(client, settings, &url).await.ok(); purge_image_from_pictrs(client, settings, &url).await.ok();
@ -569,10 +532,7 @@ pub async fn purge_image_posts_for_person(
} }
} }
blocking(pool, move |conn| { Post::remove_pictrs_post_images_and_thumbnails_for_creator(pool, banned_person_id).await?;
Post::remove_pictrs_post_images_and_thumbnails_for_creator(conn, banned_person_id)
})
.await??;
Ok(()) Ok(())
} }
@ -583,10 +543,7 @@ pub async fn purge_image_posts_for_community(
settings: &Settings, settings: &Settings,
client: &ClientWithMiddleware, client: &ClientWithMiddleware,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let posts = blocking(pool, move |conn: &mut _| { let posts = Post::fetch_pictrs_posts_for_community(pool, banned_community_id).await?;
Post::fetch_pictrs_posts_for_community(conn, banned_community_id)
})
.await??;
for post in posts { for post in posts {
if let Some(url) = post.url { if let Some(url) = post.url {
purge_image_from_pictrs(client, settings, &url).await.ok(); purge_image_from_pictrs(client, settings, &url).await.ok();
@ -598,10 +555,7 @@ pub async fn purge_image_posts_for_community(
} }
} }
blocking(pool, move |conn| { Post::remove_pictrs_post_images_and_thumbnails_for_community(pool, banned_community_id).await?;
Post::remove_pictrs_post_images_and_thumbnails_for_community(conn, banned_community_id)
})
.await??;
Ok(()) Ok(())
} }
@ -613,7 +567,7 @@ pub async fn remove_user_data(
client: &ClientWithMiddleware, client: &ClientWithMiddleware,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
// Purge user images // Purge user images
let person = blocking(pool, move |conn| Person::read(conn, banned_person_id)).await??; let person = Person::read(pool, banned_person_id).await?;
if let Some(avatar) = person.avatar { if let Some(avatar) = person.avatar {
purge_image_from_pictrs(client, settings, &avatar) purge_image_from_pictrs(client, settings, &avatar)
.await .await
@ -626,23 +580,18 @@ pub async fn remove_user_data(
} }
// Update the fields to None // Update the fields to None
blocking(pool, move |conn| { Person::update(
Person::update( pool,
conn, banned_person_id,
banned_person_id, &PersonUpdateForm::builder()
&PersonUpdateForm::builder() .avatar(Some(None))
.avatar(Some(None)) .banner(Some(None))
.banner(Some(None)) .build(),
.build(), )
) .await?;
})
.await??;
// Posts // Posts
blocking(pool, move |conn: &mut _| { Post::update_removed_for_creator(pool, banned_person_id, None, true).await?;
Post::update_removed_for_creator(conn, banned_person_id, None, true)
})
.await??;
// Purge image posts // Purge image posts
purge_image_posts_for_person(banned_person_id, pool, settings, client).await?; purge_image_posts_for_person(banned_person_id, pool, settings, client).await?;
@ -650,10 +599,7 @@ pub async fn remove_user_data(
// Communities // Communities
// Remove all communities where they're the top mod // Remove all communities where they're the top mod
// for now, remove the communities manually // for now, remove the communities manually
let first_mod_communities = blocking(pool, move |conn: &mut _| { let first_mod_communities = CommunityModeratorView::get_community_first_mods(pool).await?;
CommunityModeratorView::get_community_first_mods(conn)
})
.await??;
// Filter to only this banned users top communities // Filter to only this banned users top communities
let banned_user_first_communities: Vec<CommunityModeratorView> = first_mod_communities let banned_user_first_communities: Vec<CommunityModeratorView> = first_mod_communities
@ -663,14 +609,12 @@ pub async fn remove_user_data(
for first_mod_community in banned_user_first_communities { for first_mod_community in banned_user_first_communities {
let community_id = first_mod_community.community.id; let community_id = first_mod_community.community.id;
blocking(pool, move |conn| { Community::update(
Community::update( pool,
conn, community_id,
community_id, &CommunityUpdateForm::builder().removed(Some(true)).build(),
&CommunityUpdateForm::builder().removed(Some(true)).build(), )
) .await?;
})
.await??;
// Delete the community images // Delete the community images
if let Some(icon) = first_mod_community.community.icon { if let Some(icon) = first_mod_community.community.icon {
@ -682,24 +626,19 @@ pub async fn remove_user_data(
.ok(); .ok();
} }
// Update the fields to None // Update the fields to None
blocking(pool, move |conn| { Community::update(
Community::update( pool,
conn, community_id,
community_id, &CommunityUpdateForm::builder()
&CommunityUpdateForm::builder() .icon(Some(None))
.icon(Some(None)) .banner(Some(None))
.banner(Some(None)) .build(),
.build(), )
) .await?;
})
.await??;
} }
// Comments // Comments
blocking(pool, move |conn: &mut _| { Comment::update_removed_for_creator(pool, banned_person_id, true).await?;
Comment::update_removed_for_creator(conn, banned_person_id, true)
})
.await??;
Ok(()) Ok(())
} }
@ -710,34 +649,27 @@ pub async fn remove_user_data_in_community(
pool: &DbPool, pool: &DbPool,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
// Posts // Posts
blocking(pool, move |conn| { Post::update_removed_for_creator(pool, banned_person_id, Some(community_id), true).await?;
Post::update_removed_for_creator(conn, banned_person_id, Some(community_id), true)
})
.await??;
// Comments // Comments
// TODO Diesel doesn't allow updates with joins, so this has to be a loop // TODO Diesel doesn't allow updates with joins, so this has to be a loop
let comments = blocking(pool, move |conn| { let comments = CommentQuery::builder()
CommentQuery::builder() .pool(pool)
.conn(conn) .creator_id(Some(banned_person_id))
.creator_id(Some(banned_person_id)) .community_id(Some(community_id))
.community_id(Some(community_id)) .limit(Some(i64::MAX))
.limit(Some(i64::MAX)) .build()
.build() .list()
.list() .await?;
})
.await??;
for comment_view in &comments { for comment_view in &comments {
let comment_id = comment_view.comment.id; let comment_id = comment_view.comment.id;
blocking(pool, move |conn| { Comment::update(
Comment::update( pool,
conn, comment_id,
comment_id, &CommentUpdateForm::builder().removed(Some(true)).build(),
&CommentUpdateForm::builder().removed(Some(true)).build(), )
) .await?;
})
.await??;
} }
Ok(()) Ok(())
@ -750,7 +682,7 @@ pub async fn delete_user_account(
client: &ClientWithMiddleware, client: &ClientWithMiddleware,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
// Delete their images // Delete their images
let person = blocking(pool, move |conn| Person::read(conn, person_id)).await??; let person = Person::read(pool, person_id).await?;
if let Some(avatar) = person.avatar { if let Some(avatar) = person.avatar {
purge_image_from_pictrs(client, settings, &avatar) purge_image_from_pictrs(client, settings, &avatar)
.await .await
@ -764,21 +696,19 @@ pub async fn delete_user_account(
// No need to update avatar and banner, those are handled in Person::delete_account // No need to update avatar and banner, those are handled in Person::delete_account
// Comments // Comments
let permadelete = move |conn: &mut _| Comment::permadelete_for_creator(conn, person_id); Comment::permadelete_for_creator(pool, person_id)
blocking(pool, permadelete) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
// Posts // Posts
let permadelete = move |conn: &mut _| Post::permadelete_for_creator(conn, person_id); Post::permadelete_for_creator(pool, person_id)
blocking(pool, permadelete) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_post"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_post"))?;
// Purge image posts // Purge image posts
purge_image_posts_for_person(person_id, pool, settings, client).await?; purge_image_posts_for_person(person_id, pool, settings, client).await?;
blocking(pool, move |conn| Person::delete_account(conn, person_id)).await??; Person::delete_account(pool, person_id).await?;
Ok(()) Ok(())
} }

@ -18,10 +18,10 @@ lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["f
lemmy_websocket = { version = "=0.16.5", path = "../websocket" } lemmy_websocket = { version = "=0.16.5", path = "../websocket" }
activitypub_federation = "0.2.3" activitypub_federation = "0.2.3"
bcrypt = "0.13.0" bcrypt = "0.13.0"
serde_json = { version = "1.0.85", features = ["preserve_order"] } serde_json = { version = "1.0.87", features = ["preserve_order"] }
serde = { version = "1.0.145", features = ["derive"] } serde = { version = "1.0.147", features = ["derive"] }
actix-web = { version = "4.2.1", default-features = false } actix-web = { version = "4.2.1", default-features = false }
tracing = "0.1.36" tracing = "0.1.36"
url = { version = "2.3.1", features = ["serde"] } url = { version = "2.3.1", features = ["serde"] }
async-trait = "0.1.57" async-trait = "0.1.58"
webmention = "0.4.0" webmention = "0.4.0"

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentResponse, CreateComment}, comment::{CommentResponse, CreateComment},
utils::{ utils::{
blocking,
check_community_ban, check_community_ban,
check_community_deleted_or_removed, check_community_deleted_or_removed,
check_post_deleted_or_removed, check_post_deleted_or_removed,
@ -52,7 +51,7 @@ impl PerformCrud for CreateComment {
let data: &CreateComment = self; let data: &CreateComment = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let content_slurs_removed = remove_slurs( let content_slurs_removed = remove_slurs(
&data.content.to_owned(), &data.content.to_owned(),
@ -75,9 +74,7 @@ impl PerformCrud for CreateComment {
// Fetch the parent, if it exists // Fetch the parent, if it exists
let parent_opt = if let Some(parent_id) = data.parent_id { let parent_opt = if let Some(parent_id) = data.parent_id {
blocking(context.pool(), move |conn| Comment::read(conn, parent_id)) Comment::read(context.pool(), parent_id).await.ok()
.await?
.ok()
} else { } else {
None None
}; };
@ -97,10 +94,12 @@ impl PerformCrud for CreateComment {
.unwrap_or(post.language_id); .unwrap_or(post.language_id);
let language_id = data.language_id.unwrap_or(parent_language); let language_id = data.language_id.unwrap_or(parent_language);
blocking(context.pool(), move |conn| { CommunityLanguage::is_allowed_community_language(
CommunityLanguage::is_allowed_community_language(conn, Some(language_id), community_id) context.pool(),
}) Some(language_id),
.await??; community_id,
)
.await?;
let comment_form = CommentInsertForm::builder() let comment_form = CommentInsertForm::builder()
.content(content_slurs_removed.to_owned()) .content(content_slurs_removed.to_owned())
@ -112,31 +111,26 @@ impl PerformCrud for CreateComment {
// Create the comment // Create the comment
let comment_form2 = comment_form.clone(); let comment_form2 = comment_form.clone();
let parent_path = parent_opt.to_owned().map(|t| t.path); let parent_path = parent_opt.to_owned().map(|t| t.path);
let inserted_comment = blocking(context.pool(), move |conn| { let inserted_comment = Comment::create(context.pool(), &comment_form2, parent_path.as_ref())
Comment::create(conn, &comment_form2, parent_path.as_ref()) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_comment"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_create_comment"))?;
// Necessary to update the ap_id // Necessary to update the ap_id
let inserted_comment_id = inserted_comment.id; let inserted_comment_id = inserted_comment.id;
let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let protocol_and_hostname = context.settings().get_protocol_and_hostname();
let updated_comment: Comment = let apub_id = generate_local_apub_endpoint(
blocking(context.pool(), move |conn| -> Result<Comment, LemmyError> { EndpointType::Comment,
let apub_id = generate_local_apub_endpoint( &inserted_comment_id.to_string(),
EndpointType::Comment, &protocol_and_hostname,
&inserted_comment_id.to_string(), )?;
&protocol_and_hostname, let updated_comment = Comment::update(
)?; context.pool(),
Ok(Comment::update( inserted_comment_id,
conn, &CommentUpdateForm::builder().ap_id(Some(apub_id)).build(),
inserted_comment_id, )
&CommentUpdateForm::builder().ap_id(Some(apub_id)).build(), .await
)?) .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_comment"))?;
})
.await?
.map_err(|e| e.with_message("couldnt_create_comment"))?;
// Scan the comment for user mentions, add those rows // Scan the comment for user mentions, add those rows
let post_id = post.id; let post_id = post.id;
@ -159,9 +153,8 @@ impl PerformCrud for CreateComment {
score: 1, score: 1,
}; };
let like = move |conn: &mut _| CommentLike::like(conn, &like_form); CommentLike::like(context.pool(), &like_form)
blocking(context.pool(), like) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_like_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_like_comment"))?;
let apub_comment: ApubComment = updated_comment.into(); let apub_comment: ApubComment = updated_comment.into();
@ -177,33 +170,28 @@ impl PerformCrud for CreateComment {
// If its a reply, mark the parent as read // If its a reply, mark the parent as read
if let Some(parent) = parent_opt { if let Some(parent) = parent_opt {
let parent_id = parent.id; let parent_id = parent.id;
let comment_reply = blocking(context.pool(), move |conn| { let comment_reply = CommentReply::read_by_comment(context.pool(), parent_id).await;
CommentReply::read_by_comment(conn, parent_id)
})
.await?;
if let Ok(reply) = comment_reply { if let Ok(reply) = comment_reply {
blocking(context.pool(), move |conn| { CommentReply::update(
CommentReply::update(conn, reply.id, &CommentReplyUpdateForm { read: Some(true) }) context.pool(),
}) reply.id,
.await? &CommentReplyUpdateForm { read: Some(true) },
)
.await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_replies"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_replies"))?;
} }
// If the parent has PersonMentions mark them as read too // If the parent has PersonMentions mark them as read too
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let person_mention = blocking(context.pool(), move |conn| { let person_mention =
PersonMention::read_by_comment_and_person(conn, parent_id, person_id) PersonMention::read_by_comment_and_person(context.pool(), parent_id, person_id).await;
})
.await?;
if let Ok(mention) = person_mention { if let Ok(mention) = person_mention {
blocking(context.pool(), move |conn| { PersonMention::update(
PersonMention::update( context.pool(),
conn, mention.id,
mention.id, &PersonMentionUpdateForm { read: Some(true) },
&PersonMentionUpdateForm { read: Some(true) }, )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_person_mentions"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_person_mentions"))?;
} }
} }

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentResponse, DeleteComment}, comment::{CommentResponse, DeleteComment},
utils::{blocking, check_community_ban, get_local_user_view_from_jwt}, utils::{check_community_ban, get_local_user_view_from_jwt},
}; };
use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects}; use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -36,10 +36,7 @@ impl PerformCrud for DeleteComment {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let comment_id = data.comment_id; let comment_id = data.comment_id;
let orig_comment = blocking(context.pool(), move |conn| { let orig_comment = CommentView::read(context.pool(), comment_id, None).await?;
CommentView::read(conn, comment_id, None)
})
.await??;
// Dont delete it if its already been deleted. // Dont delete it if its already been deleted.
if orig_comment.comment.deleted == data.deleted { if orig_comment.comment.deleted == data.deleted {
@ -60,18 +57,16 @@ impl PerformCrud for DeleteComment {
// Do the delete // Do the delete
let deleted = data.deleted; let deleted = data.deleted;
let updated_comment = blocking(context.pool(), move |conn| { let updated_comment = Comment::update(
Comment::update( context.pool(),
conn, comment_id,
comment_id, &CommentUpdateForm::builder().deleted(Some(deleted)).build(),
&CommentUpdateForm::builder().deleted(Some(deleted)).build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
let post_id = updated_comment.post_id; let post_id = updated_comment.post_id;
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let post = Post::read(context.pool(), post_id).await?;
let recipient_ids = send_local_notifs( let recipient_ids = send_local_notifs(
vec![], vec![],
&updated_comment, &updated_comment,
@ -94,10 +89,7 @@ impl PerformCrud for DeleteComment {
.await?; .await?;
// Send the apub message // Send the apub message
let community = blocking(context.pool(), move |conn| { let community = Community::read(context.pool(), orig_comment.post.community_id).await?;
Community::read(conn, orig_comment.post.community_id)
})
.await??;
let deletable = DeletableObjects::Comment(Box::new(updated_comment.clone().into())); let deletable = DeletableObjects::Comment(Box::new(updated_comment.clone().into()));
send_apub_delete_in_community( send_apub_delete_in_community(
local_user_view.person, local_user_view.person,

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{GetComments, GetCommentsResponse}, comment::{GetComments, GetCommentsResponse},
utils::{ utils::{
blocking,
check_private_instance, check_private_instance,
get_local_user_view_from_jwt_opt, get_local_user_view_from_jwt_opt,
listing_type_with_site_default, listing_type_with_site_default,
@ -32,7 +31,7 @@ impl PerformCrud for GetComments {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
let community_id = data.community_id; let community_id = data.community_id;
@ -55,11 +54,7 @@ impl PerformCrud for GetComments {
// If a parent_id is given, fetch the comment to get the path // If a parent_id is given, fetch the comment to get the path
let parent_path = if let Some(parent_id) = parent_id { let parent_path = if let Some(parent_id) = parent_id {
Some( Some(Comment::read(context.pool(), parent_id).await?.path)
blocking(context.pool(), move |conn| Comment::read(conn, parent_id))
.await??
.path,
)
} else { } else {
None None
}; };
@ -67,25 +62,23 @@ impl PerformCrud for GetComments {
let parent_path_cloned = parent_path.to_owned(); let parent_path_cloned = parent_path.to_owned();
let post_id = data.post_id; let post_id = data.post_id;
let local_user = local_user_view.map(|l| l.local_user); let local_user = local_user_view.map(|l| l.local_user);
let mut comments = blocking(context.pool(), move |conn| { let mut comments = CommentQuery::builder()
CommentQuery::builder() .pool(context.pool())
.conn(conn) .listing_type(Some(listing_type))
.listing_type(Some(listing_type)) .sort(sort)
.sort(sort) .max_depth(max_depth)
.max_depth(max_depth) .saved_only(saved_only)
.saved_only(saved_only) .community_id(community_id)
.community_id(community_id) .community_actor_id(community_actor_id)
.community_actor_id(community_actor_id) .parent_path(parent_path_cloned)
.parent_path(parent_path_cloned) .post_id(post_id)
.post_id(post_id) .local_user(local_user.as_ref())
.local_user(local_user.as_ref()) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_get_comments"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_get_comments"))?;
// Blank out deleted or removed info // Blank out deleted or removed info
for cv in comments for cv in comments

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentResponse, GetComment}, comment::{CommentResponse, GetComment},
utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, utils::{check_private_instance, get_local_user_view_from_jwt_opt},
}; };
use lemmy_db_schema::source::local_site::LocalSite; use lemmy_db_schema::source::local_site::LocalSite;
use lemmy_db_views::structs::CommentView; use lemmy_db_views::structs::CommentView;
@ -23,17 +23,15 @@ impl PerformCrud for GetComment {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
let person_id = local_user_view.map(|u| u.person.id); let person_id = local_user_view.map(|u| u.person.id);
let id = data.id; let id = data.id;
let comment_view = blocking(context.pool(), move |conn| { let comment_view = CommentView::read(context.pool(), id, person_id)
CommentView::read(conn, id, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_comment"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_comment"))?;
Ok(Self::Response { Ok(Self::Response {
comment_view, comment_view,

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentResponse, RemoveComment}, comment::{CommentResponse, RemoveComment},
utils::{blocking, check_community_ban, get_local_user_view_from_jwt, is_mod_or_admin}, utils::{check_community_ban, get_local_user_view_from_jwt, is_mod_or_admin},
}; };
use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects}; use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -37,10 +37,7 @@ impl PerformCrud for RemoveComment {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let comment_id = data.comment_id; let comment_id = data.comment_id;
let orig_comment = blocking(context.pool(), move |conn| { let orig_comment = CommentView::read(context.pool(), comment_id, None).await?;
CommentView::read(conn, comment_id, None)
})
.await??;
check_community_ban( check_community_ban(
local_user_view.person.id, local_user_view.person.id,
@ -59,14 +56,12 @@ impl PerformCrud for RemoveComment {
// Do the remove // Do the remove
let removed = data.removed; let removed = data.removed;
let updated_comment = blocking(context.pool(), move |conn| { let updated_comment = Comment::update(
Comment::update( context.pool(),
conn, comment_id,
comment_id, &CommentUpdateForm::builder().removed(Some(removed)).build(),
&CommentUpdateForm::builder().removed(Some(removed)).build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
// Mod tables // Mod tables
@ -76,13 +71,10 @@ impl PerformCrud for RemoveComment {
removed: Some(removed), removed: Some(removed),
reason: data.reason.to_owned(), reason: data.reason.to_owned(),
}; };
blocking(context.pool(), move |conn| { ModRemoveComment::create(context.pool(), &form).await?;
ModRemoveComment::create(conn, &form)
})
.await??;
let post_id = updated_comment.post_id; let post_id = updated_comment.post_id;
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let post = Post::read(context.pool(), post_id).await?;
let recipient_ids = send_local_notifs( let recipient_ids = send_local_notifs(
vec![], vec![],
&updated_comment, &updated_comment,
@ -105,10 +97,7 @@ impl PerformCrud for RemoveComment {
.await?; .await?;
// Send the apub message // Send the apub message
let community = blocking(context.pool(), move |conn| { let community = Community::read(context.pool(), orig_comment.post.community_id).await?;
Community::read(conn, orig_comment.post.community_id)
})
.await??;
let deletable = DeletableObjects::Comment(Box::new(updated_comment.clone().into())); let deletable = DeletableObjects::Comment(Box::new(updated_comment.clone().into()));
send_apub_delete_in_community( send_apub_delete_in_community(
local_user_view.person, local_user_view.person,

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
comment::{CommentResponse, EditComment}, comment::{CommentResponse, EditComment},
utils::{ utils::{
blocking,
check_community_ban, check_community_ban,
check_community_deleted_or_removed, check_community_deleted_or_removed,
check_post_deleted_or_removed, check_post_deleted_or_removed,
@ -49,13 +48,10 @@ impl PerformCrud for EditComment {
let data: &EditComment = self; let data: &EditComment = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let comment_id = data.comment_id; let comment_id = data.comment_id;
let orig_comment = blocking(context.pool(), move |conn| { let orig_comment = CommentView::read(context.pool(), comment_id, None).await?;
CommentView::read(conn, comment_id, None)
})
.await??;
// TODO is this necessary? It should really only need to check on create // TODO is this necessary? It should really only need to check on create
check_community_ban( check_community_ban(
@ -83,10 +79,12 @@ impl PerformCrud for EditComment {
} }
let language_id = self.language_id; let language_id = self.language_id;
blocking(context.pool(), move |conn| { CommunityLanguage::is_allowed_community_language(
CommunityLanguage::is_allowed_community_language(conn, language_id, orig_comment.community.id) context.pool(),
}) language_id,
.await??; orig_comment.community.id,
)
.await?;
// Update the Content // Update the Content
let content_slurs_removed = data let content_slurs_removed = data
@ -99,11 +97,9 @@ impl PerformCrud for EditComment {
.distinguished(data.distinguished) .distinguished(data.distinguished)
.language_id(data.language_id) .language_id(data.language_id)
.build(); .build();
let updated_comment = blocking(context.pool(), move |conn| { let updated_comment = Comment::update(context.pool(), comment_id, &form)
Comment::update(conn, comment_id, &form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_comment"))?;
// Do the mentions / recipients // Do the mentions / recipients
let updated_comment_content = updated_comment.content.to_owned(); let updated_comment_content = updated_comment.content.to_owned();

@ -3,7 +3,7 @@ use activitypub_federation::core::{object_id::ObjectId, signatures::generate_act
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{CommunityResponse, CreateCommunity}, community::{CommunityResponse, CreateCommunity},
utils::{blocking, get_local_user_view_from_jwt, is_admin, local_site_to_slur_regex}, utils::{get_local_user_view_from_jwt, is_admin, local_site_to_slur_regex},
}; };
use lemmy_apub::{ use lemmy_apub::{
generate_followers_url, generate_followers_url,
@ -47,7 +47,7 @@ impl PerformCrud for CreateCommunity {
let data: &CreateCommunity = self; let data: &CreateCommunity = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let site_view = blocking(context.pool(), SiteView::read_local).await??; let site_view = SiteView::read_local(context.pool()).await?;
let local_site = site_view.local_site; let local_site = site_view.local_site;
if local_site.community_creation_admin_only && is_admin(&local_user_view).is_err() { if local_site.community_creation_admin_only && is_admin(&local_user_view).is_err() {
@ -101,11 +101,9 @@ impl PerformCrud for CreateCommunity {
.instance_id(site_view.site.instance_id) .instance_id(site_view.site.instance_id)
.build(); .build();
let inserted_community = blocking(context.pool(), move |conn| { let inserted_community = Community::create(context.pool(), &community_form)
Community::create(conn, &community_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "community_already_exists"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_already_exists"))?;
// The community creator becomes a moderator // The community creator becomes a moderator
let community_moderator_form = CommunityModeratorForm { let community_moderator_form = CommunityModeratorForm {
@ -113,9 +111,8 @@ impl PerformCrud for CreateCommunity {
person_id: local_user_view.person.id, person_id: local_user_view.person.id,
}; };
let join = move |conn: &mut _| CommunityModerator::join(conn, &community_moderator_form); CommunityModerator::join(context.pool(), &community_moderator_form)
blocking(context.pool(), join) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?;
// Follow your own community // Follow your own community
@ -125,16 +122,13 @@ impl PerformCrud for CreateCommunity {
pending: false, pending: false,
}; };
let follow = move |conn: &mut _| CommunityFollower::follow(conn, &community_follower_form); CommunityFollower::follow(context.pool(), &community_follower_form)
blocking(context.pool(), follow) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?; .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let community_view = blocking(context.pool(), move |conn| { let community_view =
CommunityView::read(conn, inserted_community.id, Some(person_id)) CommunityView::read(context.pool(), inserted_community.id, Some(person_id)).await?;
})
.await??;
Ok(CommunityResponse { community_view }) Ok(CommunityResponse { community_view })
} }

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{CommunityResponse, DeleteCommunity}, community::{CommunityResponse, DeleteCommunity},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects}; use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -29,10 +29,8 @@ impl PerformCrud for DeleteCommunity {
// Fetch the community mods // Fetch the community mods
let community_id = data.community_id; let community_id = data.community_id;
let community_mods = blocking(context.pool(), move |conn| { let community_mods =
CommunityModeratorView::for_community(conn, community_id) CommunityModeratorView::for_community(context.pool(), community_id).await?;
})
.await??;
// Make sure deleter is the top mod // Make sure deleter is the top mod
if local_user_view.person.id != community_mods[0].moderator.id { if local_user_view.person.id != community_mods[0].moderator.id {
@ -42,16 +40,14 @@ impl PerformCrud for DeleteCommunity {
// Do the delete // Do the delete
let community_id = data.community_id; let community_id = data.community_id;
let deleted = data.deleted; let deleted = data.deleted;
let updated_community = blocking(context.pool(), move |conn| { let updated_community = Community::update(
Community::update( context.pool(),
conn, community_id,
community_id, &CommunityUpdateForm::builder()
&CommunityUpdateForm::builder() .deleted(Some(deleted))
.deleted(Some(deleted)) .build(),
.build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community"))?;
let res = send_community_ws_message( let res = send_community_ws_message(

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{ListCommunities, ListCommunitiesResponse}, community::{ListCommunities, ListCommunitiesResponse},
utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, utils::{check_private_instance, get_local_user_view_from_jwt_opt},
}; };
use lemmy_db_schema::{source::local_site::LocalSite, traits::DeleteableOrRemoveable}; use lemmy_db_schema::{source::local_site::LocalSite, traits::DeleteableOrRemoveable};
use lemmy_db_views_actor::community_view::CommunityQuery; use lemmy_db_views_actor::community_view::CommunityQuery;
@ -23,7 +23,7 @@ impl PerformCrud for ListCommunities {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
@ -34,18 +34,16 @@ impl PerformCrud for ListCommunities {
let page = data.page; let page = data.page;
let limit = data.limit; let limit = data.limit;
let local_user = local_user_view.map(|l| l.local_user); let local_user = local_user_view.map(|l| l.local_user);
let mut communities = blocking(context.pool(), move |conn| { let mut communities = CommunityQuery::builder()
CommunityQuery::builder() .pool(context.pool())
.conn(conn) .listing_type(listing_type)
.listing_type(listing_type) .sort(sort)
.sort(sort) .local_user(local_user.as_ref())
.local_user(local_user.as_ref()) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await?;
})
.await??;
// Blank out deleted or removed info for non-logged in users // Blank out deleted or removed info for non-logged in users
if person_id.is_none() { if person_id.is_none() {

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{GetCommunity, GetCommunityResponse}, community::{GetCommunity, GetCommunityResponse},
utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, utils::{check_private_instance, get_local_user_view_from_jwt_opt},
}; };
use lemmy_apub::{ use lemmy_apub::{
fetcher::resolve_actor_identifier, fetcher::resolve_actor_identifier,
@ -36,7 +36,7 @@ impl PerformCrud for GetCommunity {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
if data.name.is_none() && data.id.is_none() { if data.name.is_none() && data.id.is_none() {
return Err(LemmyError::from_message("no_id_given")); return Err(LemmyError::from_message("no_id_given"));
@ -57,11 +57,9 @@ impl PerformCrud for GetCommunity {
} }
}; };
let mut community_view = blocking(context.pool(), move |conn| { let mut community_view = CommunityView::read(context.pool(), community_id, person_id)
CommunityView::read(conn, community_id, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
// Blank out deleted or removed info for non-logged in users // Blank out deleted or removed info for non-logged in users
if person_id.is_none() && (community_view.community.deleted || community_view.community.removed) if person_id.is_none() && (community_view.community.deleted || community_view.community.removed)
@ -69,11 +67,9 @@ impl PerformCrud for GetCommunity {
community_view.community = community_view.community.blank_out_deleted_or_removed_info(); community_view.community = community_view.community.blank_out_deleted_or_removed_info();
} }
let moderators: Vec<CommunityModeratorView> = blocking(context.pool(), move |conn| { let moderators = CommunityModeratorView::for_community(context.pool(), community_id)
CommunityModeratorView::for_community(conn, community_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
let online = context let online = context
.chat_server() .chat_server()
@ -82,10 +78,7 @@ impl PerformCrud for GetCommunity {
.unwrap_or(1); .unwrap_or(1);
let site_id = instance_actor_id_from_url(community_view.community.actor_id.clone().into()); let site_id = instance_actor_id_from_url(community_view.community.actor_id.clone().into());
let mut site: Option<Site> = blocking(context.pool(), move |conn| { let mut site = Site::read_from_apub_id(context.pool(), site_id).await?;
Site::read_from_apub_id(conn, site_id)
})
.await??;
// no need to include metadata for local site (its already available through other endpoints). // no need to include metadata for local site (its already available through other endpoints).
// this also prevents us from leaking the federation private key. // this also prevents us from leaking the federation private key.
if let Some(s) = &site { if let Some(s) = &site {
@ -95,15 +88,9 @@ impl PerformCrud for GetCommunity {
} }
let community_id = community_view.community.id; let community_id = community_view.community.id;
let discussion_languages = blocking(context.pool(), move |conn| { let discussion_languages = CommunityLanguage::read(context.pool(), community_id).await?;
CommunityLanguage::read(conn, community_id)
})
.await??;
let default_post_language = if let Some(user) = local_user_view { let default_post_language = if let Some(user) = local_user_view {
blocking(context.pool(), move |conn| { default_post_language(context.pool(), community_id, user.local_user.id).await?
default_post_language(conn, community_id, user.local_user.id)
})
.await??
} else { } else {
None None
}; };

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{CommunityResponse, RemoveCommunity}, community::{CommunityResponse, RemoveCommunity},
utils::{blocking, get_local_user_view_from_jwt, is_admin}, utils::{get_local_user_view_from_jwt, is_admin},
}; };
use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects}; use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -35,16 +35,14 @@ impl PerformCrud for RemoveCommunity {
// Do the remove // Do the remove
let community_id = data.community_id; let community_id = data.community_id;
let removed = data.removed; let removed = data.removed;
let updated_community = blocking(context.pool(), move |conn| { let updated_community = Community::update(
Community::update( context.pool(),
conn, community_id,
community_id, &CommunityUpdateForm::builder()
&CommunityUpdateForm::builder() .removed(Some(removed))
.removed(Some(removed)) .build(),
.build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community"))?;
// Mod tables // Mod tables
@ -56,10 +54,7 @@ impl PerformCrud for RemoveCommunity {
reason: data.reason.to_owned(), reason: data.reason.to_owned(),
expires, expires,
}; };
blocking(context.pool(), move |conn| { ModRemoveCommunity::create(context.pool(), &form).await?;
ModRemoveCommunity::create(conn, &form)
})
.await??;
let res = send_community_ws_message( let res = send_community_ws_message(
data.community_id, data.community_id,

@ -2,11 +2,11 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
community::{CommunityResponse, EditCommunity}, community::{CommunityResponse, EditCommunity},
utils::{blocking, get_local_user_view_from_jwt, local_site_to_slur_regex}, utils::{get_local_user_view_from_jwt, local_site_to_slur_regex},
}; };
use lemmy_apub::protocol::activities::community::update::UpdateCommunity; use lemmy_apub::protocol::activities::community::update::UpdateCommunity;
use lemmy_db_schema::{ use lemmy_db_schema::{
newtypes::{LanguageId, PersonId}, newtypes::PersonId,
source::{ source::{
actor_language::{CommunityLanguage, SiteLanguage}, actor_language::{CommunityLanguage, SiteLanguage},
community::{Community, CommunityUpdateForm}, community::{Community, CommunityUpdateForm},
@ -32,7 +32,7 @@ impl PerformCrud for EditCommunity {
let data: &EditCommunity = self; let data: &EditCommunity = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let icon = diesel_option_overwrite_to_url(&data.icon)?; let icon = diesel_option_overwrite_to_url(&data.icon)?;
let banner = diesel_option_overwrite_to_url(&data.banner)?; let banner = diesel_option_overwrite_to_url(&data.banner)?;
@ -44,29 +44,23 @@ impl PerformCrud for EditCommunity {
// Verify its a mod (only mods can edit it) // Verify its a mod (only mods can edit it)
let community_id = data.community_id; let community_id = data.community_id;
let mods: Vec<PersonId> = blocking(context.pool(), move |conn| { let mods: Vec<PersonId> = CommunityModeratorView::for_community(context.pool(), community_id)
CommunityModeratorView::for_community(conn, community_id) .await
.map(|v| v.into_iter().map(|m| m.moderator.id).collect()) .map(|v| v.into_iter().map(|m| m.moderator.id).collect())?;
})
.await??;
if !mods.contains(&local_user_view.person.id) { if !mods.contains(&local_user_view.person.id) {
return Err(LemmyError::from_message("not_a_moderator")); return Err(LemmyError::from_message("not_a_moderator"));
} }
let community_id = data.community_id; let community_id = data.community_id;
if let Some(languages) = data.discussion_languages.clone() { if let Some(languages) = data.discussion_languages.clone() {
let site_languages: Vec<LanguageId> = let site_languages = SiteLanguage::read_local(context.pool()).await?;
blocking(context.pool(), SiteLanguage::read_local).await??;
// check that community languages are a subset of site languages // check that community languages are a subset of site languages
// https://stackoverflow.com/a/64227550 // https://stackoverflow.com/a/64227550
let is_subset = languages.iter().all(|item| site_languages.contains(item)); let is_subset = languages.iter().all(|item| site_languages.contains(item));
if !is_subset { if !is_subset {
return Err(LemmyError::from_message("language_not_allowed")); return Err(LemmyError::from_message("language_not_allowed"));
} }
blocking(context.pool(), move |conn| { CommunityLanguage::update(context.pool(), languages, community_id).await?;
CommunityLanguage::update(conn, languages, community_id)
})
.await??;
} }
let community_form = CommunityUpdateForm::builder() let community_form = CommunityUpdateForm::builder()
@ -79,11 +73,9 @@ impl PerformCrud for EditCommunity {
.build(); .build();
let community_id = data.community_id; let community_id = data.community_id;
let updated_community = blocking(context.pool(), move |conn| { let updated_community = Community::update(context.pool(), community_id, &community_form)
Community::update(conn, community_id, &community_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community"))?;
UpdateCommunity::send( UpdateCommunity::send(
updated_community.into(), updated_community.into(),

@ -4,7 +4,6 @@ use lemmy_api_common::{
post::{CreatePost, PostResponse}, post::{CreatePost, PostResponse},
request::fetch_site_data, request::fetch_site_data,
utils::{ utils::{
blocking,
check_community_ban, check_community_ban,
check_community_deleted_or_removed, check_community_deleted_or_removed,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
@ -53,7 +52,7 @@ impl PerformCrud for CreatePost {
let data: &CreatePost = self; let data: &CreatePost = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let slur_regex = local_site_to_slur_regex(&local_site); let slur_regex = local_site_to_slur_regex(&local_site);
check_slurs(&data.name, &slur_regex)?; check_slurs(&data.name, &slur_regex)?;
@ -71,15 +70,14 @@ impl PerformCrud for CreatePost {
check_community_deleted_or_removed(data.community_id, context.pool()).await?; check_community_deleted_or_removed(data.community_id, context.pool()).await?;
let community_id = data.community_id; let community_id = data.community_id;
let community = blocking(context.pool(), move |conn| { let community = Community::read(context.pool(), community_id).await?;
Community::read(conn, community_id)
})
.await??;
if community.posting_restricted_to_mods { if community.posting_restricted_to_mods {
let community_id = data.community_id; let community_id = data.community_id;
let is_mod = blocking(context.pool(), move |conn| { let is_mod = CommunityView::is_mod_or_admin(
CommunityView::is_mod_or_admin(conn, local_user_view.local_user.person_id, community_id) context.pool(),
}) local_user_view.local_user.person_id,
community_id,
)
.await?; .await?;
if !is_mod { if !is_mod {
return Err(LemmyError::from_message("only_mods_can_post_in_community")); return Err(LemmyError::from_message("only_mods_can_post_in_community"));
@ -96,16 +94,11 @@ impl PerformCrud for CreatePost {
let language_id = match data.language_id { let language_id = match data.language_id {
Some(lid) => Some(lid), Some(lid) => Some(lid),
None => { None => {
blocking(context.pool(), move |conn| { default_post_language(context.pool(), community_id, local_user_view.local_user.id).await?
default_post_language(conn, community_id, local_user_view.local_user.id)
})
.await??
} }
}; };
blocking(context.pool(), move |conn| { CommunityLanguage::is_allowed_community_language(context.pool(), language_id, community_id)
CommunityLanguage::is_allowed_community_language(conn, language_id, community_id) .await?;
})
.await??;
let post_form = PostInsertForm::builder() let post_form = PostInsertForm::builder()
.name(data.name.trim().to_owned()) .name(data.name.trim().to_owned())
@ -121,36 +114,33 @@ impl PerformCrud for CreatePost {
.thumbnail_url(thumbnail_url) .thumbnail_url(thumbnail_url)
.build(); .build();
let inserted_post = let inserted_post = match Post::create(context.pool(), &post_form).await {
match blocking(context.pool(), move |conn| Post::create(conn, &post_form)).await? { Ok(post) => post,
Ok(post) => post, Err(e) => {
Err(e) => { let err_type = if e.to_string() == "value too long for type character varying(200)" {
let err_type = if e.to_string() == "value too long for type character varying(200)" { "post_title_too_long"
"post_title_too_long" } else {
} else { "couldnt_create_post"
"couldnt_create_post" };
};
return Err(LemmyError::from_error_message(e, err_type)); return Err(LemmyError::from_error_message(e, err_type));
} }
}; };
let inserted_post_id = inserted_post.id; let inserted_post_id = inserted_post.id;
let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let protocol_and_hostname = context.settings().get_protocol_and_hostname();
let updated_post = blocking(context.pool(), move |conn| -> Result<Post, LemmyError> { let apub_id = generate_local_apub_endpoint(
let apub_id = generate_local_apub_endpoint( EndpointType::Post,
EndpointType::Post, &inserted_post_id.to_string(),
&inserted_post_id.to_string(), &protocol_and_hostname,
&protocol_and_hostname, )?;
)?; let updated_post = Post::update(
Ok(Post::update( context.pool(),
conn, inserted_post_id,
inserted_post_id, &PostUpdateForm::builder().ap_id(Some(apub_id)).build(),
&PostUpdateForm::builder().ap_id(Some(apub_id)).build(), )
)?) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_post"))?;
.await?
.map_err(|e| e.with_message("couldnt_create_post"))?;
// They like their own post by default // They like their own post by default
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
@ -161,9 +151,8 @@ impl PerformCrud for CreatePost {
score: 1, score: 1,
}; };
let like = move |conn: &mut _| PostLike::like(conn, &like_form); PostLike::like(context.pool(), &like_form)
blocking(context.pool(), like) .await
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_like_post"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_like_post"))?;
// Mark the post as read // Mark the post as read

@ -2,12 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{DeletePost, PostResponse}, post::{DeletePost, PostResponse},
utils::{ utils::{check_community_ban, check_community_deleted_or_removed, get_local_user_view_from_jwt},
blocking,
check_community_ban,
check_community_deleted_or_removed,
get_local_user_view_from_jwt,
},
}; };
use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects}; use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -35,7 +30,7 @@ impl PerformCrud for DeletePost {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let post_id = data.post_id; let post_id = data.post_id;
let orig_post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let orig_post = Post::read(context.pool(), post_id).await?;
// Dont delete it if its already been deleted. // Dont delete it if its already been deleted.
if orig_post.deleted == data.deleted { if orig_post.deleted == data.deleted {
@ -58,14 +53,12 @@ impl PerformCrud for DeletePost {
// Update the post // Update the post
let post_id = data.post_id; let post_id = data.post_id;
let deleted = data.deleted; let deleted = data.deleted;
let updated_post = blocking(context.pool(), move |conn| { let updated_post = Post::update(
Post::update( context.pool(),
conn, post_id,
post_id, &PostUpdateForm::builder().deleted(Some(deleted)).build(),
&PostUpdateForm::builder().deleted(Some(deleted)).build(), )
) .await?;
})
.await??;
let res = send_post_ws_message( let res = send_post_ws_message(
data.post_id, data.post_id,
@ -77,10 +70,7 @@ impl PerformCrud for DeletePost {
.await?; .await?;
// apub updates // apub updates
let community = blocking(context.pool(), move |conn| { let community = Community::read(context.pool(), orig_post.community_id).await?;
Community::read(conn, orig_post.community_id)
})
.await??;
let deletable = DeletableObjects::Post(Box::new(updated_post.into())); let deletable = DeletableObjects::Post(Box::new(updated_post.into()));
send_apub_delete_in_community( send_apub_delete_in_community(
local_user_view.person, local_user_view.person,

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{GetPosts, GetPostsResponse}, post::{GetPosts, GetPostsResponse},
utils::{ utils::{
blocking,
check_private_instance, check_private_instance,
get_local_user_view_from_jwt_opt, get_local_user_view_from_jwt_opt,
listing_type_with_site_default, listing_type_with_site_default,
@ -32,7 +31,7 @@ impl PerformCrud for GetPosts {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
@ -54,22 +53,20 @@ impl PerformCrud for GetPosts {
}; };
let saved_only = data.saved_only; let saved_only = data.saved_only;
let mut posts = blocking(context.pool(), move |conn| { let mut posts = PostQuery::builder()
PostQuery::builder() .pool(context.pool())
.conn(conn) .local_user(local_user_view.map(|l| l.local_user).as_ref())
.local_user(local_user_view.map(|l| l.local_user).as_ref()) .listing_type(Some(listing_type))
.listing_type(Some(listing_type)) .sort(sort)
.sort(sort) .community_id(community_id)
.community_id(community_id) .community_actor_id(community_actor_id)
.community_actor_id(community_actor_id) .saved_only(saved_only)
.saved_only(saved_only) .page(page)
.page(page) .limit(limit)
.limit(limit) .build()
.build() .list()
.list() .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_get_posts"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_get_posts"))?;
// Blank out deleted or removed info for non-logged in users // Blank out deleted or removed info for non-logged in users
if !is_logged_in { if !is_logged_in {

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{GetPost, GetPostResponse}, post::{GetPost, GetPostResponse},
utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt, mark_post_as_read}, utils::{check_private_instance, get_local_user_view_from_jwt_opt, mark_post_as_read},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
aggregates::structs::{PersonPostAggregates, PersonPostAggregatesForm}, aggregates::structs::{PersonPostAggregates, PersonPostAggregatesForm},
@ -28,7 +28,7 @@ impl PerformCrud for GetPost {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
@ -38,19 +38,17 @@ impl PerformCrud for GetPost {
let post_id = if let Some(id) = data.id { let post_id = if let Some(id) = data.id {
id id
} else if let Some(comment_id) = data.comment_id { } else if let Some(comment_id) = data.comment_id {
blocking(context.pool(), move |conn| Comment::read(conn, comment_id)) Comment::read(context.pool(), comment_id)
.await? .await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))? .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))?
.post_id .post_id
} else { } else {
Err(LemmyError::from_message("couldnt_find_post"))? Err(LemmyError::from_message("couldnt_find_post"))?
}; };
let mut post_view = blocking(context.pool(), move |conn| { let mut post_view = PostView::read(context.pool(), post_id, person_id)
PostView::read(conn, post_id, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))?;
// Mark the post as read // Mark the post as read
let post_id = post_view.post.id; let post_id = post_view.post.id;
@ -60,11 +58,9 @@ impl PerformCrud for GetPost {
// Necessary for the sidebar subscribed // Necessary for the sidebar subscribed
let community_id = post_view.community.id; let community_id = post_view.community.id;
let mut community_view = blocking(context.pool(), move |conn| { let mut community_view = CommunityView::read(context.pool(), community_id, person_id)
CommunityView::read(conn, community_id, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
// Insert into PersonPostAggregates // Insert into PersonPostAggregates
// to update the read_comments count // to update the read_comments count
@ -76,11 +72,9 @@ impl PerformCrud for GetPost {
read_comments, read_comments,
..PersonPostAggregatesForm::default() ..PersonPostAggregatesForm::default()
}; };
blocking(context.pool(), move |conn| { PersonPostAggregates::upsert(context.pool(), &person_post_agg_form)
PersonPostAggregates::upsert(conn, &person_post_agg_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))?;
} }
// Blank out deleted or removed info for non-logged in users // Blank out deleted or removed info for non-logged in users
@ -94,10 +88,7 @@ impl PerformCrud for GetPost {
} }
} }
let moderators = blocking(context.pool(), move |conn| { let moderators = CommunityModeratorView::for_community(context.pool(), community_id).await?;
CommunityModeratorView::for_community(conn, community_id)
})
.await??;
let online = context let online = context
.chat_server() .chat_server()

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
post::{PostResponse, RemovePost}, post::{PostResponse, RemovePost},
utils::{blocking, check_community_ban, get_local_user_view_from_jwt, is_mod_or_admin}, utils::{check_community_ban, get_local_user_view_from_jwt, is_mod_or_admin},
}; };
use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects}; use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -31,7 +31,7 @@ impl PerformCrud for RemovePost {
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let post_id = data.post_id; let post_id = data.post_id;
let orig_post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let orig_post = Post::read(context.pool(), post_id).await?;
check_community_ban( check_community_ban(
local_user_view.person.id, local_user_view.person.id,
@ -51,14 +51,12 @@ impl PerformCrud for RemovePost {
// Update the post // Update the post
let post_id = data.post_id; let post_id = data.post_id;
let removed = data.removed; let removed = data.removed;
let updated_post = blocking(context.pool(), move |conn| { let updated_post = Post::update(
Post::update( context.pool(),
conn, post_id,
post_id, &PostUpdateForm::builder().removed(Some(removed)).build(),
&PostUpdateForm::builder().removed(Some(removed)).build(), )
) .await?;
})
.await??;
// Mod tables // Mod tables
let form = ModRemovePostForm { let form = ModRemovePostForm {
@ -67,10 +65,7 @@ impl PerformCrud for RemovePost {
removed: Some(removed), removed: Some(removed),
reason: data.reason.to_owned(), reason: data.reason.to_owned(),
}; };
blocking(context.pool(), move |conn| { ModRemovePost::create(context.pool(), &form).await?;
ModRemovePost::create(conn, &form)
})
.await??;
let res = send_post_ws_message( let res = send_post_ws_message(
data.post_id, data.post_id,
@ -82,10 +77,7 @@ impl PerformCrud for RemovePost {
.await?; .await?;
// apub updates // apub updates
let community = blocking(context.pool(), move |conn| { let community = Community::read(context.pool(), orig_post.community_id).await?;
Community::read(conn, orig_post.community_id)
})
.await??;
let deletable = DeletableObjects::Post(Box::new(updated_post.into())); let deletable = DeletableObjects::Post(Box::new(updated_post.into()));
send_apub_delete_in_community( send_apub_delete_in_community(
local_user_view.person, local_user_view.person,

@ -4,7 +4,6 @@ use lemmy_api_common::{
post::{EditPost, PostResponse}, post::{EditPost, PostResponse},
request::fetch_site_data, request::fetch_site_data,
utils::{ utils::{
blocking,
check_community_ban, check_community_ban,
check_community_deleted_or_removed, check_community_deleted_or_removed,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
@ -44,7 +43,7 @@ impl PerformCrud for EditPost {
let data: &EditPost = self; let data: &EditPost = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let data_url = data.url.as_ref(); let data_url = data.url.as_ref();
@ -64,7 +63,7 @@ impl PerformCrud for EditPost {
} }
let post_id = data.post_id; let post_id = data.post_id;
let orig_post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; let orig_post = Post::read(context.pool(), post_id).await?;
check_community_ban( check_community_ban(
local_user_view.person.id, local_user_view.person.id,
@ -88,10 +87,12 @@ impl PerformCrud for EditPost {
.unwrap_or_default(); .unwrap_or_default();
let language_id = self.language_id; let language_id = self.language_id;
blocking(context.pool(), move |conn| { CommunityLanguage::is_allowed_community_language(
CommunityLanguage::is_allowed_community_language(conn, language_id, orig_post.community_id) context.pool(),
}) language_id,
.await??; orig_post.community_id,
)
.await?;
let post_form = PostUpdateForm::builder() let post_form = PostUpdateForm::builder()
.name(data.name.to_owned()) .name(data.name.to_owned())
@ -106,10 +107,7 @@ impl PerformCrud for EditPost {
.build(); .build();
let post_id = data.post_id; let post_id = data.post_id;
let res = blocking(context.pool(), move |conn| { let res = Post::update(context.pool(), post_id, &post_form).await;
Post::update(conn, post_id, &post_form)
})
.await?;
let updated_post: Post = match res { let updated_post: Post = match res {
Ok(post) => post, Ok(post) => post,
Err(e) => { Err(e) => {

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{CreatePrivateMessage, PrivateMessageResponse}, private_message::{CreatePrivateMessage, PrivateMessageResponse},
utils::{ utils::{
blocking,
check_person_block, check_person_block,
get_interface_language, get_interface_language,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
@ -43,7 +42,7 @@ impl PerformCrud for CreatePrivateMessage {
let data: &CreatePrivateMessage = self; let data: &CreatePrivateMessage = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
let content_slurs_removed = remove_slurs( let content_slurs_removed = remove_slurs(
&data.content.to_owned(), &data.content.to_owned(),
@ -58,41 +57,33 @@ impl PerformCrud for CreatePrivateMessage {
.recipient_id(data.recipient_id) .recipient_id(data.recipient_id)
.build(); .build();
let inserted_private_message = match blocking(context.pool(), move |conn| { let inserted_private_message =
PrivateMessage::create(conn, &private_message_form) match PrivateMessage::create(context.pool(), &private_message_form).await {
}) Ok(private_message) => private_message,
.await? Err(e) => {
{ return Err(LemmyError::from_error_message(
Ok(private_message) => private_message, e,
Err(e) => { "couldnt_create_private_message",
return Err(LemmyError::from_error_message( ));
e, }
"couldnt_create_private_message", };
));
}
};
let inserted_private_message_id = inserted_private_message.id; let inserted_private_message_id = inserted_private_message.id;
let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let protocol_and_hostname = context.settings().get_protocol_and_hostname();
let updated_private_message = blocking( let apub_id = generate_local_apub_endpoint(
EndpointType::PrivateMessage,
&inserted_private_message_id.to_string(),
&protocol_and_hostname,
)?;
let updated_private_message = PrivateMessage::update(
context.pool(), context.pool(),
move |conn| -> Result<PrivateMessage, LemmyError> { inserted_private_message.id,
let apub_id = generate_local_apub_endpoint( &PrivateMessageUpdateForm::builder()
EndpointType::PrivateMessage, .ap_id(Some(apub_id))
&inserted_private_message_id.to_string(), .build(),
&protocol_and_hostname,
)?;
Ok(PrivateMessage::update(
conn,
inserted_private_message.id,
&PrivateMessageUpdateForm::builder()
.ap_id(Some(apub_id))
.build(),
)?)
},
) )
.await? .await
.map_err(|e| e.with_message("couldnt_create_private_message"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_private_message"))?;
CreateOrUpdatePrivateMessage::send( CreateOrUpdatePrivateMessage::send(
updated_private_message.into(), updated_private_message.into(),
@ -113,10 +104,7 @@ impl PerformCrud for CreatePrivateMessage {
// Send email to the local recipient, if one exists // Send email to the local recipient, if one exists
if res.private_message_view.recipient.local { if res.private_message_view.recipient.local {
let recipient_id = data.recipient_id; let recipient_id = data.recipient_id;
let local_recipient = blocking(context.pool(), move |conn| { let local_recipient = LocalUserView::read_person(context.pool(), recipient_id).await?;
LocalUserView::read_person(conn, recipient_id)
})
.await??;
let lang = get_interface_language(&local_recipient); let lang = get_interface_language(&local_recipient);
let inbox_link = format!("{}/inbox", context.settings().get_protocol_and_hostname()); let inbox_link = format!("{}/inbox", context.settings().get_protocol_and_hostname());
send_email_to_user( send_email_to_user(

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{DeletePrivateMessage, PrivateMessageResponse}, private_message::{DeletePrivateMessage, PrivateMessageResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_apub::activities::deletion::send_apub_delete_private_message; use lemmy_apub::activities::deletion::send_apub_delete_private_message;
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -28,10 +28,7 @@ impl PerformCrud for DeletePrivateMessage {
// Checking permissions // Checking permissions
let private_message_id = data.private_message_id; let private_message_id = data.private_message_id;
let orig_private_message = blocking(context.pool(), move |conn| { let orig_private_message = PrivateMessage::read(context.pool(), private_message_id).await?;
PrivateMessage::read(conn, private_message_id)
})
.await??;
if local_user_view.person.id != orig_private_message.creator_id { if local_user_view.person.id != orig_private_message.creator_id {
return Err(LemmyError::from_message("no_private_message_edit_allowed")); return Err(LemmyError::from_message("no_private_message_edit_allowed"));
} }
@ -39,16 +36,14 @@ impl PerformCrud for DeletePrivateMessage {
// Doing the update // Doing the update
let private_message_id = data.private_message_id; let private_message_id = data.private_message_id;
let deleted = data.deleted; let deleted = data.deleted;
let updated_private_message = blocking(context.pool(), move |conn| { let updated_private_message = PrivateMessage::update(
PrivateMessage::update( context.pool(),
conn, private_message_id,
private_message_id, &PrivateMessageUpdateForm::builder()
&PrivateMessageUpdateForm::builder() .deleted(Some(deleted))
.deleted(Some(deleted)) .build(),
.build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
// Send the apub update // Send the apub update

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{GetPrivateMessages, PrivateMessagesResponse}, private_message::{GetPrivateMessages, PrivateMessagesResponse},
utils::{blocking, get_local_user_view_from_jwt}, utils::get_local_user_view_from_jwt,
}; };
use lemmy_db_schema::traits::DeleteableOrRemoveable; use lemmy_db_schema::traits::DeleteableOrRemoveable;
use lemmy_db_views::private_message_view::PrivateMessageQuery; use lemmy_db_views::private_message_view::PrivateMessageQuery;
@ -27,17 +27,15 @@ impl PerformCrud for GetPrivateMessages {
let page = data.page; let page = data.page;
let limit = data.limit; let limit = data.limit;
let unread_only = data.unread_only; let unread_only = data.unread_only;
let mut messages = blocking(context.pool(), move |conn| { let mut messages = PrivateMessageQuery::builder()
PrivateMessageQuery::builder() .pool(context.pool())
.conn(conn) .recipient_id(person_id)
.recipient_id(person_id) .page(page)
.page(page) .limit(limit)
.limit(limit) .unread_only(unread_only)
.unread_only(unread_only) .build()
.build() .list()
.list() .await?;
})
.await??;
// Messages sent by ourselves should be marked as read. The `read` column in database is only // Messages sent by ourselves should be marked as read. The `read` column in database is only
// for the recipient, and shouldnt be exposed to sender. // for the recipient, and shouldnt be exposed to sender.

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
private_message::{EditPrivateMessage, PrivateMessageResponse}, private_message::{EditPrivateMessage, PrivateMessageResponse},
utils::{blocking, get_local_user_view_from_jwt, local_site_to_slur_regex}, utils::{get_local_user_view_from_jwt, local_site_to_slur_regex},
}; };
use lemmy_apub::protocol::activities::{ use lemmy_apub::protocol::activities::{
create_or_update::private_message::CreateOrUpdatePrivateMessage, create_or_update::private_message::CreateOrUpdatePrivateMessage,
@ -32,14 +32,11 @@ impl PerformCrud for EditPrivateMessage {
let data: &EditPrivateMessage = self; let data: &EditPrivateMessage = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
// Checking permissions // Checking permissions
let private_message_id = data.private_message_id; let private_message_id = data.private_message_id;
let orig_private_message = blocking(context.pool(), move |conn| { let orig_private_message = PrivateMessage::read(context.pool(), private_message_id).await?;
PrivateMessage::read(conn, private_message_id)
})
.await??;
if local_user_view.person.id != orig_private_message.creator_id { if local_user_view.person.id != orig_private_message.creator_id {
return Err(LemmyError::from_message("no_private_message_edit_allowed")); return Err(LemmyError::from_message("no_private_message_edit_allowed"));
} }
@ -47,17 +44,15 @@ impl PerformCrud for EditPrivateMessage {
// Doing the update // Doing the update
let content_slurs_removed = remove_slurs(&data.content, &local_site_to_slur_regex(&local_site)); let content_slurs_removed = remove_slurs(&data.content, &local_site_to_slur_regex(&local_site));
let private_message_id = data.private_message_id; let private_message_id = data.private_message_id;
let updated_private_message = blocking(context.pool(), move |conn| { let updated_private_message = PrivateMessage::update(
PrivateMessage::update( context.pool(),
conn, private_message_id,
private_message_id, &PrivateMessageUpdateForm::builder()
&PrivateMessageUpdateForm::builder() .content(Some(content_slurs_removed))
.content(Some(content_slurs_removed)) .updated(Some(Some(naive_now())))
.updated(Some(Some(naive_now()))) .build(),
.build(), )
) .await
})
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?; .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
// Send the apub update // Send the apub update

@ -4,7 +4,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{CreateSite, SiteResponse}, site::{CreateSite, SiteResponse},
utils::{ utils::{
blocking,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
is_admin, is_admin,
local_site_to_slur_regex, local_site_to_slur_regex,
@ -43,7 +42,7 @@ impl PerformCrud for CreateSite {
) -> Result<SiteResponse, LemmyError> { ) -> Result<SiteResponse, LemmyError> {
let data: &CreateSite = self; let data: &CreateSite = self;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
if local_site.site_setup { if local_site.site_setup {
return Err(LemmyError::from_message("site_already_exists")); return Err(LemmyError::from_message("site_already_exists"));
@ -88,10 +87,8 @@ impl PerformCrud for CreateSite {
.build(); .build();
let site_id = local_site.site_id; let site_id = local_site.site_id;
blocking(context.pool(), move |conn| {
Site::update(conn, site_id, &site_form) Site::update(context.pool(), site_id, &site_form).await?;
})
.await??;
let local_site_form = LocalSiteUpdateForm::builder() let local_site_form = LocalSiteUpdateForm::builder()
// Set the site setup to true // Set the site setup to true
@ -120,10 +117,8 @@ impl PerformCrud for CreateSite {
.captcha_enabled(data.captcha_enabled) .captcha_enabled(data.captcha_enabled)
.captcha_difficulty(data.captcha_difficulty.to_owned()) .captcha_difficulty(data.captcha_difficulty.to_owned())
.build(); .build();
blocking(context.pool(), move |conn| {
LocalSite::update(conn, &local_site_form) LocalSite::update(context.pool(), &local_site_form).await?;
})
.await??;
let local_site_rate_limit_form = LocalSiteRateLimitUpdateForm::builder() let local_site_rate_limit_form = LocalSiteRateLimitUpdateForm::builder()
.message(data.rate_limit_message) .message(data.rate_limit_message)
@ -140,12 +135,9 @@ impl PerformCrud for CreateSite {
.search_per_second(data.rate_limit_search_per_second) .search_per_second(data.rate_limit_search_per_second)
.build(); .build();
blocking(context.pool(), move |conn| { LocalSiteRateLimit::update(context.pool(), &local_site_rate_limit_form).await?;
LocalSiteRateLimit::update(conn, &local_site_rate_limit_form)
})
.await??;
let site_view = blocking(context.pool(), SiteView::read_local).await??; let site_view = SiteView::read_local(context.pool()).await?;
Ok(SiteResponse { site_view }) Ok(SiteResponse { site_view })
} }

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{GetSite, GetSiteResponse, MyUserInfo}, site::{GetSite, GetSiteResponse, MyUserInfo},
utils::{blocking, build_federated_instances, get_local_user_settings_view_from_jwt_opt}, utils::{build_federated_instances, get_local_user_settings_view_from_jwt_opt},
}; };
use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language}; use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language};
use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView}; use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView};
@ -28,9 +28,9 @@ impl PerformCrud for GetSite {
) -> Result<GetSiteResponse, LemmyError> { ) -> Result<GetSiteResponse, LemmyError> {
let data: &GetSite = self; let data: &GetSite = self;
let site_view = blocking(context.pool(), SiteView::read_local).await??; let site_view = SiteView::read_local(context.pool()).await?;
let admins = blocking(context.pool(), PersonViewSafe::admins).await??; let admins = PersonViewSafe::admins(context.pool()).await?;
let online = context let online = context
.chat_server() .chat_server()
@ -49,37 +49,28 @@ impl PerformCrud for GetSite {
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let local_user_id = local_user_view.local_user.id; let local_user_id = local_user_view.local_user.id;
let follows = blocking(context.pool(), move |conn| { let follows = CommunityFollowerView::for_person(context.pool(), person_id)
CommunityFollowerView::for_person(conn, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let community_blocks = blocking(context.pool(), move |conn| { let community_blocks = CommunityBlockView::for_person(context.pool(), person_id)
CommunityBlockView::for_person(conn, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
let person_id = local_user_view.person.id; let person_id = local_user_view.person.id;
let person_blocks = blocking(context.pool(), move |conn| { let person_blocks = PersonBlockView::for_person(context.pool(), person_id)
PersonBlockView::for_person(conn, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
let moderates = blocking(context.pool(), move |conn| { let moderates = CommunityModeratorView::for_person(context.pool(), person_id)
CommunityModeratorView::for_person(conn, person_id) .await
}) .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
let discussion_languages = blocking(context.pool(), move |conn| { let discussion_languages =
LocalUserDiscussionLanguageView::read_languages(conn, local_user_id) LocalUserDiscussionLanguageView::read_languages(context.pool(), local_user_id)
}) .await
.await? .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
.map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
Some(MyUserInfo { Some(MyUserInfo {
local_user_view, local_user_view,
@ -96,8 +87,8 @@ impl PerformCrud for GetSite {
let federated_instances = let federated_instances =
build_federated_instances(&site_view.local_site, context.pool()).await?; build_federated_instances(&site_view.local_site, context.pool()).await?;
let all_languages = blocking(context.pool(), Language::read_all).await??; let all_languages = Language::read_all(context.pool()).await?;
let discussion_languages = blocking(context.pool(), SiteLanguage::read_local).await??; let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
Ok(GetSiteResponse { Ok(GetSiteResponse {
site_view, site_view,

@ -3,7 +3,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
site::{EditSite, SiteResponse}, site::{EditSite, SiteResponse},
utils::{ utils::{
blocking,
get_local_user_view_from_jwt, get_local_user_view_from_jwt,
is_admin, is_admin,
local_site_to_slur_regex, local_site_to_slur_regex,
@ -46,7 +45,7 @@ impl PerformCrud for EditSite {
let data: &EditSite = self; let data: &EditSite = self;
let local_user_view = let local_user_view =
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
// Make sure user is an admin // Make sure user is an admin
is_admin(&local_user_view)?; is_admin(&local_user_view)?;
@ -75,11 +74,8 @@ impl PerformCrud for EditSite {
let site_id = local_site.site_id; let site_id = local_site.site_id;
if let Some(discussion_languages) = data.discussion_languages.clone() { if let Some(discussion_languages) = data.discussion_languages.clone() {
blocking(context.pool(), move |conn| { let site = Site::read(context.pool(), site_id).await?;
let site = Site::read(conn, site_id)?; SiteLanguage::update(context.pool(), discussion_languages.clone(), &site).await?;
SiteLanguage::update(conn, discussion_languages, &site)
})
.await??;
} }
let name = data.name.to_owned(); let name = data.name.to_owned();
@ -92,13 +88,11 @@ impl PerformCrud for EditSite {
.updated(Some(Some(naive_now()))) .updated(Some(Some(naive_now())))
.build(); .build();
blocking(context.pool(), move |conn| { Site::update(context.pool(), site_id, &site_form)
Site::update(conn, local_site.site_id, &site_form) .await
}) // Ignore errors for all these, so as to not throw errors if no update occurs
.await // Diesel will throw an error for empty update forms
// Ignore errors for all these, so as to not throw errors if no update occurs .ok();
// Diesel will throw an error for empty update forms
.ok();
let local_site_form = LocalSiteUpdateForm::builder() let local_site_form = LocalSiteUpdateForm::builder()
.enable_downvotes(data.enable_downvotes) .enable_downvotes(data.enable_downvotes)
@ -126,11 +120,9 @@ impl PerformCrud for EditSite {
.captcha_difficulty(data.captcha_difficulty.to_owned()) .captcha_difficulty(data.captcha_difficulty.to_owned())
.build(); .build();
let update_local_site = blocking(context.pool(), move |conn| { let update_local_site = LocalSite::update(context.pool(), &local_site_form)
LocalSite::update(conn, &local_site_form) .await
}) .ok();
.await
.ok();
let local_site_rate_limit_form = LocalSiteRateLimitUpdateForm::builder() let local_site_rate_limit_form = LocalSiteRateLimitUpdateForm::builder()
.message(data.rate_limit_message) .message(data.rate_limit_message)
@ -147,23 +139,15 @@ impl PerformCrud for EditSite {
.search_per_second(data.rate_limit_search_per_second) .search_per_second(data.rate_limit_search_per_second)
.build(); .build();
blocking(context.pool(), move |conn| { LocalSiteRateLimit::update(context.pool(), &local_site_rate_limit_form)
LocalSiteRateLimit::update(conn, &local_site_rate_limit_form) .await
}) .ok();
.await
.ok();
// Replace the blocked and allowed instances // Replace the blocked and allowed instances
let allowed = data.allowed_instances.to_owned(); let allowed = data.allowed_instances.to_owned();
blocking(context.pool(), move |conn| { FederationAllowList::replace(context.pool(), allowed).await?;
FederationAllowList::replace(conn, allowed)
})
.await??;
let blocked = data.blocked_instances.to_owned(); let blocked = data.blocked_instances.to_owned();
blocking(context.pool(), move |conn| { FederationBlockList::replace(context.pool(), blocked).await?;
FederationBlockList::replace(conn, blocked)
})
.await??;
// TODO can't think of a better way to do this. // TODO can't think of a better way to do this.
// If the server suddenly requires email verification, or required applications, no old users // If the server suddenly requires email verification, or required applications, no old users
@ -172,39 +156,25 @@ impl PerformCrud for EditSite {
let new_require_application = update_local_site let new_require_application = update_local_site
.as_ref() .as_ref()
.map(|ols| { .map(|ols| ols.require_application)
ols
.as_ref()
.map(|ls| ls.require_application)
.unwrap_or(false)
})
.unwrap_or(false); .unwrap_or(false);
if !local_site.require_application && new_require_application { if !local_site.require_application && new_require_application {
blocking(context.pool(), move |conn| { LocalUser::set_all_users_registration_applications_accepted(context.pool())
LocalUser::set_all_users_registration_applications_accepted(conn) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_set_all_registrations_accepted"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_set_all_registrations_accepted"))?;
} }
let new_require_email_verification = update_local_site let new_require_email_verification = update_local_site
.as_ref() .as_ref()
.map(|ols| { .map(|ols| ols.require_email_verification)
ols
.as_ref()
.map(|ls| ls.require_email_verification)
.unwrap_or(false)
})
.unwrap_or(false); .unwrap_or(false);
if !local_site.require_email_verification && new_require_email_verification { if !local_site.require_email_verification && new_require_email_verification {
blocking(context.pool(), move |conn| { LocalUser::set_all_users_email_verified(context.pool())
LocalUser::set_all_users_email_verified(conn) .await
}) .map_err(|e| LemmyError::from_error_message(e, "couldnt_set_all_email_verified"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "couldnt_set_all_email_verified"))?;
} }
let site_view = blocking(context.pool(), SiteView::read_local).await??; let site_view = SiteView::read_local(context.pool()).await?;
let res = SiteResponse { site_view }; let res = SiteResponse { site_view };

@ -4,7 +4,6 @@ use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{LoginResponse, Register}, person::{LoginResponse, Register},
utils::{ utils::{
blocking,
honeypot_check, honeypot_check,
local_site_to_slur_regex, local_site_to_slur_regex,
password_length_check, password_length_check,
@ -28,7 +27,6 @@ use lemmy_db_schema::{
traits::Crud, traits::Crud,
}; };
use lemmy_db_views::structs::{LocalUserView, SiteView}; use lemmy_db_views::structs::{LocalUserView, SiteView};
use lemmy_db_views_actor::structs::PersonViewSafe;
use lemmy_utils::{ use lemmy_utils::{
claims::Claims, claims::Claims,
error::LemmyError, error::LemmyError,
@ -49,7 +47,7 @@ impl PerformCrud for Register {
) -> Result<LoginResponse, LemmyError> { ) -> Result<LoginResponse, LemmyError> {
let data: &Register = self; let data: &Register = self;
let site_view = blocking(context.pool(), SiteView::read_local).await??; let site_view = SiteView::read_local(context.pool()).await?;
let local_site = site_view.local_site; let local_site = site_view.local_site;
if !local_site.open_registration { if !local_site.open_registration {
@ -63,7 +61,7 @@ impl PerformCrud for Register {
return Err(LemmyError::from_message("email_required")); return Err(LemmyError::from_message("email_required"));
} }
if local_site.require_application && data.answer.is_none() { if local_site.site_setup && local_site.require_application && data.answer.is_none() {
return Err(LemmyError::from_message( return Err(LemmyError::from_message(
"registration_application_answer_required", "registration_application_answer_required",
)); ));
@ -74,14 +72,8 @@ impl PerformCrud for Register {
return Err(LemmyError::from_message("passwords_dont_match")); return Err(LemmyError::from_message("passwords_dont_match"));
} }
// Check if there are admins. False if admins exist // If the site is set up, check the captcha
let no_admins = blocking(context.pool(), move |conn| { if local_site.site_setup && local_site.captcha_enabled {
PersonViewSafe::admins(conn).map(|a| a.is_empty())
})
.await??;
// If its not the admin, check the captcha
if !no_admins && local_site.captcha_enabled {
let check = context let check = context
.chat_server() .chat_server()
.send(CheckCaptcha { .send(CheckCaptcha {
@ -124,16 +116,15 @@ impl PerformCrud for Register {
.public_key(actor_keypair.public_key) .public_key(actor_keypair.public_key)
.inbox_url(Some(generate_inbox_url(&actor_id)?)) .inbox_url(Some(generate_inbox_url(&actor_id)?))
.shared_inbox_url(Some(generate_shared_inbox_url(&actor_id)?)) .shared_inbox_url(Some(generate_shared_inbox_url(&actor_id)?))
.admin(Some(no_admins)) // If its the initial site setup, they are an admin
.admin(Some(!local_site.site_setup))
.instance_id(site_view.site.instance_id) .instance_id(site_view.site.instance_id)
.build(); .build();
// insert the person // insert the person
let inserted_person = blocking(context.pool(), move |conn| { let inserted_person = Person::create(context.pool(), &person_form)
Person::create(conn, &person_form) .await
}) .map_err(|e| LemmyError::from_error_message(e, "user_already_exists"))?;
.await?
.map_err(|e| LemmyError::from_error_message(e, "user_already_exists"))?;
// Create the local user // Create the local user
let local_user_form = LocalUserInsertForm::builder() let local_user_form = LocalUserInsertForm::builder()
@ -143,11 +134,7 @@ impl PerformCrud for Register {
.show_nsfw(Some(data.show_nsfw)) .show_nsfw(Some(data.show_nsfw))
.build(); .build();
let inserted_local_user = match blocking(context.pool(), move |conn| { let inserted_local_user = match LocalUser::create(context.pool(), &local_user_form).await {
LocalUser::create(conn, &local_user_form)
})
.await?
{
Ok(lu) => lu, Ok(lu) => lu,
Err(e) => { Err(e) => {
let err_type = if e.to_string() let err_type = if e.to_string()
@ -159,16 +146,13 @@ impl PerformCrud for Register {
}; };
// If the local user creation errored, then delete that person // If the local user creation errored, then delete that person
blocking(context.pool(), move |conn| { Person::delete(context.pool(), inserted_person.id).await?;
Person::delete(conn, inserted_person.id)
})
.await??;
return Err(LemmyError::from_error_message(e, err_type)); return Err(LemmyError::from_error_message(e, err_type));
} }
}; };
if local_site.require_application { if local_site.site_setup && local_site.require_application {
// Create the registration application // Create the registration application
let form = RegistrationApplicationInsertForm { let form = RegistrationApplicationInsertForm {
local_user_id: inserted_local_user.id, local_user_id: inserted_local_user.id,
@ -176,10 +160,7 @@ impl PerformCrud for Register {
answer: data.answer.to_owned().expect("must have an answer"), answer: data.answer.to_owned().expect("must have an answer"),
}; };
blocking(context.pool(), move |conn| { RegistrationApplication::create(context.pool(), &form).await?;
RegistrationApplication::create(conn, &form)
})
.await??;
} }
// Email the admins // Email the admins
@ -194,8 +175,10 @@ impl PerformCrud for Register {
verify_email_sent: false, verify_email_sent: false,
}; };
// Log the user in directly if email verification and application aren't required // Log the user in directly if the site is not setup, or email verification and application aren't required
if !local_site.require_application && !local_site.require_email_verification { if !local_site.site_setup
|| (!local_site.require_application && !local_site.require_email_verification)
{
login_response.jwt = Some( login_response.jwt = Some(
Claims::jwt( Claims::jwt(
inserted_local_user.id.0, inserted_local_user.id.0,

@ -2,7 +2,7 @@ use crate::PerformCrud;
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::{ use lemmy_api_common::{
person::{GetPersonDetails, GetPersonDetailsResponse}, person::{GetPersonDetails, GetPersonDetailsResponse},
utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, utils::{check_private_instance, get_local_user_view_from_jwt_opt},
}; };
use lemmy_apub::{fetcher::resolve_actor_identifier, objects::person::ApubPerson}; use lemmy_apub::{fetcher::resolve_actor_identifier, objects::person::ApubPerson};
use lemmy_db_schema::{ use lemmy_db_schema::{
@ -34,7 +34,7 @@ impl PerformCrud for GetPersonDetails {
let local_user_view = let local_user_view =
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?; .await?;
let local_site = blocking(context.pool(), LocalSite::read).await??; let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?; check_private_instance(&local_user_view, &local_site)?;
@ -56,10 +56,7 @@ impl PerformCrud for GetPersonDetails {
// You don't need to return settings for the user, since this comes back with GetSite // You don't need to return settings for the user, since this comes back with GetSite
// `my_user` // `my_user`
let person_view = blocking(context.pool(), move |conn| { let person_view = PersonViewSafe::read(context.pool(), person_details_id).await?;
PersonViewSafe::read(conn, person_details_id)
})
.await??;
let sort = data.sort; let sort = data.sort;
let page = data.page; let page = data.page;
@ -69,57 +66,50 @@ impl PerformCrud for GetPersonDetails {
let local_user = local_user_view.map(|l| l.local_user); let local_user = local_user_view.map(|l| l.local_user);
let local_user_clone = local_user.to_owned(); let local_user_clone = local_user.to_owned();
let posts = blocking(context.pool(), move |conn| { let posts_query = PostQuery::builder()
let posts_query = PostQuery::builder() .pool(context.pool())
.conn(conn) .sort(sort)
.sort(sort) .saved_only(saved_only)
.saved_only(saved_only) .local_user(local_user.as_ref())
.local_user(local_user.as_ref()) .community_id(community_id)
.community_id(community_id) .page(page)
.page(page) .limit(limit);
.limit(limit);
// If its saved only, you don't care what creator it was // If its saved only, you don't care what creator it was
// Or, if its not saved, then you only want it for that specific creator // Or, if its not saved, then you only want it for that specific creator
if !saved_only.unwrap_or(false) { let posts = if !saved_only.unwrap_or(false) {
posts_query posts_query
.creator_id(Some(person_details_id)) .creator_id(Some(person_details_id))
.build() .build()
.list() .list()
} else { } else {
posts_query.build().list() posts_query.build().list()
} }
}) .await?;
.await??;
let comments = blocking(context.pool(), move |conn| { let comments_query = CommentQuery::builder()
let comments_query = CommentQuery::builder() .pool(context.pool())
.conn(conn) .local_user(local_user_clone.as_ref())
.local_user(local_user_clone.as_ref()) .sort(sort.map(post_to_comment_sort_type))
.sort(sort.map(post_to_comment_sort_type)) .saved_only(saved_only)
.saved_only(saved_only) .show_deleted_and_removed(Some(false))
.show_deleted_and_removed(Some(false)) .community_id(community_id)
.community_id(community_id) .page(page)
.page(page) .limit(limit);
.limit(limit);
// If its saved only, you don't care what creator it was // If its saved only, you don't care what creator it was
// Or, if its not saved, then you only want it for that specific creator // Or, if its not saved, then you only want it for that specific creator
if !saved_only.unwrap_or(false) { let comments = if !saved_only.unwrap_or(false) {
comments_query comments_query
.creator_id(Some(person_details_id)) .creator_id(Some(person_details_id))
.build() .build()
.list() .list()
} else { } else {
comments_query.build().list() comments_query.build().list()
} }
}) .await?;
.await??;
let moderates = blocking(context.pool(), move |conn| { let moderates = CommunityModeratorView::for_person(context.pool(), person_details_id).await?;
CommunityModeratorView::for_person(conn, person_details_id)
})
.await??;
// Return the jwt // Return the jwt
Ok(GetPersonDetailsResponse { Ok(GetPersonDetailsResponse {

@ -21,11 +21,11 @@ lemmy_db_views_actor = { version = "=0.16.5", path = "../db_views_actor", featur
lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["full"] } lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["full"] }
lemmy_websocket = { version = "=0.16.5", path = "../websocket" } lemmy_websocket = { version = "=0.16.5", path = "../websocket" }
activitypub_federation = "0.2.3" activitypub_federation = "0.2.3"
diesel = "2.0.0" diesel = "2.0.2"
activitystreams-kinds = "0.2.1" activitystreams-kinds = "0.2.1"
chrono = { version = "0.4.22", features = ["serde"], default-features = false } chrono = { version = "0.4.22", features = ["serde"], default-features = false }
serde_json = { version = "1.0.85", features = ["preserve_order"] } serde_json = { version = "1.0.87", features = ["preserve_order"] }
serde = { version = "1.0.145", features = ["derive"] } serde = { version = "1.0.147", features = ["derive"] }
serde_with = "1.14.0" serde_with = "1.14.0"
actix = "0.13.0" actix = "0.13.0"
actix-web = { version = "4.2.1", default-features = false } actix-web = { version = "4.2.1", default-features = false }
@ -35,15 +35,16 @@ strum_macros = "0.24.3"
url = { version = "2.3.1", features = ["serde"] } url = { version = "2.3.1", features = ["serde"] }
http = "0.2.8" http = "0.2.8"
http-signature-normalization-actix = { version = "0.6.1", default-features = false, features = ["server", "sha-2"] } http-signature-normalization-actix = { version = "0.6.1", default-features = false, features = ["server", "sha-2"] }
futures = "0.3.24" futures = "0.3.25"
itertools = "0.10.5" itertools = "0.10.5"
uuid = { version = "1.1.2", features = ["serde", "v4"] } uuid = { version = "1.2.1", features = ["serde", "v4"] }
sha2 = "0.10.6" sha2 = "0.10.6"
async-trait = "0.1.57" async-trait = "0.1.58"
anyhow = "1.0.65" anyhow = "1.0.66"
reqwest = { version = "0.11.12", features = ["json"] } reqwest = { version = "0.11.12", features = ["json"] }
html2md = "0.2.13" html2md = "0.2.13"
once_cell = "1.15.0" once_cell = "1.15.0"
tokio = "1.21.2"
[dev-dependencies] [dev-dependencies]
serial_test = "0.9.0" serial_test = "0.9.0"

@ -23,7 +23,7 @@ use activitypub_federation::{
use activitystreams_kinds::{activity::BlockType, public}; use activitystreams_kinds::{activity::BlockType, public};
use anyhow::anyhow; use anyhow::anyhow;
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use lemmy_api_common::utils::{blocking, remove_user_data, remove_user_data_in_community}; use lemmy_api_common::utils::{remove_user_data, remove_user_data_in_community};
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
community::{ community::{
@ -126,7 +126,7 @@ impl ActivityHandler for BlockUser {
verify_is_public(&self.to, &self.cc)?; verify_is_public(&self.to, &self.cc)?;
match self match self
.target .target
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await? .await?
{ {
SiteOrCommunity::Site(site) => { SiteOrCommunity::Site(site) => {
@ -164,29 +164,27 @@ impl ActivityHandler for BlockUser {
let expires = self.expires.map(|u| u.naive_local()); let expires = self.expires.map(|u| u.naive_local());
let mod_person = self let mod_person = self
.actor .actor
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
let blocked_person = self let blocked_person = self
.object .object
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
let target = self let target = self
.target .target
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
match target { match target {
SiteOrCommunity::Site(_site) => { SiteOrCommunity::Site(_site) => {
let blocked_person = blocking(context.pool(), move |conn| { let blocked_person = Person::update(
Person::update( context.pool(),
conn, blocked_person.id,
blocked_person.id, &PersonUpdateForm::builder()
&PersonUpdateForm::builder() .banned(Some(true))
.banned(Some(true)) .ban_expires(Some(expires))
.ban_expires(Some(expires)) .build(),
.build(), )
) .await?;
})
.await??;
if self.remove_data.unwrap_or(false) { if self.remove_data.unwrap_or(false) {
remove_user_data( remove_user_data(
blocked_person.id, blocked_person.id,
@ -205,7 +203,7 @@ impl ActivityHandler for BlockUser {
banned: Some(true), banned: Some(true),
expires, expires,
}; };
blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??; ModBan::create(context.pool(), &form).await?;
} }
SiteOrCommunity::Community(community) => { SiteOrCommunity::Community(community) => {
let community_user_ban_form = CommunityPersonBanForm { let community_user_ban_form = CommunityPersonBanForm {
@ -213,10 +211,7 @@ impl ActivityHandler for BlockUser {
person_id: blocked_person.id, person_id: blocked_person.id,
expires: Some(expires), expires: Some(expires),
}; };
blocking(context.pool(), move |conn| { CommunityPersonBan::ban(context.pool(), &community_user_ban_form).await?;
CommunityPersonBan::ban(conn, &community_user_ban_form)
})
.await??;
// Also unsubscribe them from the community, if they are subscribed // Also unsubscribe them from the community, if they are subscribed
let community_follower_form = CommunityFollowerForm { let community_follower_form = CommunityFollowerForm {
@ -224,11 +219,9 @@ impl ActivityHandler for BlockUser {
person_id: blocked_person.id, person_id: blocked_person.id,
pending: false, pending: false,
}; };
blocking(context.pool(), move |conn: &mut _| { CommunityFollower::unfollow(context.pool(), &community_follower_form)
CommunityFollower::unfollow(conn, &community_follower_form) .await
}) .ok();
.await?
.ok();
if self.remove_data.unwrap_or(false) { if self.remove_data.unwrap_or(false) {
remove_user_data_in_community(community.id, blocked_person.id, context.pool()).await?; remove_user_data_in_community(community.id, blocked_person.id, context.pool()).await?;
@ -243,10 +236,7 @@ impl ActivityHandler for BlockUser {
banned: Some(true), banned: Some(true),
expires, expires,
}; };
blocking(context.pool(), move |conn| { ModBanFromCommunity::create(context.pool(), &form).await?;
ModBanFromCommunity::create(conn, &form)
})
.await??;
} }
} }
@ -264,7 +254,7 @@ impl GetCommunity for BlockUser {
) -> Result<ApubCommunity, LemmyError> { ) -> Result<ApubCommunity, LemmyError> {
let target = self let target = self
.target .target
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
match target { match target {
SiteOrCommunity::Community(c) => Ok(c), SiteOrCommunity::Community(c) => Ok(c),

@ -5,7 +5,6 @@ use crate::{
}; };
use activitypub_federation::{core::object_id::ObjectId, traits::ApubObject}; use activitypub_federation::{core::object_id::ObjectId, traits::ApubObject};
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{source::site::Site, utils::DbPool}; use lemmy_db_schema::{source::site::Site, utils::DbPool};
use lemmy_utils::error::LemmyError; use lemmy_utils::error::LemmyError;
use lemmy_websocket::LemmyContext; use lemmy_websocket::LemmyContext;
@ -116,8 +115,8 @@ impl SiteOrCommunity {
async fn generate_cc(target: &SiteOrCommunity, pool: &DbPool) -> Result<Vec<Url>, LemmyError> { async fn generate_cc(target: &SiteOrCommunity, pool: &DbPool) -> Result<Vec<Url>, LemmyError> {
Ok(match target { Ok(match target {
SiteOrCommunity::Site(_) => blocking(pool, Site::read_remote_sites) SiteOrCommunity::Site(_) => Site::read_remote_sites(pool)
.await?? .await?
.into_iter() .into_iter()
.map(|s| s.actor_id.into()) .map(|s| s.actor_id.into())
.collect(), .collect(),

@ -19,7 +19,6 @@ use activitypub_federation::{
utils::verify_domains_match, utils::verify_domains_match,
}; };
use activitystreams_kinds::{activity::UndoType, public}; use activitystreams_kinds::{activity::UndoType, public};
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
community::{CommunityPersonBan, CommunityPersonBanForm}, community::{CommunityPersonBan, CommunityPersonBanForm},
@ -102,7 +101,7 @@ impl ActivityHandler for UndoBlockUser {
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
request_counter: &mut i32, request_counter: &mut i32,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let instance = local_instance(context); let instance = local_instance(context).await;
let expires = self.object.expires.map(|u| u.naive_local()); let expires = self.object.expires.map(|u| u.naive_local());
let mod_person = self let mod_person = self
.actor .actor
@ -120,17 +119,15 @@ impl ActivityHandler for UndoBlockUser {
.await? .await?
{ {
SiteOrCommunity::Site(_site) => { SiteOrCommunity::Site(_site) => {
let blocked_person = blocking(context.pool(), move |conn| { let blocked_person = Person::update(
Person::update( context.pool(),
conn, blocked_person.id,
blocked_person.id, &PersonUpdateForm::builder()
&PersonUpdateForm::builder() .banned(Some(false))
.banned(Some(false)) .ban_expires(Some(expires))
.ban_expires(Some(expires)) .build(),
.build(), )
) .await?;
})
.await??;
// write mod log // write mod log
let form = ModBanForm { let form = ModBanForm {
@ -140,7 +137,7 @@ impl ActivityHandler for UndoBlockUser {
banned: Some(false), banned: Some(false),
expires, expires,
}; };
blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??; ModBan::create(context.pool(), &form).await?;
} }
SiteOrCommunity::Community(community) => { SiteOrCommunity::Community(community) => {
let community_user_ban_form = CommunityPersonBanForm { let community_user_ban_form = CommunityPersonBanForm {
@ -148,10 +145,7 @@ impl ActivityHandler for UndoBlockUser {
person_id: blocked_person.id, person_id: blocked_person.id,
expires: None, expires: None,
}; };
blocking(context.pool(), move |conn: &mut _| { CommunityPersonBan::unban(context.pool(), &community_user_ban_form).await?;
CommunityPersonBan::unban(conn, &community_user_ban_form)
})
.await??;
// write to mod log // write to mod log
let form = ModBanFromCommunityForm { let form = ModBanFromCommunityForm {
@ -162,10 +156,7 @@ impl ActivityHandler for UndoBlockUser {
banned: Some(false), banned: Some(false),
expires, expires,
}; };
blocking(context.pool(), move |conn| { ModBanFromCommunity::create(context.pool(), &form).await?;
ModBanFromCommunity::create(conn, &form)
})
.await??;
} }
} }

@ -24,7 +24,6 @@ use activitypub_federation::{
traits::{ActivityHandler, Actor}, traits::{ActivityHandler, Actor},
}; };
use activitystreams_kinds::{activity::AddType, public}; use activitystreams_kinds::{activity::AddType, public};
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
community::{CommunityModerator, CommunityModeratorForm}, community::{CommunityModerator, CommunityModeratorForm},
@ -108,30 +107,25 @@ impl ActivityHandler for AddMod {
let community = self.get_community(context, request_counter).await?; let community = self.get_community(context, request_counter).await?;
let new_mod = self let new_mod = self
.object .object
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
// If we had to refetch the community while parsing the activity, then the new mod has already // If we had to refetch the community while parsing the activity, then the new mod has already
// been added. Skip it here as it would result in a duplicate key error. // been added. Skip it here as it would result in a duplicate key error.
let new_mod_id = new_mod.id; let new_mod_id = new_mod.id;
let moderated_communities = blocking(context.pool(), move |conn| { let moderated_communities =
CommunityModerator::get_person_moderated_communities(conn, new_mod_id) CommunityModerator::get_person_moderated_communities(context.pool(), new_mod_id).await?;
})
.await??;
if !moderated_communities.contains(&community.id) { if !moderated_communities.contains(&community.id) {
let form = CommunityModeratorForm { let form = CommunityModeratorForm {
community_id: community.id, community_id: community.id,
person_id: new_mod.id, person_id: new_mod.id,
}; };
blocking(context.pool(), move |conn| { CommunityModerator::join(context.pool(), &form).await?;
CommunityModerator::join(conn, &form)
})
.await??;
// write mod log // write mod log
let actor = self let actor = self
.actor .actor
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
let form = ModAddCommunityForm { let form = ModAddCommunityForm {
mod_person_id: actor.id, mod_person_id: actor.id,
@ -139,10 +133,7 @@ impl ActivityHandler for AddMod {
community_id: community.id, community_id: community.id,
removed: Some(false), removed: Some(false),
}; };
blocking(context.pool(), move |conn| { ModAddCommunity::create(context.pool(), &form).await?;
ModAddCommunity::create(conn, &form)
})
.await??;
} }
// TODO: send websocket notification about added mod // TODO: send websocket notification about added mod
Ok(()) Ok(())

@ -46,6 +46,6 @@ async fn get_community_from_moderators_url(
) -> Result<ApubCommunity, LemmyError> { ) -> Result<ApubCommunity, LemmyError> {
let community_id = Url::parse(&moderators.to_string().replace("/moderators", ""))?; let community_id = Url::parse(&moderators.to_string().replace("/moderators", ""))?;
ObjectId::new(community_id) ObjectId::new(community_id)
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await .await
} }

@ -24,7 +24,6 @@ use activitypub_federation::{
traits::{ActivityHandler, Actor}, traits::{ActivityHandler, Actor},
}; };
use activitystreams_kinds::{activity::RemoveType, public}; use activitystreams_kinds::{activity::RemoveType, public};
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
community::{CommunityModerator, CommunityModeratorForm}, community::{CommunityModerator, CommunityModeratorForm},
@ -108,22 +107,19 @@ impl ActivityHandler for RemoveMod {
let community = self.get_community(context, request_counter).await?; let community = self.get_community(context, request_counter).await?;
let remove_mod = self let remove_mod = self
.object .object
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
let form = CommunityModeratorForm { let form = CommunityModeratorForm {
community_id: community.id, community_id: community.id,
person_id: remove_mod.id, person_id: remove_mod.id,
}; };
blocking(context.pool(), move |conn| { CommunityModerator::leave(context.pool(), &form).await?;
CommunityModerator::leave(conn, &form)
})
.await??;
// write mod log // write mod log
let actor = self let actor = self
.actor .actor
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
let form = ModAddCommunityForm { let form = ModAddCommunityForm {
mod_person_id: actor.id, mod_person_id: actor.id,
@ -131,10 +127,7 @@ impl ActivityHandler for RemoveMod {
community_id: community.id, community_id: community.id,
removed: Some(true), removed: Some(true),
}; };
blocking(context.pool(), move |conn| { ModAddCommunity::create(context.pool(), &form).await?;
ModAddCommunity::create(conn, &form)
})
.await??;
// TODO: send websocket notification about removed mod // TODO: send websocket notification about removed mod
Ok(()) Ok(())

@ -12,7 +12,7 @@ use activitypub_federation::{
traits::{ActivityHandler, Actor}, traits::{ActivityHandler, Actor},
}; };
use activitystreams_kinds::activity::FlagType; use activitystreams_kinds::activity::FlagType;
use lemmy_api_common::{comment::CommentReportResponse, post::PostReportResponse, utils::blocking}; use lemmy_api_common::{comment::CommentReportResponse, post::PostReportResponse};
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
comment_report::{CommentReport, CommentReportForm}, comment_report::{CommentReport, CommentReportForm},
@ -75,7 +75,7 @@ impl ActivityHandler for Report {
request_counter: &mut i32, request_counter: &mut i32,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let community = self.to[0] let community = self.to[0]
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
verify_person_in_community(&self.actor, &community, context, request_counter).await?; verify_person_in_community(&self.actor, &community, context, request_counter).await?;
Ok(()) Ok(())
@ -89,11 +89,11 @@ impl ActivityHandler for Report {
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let actor = self let actor = self
.actor .actor
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await?; .await?;
match self match self
.object .object
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await? .await?
{ {
PostOrComment::Post(post) => { PostOrComment::Post(post) => {
@ -106,15 +106,9 @@ impl ActivityHandler for Report {
original_post_body: post.body.clone(), original_post_body: post.body.clone(),
}; };
let report = blocking(context.pool(), move |conn| { let report = PostReport::report(context.pool(), &report_form).await?;
PostReport::report(conn, &report_form)
})
.await??;
let post_report_view = blocking(context.pool(), move |conn| { let post_report_view = PostReportView::read(context.pool(), report.id, actor.id).await?;
PostReportView::read(conn, report.id, actor.id)
})
.await??;
context.chat_server().do_send(SendModRoomMessage { context.chat_server().do_send(SendModRoomMessage {
op: UserOperation::CreateCommentReport, op: UserOperation::CreateCommentReport,
@ -131,15 +125,10 @@ impl ActivityHandler for Report {
reason: self.summary, reason: self.summary,
}; };
let report = blocking(context.pool(), move |conn| { let report = CommentReport::report(context.pool(), &report_form).await?;
CommentReport::report(conn, &report_form)
})
.await??;
let comment_report_view = blocking(context.pool(), move |conn| { let comment_report_view =
CommentReportView::read(conn, report.id, actor.id) CommentReportView::read(context.pool(), report.id, actor.id).await?;
})
.await??;
let community_id = comment_report_view.community.id; let community_id = comment_report_view.community.id;
context.chat_server().do_send(SendModRoomMessage { context.chat_server().do_send(SendModRoomMessage {

@ -18,7 +18,6 @@ use activitypub_federation::{
traits::{ActivityHandler, ApubObject}, traits::{ActivityHandler, ApubObject},
}; };
use activitystreams_kinds::{activity::UpdateType, public}; use activitystreams_kinds::{activity::UpdateType, public};
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{source::community::Community, traits::Crud}; use lemmy_db_schema::{source::community::Community, traits::Crud};
use lemmy_utils::error::LemmyError; use lemmy_utils::error::LemmyError;
use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud}; use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud};
@ -100,10 +99,8 @@ impl ActivityHandler for UpdateCommunity {
let community_update_form = self.object.into_update_form(); let community_update_form = self.object.into_update_form();
let updated_community = blocking(context.pool(), move |conn| { let updated_community =
Community::update(conn, community.id, &community_update_form) Community::update(context.pool(), community.id, &community_update_form).await?;
})
.await??;
send_community_ws_message( send_community_ws_message(
updated_community.id, updated_community.id,
@ -127,7 +124,7 @@ impl GetCommunity for UpdateCommunity {
) -> Result<ApubCommunity, LemmyError> { ) -> Result<ApubCommunity, LemmyError> {
let cid = ObjectId::new(self.object.id.clone()); let cid = ObjectId::new(self.object.id.clone());
cid cid
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context).await, request_counter)
.await .await
} }
} }

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save