Browse Source

Rust 2018! (#726)

remotes/RAOF/fix-arm64-build
Ana Gelez 2 years ago
committed by Igor Galić
parent
commit
5f8d6b8e0e
  1. 1
      Cargo.toml
  2. 4
      build.rs
  3. 1
      plume-api/Cargo.toml
  4. 1
      plume-api/src/lib.rs
  5. 1
      plume-cli/Cargo.toml
  6. 6
      plume-cli/src/main.rs
  7. 1
      plume-common/Cargo.toml
  8. 2
      plume-common/src/activity_pub/mod.rs
  9. 4
      plume-common/src/activity_pub/request.rs
  10. 2
      plume-common/src/activity_pub/sign.rs
  11. 17
      plume-common/src/lib.rs
  12. 4
      plume-common/src/utils.rs
  13. 1
      plume-front/Cargo.toml
  14. 2
      plume-front/src/editor.rs
  15. 3
      plume-front/src/main.rs
  16. 3
      plume-macro/src/lib.rs
  17. 1
      plume-models/Cargo.toml
  18. 3
      plume-models/src/admin.rs
  19. 5
      plume-models/src/api_tokens.rs
  20. 4
      plume-models/src/apps.rs
  21. 9
      plume-models/src/blocklisted_emails.rs
  22. 4
      plume-models/src/blog_authors.rs
  23. 43
      plume-models/src/blogs.rs
  24. 6
      plume-models/src/comment_seers.rs
  25. 38
      plume-models/src/comments.rs
  26. 5
      plume-models/src/db_conn.rs
  27. 12
      plume-models/src/follows.rs
  28. 20
      plume-models/src/instance.rs
  29. 31
      plume-models/src/lib.rs
  30. 11
      plume-models/src/likes.rs
  31. 18
      plume-models/src/lists.rs
  32. 19
      plume-models/src/medias.rs
  33. 12
      plume-models/src/mentions.rs
  34. 6
      plume-models/src/migrations.rs
  35. 21
      plume-models/src/notifications.rs
  36. 6
      plume-models/src/password_reset_requests.rs
  37. 18
      plume-models/src/plume_rocket.rs
  38. 6
      plume-models/src/post_authors.rs
  39. 46
      plume-models/src/posts.rs
  40. 11
      plume-models/src/reshares.rs
  41. 8
      plume-models/src/safe_string.rs
  42. 14
      plume-models/src/search/mod.rs
  43. 2
      plume-models/src/search/query.rs
  44. 18
      plume-models/src/search/searcher.rs
  45. 5
      plume-models/src/tags.rs
  46. 38
      plume-models/src/timeline/mod.rs
  47. 34
      plume-models/src/timeline/query.rs
  48. 79
      plume-models/src/users.rs
  49. 4
      plume-models/tests/lib.rs
  50. 2
      src/api/mod.rs
  51. 6
      src/inbox.rs
  52. 27
      src/main.rs
  53. 4
      src/routes/blogs.rs
  54. 6
      src/routes/comments.rs
  55. 10
      src/routes/errors.rs
  56. 10
      src/routes/instance.rs
  57. 2
      src/routes/likes.rs
  58. 4
      src/routes/medias.rs
  59. 4
      src/routes/mod.rs
  60. 4
      src/routes/notifications.rs
  61. 8
      src/routes/posts.rs
  62. 2
      src/routes/reshares.rs
  63. 4
      src/routes/search.rs
  64. 12
      src/routes/session.rs
  65. 4
      src/routes/tags.rs
  66. 4
      src/routes/timelines.rs
  67. 10
      src/routes/user.rs
  68. 8
      src/template_utils.rs
  69. 5
      templates/base.rs.html
  70. 6
      templates/blogs/details.rs.html
  71. 12
      templates/blogs/edit.rs.html
  72. 8
      templates/blogs/new.rs.html
  73. 4
      templates/errors/base.rs.html
  74. 4
      templates/errors/csrf.rs.html
  75. 4
      templates/errors/not_authorized.rs.html
  76. 5
      templates/errors/not_found.rs.html
  77. 4
      templates/errors/server_error.rs.html
  78. 5
      templates/errors/unprocessable_entity.rs.html
  79. 6
      templates/instance/about.rs.html
  80. 8
      templates/instance/admin.rs.html
  81. 6
      templates/instance/admin_mod.rs.html
  82. 6
      templates/instance/emailblocklist.rs.html
  83. 6
      templates/instance/index.rs.html
  84. 6
      templates/instance/list.rs.html
  85. 4
      templates/instance/privacy.rs.html
  86. 6
      templates/instance/users.rs.html
  87. 6
      templates/medias/details.rs.html
  88. 6
      templates/medias/index.rs.html
  89. 6
      templates/medias/new.rs.html
  90. 4
      templates/notifications/index.rs.html
  91. 4
      templates/partials/comment.rs.html
  92. 2
      templates/partials/image_select.rs.html
  93. 4
      templates/partials/instance_description.rs.html
  94. 5
      templates/partials/post_card.rs.html
  95. 10
      templates/posts/details.rs.html
  96. 14
      templates/posts/new.rs.html
  97. 10
      templates/posts/remote_interact.rs.html
  98. 8
      templates/remote_interact_base.rs.html
  99. 4
      templates/search/index.rs.html
  100. 4
      templates/search/result.rs.html

1
Cargo.toml

@ -3,6 +3,7 @@ authors = ["Plume contributors"]
name = "plume"
version = "0.4.0"
repository = "https://github.com/Plume-org/Plume"
edition = "2018"
[dependencies]
activitypub = "0.1.3"

4
build.rs

@ -1,5 +1,5 @@
extern crate rsass;
extern crate ructe;
use rsass;
use ructe::Ructe;
use std::process::{Command, Stdio};
use std::{ffi::OsStr, fs::*, io::Write, path::*};

1
plume-api/Cargo.toml

@ -2,6 +2,7 @@
name = "plume-api"
version = "0.4.0"
authors = ["Plume contributors"]
edition = "2018"
[dependencies]
serde = "1.0"

1
plume-api/src/lib.rs

@ -1,4 +1,3 @@
extern crate serde;
#[macro_use]
extern crate serde_derive;

1
plume-cli/Cargo.toml

@ -2,6 +2,7 @@
name = "plume-cli"
version = "0.4.0"
authors = ["Plume contributors"]
edition = "2018"
[[bin]]
name = "plm"

6
plume-cli/src/main.rs

@ -1,8 +1,4 @@
extern crate clap;
extern crate diesel;
extern crate dotenv;
extern crate plume_models;
extern crate rpassword;
use dotenv;
use clap::App;
use diesel::Connection;

1
plume-common/Cargo.toml

@ -2,6 +2,7 @@
name = "plume-common"
version = "0.4.0"
authors = ["Plume contributors"]
edition = "2018"
[dependencies]
activitypub = "0.1.1"

2
plume-common/src/activity_pub/mod.rs

@ -64,7 +64,7 @@ impl<T> ActivityStream<T> {
}
impl<'r, O: Object> Responder<'r> for ActivityStream<O> {
fn respond_to(self, request: &Request) -> Result<Response<'r>, Status> {
fn respond_to(self, request: &Request<'_>) -> Result<Response<'r>, Status> {
let mut json = serde_json::to_value(&self.0).map_err(|_| Status::InternalServerError)?;
json["@context"] = context();
serde_json::to_string(&json).respond_to(request).map(|r| {

4
plume-common/src/activity_pub/request.rs

@ -5,8 +5,8 @@ use reqwest::header::{HeaderMap, HeaderValue, ACCEPT, CONTENT_TYPE, DATE, USER_A
use std::ops::Deref;
use std::time::SystemTime;
use activity_pub::sign::Signer;
use activity_pub::{ap_accept_header, AP_CONTENT_TYPE};
use crate::activity_pub::sign::Signer;
use crate::activity_pub::{ap_accept_header, AP_CONTENT_TYPE};
const PLUME_USER_AGENT: &str = concat!("Plume/", env!("CARGO_PKG_VERSION"));

2
plume-common/src/activity_pub/sign.rs

@ -131,7 +131,7 @@ impl SignatureValidity {
pub fn verify_http_headers<S: Signer + ::std::fmt::Debug>(
sender: &S,
all_headers: &HeaderMap,
all_headers: &HeaderMap<'_>,
data: &request::Digest,
) -> SignatureValidity {
let sig_header = all_headers.get_one("Signature");

17
plume-common/src/lib.rs

@ -1,27 +1,16 @@
#![feature(associated_type_defaults)]
extern crate activitypub;
#[macro_use]
extern crate activitystreams_derive;
extern crate activitystreams_traits;
extern crate array_tool;
extern crate base64;
extern crate chrono;
extern crate heck;
extern crate hex;
extern crate openssl;
extern crate pulldown_cmark;
extern crate reqwest;
extern crate rocket;
extern crate serde;
use activitystreams_traits;
use serde;
#[macro_use]
extern crate shrinkwraprs;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
extern crate syntect;
extern crate tokio;
pub mod activity_pub;
pub mod utils;

4
plume-common/src/utils.rs

@ -48,7 +48,7 @@ enum State {
Ready,
}
fn to_inline(tag: Tag) -> Tag {
fn to_inline(tag: Tag<'_>) -> Tag<'_> {
match tag {
Tag::Header(_) | Tag::Table(_) | Tag::TableHead | Tag::TableRow | Tag::TableCell => {
Tag::Paragraph
@ -214,7 +214,7 @@ pub fn md_to_html<'a>(
};
let parser = Parser::new_ext(md, Options::all());
let (parser, mentions, hashtags): (Vec<Event>, Vec<String>, Vec<String>) = parser
let (parser, mentions, hashtags): (Vec<Event<'_>>, Vec<String>, Vec<String>) = parser
// Flatten text because pulldown_cmark break #hashtag in two individual text elements
.scan(None, flatten_text)
.flatten()

1
plume-front/Cargo.toml

@ -2,6 +2,7 @@
name = "plume-front"
version = "0.4.0"
authors = ["Plume contributors"]
edition = "2018"
[dependencies]
stdweb = "=0.4.18"

2
plume-front/src/editor.rs

@ -1,3 +1,4 @@
use crate::CATALOG;
use serde::{Deserialize, Serialize};
use serde_json;
use std::sync::Mutex;
@ -5,7 +6,6 @@ use stdweb::{
unstable::{TryFrom, TryInto},
web::{event::*, html_element::*, *},
};
use CATALOG;
macro_rules! mv {
( $( $var:ident ),* => $exp:expr ) => {

3
plume-front/src/main.rs

@ -1,15 +1,12 @@
#![recursion_limit = "128"]
#![feature(decl_macro, proc_macro_hygiene, try_trait)]
extern crate gettext;
#[macro_use]
extern crate gettext_macros;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate stdweb;
extern crate serde;
extern crate serde_json;
use stdweb::web::{event::*, *};
init_i18n!(

3
plume-macro/src/lib.rs

@ -1,8 +1,7 @@
#![recursion_limit = "128"]
extern crate proc_macro;
#[macro_use]
extern crate quote;
extern crate syn;
use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;

1
plume-models/Cargo.toml

@ -2,6 +2,7 @@
name = "plume-models"
version = "0.4.0"
authors = ["Plume contributors"]
edition = "2018"
[dependencies]
activitypub = "0.1.1"

3
plume-models/src/admin.rs

@ -1,11 +1,10 @@
use crate::users::User;
use rocket::{
http::Status,
request::{self, FromRequest, Request},
Outcome,
};
use users::User;
/// Wrapper around User to use as a request guard on pages reserved to admins.
pub struct Admin(pub User);

5
plume-models/src/api_tokens.rs

@ -1,3 +1,4 @@
use crate::{db_conn::DbConn, schema::api_tokens, Error, Result};
use chrono::NaiveDateTime;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use rocket::{
@ -6,10 +7,6 @@ use rocket::{
Outcome,
};
use db_conn::DbConn;
use schema::api_tokens;
use {Error, Result};
#[derive(Clone, Queryable)]
pub struct ApiToken {
pub id: i32,

4
plume-models/src/apps.rs

@ -1,9 +1,7 @@
use crate::{schema::apps, Error, Result};
use chrono::NaiveDateTime;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use schema::apps;
use {Error, Result};
#[derive(Clone, Queryable, Serialize)]
pub struct App {
pub id: i32,

9
plume-models/src/blocklisted_emails.rs

@ -1,9 +1,7 @@
use crate::{schema::email_blocklist, Connection, Error, Result};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl, TextExpressionMethods};
use glob::Pattern;
use schema::email_blocklist;
use {Connection, Error, Result};
#[derive(Clone, Queryable, Identifiable)]
#[table_name = "email_blocklist"]
pub struct BlocklistedEmail {
@ -89,10 +87,9 @@ impl BlocklistedEmail {
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use crate::{instance::tests as instance_tests, tests::rockets, Connection as Conn};
use diesel::Connection;
use instance::tests as instance_tests;
use tests::rockets;
use Connection as Conn;
pub(crate) fn fill_database(conn: &Conn) -> Vec<BlocklistedEmail> {
instance_tests::fill_database(conn);
let domainblock =

4
plume-models/src/blog_authors.rs

@ -1,8 +1,6 @@
use crate::{schema::blog_authors, Error, Result};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use schema::blog_authors;
use {Error, Result};
#[derive(Clone, Queryable, Identifiable)]
pub struct BlogAuthor {
pub id: i32,

43
plume-models/src/blogs.rs

@ -1,3 +1,7 @@
use crate::{
ap_url, instance::*, medias::Media, posts::Post, safe_string::SafeString, schema::blogs,
search::Searcher, users::User, Connection, Error, PlumeRocket, Result, ITEMS_PER_PAGE,
};
use activitypub::{
actor::Group,
collection::{OrderedCollection, OrderedCollectionPage},
@ -12,22 +16,13 @@ use openssl::{
rsa::Rsa,
sign::{Signer, Verifier},
};
use serde_json;
use url::Url;
use webfinger::*;
use instance::*;
use medias::Media;
use plume_common::activity_pub::{
inbox::{AsActor, FromId},
sign, ActivityStream, ApSignature, Id, IntoId, PublicKey, Source,
};
use posts::Post;
use safe_string::SafeString;
use schema::blogs;
use search::Searcher;
use users::User;
use {ap_url, Connection, Error, PlumeRocket, Result, ITEMS_PER_PAGE};
use serde_json;
use url::Url;
use webfinger::*;
pub type CustomGroup = CustomObject<ApSignature, Group>;
@ -106,8 +101,8 @@ impl Blog {
}
pub fn list_authors(&self, conn: &Connection) -> Result<Vec<User>> {
use schema::blog_authors;
use schema::users;
use crate::schema::blog_authors;
use crate::schema::users;
let authors_ids = blog_authors::table
.filter(blog_authors::blog_id.eq(self.id))
.select(blog_authors::author_id);
@ -118,7 +113,7 @@ impl Blog {
}
pub fn count_authors(&self, conn: &Connection) -> Result<i64> {
use schema::blog_authors;
use crate::schema::blog_authors;
blog_authors::table
.filter(blog_authors::blog_id.eq(self.id))
.count()
@ -127,7 +122,7 @@ impl Blog {
}
pub fn find_for_author(conn: &Connection, author: &User) -> Result<Vec<Blog>> {
use schema::blog_authors;
use crate::schema::blog_authors;
let author_ids = blog_authors::table
.filter(blog_authors::author_id.eq(author.id))
.select(blog_authors::blog_id);
@ -501,14 +496,16 @@ impl NewBlog {
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use blog_authors::*;
use crate::{
blog_authors::*,
instance::tests as instance_tests,
medias::NewMedia,
search::tests::get_searcher,
tests::{db, rockets},
users::tests as usersTests,
Connection as Conn,
};
use diesel::Connection;
use instance::tests as instance_tests;
use medias::NewMedia;
use search::tests::get_searcher;
use tests::{db, rockets};
use users::tests as usersTests;
use Connection as Conn;
pub(crate) fn fill_database(conn: &Conn) -> (Vec<User>, Vec<Blog>) {
instance_tests::fill_database(conn);

6
plume-models/src/comment_seers.rs

@ -1,10 +1,6 @@
use crate::{comments::Comment, schema::comment_seers, users::User, Connection, Error, Result};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use comments::Comment;
use schema::comment_seers;
use users::User;
use {Connection, Error, Result};
#[derive(Queryable, Clone)]
pub struct CommentSeers {
pub id: i32,

38
plume-models/src/comments.rs

@ -1,3 +1,15 @@
use crate::{
comment_seers::{CommentSeers, NewCommentSeers},
instance::Instance,
medias::Media,
mentions::Mention,
notifications::*,
posts::Post,
safe_string::SafeString,
schema::comments,
users::User,
Connection, Error, PlumeRocket, Result,
};
use activitypub::{
activity::{Create, Delete},
link,
@ -5,26 +17,16 @@ use activitypub::{
};
use chrono::{self, NaiveDateTime};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl, SaveChangesDsl};
use plume_common::{
activity_pub::{
inbox::{AsActor, AsObject, FromId},
Id, IntoId, PUBLIC_VISIBILITY,
},
utils,
};
use serde_json;
use std::collections::HashSet;
use comment_seers::{CommentSeers, NewCommentSeers};
use instance::Instance;
use medias::Media;
use mentions::Mention;
use notifications::*;
use plume_common::activity_pub::{
inbox::{AsActor, AsObject, FromId},
Id, IntoId, PUBLIC_VISIBILITY,
};
use plume_common::utils;
use posts::Post;
use safe_string::SafeString;
use schema::comments;
use users::User;
use {Connection, Error, PlumeRocket, Result};
#[derive(Queryable, Identifiable, Clone, AsChangeset)]
pub struct Comment {
pub id: i32,
@ -77,7 +79,7 @@ impl Comment {
}
pub fn count_local(conn: &Connection) -> Result<i64> {
use schema::users;
use crate::schema::users;
let local_authors = users::table
.filter(users::instance_id.eq(Instance::get_local()?.id))
.select(users::id);

5
plume-models/src/db_conn.rs

@ -1,3 +1,4 @@
use crate::Connection;
use diesel::r2d2::{
ConnectionManager, CustomizeConnection, Error as ConnError, Pool, PooledConnection,
};
@ -10,8 +11,6 @@ use rocket::{
};
use std::ops::Deref;
use Connection;
pub type DbPool = Pool<ConnectionManager<Connection>>;
// From rocket documentation
@ -26,7 +25,7 @@ impl<'a, 'r> FromRequest<'a, 'r> for DbConn {
type Error = ();
fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
let pool = request.guard::<State<DbPool>>()?;
let pool = request.guard::<State<'_, DbPool>>()?;
match pool.get() {
Ok(conn) => Outcome::Success(DbConn(conn)),
Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())),

12
plume-models/src/follows.rs

@ -1,16 +1,15 @@
use crate::{
ap_url, notifications::*, schema::follows, users::User, Connection, Error, PlumeRocket, Result,
CONFIG,
};
use activitypub::activity::{Accept, Follow as FollowAct, Undo};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl, SaveChangesDsl};
use notifications::*;
use plume_common::activity_pub::{
broadcast,
inbox::{AsActor, AsObject, FromId},
sign::Signer,
Id, IntoId, PUBLIC_VISIBILITY,
};
use schema::follows;
use users::User;
use {ap_url, Connection, Error, PlumeRocket, Result, CONFIG};
#[derive(Clone, Queryable, Identifiable, Associations, AsChangeset)]
#[belongs_to(User, foreign_key = "following_id")]
@ -201,9 +200,8 @@ impl IntoId for Follow {
#[cfg(test)]
mod tests {
use super::*;
use crate::{tests::db, users::tests as user_tests};
use diesel::Connection;
use tests::db;
use users::tests as user_tests;
#[test]
fn test_id() {

20
plume-models/src/instance.rs

@ -1,14 +1,15 @@
use crate::{
ap_url,
medias::Media,
safe_string::SafeString,
schema::{instances, users},
users::{Role, User},
Connection, Error, Result,
};
use chrono::NaiveDateTime;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use std::sync::RwLock;
use ap_url;
use medias::Media;
use plume_common::utils::md_to_html;
use safe_string::SafeString;
use schema::{instances, users};
use users::{Role, User};
use {Connection, Error, Result};
use std::sync::RwLock;
#[derive(Clone, Identifiable, Queryable)]
pub struct Instance {
@ -242,9 +243,8 @@ impl Instance {
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use crate::{tests::db, Connection as Conn};
use diesel::Connection;
use tests::db;
use Connection as Conn;
pub(crate) fn fill_database(conn: &Conn) -> Vec<(NewInstance, Instance)> {
let res = vec![

31
plume-models/src/lib.rs

@ -2,41 +2,20 @@
#![feature(never_type)]
#![feature(proc_macro_hygiene)]
extern crate activitypub;
extern crate ammonia;
extern crate askama_escape;
extern crate bcrypt;
extern crate chrono;
#[macro_use]
extern crate diesel;
extern crate guid_create;
extern crate heck;
extern crate itertools;
#[macro_use]
extern crate lazy_static;
extern crate migrations_internals;
extern crate openssl;
extern crate plume_api;
extern crate plume_common;
#[macro_use]
extern crate plume_macro;
extern crate reqwest;
#[macro_use]
extern crate rocket;
extern crate rocket_i18n;
extern crate scheduled_thread_pool;
extern crate serde;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
#[macro_use]
extern crate tantivy;
extern crate glob;
extern crate url;
extern crate walkdir;
extern crate webfinger;
extern crate whatlang;
use plume_common::activity_pub::inbox::InboxError;
@ -249,10 +228,10 @@ macro_rules! get {
/// Model::insert(connection, NewModelType::new());
/// ```
macro_rules! insert {
($table:ident, $from:ident) => {
($table:ident, $from:ty) => {
insert!($table, $from, |x, _conn| Ok(x));
};
($table:ident, $from:ident, |$val:ident, $conn:ident | $( $after:tt )+) => {
($table:ident, $from:ty, |$val:ident, $conn:ident | $( $after:tt )+) => {
last!($table);
#[allow(dead_code)]
@ -302,16 +281,12 @@ pub fn ap_url(url: &str) -> String {
#[cfg(test)]
#[macro_use]
mod tests {
use db_conn;
use crate::{db_conn, migrations::IMPORTED_MIGRATIONS, search, Connection as Conn, CONFIG};
use diesel::r2d2::ConnectionManager;
use migrations::IMPORTED_MIGRATIONS;
use plume_common::utils::random_hex;
use scheduled_thread_pool::ScheduledThreadPool;
use search;
use std::env::temp_dir;
use std::sync::Arc;
use Connection as Conn;
use CONFIG;
#[macro_export]
macro_rules! part_eq {

11
plume-models/src/likes.rs

@ -1,17 +1,14 @@
use crate::{
notifications::*, posts::Post, schema::likes, timeline::*, users::User, Connection, Error,
PlumeRocket, Result,
};
use activitypub::activity;
use chrono::NaiveDateTime;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use notifications::*;
use plume_common::activity_pub::{
inbox::{AsActor, AsObject, FromId},
Id, IntoId, PUBLIC_VISIBILITY,
};
use posts::Post;
use schema::likes;
use timeline::*;
use users::User;
use {Connection, Error, PlumeRocket, Result};
#[derive(Clone, Queryable, Identifiable)]
pub struct Like {

18
plume-models/src/lists.rs

@ -1,10 +1,11 @@
use crate::{
blogs::Blog,
schema::{blogs, list_elems, lists, users},
users::User,
Connection, Error, Result,
};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use blogs::Blog;
use schema::{blogs, list_elems, lists, users};
use std::convert::{TryFrom, TryInto};
use users::User;
use {Connection, Error, Result};
/// Represent what a list is supposed to store. Represented in database as an integer
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
@ -164,7 +165,7 @@ impl List {
last!(lists);
get!(lists);
fn insert(conn: &Connection, val: NewList) -> Result<Self> {
fn insert(conn: &Connection, val: NewList<'_>) -> Result<Self> {
diesel::insert_into(lists::table)
.values(val)
.execute(conn)?;
@ -309,7 +310,7 @@ mod private {
};
impl ListElem {
insert!(list_elems, NewListElem);
insert!(list_elems, NewListElem<'_>);
pub fn user_in_list(conn: &Connection, list: &List, user: i32) -> Result<bool> {
dsl::select(dsl::exists(
@ -359,9 +360,8 @@ mod private {
#[cfg(test)]
mod tests {
use super::*;
use blogs::tests as blog_tests;
use crate::{blogs::tests as blog_tests, tests::db};
use diesel::Connection;
use tests::db;
#[test]
fn list_type() {

19
plume-models/src/medias.rs

@ -1,20 +1,17 @@
use crate::{
ap_url, instance::Instance, safe_string::SafeString, schema::medias, users::User, Connection,
Error, PlumeRocket, Result,
};
use activitypub::object::Image;
use askama_escape::escape;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use guid_create::GUID;
use reqwest;
use std::{fs, path::Path};
use plume_common::{
activity_pub::{inbox::FromId, Id},
utils::MediaProcessor,
};
use instance::Instance;
use safe_string::SafeString;
use schema::medias;
use users::User;
use {ap_url, Connection, Error, PlumeRocket, Result};
use reqwest;
use std::{fs, path::Path};
#[derive(Clone, Identifiable, Queryable)]
pub struct Media {
@ -263,13 +260,11 @@ impl Media {
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use crate::{tests::db, users::tests as usersTests, Connection as Conn};
use diesel::Connection;
use std::env::{current_dir, set_current_dir};
use std::fs;
use std::path::Path;
use tests::db;
use users::tests as usersTests;
use Connection as Conn;
pub(crate) fn fill_database(conn: &Conn) -> (Vec<User>, Vec<Media>) {
let mut wd = current_dir().unwrap().to_path_buf();

12
plume-models/src/mentions.rs

@ -1,14 +1,10 @@
use crate::{
comments::Comment, notifications::*, posts::Post, schema::mentions, users::User, Connection,
Error, PlumeRocket, Result,
};
use activitypub::link;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use comments::Comment;
use notifications::*;
use plume_common::activity_pub::inbox::AsActor;
use posts::Post;
use schema::mentions;
use users::User;
use PlumeRocket;
use {Connection, Error, Result};
#[derive(Clone, Queryable, Identifiable)]
pub struct Mention {

6
plume-models/src/migrations.rs

@ -1,10 +1,6 @@
use Connection;
use Error;
use Result;
use crate::{Connection, Error, Result};
use diesel::connection::{Connection as Conn, SimpleConnection};
use migrations_internals::{setup_database, MigrationConnection};
use std::path::Path;
#[allow(dead_code)] //variants might not be constructed if not required by current migrations

21
plume-models/src/notifications.rs

@ -1,16 +1,17 @@
use crate::{
comments::Comment,
follows::Follow,
likes::Like,
mentions::Mention,
posts::Post,
reshares::Reshare,
schema::{follows, notifications},
users::User,
Connection, Error, Result,
};
use chrono::NaiveDateTime;
use diesel::{self, ExpressionMethods, JoinOnDsl, QueryDsl, RunQueryDsl};
use comments::Comment;
use follows::Follow;
use likes::Like;
use mentions::Mention;
use posts::Post;
use reshares::Reshare;
use schema::{follows, notifications};
use users::User;
use {Connection, Error, Result};
pub mod notification_kind {
pub const COMMENT: &str = "COMMENT";
pub const FOLLOW: &str = "FOLLOW";

6
plume-models/src/password_reset_requests.rs

@ -1,7 +1,6 @@
use crate::{schema::password_reset_requests, Connection, Error, Result};
use chrono::{offset::Utc, Duration, NaiveDateTime};
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl};
use schema::password_reset_requests;
use {Connection, Error, Result};
#[derive(Clone, Identifiable, Queryable)]
pub struct PasswordResetRequest {
@ -75,9 +74,8 @@ impl PasswordResetRequest {
#[cfg(test)]
mod tests {
use super::*;
use crate::{tests::db, users::tests as user_tests};
use diesel::Connection;
use tests::db;
use users::tests as user_tests;
#[test]
fn test_insert_and_find_password_reset_request() {

18
plume-models/src/plume_rocket.rs

@ -2,9 +2,7 @@ pub use self::module::PlumeRocket;
#[cfg(not(test))]
mod module {
use crate::db_conn::DbConn;
use crate::search;
use crate::users;
use crate::{db_conn::DbConn, search, users};
use rocket::{
request::{self, FlashMessage, FromRequest, Request},
Outcome, State,
@ -29,9 +27,9 @@ mod module {
let conn = request.guard::<DbConn>()?;
let intl = request.guard::<rocket_i18n::I18n>()?;
let user = request.guard::<users::User>().succeeded();
let worker = request.guard::<State<Arc<ScheduledThreadPool>>>()?;
let searcher = request.guard::<State<Arc<search::Searcher>>>()?;
let flash_msg = request.guard::<FlashMessage>().succeeded();
let worker = request.guard::<'_, State<'_, Arc<ScheduledThreadPool>>>()?;
let searcher = request.guard::<'_, State<'_, Arc<search::Searcher>>>()?;
let flash_msg = request.guard::<FlashMessage<'_, '_>>().succeeded();
Outcome::Success(PlumeRocket {
conn,
intl,
@ -46,9 +44,7 @@ mod module {
#[cfg(test)]
mod module {
use crate::db_conn::DbConn;
use crate::search;
use crate::users;
use crate::{db_conn::DbConn, search, users};
use rocket::{
request::{self, FromRequest, Request},
Outcome, State,
@ -70,8 +66,8 @@ mod module {
fn from_request(request: &'a Request<'r>) -> request::Outcome<PlumeRocket, ()> {
let conn = request.guard::<DbConn>()?;
let user = request.guard::<users::User>().succeeded();
let worker = request.guard::<State<Arc<ScheduledThreadPool>>>()?;
let searcher = request.guard::<State<Arc<search::Searcher>>>()?;
let worker = request.guard::<'_, State<'_, Arc<ScheduledThreadPool>>>()?;
let searcher = request.guard::<'_, State<'_, Arc<search::Searcher>>>()?;
Outcome::Success(PlumeRocket {
conn,
user,

6
plume-models/src/post_authors.rs

@ -1,10 +1,6 @@
use crate::{posts::Post, schema::post_authors, users::User, Error, Result};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use posts::Post;
use schema::post_authors;
use users::User;
use {Error, Result};
#[derive(Clone, Queryable, Identifiable, Associations)]
#[belongs_to(Post)]
#[belongs_to(User, foreign_key = "author_id")]

46
plume-models/src/posts.rs

@ -1,3 +1,8 @@
use crate::{
ap_url, blogs::Blog, instance::Instance, medias::Media, mentions::Mention, post_authors::*,
safe_string::SafeString, schema::posts, search::Searcher, tags::*, timeline::*, users::User,
Connection, Error, PlumeRocket, Result, CONFIG,
};
use activitypub::{
activity::{Create, Delete, Update},
link,
@ -7,13 +12,6 @@ use activitypub::{
use chrono::{NaiveDateTime, TimeZone, Utc};
use diesel::{self, BelongingToDsl, ExpressionMethods, QueryDsl, RunQueryDsl, SaveChangesDsl};
use heck::{CamelCase, KebabCase};
use serde_json;
use std::collections::HashSet;
use blogs::Blog;
use instance::Instance;
use medias::Media;
use mentions::Mention;
use plume_common::{
activity_pub::{
inbox::{AsObject, FromId},
@ -21,14 +19,8 @@ use plume_common::{
},
utils::md_to_html,
};
use post_authors::*;
use safe_string::SafeString;
use schema::posts;
use search::Searcher;
use tags::*;
use timeline::*;
use users::User;
use {ap_url, Connection, Error, PlumeRocket, Result, CONFIG};
use serde_json;
use std::collections::HashSet;
pub type LicensedArticle = CustomObject<Licensed, Article>;
@ -111,7 +103,7 @@ impl Post {
tag: String,
(min, max): (i32, i32),
) -> Result<Vec<Post>> {
use schema::tags;
use crate::schema::tags;
let ids = tags::table.filter(tags::tag.eq(tag)).select(tags::post_id);
posts::table
@ -125,7 +117,7 @@ impl Post {
}
pub fn count_for_tag(conn: &Connection, tag: String) -> Result<i64> {
use schema::tags;
use crate::schema::tags;
let ids = tags::table.filter(tags::tag.eq(tag)).select(tags::post_id);
posts::table
.filter(posts::id.eq_any(ids))
@ -139,8 +131,8 @@ impl Post {
}
pub fn count_local(conn: &Connection) -> Result<i64> {
use schema::post_authors;
use schema::users;
use crate::schema::post_authors;
use crate::schema::users;
let local_authors = users::table
.filter(users::instance_id.eq(Instance::get_local()?.id))
.select(users::id);
@ -188,7 +180,7 @@ impl Post {
author: &User,
limit: i64,
) -> Result<Vec<Post>> {
use schema::post_authors;
use crate::schema::post_authors;
let posts = PostAuthor::belonging_to(author).select(post_authors::post_id);
posts::table
@ -239,7 +231,7 @@ impl Post {
}
pub fn drafts_by_author(conn: &Connection, author: &User) -> Result<Vec<Post>> {
use schema::post_authors;
use crate::schema::post_authors;
let posts = PostAuthor::belonging_to(author).select(post_authors::post_id);
posts::table
@ -251,8 +243,8 @@ impl Post {
}
pub fn get_authors(&self, conn: &Connection) -> Result<Vec<User>> {
use schema::post_authors;
use schema::users;
use crate::schema::post_authors;
use crate::schema::users;
let author_list = PostAuthor::belonging_to(self).select(post_authors::author_id);
users::table
.filter(users::id.eq_any(author_list))
@ -261,7 +253,7 @@ impl Post {
}
pub fn is_author(&self, conn: &Connection, author_id: i32) -> Result<bool> {
use schema::post_authors;
use crate::schema::post_authors;
Ok(PostAuthor::belonging_to(self)
.filter(post_authors::author_id.eq(author_id))
.count()
@ -270,7 +262,7 @@ impl Post {
}
pub fn get_blog(&self, conn: &Connection) -> Result<Blog> {
use schema::blogs;
use crate::schema::blogs;
blogs::table
.filter(blogs::id.eq(self.blog_id))
.first(conn)
@ -278,7 +270,7 @@ impl Post {
}
pub fn count_likes(&self, conn: &Connection) -> Result<i64> {
use schema::likes;
use crate::schema::likes;
likes::table
.filter(likes::post_id.eq(self.id))
.count()
@ -287,7 +279,7 @@ impl Post {
}
pub fn count_reshares(&self, conn: &Connection) -> Result<i64> {
use schema::reshares;
use crate::schema::reshares;
reshares::table
.filter(reshares::post_id.eq(self.id))
.count()

11
plume-models/src/reshares.rs

@ -1,17 +1,14 @@
use crate::{
notifications::*, posts::Post, schema::reshares, timeline::*, users::User, Connection, Error,
PlumeRocket, Result,
};
use activitypub::activity::{Announce, Undo};
use chrono::NaiveDateTime;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use notifications::*;
use plume_common::activity_pub::{
inbox::{AsActor, AsObject, FromId},
Id, IntoId, PUBLIC_VISIBILITY,
};
use posts::Post;
use schema::reshares;
use timeline::*;
use users::User;
use {Connection, Error, PlumeRocket, Result};
#[derive(Clone, Queryable, Identifiable)]
pub struct Reshare {

8
plume-models/src/safe_string.rs

@ -82,7 +82,7 @@ lazy_static! {
};
}
fn url_add_prefix(url: &str) -> Option<Cow<str>> {
fn url_add_prefix(url: &str) -> Option<Cow<'_, str>> {
if url.starts_with('#') && !url.starts_with("#postcontent-") {
//if start with an #
let mut new_url = "#postcontent-".to_owned(); //change to valid id
@ -139,7 +139,7 @@ struct SafeStringVisitor;
impl<'de> Visitor<'de> for SafeStringVisitor {
type Value = SafeString;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("a string")
}
@ -181,7 +181,7 @@ where
DB: diesel::backend::Backend,
str: ToSql<diesel::sql_types::Text, DB>,
{
fn to_sql<W: Write>(&self, out: &mut Output<W, DB>) -> serialize::Result {
fn to_sql<W: Write>(&self, out: &mut Output<'_, W, DB>) -> serialize::Result {
str::to_sql(&self.value, out)
}
}
@ -193,7 +193,7 @@ impl Borrow<str> for SafeString {
}
impl Display for SafeString {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.value)
}
}

14
plume-models/src/search/mod.rs

@ -8,15 +8,17 @@ pub use self::searcher::*;
pub(crate) mod tests {
use super::{Query, Searcher};
use diesel::Connection;
use plume_common::utils::random_hex;
use std::env::temp_dir;
use std::str::FromStr;
use blogs::tests::fill_database;
use plume_common::utils::random_hex;
use post_authors::*;
use posts::{NewPost, Post};
use safe_string::SafeString;
use tests::db;
use crate::{
blogs::tests::fill_database,
post_authors::*,
posts::{NewPost, Post},
safe_string::SafeString,
tests::db,
};
pub(crate) fn get_searcher() -> Searcher {
let dir = temp_dir().join(&format!("plume-test-{}", random_hex()));

2
plume-models/src/search/query.rs

@ -1,5 +1,5 @@
use crate::search::searcher::Searcher;
use chrono::{naive::NaiveDate, offset::Utc, Datelike};
use search::searcher::Searcher;
use std::{cmp, ops::Bound};
use tantivy::{query::*, schema::*, Term};

18
plume-models/src/search/searcher.rs

@ -1,9 +1,11 @@
use instance::Instance;
use posts::Post;
use schema::posts;
use tags::Tag;
use Connection;
use crate::{
instance::Instance,
posts::Post,
schema::posts,
search::{query::PlumeQuery, tokenizer},
tags::Tag,
Connection, Result,
};
use chrono::Datelike;
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl};
use itertools::Itertools;
@ -14,10 +16,6 @@ use tantivy::{
};
use whatlang::{detect as detect_lang, Lang};
use super::tokenizer;
use search::query::PlumeQuery;
use Result;
#[derive(Debug)]
pub enum SearcherError {
IndexCreationError,

5
plume-models/src/tags.rs

@ -1,9 +1,6 @@
use crate::{ap_url, instance::Instance, schema::tags, Connection, Error, Result};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use instance::Instance;
use plume_common::activity_pub::Hashtag;
use schema::tags;
use {ap_url, Connection, Error, Result};
#[derive(Clone, Identifiable, Queryable)]
pub struct Tag {

38
plume-models/src/timeline/mod.rs

@ -1,16 +1,16 @@
use crate::{
lists::List,
posts::Post,
schema::{posts, timeline, timeline_definition},
Connection, Error, PlumeRocket, Result,
};
use diesel::{self, BoolExpressionMethods, ExpressionMethods, QueryDsl, RunQueryDsl};
use lists::List;
use posts::Post;
use schema::{posts, timeline, timeline_definition};
use std::ops::Deref;
use {Connection, Error, PlumeRocket, Result};
pub(crate) mod query;
use self::query::{QueryError, TimelineQuery};
pub use self::query::Kind;
use self::query::{QueryError, TimelineQuery};
#[derive(Clone, Debug, P