From f842bbff8dbdee00d85d8bd636d65eb98284310c Mon Sep 17 00:00:00 2001
From: Felix Ableitner <me@nutomic.com>
Date: Fri, 18 Dec 2020 19:38:32 +0100
Subject: [PATCH] Move user to lemmy_db_schema, create traits for impls

---
 lemmy_api/src/claims.rs                       |   2 +-
 lemmy_api/src/comment.rs                      |   3 +-
 lemmy_api/src/community.rs                    |   2 +-
 lemmy_api/src/lib.rs                          |   7 +-
 lemmy_api/src/post.rs                         |   1 +
 lemmy_api/src/user.rs                         |   6 +-
 lemmy_apub/src/activities/receive/comment.rs  |   2 +-
 .../src/activities/receive/comment_undo.rs    |   2 +-
 lemmy_apub/src/activities/receive/mod.rs      |   2 +-
 lemmy_apub/src/activities/receive/post.rs     |   2 +-
 .../src/activities/receive/post_undo.rs       |   2 +-
 lemmy_apub/src/activities/send/comment.rs     |   8 +-
 lemmy_apub/src/activities/send/post.rs        |   7 +-
 .../src/activities/send/private_message.rs    |   6 +-
 lemmy_apub/src/activities/send/user.rs        |   6 +-
 lemmy_apub/src/activity_queue.rs              |   6 +-
 lemmy_apub/src/fetcher.rs                     |   5 +-
 lemmy_apub/src/http/community.rs              |   2 +-
 lemmy_apub/src/http/post.rs                   |   1 +
 lemmy_apub/src/http/user.rs                   |   3 +-
 lemmy_apub/src/inbox/community_inbox.rs       |   6 +-
 lemmy_apub/src/inbox/mod.rs                   |   3 +-
 lemmy_apub/src/inbox/user_inbox.rs            |   3 +-
 lemmy_apub/src/lib.rs                         |   6 +-
 lemmy_apub/src/objects/comment.rs             |   7 +-
 lemmy_apub/src/objects/post.rs                |   9 +-
 lemmy_apub/src/objects/private_message.rs     |   6 +-
 lemmy_apub/src/objects/user.rs                |   7 +-
 lemmy_db/Cargo.toml                           |   2 +-
 .../src/aggregates/community_aggregates.rs    |   6 +-
 lemmy_db/src/aggregates/post_aggregates.rs    |   6 +-
 lemmy_db/src/aggregates/site_aggregates.rs    |   6 +-
 lemmy_db/src/aggregates/user_aggregates.rs    |   6 +-
 lemmy_db/src/source/activity.rs               |   6 +-
 lemmy_db/src/source/comment.rs                | 126 ++++++++-
 lemmy_db/src/source/community.rs              |   8 +-
 lemmy_db/src/source/moderator.rs              |   4 +-
 lemmy_db/src/source/password_reset_request.rs |   2 +-
 lemmy_db/src/source/post.rs                   | 137 +++++++++-
 lemmy_db/src/source/private_message.rs        |   3 +-
 lemmy_db/src/source/user.rs                   | 245 +++---------------
 lemmy_db/src/source/user_mention.rs           |   4 +-
 lemmy_db/src/views/comment_report_view.rs     |   7 +-
 lemmy_db/src/views/comment_view.rs            |  10 +-
 .../community/community_follower_view.rs      |  10 +-
 .../community/community_moderator_view.rs     |  10 +-
 .../community/community_user_ban_view.rs      |  10 +-
 .../src/views/community/community_view.rs     |  10 +-
 .../views/moderator/mod_add_community_view.rs |   6 +-
 lemmy_db/src/views/moderator/mod_add_view.rs  |  15 +-
 .../moderator/mod_ban_from_community_view.rs  |   6 +-
 lemmy_db/src/views/moderator/mod_ban_view.rs  |  15 +-
 .../src/views/moderator/mod_lock_post_view.rs |   6 +-
 .../moderator/mod_remove_comment_view.rs      |   7 +-
 .../moderator/mod_remove_community_view.rs    |   6 +-
 .../views/moderator/mod_remove_post_view.rs   |   6 +-
 .../views/moderator/mod_sticky_post_view.rs   |   6 +-
 lemmy_db/src/views/post_report_view.rs        |   6 +-
 lemmy_db/src/views/post_view.rs               |  14 +-
 lemmy_db/src/views/private_message_view.rs    |  10 +-
 lemmy_db/src/views/site_view.rs               |  13 +-
 lemmy_db/src/views/user_mention_view.rs       |   2 +-
 lemmy_db/src/views/user_view.rs               |   6 +-
 lemmy_db_schema/src/lib.rs                    |   1 +
 lemmy_db_schema/src/source/comment.rs         |  81 ------
 lemmy_db_schema/src/source/mod.rs             |   1 +
 lemmy_db_schema/src/source/post.rs            | 118 +--------
 lemmy_db_schema/src/source/user.rs            | 182 +++++++++++++
 lemmy_structs/src/lib.rs                      |   4 +-
 lemmy_structs/src/site.rs                     |   3 +-
 src/code_migrations.rs                        |   9 +-
 src/routes/feeds.rs                           |   3 +-
 src/routes/webfinger.rs                       |   3 +-
 tests/integration_test.rs                     |   6 +-
 74 files changed, 651 insertions(+), 624 deletions(-)
 create mode 100644 lemmy_db_schema/src/source/user.rs

diff --git a/lemmy_api/src/claims.rs b/lemmy_api/src/claims.rs
index 4a0ab12b..f99730bd 100644
--- a/lemmy_api/src/claims.rs
+++ b/lemmy_api/src/claims.rs
@@ -1,5 +1,5 @@
 use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, TokenData, Validation};
-use lemmy_db::source::user::User_;
+use lemmy_db_schema::source::user::User_;
 use lemmy_utils::settings::Settings;
 use serde::{Deserialize, Serialize};
 
diff --git a/lemmy_api/src/comment.rs b/lemmy_api/src/comment.rs
index acff6004..78c45c49 100644
--- a/lemmy_api/src/comment.rs
+++ b/lemmy_api/src/comment.rs
@@ -11,9 +11,9 @@ use actix_web::web::Data;
 use lemmy_apub::{ApubLikeableType, ApubObjectType};
 use lemmy_db::{
   source::{
+    comment::Comment_,
     comment_report::{CommentReport, CommentReportForm},
     moderator::*,
-    user::*,
   },
   views::{
     comment_report_view::{CommentReportQueryBuilder, CommentReportView},
@@ -30,6 +30,7 @@ use lemmy_db::{
 use lemmy_db_schema::source::{
   comment::{Comment, CommentForm, CommentLike, CommentLikeForm, CommentSaved, CommentSavedForm},
   post::Post,
+  user::*,
 };
 use lemmy_structs::{blocking, comment::*, send_local_notifs};
 use lemmy_utils::{
diff --git a/lemmy_api/src/community.rs b/lemmy_api/src/community.rs
index 35aafc88..0316beaa 100644
--- a/lemmy_api/src/community.rs
+++ b/lemmy_api/src/community.rs
@@ -11,7 +11,7 @@ use anyhow::Context;
 use lemmy_apub::ActorType;
 use lemmy_db::{
   diesel_option_overwrite,
-  source::{community::*, moderator::*, site::*},
+  source::{comment::Comment_, community::*, moderator::*, post::Post_, site::*},
   views::{
     comment_view::CommentQueryBuilder,
     community::{
diff --git a/lemmy_api/src/lib.rs b/lemmy_api/src/lib.rs
index 927846c0..e6c3b825 100644
--- a/lemmy_api/src/lib.rs
+++ b/lemmy_api/src/lib.rs
@@ -1,15 +1,12 @@
 use crate::claims::Claims;
 use actix_web::{web, web::Data};
 use lemmy_db::{
-  source::{
-    community::{Community, CommunityModerator},
-    user::User_,
-  },
+  source::community::{Community, CommunityModerator},
   views::community::community_user_ban_view::CommunityUserBanView,
   Crud,
   DbPool,
 };
-use lemmy_db_schema::source::post::Post;
+use lemmy_db_schema::source::{post::Post, user::User_};
 use lemmy_structs::{blocking, comment::*, community::*, post::*, site::*, user::*};
 use lemmy_utils::{settings::Settings, APIError, ConnectionId, LemmyError};
 use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperation};
diff --git a/lemmy_api/src/post.rs b/lemmy_api/src/post.rs
index ee09059a..9024541c 100644
--- a/lemmy_api/src/post.rs
+++ b/lemmy_api/src/post.rs
@@ -12,6 +12,7 @@ use lemmy_apub::{ApubLikeableType, ApubObjectType};
 use lemmy_db::{
   source::{
     moderator::*,
+    post::Post_,
     post_report::{PostReport, PostReportForm},
   },
   views::{
diff --git a/lemmy_api/src/user.rs b/lemmy_api/src/user.rs
index 680910b8..a6e1cbce 100644
--- a/lemmy_api/src/user.rs
+++ b/lemmy_api/src/user.rs
@@ -17,12 +17,14 @@ use lemmy_apub::ApubObjectType;
 use lemmy_db::{
   diesel_option_overwrite,
   source::{
+    comment::Comment_,
     community::*,
     moderator::*,
     password_reset_request::*,
+    post::Post_,
     private_message::*,
     site::*,
-    user::*,
+    user::User,
     user_mention::*,
   },
   views::{
@@ -47,7 +49,7 @@ use lemmy_db::{
 };
 use lemmy_db_schema::{
   naive_now,
-  source::{comment::Comment, post::Post},
+  source::{comment::Comment, post::Post, user::*},
 };
 use lemmy_structs::{blocking, send_email_to_user, user::*};
 use lemmy_utils::{
diff --git a/lemmy_apub/src/activities/receive/comment.rs b/lemmy_apub/src/activities/receive/comment.rs
index 76337c4f..0149e931 100644
--- a/lemmy_apub/src/activities/receive/comment.rs
+++ b/lemmy_apub/src/activities/receive/comment.rs
@@ -4,7 +4,7 @@ use activitystreams::{
   base::ExtendsExt,
 };
 use anyhow::Context;
-use lemmy_db::{views::comment_view::CommentView, Likeable};
+use lemmy_db::{source::comment::Comment_, views::comment_view::CommentView, Crud, Likeable};
 use lemmy_db_schema::source::{
   comment::{Comment, CommentLike, CommentLikeForm},
   post::Post,
diff --git a/lemmy_apub/src/activities/receive/comment_undo.rs b/lemmy_apub/src/activities/receive/comment_undo.rs
index f446b286..7e672045 100644
--- a/lemmy_apub/src/activities/receive/comment_undo.rs
+++ b/lemmy_apub/src/activities/receive/comment_undo.rs
@@ -1,6 +1,6 @@
 use crate::activities::receive::get_actor_as_user;
 use activitystreams::activity::{Dislike, Like};
-use lemmy_db::{views::comment_view::CommentView, Likeable};
+use lemmy_db::{source::comment::Comment_, views::comment_view::CommentView, Likeable};
 use lemmy_db_schema::source::comment::{Comment, CommentLike};
 use lemmy_structs::{blocking, comment::CommentResponse};
 use lemmy_utils::LemmyError;
diff --git a/lemmy_apub/src/activities/receive/mod.rs b/lemmy_apub/src/activities/receive/mod.rs
index a66ddfb9..f52bbea1 100644
--- a/lemmy_apub/src/activities/receive/mod.rs
+++ b/lemmy_apub/src/activities/receive/mod.rs
@@ -5,7 +5,7 @@ use activitystreams::{
   error::DomainError,
 };
 use anyhow::{anyhow, Context};
-use lemmy_db::source::user::User_;
+use lemmy_db_schema::source::user::User_;
 use lemmy_utils::{location_info, LemmyError};
 use lemmy_websocket::LemmyContext;
 use log::debug;
diff --git a/lemmy_apub/src/activities/receive/post.rs b/lemmy_apub/src/activities/receive/post.rs
index 4a3cc13f..8e20da75 100644
--- a/lemmy_apub/src/activities/receive/post.rs
+++ b/lemmy_apub/src/activities/receive/post.rs
@@ -4,7 +4,7 @@ use activitystreams::{
   prelude::*,
 };
 use anyhow::Context;
-use lemmy_db::{views::post_view::PostView, Likeable};
+use lemmy_db::{source::post::Post_, views::post_view::PostView, Likeable};
 use lemmy_db_schema::source::post::{Post, PostLike, PostLikeForm};
 use lemmy_structs::{blocking, post::PostResponse};
 use lemmy_utils::{location_info, LemmyError};
diff --git a/lemmy_apub/src/activities/receive/post_undo.rs b/lemmy_apub/src/activities/receive/post_undo.rs
index 817a74e4..facaf65f 100644
--- a/lemmy_apub/src/activities/receive/post_undo.rs
+++ b/lemmy_apub/src/activities/receive/post_undo.rs
@@ -1,6 +1,6 @@
 use crate::activities::receive::get_actor_as_user;
 use activitystreams::activity::{Dislike, Like};
-use lemmy_db::{views::post_view::PostView, Likeable};
+use lemmy_db::{source::post::Post_, views::post_view::PostView, Likeable};
 use lemmy_db_schema::source::post::{Post, PostLike};
 use lemmy_structs::{blocking, post::PostResponse};
 use lemmy_utils::LemmyError;
diff --git a/lemmy_apub/src/activities/send/comment.rs b/lemmy_apub/src/activities/send/comment.rs
index 358e5020..fa39fd47 100644
--- a/lemmy_apub/src/activities/send/comment.rs
+++ b/lemmy_apub/src/activities/send/comment.rs
@@ -26,12 +26,8 @@ use activitystreams::{
 };
 use anyhow::anyhow;
 use itertools::Itertools;
-use lemmy_db::{
-  source::{community::Community, user::User_},
-  Crud,
-  DbPool,
-};
-use lemmy_db_schema::source::{comment::Comment, post::Post};
+use lemmy_db::{source::community::Community, Crud, DbPool};
+use lemmy_db_schema::source::{comment::Comment, post::Post, user::User_};
 use lemmy_structs::{blocking, WebFingerResponse};
 use lemmy_utils::{
   request::{retry, RecvError},
diff --git a/lemmy_apub/src/activities/send/post.rs b/lemmy_apub/src/activities/send/post.rs
index fd7f7c12..c79f79ac 100644
--- a/lemmy_apub/src/activities/send/post.rs
+++ b/lemmy_apub/src/activities/send/post.rs
@@ -21,11 +21,8 @@ use activitystreams::{
   prelude::*,
   public,
 };
-use lemmy_db::{
-  source::{community::Community, user::User_},
-  Crud,
-};
-use lemmy_db_schema::source::post::Post;
+use lemmy_db::{source::community::Community, Crud};
+use lemmy_db_schema::source::{post::Post, user::User_};
 use lemmy_structs::blocking;
 use lemmy_utils::LemmyError;
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/activities/send/private_message.rs b/lemmy_apub/src/activities/send/private_message.rs
index 9abe70d6..4c8cb874 100644
--- a/lemmy_apub/src/activities/send/private_message.rs
+++ b/lemmy_apub/src/activities/send/private_message.rs
@@ -16,10 +16,8 @@ use activitystreams::{
   },
   prelude::*,
 };
-use lemmy_db::{
-  source::{private_message::PrivateMessage, user::User_},
-  Crud,
-};
+use lemmy_db::{source::private_message::PrivateMessage, Crud};
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::LemmyError;
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/activities/send/user.rs b/lemmy_apub/src/activities/send/user.rs
index 26c5a5d5..8c01aff8 100644
--- a/lemmy_apub/src/activities/send/user.rs
+++ b/lemmy_apub/src/activities/send/user.rs
@@ -14,14 +14,12 @@ use activitystreams::{
   object::ObjectExt,
 };
 use lemmy_db::{
-  source::{
-    community::{Community, CommunityFollower, CommunityFollowerForm},
-    user::User_,
-  },
+  source::community::{Community, CommunityFollower, CommunityFollowerForm},
   ApubObject,
   DbPool,
   Followable,
 };
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::LemmyError;
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/activity_queue.rs b/lemmy_apub/src/activity_queue.rs
index 07990457..b32a3eb6 100644
--- a/lemmy_apub/src/activity_queue.rs
+++ b/lemmy_apub/src/activity_queue.rs
@@ -19,10 +19,8 @@ use background_jobs::{
   WorkerConfig,
 };
 use itertools::Itertools;
-use lemmy_db::{
-  source::{community::Community, user::User_},
-  DbPool,
-};
+use lemmy_db::{source::community::Community, DbPool};
+use lemmy_db_schema::source::user::User_;
 use lemmy_utils::{location_info, settings::Settings, LemmyError};
 use lemmy_websocket::LemmyContext;
 use log::{debug, warn};
diff --git a/lemmy_apub/src/fetcher.rs b/lemmy_apub/src/fetcher.rs
index d06b221e..a4c5d66f 100644
--- a/lemmy_apub/src/fetcher.rs
+++ b/lemmy_apub/src/fetcher.rs
@@ -15,7 +15,7 @@ use diesel::result::Error::NotFound;
 use lemmy_db::{
   source::{
     community::{Community, CommunityModerator, CommunityModeratorForm},
-    user::User_,
+    user::User,
   },
   views::{
     comment_view::CommentView,
@@ -24,12 +24,13 @@ use lemmy_db::{
     user_view::UserViewSafe,
   },
   ApubObject,
+  Crud,
   Joinable,
   SearchType,
 };
 use lemmy_db_schema::{
   naive_now,
-  source::{comment::Comment, post::Post},
+  source::{comment::Comment, post::Post, user::User_},
 };
 use lemmy_structs::{blocking, site::SearchResponse};
 use lemmy_utils::{
diff --git a/lemmy_apub/src/http/community.rs b/lemmy_apub/src/http/community.rs
index a1a7870f..0ab14e07 100644
--- a/lemmy_apub/src/http/community.rs
+++ b/lemmy_apub/src/http/community.rs
@@ -10,7 +10,7 @@ use activitystreams::{
 };
 use actix_web::{body::Body, web, HttpResponse};
 use lemmy_db::{
-  source::community::Community,
+  source::{community::Community, post::Post_},
   views::community::community_follower_view::CommunityFollowerView,
 };
 use lemmy_db_schema::source::post::Post;
diff --git a/lemmy_apub/src/http/post.rs b/lemmy_apub/src/http/post.rs
index ad846407..8ade3529 100644
--- a/lemmy_apub/src/http/post.rs
+++ b/lemmy_apub/src/http/post.rs
@@ -4,6 +4,7 @@ use crate::{
 };
 use actix_web::{body::Body, web, HttpResponse};
 use diesel::result::Error::NotFound;
+use lemmy_db::Crud;
 use lemmy_db_schema::source::post::Post;
 use lemmy_structs::blocking;
 use lemmy_utils::LemmyError;
diff --git a/lemmy_apub/src/http/user.rs b/lemmy_apub/src/http/user.rs
index 8dcc8eda..b01347e0 100644
--- a/lemmy_apub/src/http/user.rs
+++ b/lemmy_apub/src/http/user.rs
@@ -9,7 +9,8 @@ use activitystreams::{
   collection::{CollectionExt, OrderedCollection},
 };
 use actix_web::{body::Body, web, HttpResponse};
-use lemmy_db::source::user::User_;
+use lemmy_db::source::user::User;
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::LemmyError;
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/inbox/community_inbox.rs b/lemmy_apub/src/inbox/community_inbox.rs
index a2bed621..9d5d4d1b 100644
--- a/lemmy_apub/src/inbox/community_inbox.rs
+++ b/lemmy_apub/src/inbox/community_inbox.rs
@@ -27,15 +27,13 @@ use activitystreams::{
 use actix_web::{web, HttpRequest, HttpResponse};
 use anyhow::{anyhow, Context};
 use lemmy_db::{
-  source::{
-    community::{Community, CommunityFollower, CommunityFollowerForm},
-    user::User_,
-  },
+  source::community::{Community, CommunityFollower, CommunityFollowerForm},
   views::community::community_user_ban_view::CommunityUserBanView,
   ApubObject,
   DbPool,
   Followable,
 };
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::{location_info, LemmyError};
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/inbox/mod.rs b/lemmy_apub/src/inbox/mod.rs
index 41585188..2d097772 100644
--- a/lemmy_apub/src/inbox/mod.rs
+++ b/lemmy_apub/src/inbox/mod.rs
@@ -13,10 +13,11 @@ use activitystreams::{
 use actix_web::HttpRequest;
 use anyhow::{anyhow, Context};
 use lemmy_db::{
-  source::{activity::Activity, community::Community, user::User_},
+  source::{activity::Activity, community::Community},
   ApubObject,
   DbPool,
 };
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::{location_info, settings::Settings, LemmyError};
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/inbox/user_inbox.rs b/lemmy_apub/src/inbox/user_inbox.rs
index 374772d6..d9feffd3 100644
--- a/lemmy_apub/src/inbox/user_inbox.rs
+++ b/lemmy_apub/src/inbox/user_inbox.rs
@@ -52,11 +52,12 @@ use lemmy_db::{
   source::{
     community::{Community, CommunityFollower},
     private_message::PrivateMessage,
-    user::User_,
+    user::User,
   },
   ApubObject,
   Followable,
 };
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::{location_info, LemmyError};
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/lib.rs b/lemmy_apub/src/lib.rs
index 78224c32..991e782e 100644
--- a/lemmy_apub/src/lib.rs
+++ b/lemmy_apub/src/lib.rs
@@ -22,10 +22,8 @@ use activitystreams::{
 };
 use activitystreams_ext::{Ext1, Ext2};
 use anyhow::{anyhow, Context};
-use lemmy_db::{
-  source::{activity::Activity, user::User_},
-  DbPool,
-};
+use lemmy_db::{source::activity::Activity, DbPool};
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::{location_info, settings::Settings, LemmyError};
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/objects/comment.rs b/lemmy_apub/src/objects/comment.rs
index 9dd035c5..a753c8db 100644
--- a/lemmy_apub/src/objects/comment.rs
+++ b/lemmy_apub/src/objects/comment.rs
@@ -23,14 +23,11 @@ use activitystreams::{
   prelude::*,
 };
 use anyhow::{anyhow, Context};
-use lemmy_db::{
-  source::{community::Community, user::User_},
-  Crud,
-  DbPool,
-};
+use lemmy_db::{source::community::Community, Crud, DbPool};
 use lemmy_db_schema::source::{
   comment::{Comment, CommentForm},
   post::Post,
+  user::User_,
 };
 use lemmy_structs::blocking;
 use lemmy_utils::{
diff --git a/lemmy_apub/src/objects/post.rs b/lemmy_apub/src/objects/post.rs
index 7090cd16..ed5a5d9c 100644
--- a/lemmy_apub/src/objects/post.rs
+++ b/lemmy_apub/src/objects/post.rs
@@ -20,12 +20,11 @@ use activitystreams::{
 };
 use activitystreams_ext::Ext1;
 use anyhow::Context;
-use lemmy_db::{
-  source::{community::Community, user::User_},
-  Crud,
-  DbPool,
+use lemmy_db::{source::community::Community, Crud, DbPool};
+use lemmy_db_schema::source::{
+  post::{Post, PostForm},
+  user::User_,
 };
-use lemmy_db_schema::source::post::{Post, PostForm};
 use lemmy_structs::blocking;
 use lemmy_utils::{
   location_info,
diff --git a/lemmy_apub/src/objects/private_message.rs b/lemmy_apub/src/objects/private_message.rs
index e69c2811..cf176dc6 100644
--- a/lemmy_apub/src/objects/private_message.rs
+++ b/lemmy_apub/src/objects/private_message.rs
@@ -20,13 +20,11 @@ use activitystreams::{
 };
 use anyhow::Context;
 use lemmy_db::{
-  source::{
-    private_message::{PrivateMessage, PrivateMessageForm},
-    user::User_,
-  },
+  source::private_message::{PrivateMessage, PrivateMessageForm},
   Crud,
   DbPool,
 };
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::{location_info, utils::convert_datetime, LemmyError};
 use lemmy_websocket::LemmyContext;
diff --git a/lemmy_apub/src/objects/user.rs b/lemmy_apub/src/objects/user.rs
index 6862867a..3ec1548d 100644
--- a/lemmy_apub/src/objects/user.rs
+++ b/lemmy_apub/src/objects/user.rs
@@ -18,12 +18,11 @@ use activitystreams::{
 };
 use activitystreams_ext::Ext1;
 use anyhow::Context;
-use lemmy_db::{
+use lemmy_db::{ApubObject, DbPool};
+use lemmy_db_schema::{
+  naive_now,
   source::user::{UserForm, User_},
-  ApubObject,
-  DbPool,
 };
-use lemmy_db_schema::naive_now;
 use lemmy_structs::blocking;
 use lemmy_utils::{
   location_info,
diff --git a/lemmy_db/Cargo.toml b/lemmy_db/Cargo.toml
index 849dba8e..0442d014 100644
--- a/lemmy_db/Cargo.toml
+++ b/lemmy_db/Cargo.toml
@@ -18,7 +18,7 @@ strum = "0.20.0"
 strum_macros = "0.20.1"
 log = "0.4.11"
 sha2 = "0.9.2"
-bcrypt = "0.9.0"
 url = { version = "2.2.0", features = ["serde"] }
 lazy_static = "1.4.0"
 regex = "1.4.2"
+bcrypt = "0.9.0"
diff --git a/lemmy_db/src/aggregates/community_aggregates.rs b/lemmy_db/src/aggregates/community_aggregates.rs
index cb94e632..f452892d 100644
--- a/lemmy_db/src/aggregates/community_aggregates.rs
+++ b/lemmy_db/src/aggregates/community_aggregates.rs
@@ -24,10 +24,7 @@ impl CommunityAggregates {
 mod tests {
   use crate::{
     aggregates::community_aggregates::CommunityAggregates,
-    source::{
-      community::{Community, CommunityFollower, CommunityFollowerForm, CommunityForm},
-      user::{UserForm, User_},
-    },
+    source::community::{Community, CommunityFollower, CommunityFollowerForm, CommunityForm},
     tests::establish_unpooled_connection,
     Crud,
     Followable,
@@ -37,6 +34,7 @@ mod tests {
   use lemmy_db_schema::source::{
     comment::{Comment, CommentForm},
     post::{Post, PostForm},
+    user::{UserForm, User_},
   };
 
   #[test]
diff --git a/lemmy_db/src/aggregates/post_aggregates.rs b/lemmy_db/src/aggregates/post_aggregates.rs
index 0b9bfa5f..434e52fd 100644
--- a/lemmy_db/src/aggregates/post_aggregates.rs
+++ b/lemmy_db/src/aggregates/post_aggregates.rs
@@ -26,10 +26,7 @@ impl PostAggregates {
 mod tests {
   use crate::{
     aggregates::post_aggregates::PostAggregates,
-    source::{
-      community::{Community, CommunityForm},
-      user::{UserForm, User_},
-    },
+    source::community::{Community, CommunityForm},
     tests::establish_unpooled_connection,
     Crud,
     Likeable,
@@ -39,6 +36,7 @@ mod tests {
   use lemmy_db_schema::source::{
     comment::{Comment, CommentForm},
     post::{Post, PostForm, PostLike, PostLikeForm},
+    user::{UserForm, User_},
   };
 
   #[test]
diff --git a/lemmy_db/src/aggregates/site_aggregates.rs b/lemmy_db/src/aggregates/site_aggregates.rs
index ea58b216..7fafc8ef 100644
--- a/lemmy_db/src/aggregates/site_aggregates.rs
+++ b/lemmy_db/src/aggregates/site_aggregates.rs
@@ -22,10 +22,7 @@ impl SiteAggregates {
 mod tests {
   use crate::{
     aggregates::site_aggregates::SiteAggregates,
-    source::{
-      community::{Community, CommunityForm},
-      user::{UserForm, User_},
-    },
+    source::community::{Community, CommunityForm},
     tests::establish_unpooled_connection,
     Crud,
     ListingType,
@@ -34,6 +31,7 @@ mod tests {
   use lemmy_db_schema::source::{
     comment::{Comment, CommentForm},
     post::{Post, PostForm},
+    user::{UserForm, User_},
   };
 
   #[test]
diff --git a/lemmy_db/src/aggregates/user_aggregates.rs b/lemmy_db/src/aggregates/user_aggregates.rs
index 91fa7460..61a1ae7c 100644
--- a/lemmy_db/src/aggregates/user_aggregates.rs
+++ b/lemmy_db/src/aggregates/user_aggregates.rs
@@ -25,10 +25,7 @@ impl UserAggregates {
 mod tests {
   use crate::{
     aggregates::user_aggregates::UserAggregates,
-    source::{
-      community::{Community, CommunityForm},
-      user::{UserForm, User_},
-    },
+    source::community::{Community, CommunityForm},
     tests::establish_unpooled_connection,
     Crud,
     Likeable,
@@ -38,6 +35,7 @@ mod tests {
   use lemmy_db_schema::source::{
     comment::{Comment, CommentForm, CommentLike, CommentLikeForm},
     post::{Post, PostForm, PostLike, PostLikeForm},
+    user::{UserForm, User_},
   };
 
   #[test]
diff --git a/lemmy_db/src/source/activity.rs b/lemmy_db/src/source/activity.rs
index 38a353a4..ca85cf9f 100644
--- a/lemmy_db/src/source/activity.rs
+++ b/lemmy_db/src/source/activity.rs
@@ -98,15 +98,13 @@ impl Activity {
 #[cfg(test)]
 mod tests {
   use crate::{
-    source::{
-      activity::{Activity, ActivityForm},
-      user::{UserForm, User_},
-    },
+    source::activity::{Activity, ActivityForm},
     tests::establish_unpooled_connection,
     Crud,
     ListingType,
     SortType,
   };
+  use lemmy_db_schema::source::user::{UserForm, User_};
   use serde_json::Value;
 
   #[test]
diff --git a/lemmy_db/src/source/comment.rs b/lemmy_db/src/source/comment.rs
index 17e9d637..010ca7da 100644
--- a/lemmy_db/src/source/comment.rs
+++ b/lemmy_db/src/source/comment.rs
@@ -1,14 +1,118 @@
 use crate::{ApubObject, Crud, Likeable, Saveable};
 use diesel::{dsl::*, result::Error, *};
-use lemmy_db_schema::source::comment::{
-  Comment,
-  CommentForm,
-  CommentLike,
-  CommentLikeForm,
-  CommentSaved,
-  CommentSavedForm,
+use lemmy_db_schema::{
+  naive_now,
+  source::comment::{
+    Comment,
+    CommentForm,
+    CommentLike,
+    CommentLikeForm,
+    CommentSaved,
+    CommentSavedForm,
+  },
 };
 
+pub trait Comment_ {
+  fn update_ap_id(conn: &PgConnection, comment_id: i32, apub_id: String) -> Result<Comment, Error>;
+  fn permadelete_for_creator(
+    conn: &PgConnection,
+    for_creator_id: i32,
+  ) -> Result<Vec<Comment>, Error>;
+  fn update_deleted(
+    conn: &PgConnection,
+    comment_id: i32,
+    new_deleted: bool,
+  ) -> Result<Comment, Error>;
+  fn update_removed(
+    conn: &PgConnection,
+    comment_id: i32,
+    new_removed: bool,
+  ) -> Result<Comment, Error>;
+  fn update_removed_for_creator(
+    conn: &PgConnection,
+    for_creator_id: i32,
+    new_removed: bool,
+  ) -> Result<Vec<Comment>, Error>;
+  fn update_read(conn: &PgConnection, comment_id: i32, new_read: bool) -> Result<Comment, Error>;
+  fn update_content(
+    conn: &PgConnection,
+    comment_id: i32,
+    new_content: &str,
+  ) -> Result<Comment, Error>;
+}
+
+impl Comment_ for Comment {
+  fn update_ap_id(conn: &PgConnection, comment_id: i32, apub_id: String) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::comment::dsl::*;
+
+    diesel::update(comment.find(comment_id))
+      .set(ap_id.eq(apub_id))
+      .get_result::<Self>(conn)
+  }
+
+  fn permadelete_for_creator(conn: &PgConnection, for_creator_id: i32) -> Result<Vec<Self>, Error> {
+    use lemmy_db_schema::schema::comment::dsl::*;
+    diesel::update(comment.filter(creator_id.eq(for_creator_id)))
+      .set((
+        content.eq("*Permananently Deleted*"),
+        deleted.eq(true),
+        updated.eq(naive_now()),
+      ))
+      .get_results::<Self>(conn)
+  }
+
+  fn update_deleted(
+    conn: &PgConnection,
+    comment_id: i32,
+    new_deleted: bool,
+  ) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::comment::dsl::*;
+    diesel::update(comment.find(comment_id))
+      .set((deleted.eq(new_deleted), updated.eq(naive_now())))
+      .get_result::<Self>(conn)
+  }
+
+  fn update_removed(
+    conn: &PgConnection,
+    comment_id: i32,
+    new_removed: bool,
+  ) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::comment::dsl::*;
+    diesel::update(comment.find(comment_id))
+      .set((removed.eq(new_removed), updated.eq(naive_now())))
+      .get_result::<Self>(conn)
+  }
+
+  fn update_removed_for_creator(
+    conn: &PgConnection,
+    for_creator_id: i32,
+    new_removed: bool,
+  ) -> Result<Vec<Self>, Error> {
+    use lemmy_db_schema::schema::comment::dsl::*;
+    diesel::update(comment.filter(creator_id.eq(for_creator_id)))
+      .set((removed.eq(new_removed), updated.eq(naive_now())))
+      .get_results::<Self>(conn)
+  }
+
+  fn update_read(conn: &PgConnection, comment_id: i32, new_read: bool) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::comment::dsl::*;
+    diesel::update(comment.find(comment_id))
+      .set(read.eq(new_read))
+      .get_result::<Self>(conn)
+  }
+
+  fn update_content(
+    conn: &PgConnection,
+    comment_id: i32,
+    new_content: &str,
+  ) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::comment::dsl::*;
+    diesel::update(comment.find(comment_id))
+      .set((content.eq(new_content), updated.eq(naive_now())))
+      .get_result::<Self>(conn)
+  }
+}
+
 impl Crud<CommentForm> for Comment {
   fn read(conn: &PgConnection, comment_id: i32) -> Result<Self, Error> {
     use lemmy_db_schema::schema::comment::dsl::*;
@@ -101,7 +205,7 @@ impl Saveable<CommentSavedForm> for CommentSaved {
 #[cfg(test)]
 mod tests {
   use crate::{
-    source::{community::*, user::*},
+    source::community::*,
     tests::establish_unpooled_connection,
     Crud,
     Likeable,
@@ -109,7 +213,11 @@ mod tests {
     Saveable,
     SortType,
   };
-  use lemmy_db_schema::source::{comment::*, post::*};
+  use lemmy_db_schema::source::{
+    comment::*,
+    post::*,
+    user::{UserForm, User_},
+  };
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/source/community.rs b/lemmy_db/src/source/community.rs
index 13045cca..795ed123 100644
--- a/lemmy_db/src/source/community.rs
+++ b/lemmy_db/src/source/community.rs
@@ -421,12 +421,8 @@ impl Followable<CommunityFollowerForm> for CommunityFollower {
 
 #[cfg(test)]
 mod tests {
-  use crate::{
-    source::{community::*, user::*},
-    tests::establish_unpooled_connection,
-    ListingType,
-    SortType,
-  };
+  use crate::{source::community::*, tests::establish_unpooled_connection, ListingType, SortType};
+  use lemmy_db_schema::source::user::*;
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/source/moderator.rs b/lemmy_db/src/source/moderator.rs
index eb6c2d56..ddb1407d 100644
--- a/lemmy_db/src/source/moderator.rs
+++ b/lemmy_db/src/source/moderator.rs
@@ -391,12 +391,12 @@ impl Crud<ModAddForm> for ModAdd {
 #[cfg(test)]
 mod tests {
   use crate::{
-    source::{community::*, moderator::*, user::*},
+    source::{community::*, moderator::*},
     tests::establish_unpooled_connection,
     ListingType,
     SortType,
   };
-  use lemmy_db_schema::source::{comment::*, post::*};
+  use lemmy_db_schema::source::{comment::*, post::*, user::*};
 
   // use Crud;
   #[test]
diff --git a/lemmy_db/src/source/password_reset_request.rs b/lemmy_db/src/source/password_reset_request.rs
index 3c9969e4..ae38f1c1 100644
--- a/lemmy_db/src/source/password_reset_request.rs
+++ b/lemmy_db/src/source/password_reset_request.rs
@@ -75,7 +75,6 @@ impl PasswordResetRequest {
 
 #[cfg(test)]
 mod tests {
-  use super::super::user::*;
   use crate::{
     source::password_reset_request::PasswordResetRequest,
     tests::establish_unpooled_connection,
@@ -83,6 +82,7 @@ mod tests {
     ListingType,
     SortType,
   };
+  use lemmy_db_schema::source::user::*;
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/source/post.rs b/lemmy_db/src/source/post.rs
index 5e8dc1cc..688ef39f 100644
--- a/lemmy_db/src/source/post.rs
+++ b/lemmy_db/src/source/post.rs
@@ -1,14 +1,17 @@
 use crate::{ApubObject, Crud, Likeable, Readable, Saveable};
 use diesel::{dsl::*, result::Error, *};
-use lemmy_db_schema::source::post::{
-  Post,
-  PostForm,
-  PostLike,
-  PostLikeForm,
-  PostRead,
-  PostReadForm,
-  PostSaved,
-  PostSavedForm,
+use lemmy_db_schema::{
+  naive_now,
+  source::post::{
+    Post,
+    PostForm,
+    PostLike,
+    PostLikeForm,
+    PostRead,
+    PostReadForm,
+    PostSaved,
+    PostSavedForm,
+  },
 };
 
 impl Crud<PostForm> for Post {
@@ -35,6 +38,119 @@ impl Crud<PostForm> for Post {
   }
 }
 
+pub trait Post_ {
+  //fn read(conn: &PgConnection, post_id: i32) -> Result<Post, Error>;
+  fn list_for_community(conn: &PgConnection, the_community_id: i32) -> Result<Vec<Post>, Error>;
+  fn update_ap_id(conn: &PgConnection, post_id: i32, apub_id: String) -> Result<Post, Error>;
+  fn permadelete_for_creator(conn: &PgConnection, for_creator_id: i32) -> Result<Vec<Post>, Error>;
+  fn update_deleted(conn: &PgConnection, post_id: i32, new_deleted: bool) -> Result<Post, Error>;
+  fn update_removed(conn: &PgConnection, post_id: i32, new_removed: bool) -> Result<Post, Error>;
+  fn update_removed_for_creator(
+    conn: &PgConnection,
+    for_creator_id: i32,
+    for_community_id: Option<i32>,
+    new_removed: bool,
+  ) -> Result<Vec<Post>, Error>;
+  fn update_locked(conn: &PgConnection, post_id: i32, new_locked: bool) -> Result<Post, Error>;
+  fn update_stickied(conn: &PgConnection, post_id: i32, new_stickied: bool) -> Result<Post, Error>;
+  fn is_post_creator(user_id: i32, post_creator_id: i32) -> bool;
+}
+
+impl Post_ for Post {
+  // TODO: this is a duplicate?
+  //fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> {
+  //  use lemmy_db_schema::schema::post::dsl::*;
+  //  post.filter(id.eq(post_id)).first::<Self>(conn)
+  //}
+
+  fn list_for_community(conn: &PgConnection, the_community_id: i32) -> Result<Vec<Self>, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+    post
+      .filter(community_id.eq(the_community_id))
+      .then_order_by(published.desc())
+      .then_order_by(stickied.desc())
+      .limit(20)
+      .load::<Self>(conn)
+  }
+
+  fn update_ap_id(conn: &PgConnection, post_id: i32, apub_id: String) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+
+    diesel::update(post.find(post_id))
+      .set(ap_id.eq(apub_id))
+      .get_result::<Self>(conn)
+  }
+
+  fn permadelete_for_creator(conn: &PgConnection, for_creator_id: i32) -> Result<Vec<Self>, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+
+    let perma_deleted = "*Permananently Deleted*";
+    let perma_deleted_url = "https://deleted.com";
+
+    diesel::update(post.filter(creator_id.eq(for_creator_id)))
+      .set((
+        name.eq(perma_deleted),
+        url.eq(perma_deleted_url),
+        body.eq(perma_deleted),
+        deleted.eq(true),
+        updated.eq(naive_now()),
+      ))
+      .get_results::<Self>(conn)
+  }
+
+  fn update_deleted(conn: &PgConnection, post_id: i32, new_deleted: bool) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+    diesel::update(post.find(post_id))
+      .set((deleted.eq(new_deleted), updated.eq(naive_now())))
+      .get_result::<Self>(conn)
+  }
+
+  fn update_removed(conn: &PgConnection, post_id: i32, new_removed: bool) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+    diesel::update(post.find(post_id))
+      .set((removed.eq(new_removed), updated.eq(naive_now())))
+      .get_result::<Self>(conn)
+  }
+
+  fn update_removed_for_creator(
+    conn: &PgConnection,
+    for_creator_id: i32,
+    for_community_id: Option<i32>,
+    new_removed: bool,
+  ) -> Result<Vec<Self>, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+
+    let mut update = diesel::update(post).into_boxed();
+    update = update.filter(creator_id.eq(for_creator_id));
+
+    if let Some(for_community_id) = for_community_id {
+      update = update.filter(community_id.eq(for_community_id));
+    }
+
+    update
+      .set((removed.eq(new_removed), updated.eq(naive_now())))
+      .get_results::<Self>(conn)
+  }
+
+  fn update_locked(conn: &PgConnection, post_id: i32, new_locked: bool) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+    diesel::update(post.find(post_id))
+      .set(locked.eq(new_locked))
+      .get_result::<Self>(conn)
+  }
+
+  fn update_stickied(conn: &PgConnection, post_id: i32, new_stickied: bool) -> Result<Self, Error> {
+    use lemmy_db_schema::schema::post::dsl::*;
+    diesel::update(post.find(post_id))
+      .set(stickied.eq(new_stickied))
+      .get_result::<Self>(conn)
+  }
+
+  fn is_post_creator(user_id: i32, post_creator_id: i32) -> bool {
+    user_id == post_creator_id
+  }
+}
+
 impl ApubObject<PostForm> for Post {
   fn read_from_apub_id(conn: &PgConnection, object_id: &str) -> Result<Self, Error> {
     use lemmy_db_schema::schema::post::dsl::*;
@@ -116,11 +232,12 @@ impl Readable<PostReadForm> for PostRead {
 #[cfg(test)]
 mod tests {
   use crate::{
-    source::{community::*, post::*, user::*},
+    source::{community::*, post::*},
     tests::establish_unpooled_connection,
     ListingType,
     SortType,
   };
+  use lemmy_db_schema::source::user::*;
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/source/private_message.rs b/lemmy_db/src/source/private_message.rs
index fd73a864..1177eaa9 100644
--- a/lemmy_db/src/source/private_message.rs
+++ b/lemmy_db/src/source/private_message.rs
@@ -140,11 +140,12 @@ impl PrivateMessage {
 #[cfg(test)]
 mod tests {
   use crate::{
-    source::{private_message::*, user::*},
+    source::private_message::*,
     tests::establish_unpooled_connection,
     ListingType,
     SortType,
   };
+  use lemmy_db_schema::source::user::*;
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/source/user.rs b/lemmy_db/src/source/user.rs
index 6bca769e..7461f4b4 100644
--- a/lemmy_db/src/source/user.rs
+++ b/lemmy_db/src/source/user.rs
@@ -3,65 +3,15 @@ use bcrypt::{hash, DEFAULT_COST};
 use diesel::{dsl::*, result::Error, *};
 use lemmy_db_schema::{
   naive_now,
-  schema::{user_, user_::dsl::*, user_alias_1, user_alias_2},
+  schema::user_::dsl::*,
+  source::user::{UserForm, User_},
 };
 use lemmy_utils::settings::Settings;
-use serde::Serialize;
-
-#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
-#[table_name = "user_"]
-pub struct User_ {
-  pub id: i32,
-  pub name: String,
-  pub preferred_username: Option<String>,
-  pub password_encrypted: String,
-  pub email: Option<String>,
-  pub avatar: Option<String>,
-  pub admin: bool,
-  pub banned: bool,
-  pub published: chrono::NaiveDateTime,
-  pub updated: Option<chrono::NaiveDateTime>,
-  pub show_nsfw: bool,
-  pub theme: String,
-  pub default_sort_type: i16,
-  pub default_listing_type: i16,
-  pub lang: String,
-  pub show_avatars: bool,
-  pub send_notifications_to_email: bool,
-  pub matrix_user_id: Option<String>,
-  pub actor_id: String,
-  pub bio: Option<String>,
-  pub local: bool,
-  pub private_key: Option<String>,
-  pub public_key: Option<String>,
-  pub last_refreshed_at: chrono::NaiveDateTime,
-  pub banner: Option<String>,
-  pub deleted: bool,
-}
-
-/// A safe representation of user, without the sensitive info
-#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
-#[table_name = "user_"]
-pub struct UserSafe {
-  pub id: i32,
-  pub name: String,
-  pub preferred_username: Option<String>,
-  pub avatar: Option<String>,
-  pub admin: bool,
-  pub banned: bool,
-  pub published: chrono::NaiveDateTime,
-  pub updated: Option<chrono::NaiveDateTime>,
-  pub matrix_user_id: Option<String>,
-  pub actor_id: String,
-  pub bio: Option<String>,
-  pub local: bool,
-  pub banner: Option<String>,
-  pub deleted: bool,
-}
 
 mod safe_type {
-  use crate::{source::user::User_, ToSafe};
-  use lemmy_db_schema::schema::user_::columns::*;
+  use crate::ToSafe;
+  use lemmy_db_schema::{schema::user_::columns::*, source::user::User_};
+
   type Columns = (
     id,
     name,
@@ -102,59 +52,10 @@ mod safe_type {
   }
 }
 
-#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
-#[table_name = "user_alias_1"]
-pub struct UserAlias1 {
-  pub id: i32,
-  pub name: String,
-  pub preferred_username: Option<String>,
-  pub password_encrypted: String,
-  pub email: Option<String>,
-  pub avatar: Option<String>,
-  pub admin: bool,
-  pub banned: bool,
-  pub published: chrono::NaiveDateTime,
-  pub updated: Option<chrono::NaiveDateTime>,
-  pub show_nsfw: bool,
-  pub theme: String,
-  pub default_sort_type: i16,
-  pub default_listing_type: i16,
-  pub lang: String,
-  pub show_avatars: bool,
-  pub send_notifications_to_email: bool,
-  pub matrix_user_id: Option<String>,
-  pub actor_id: String,
-  pub bio: Option<String>,
-  pub local: bool,
-  pub private_key: Option<String>,
-  pub public_key: Option<String>,
-  pub last_refreshed_at: chrono::NaiveDateTime,
-  pub banner: Option<String>,
-  pub deleted: bool,
-}
-
-#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
-#[table_name = "user_alias_1"]
-pub struct UserSafeAlias1 {
-  pub id: i32,
-  pub name: String,
-  pub preferred_username: Option<String>,
-  pub avatar: Option<String>,
-  pub admin: bool,
-  pub banned: bool,
-  pub published: chrono::NaiveDateTime,
-  pub updated: Option<chrono::NaiveDateTime>,
-  pub matrix_user_id: Option<String>,
-  pub actor_id: String,
-  pub bio: Option<String>,
-  pub local: bool,
-  pub banner: Option<String>,
-  pub deleted: bool,
-}
-
 mod safe_type_alias_1 {
-  use crate::{source::user::UserAlias1, ToSafe};
-  use lemmy_db_schema::schema::user_alias_1::columns::*;
+  use crate::ToSafe;
+  use lemmy_db_schema::{schema::user_alias_1::columns::*, source::user::UserAlias1};
+
   type Columns = (
     id,
     name,
@@ -195,59 +96,10 @@ mod safe_type_alias_1 {
   }
 }
 
-#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
-#[table_name = "user_alias_2"]
-pub struct UserAlias2 {
-  pub id: i32,
-  pub name: String,
-  pub preferred_username: Option<String>,
-  pub password_encrypted: String,
-  pub email: Option<String>,
-  pub avatar: Option<String>,
-  pub admin: bool,
-  pub banned: bool,
-  pub published: chrono::NaiveDateTime,
-  pub updated: Option<chrono::NaiveDateTime>,
-  pub show_nsfw: bool,
-  pub theme: String,
-  pub default_sort_type: i16,
-  pub default_listing_type: i16,
-  pub lang: String,
-  pub show_avatars: bool,
-  pub send_notifications_to_email: bool,
-  pub matrix_user_id: Option<String>,
-  pub actor_id: String,
-  pub bio: Option<String>,
-  pub local: bool,
-  pub private_key: Option<String>,
-  pub public_key: Option<String>,
-  pub last_refreshed_at: chrono::NaiveDateTime,
-  pub banner: Option<String>,
-  pub deleted: bool,
-}
-
-#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
-#[table_name = "user_alias_2"]
-pub struct UserSafeAlias2 {
-  pub id: i32,
-  pub name: String,
-  pub preferred_username: Option<String>,
-  pub avatar: Option<String>,
-  pub admin: bool,
-  pub banned: bool,
-  pub published: chrono::NaiveDateTime,
-  pub updated: Option<chrono::NaiveDateTime>,
-  pub matrix_user_id: Option<String>,
-  pub actor_id: String,
-  pub bio: Option<String>,
-  pub local: bool,
-  pub banner: Option<String>,
-  pub deleted: bool,
-}
-
 mod safe_type_alias_2 {
-  use crate::{source::user::UserAlias2, ToSafe};
-  use lemmy_db_schema::schema::user_alias_2::columns::*;
+  use crate::ToSafe;
+  use lemmy_db_schema::{schema::user_alias_2::columns::*, source::user::UserAlias2};
+
   type Columns = (
     id,
     name,
@@ -288,35 +140,6 @@ mod safe_type_alias_2 {
   }
 }
 
-#[derive(Insertable, AsChangeset, Clone)]
-#[table_name = "user_"]
-pub struct UserForm {
-  pub name: String,
-  pub preferred_username: Option<Option<String>>,
-  pub password_encrypted: String,
-  pub admin: bool,
-  pub banned: Option<bool>,
-  pub email: Option<Option<String>>,
-  pub avatar: Option<Option<String>>,
-  pub published: Option<chrono::NaiveDateTime>,
-  pub updated: Option<chrono::NaiveDateTime>,
-  pub show_nsfw: bool,
-  pub theme: String,
-  pub default_sort_type: i16,
-  pub default_listing_type: i16,
-  pub lang: String,
-  pub show_avatars: bool,
-  pub send_notifications_to_email: bool,
-  pub matrix_user_id: Option<Option<String>>,
-  pub actor_id: Option<String>,
-  pub bio: Option<Option<String>>,
-  pub local: bool,
-  pub private_key: Option<String>,
-  pub public_key: Option<String>,
-  pub last_refreshed_at: Option<chrono::NaiveDateTime>,
-  pub banner: Option<Option<String>>,
-}
-
 impl Crud<UserForm> for User_ {
   fn read(conn: &PgConnection, user_id: i32) -> Result<Self, Error> {
     user_
@@ -356,8 +179,26 @@ impl ApubObject<UserForm> for User_ {
   }
 }
 
-impl User_ {
-  pub fn register(conn: &PgConnection, form: &UserForm) -> Result<Self, Error> {
+pub trait User {
+  fn register(conn: &PgConnection, form: &UserForm) -> Result<User_, Error>;
+  fn update_password(conn: &PgConnection, user_id: i32, new_password: &str)
+    -> Result<User_, Error>;
+  fn read_from_name(conn: &PgConnection, from_user_name: &str) -> Result<User_, Error>;
+  fn add_admin(conn: &PgConnection, user_id: i32, added: bool) -> Result<User_, Error>;
+  fn ban_user(conn: &PgConnection, user_id: i32, ban: bool) -> Result<User_, Error>;
+  fn find_by_email_or_username(
+    conn: &PgConnection,
+    username_or_email: &str,
+  ) -> Result<User_, Error>;
+  fn find_by_username(conn: &PgConnection, username: &str) -> Result<User_, Error>;
+  fn find_by_email(conn: &PgConnection, from_email: &str) -> Result<User_, Error>;
+  fn get_profile_url(&self, hostname: &str) -> String;
+  fn mark_as_updated(conn: &PgConnection, user_id: i32) -> Result<User_, Error>;
+  fn delete_account(conn: &PgConnection, user_id: i32) -> Result<User_, Error>;
+}
+
+impl User for User_ {
+  fn register(conn: &PgConnection, form: &UserForm) -> Result<Self, Error> {
     let mut edited_user = form.clone();
     let password_hash =
       hash(&form.password_encrypted, DEFAULT_COST).expect("Couldn't hash password");
@@ -367,11 +208,7 @@ impl User_ {
   }
 
   // TODO do more individual updates like these
-  pub fn update_password(
-    conn: &PgConnection,
-    user_id: i32,
-    new_password: &str,
-  ) -> Result<Self, Error> {
+  fn update_password(conn: &PgConnection, user_id: i32, new_password: &str) -> Result<Self, Error> {
     let password_hash = hash(new_password, DEFAULT_COST).expect("Couldn't hash password");
 
     diesel::update(user_.find(user_id))
@@ -382,7 +219,7 @@ impl User_ {
       .get_result::<Self>(conn)
   }
 
-  pub fn read_from_name(conn: &PgConnection, from_user_name: &str) -> Result<Self, Error> {
+  fn read_from_name(conn: &PgConnection, from_user_name: &str) -> Result<Self, Error> {
     user_
       .filter(local.eq(true))
       .filter(deleted.eq(false))
@@ -390,19 +227,19 @@ impl User_ {
       .first::<Self>(conn)
   }
 
-  pub fn add_admin(conn: &PgConnection, user_id: i32, added: bool) -> Result<Self, Error> {
+  fn add_admin(conn: &PgConnection, user_id: i32, added: bool) -> Result<Self, Error> {
     diesel::update(user_.find(user_id))
       .set(admin.eq(added))
       .get_result::<Self>(conn)
   }
 
-  pub fn ban_user(conn: &PgConnection, user_id: i32, ban: bool) -> Result<Self, Error> {
+  fn ban_user(conn: &PgConnection, user_id: i32, ban: bool) -> Result<Self, Error> {
     diesel::update(user_.find(user_id))
       .set(banned.eq(ban))
       .get_result::<Self>(conn)
   }
 
-  pub fn find_by_email_or_username(
+  fn find_by_email_or_username(
     conn: &PgConnection,
     username_or_email: &str,
   ) -> Result<Self, Error> {
@@ -413,7 +250,7 @@ impl User_ {
     }
   }
 
-  pub fn find_by_username(conn: &PgConnection, username: &str) -> Result<User_, Error> {
+  fn find_by_username(conn: &PgConnection, username: &str) -> Result<User_, Error> {
     user_
       .filter(deleted.eq(false))
       .filter(local.eq(true))
@@ -421,7 +258,7 @@ impl User_ {
       .first::<User_>(conn)
   }
 
-  pub fn find_by_email(conn: &PgConnection, from_email: &str) -> Result<User_, Error> {
+  fn find_by_email(conn: &PgConnection, from_email: &str) -> Result<User_, Error> {
     user_
       .filter(deleted.eq(false))
       .filter(local.eq(true))
@@ -429,7 +266,7 @@ impl User_ {
       .first::<User_>(conn)
   }
 
-  pub fn get_profile_url(&self, hostname: &str) -> String {
+  fn get_profile_url(&self, hostname: &str) -> String {
     format!(
       "{}://{}/u/{}",
       Settings::get().get_protocol_string(),
@@ -438,13 +275,13 @@ impl User_ {
     )
   }
 
-  pub fn mark_as_updated(conn: &PgConnection, user_id: i32) -> Result<User_, Error> {
+  fn mark_as_updated(conn: &PgConnection, user_id: i32) -> Result<User_, Error> {
     diesel::update(user_.find(user_id))
       .set((last_refreshed_at.eq(naive_now()),))
       .get_result::<Self>(conn)
   }
 
-  pub fn delete_account(conn: &PgConnection, user_id: i32) -> Result<User_, Error> {
+  fn delete_account(conn: &PgConnection, user_id: i32) -> Result<User_, Error> {
     diesel::update(user_.find(user_id))
       .set((
         preferred_username.eq::<Option<String>>(None),
diff --git a/lemmy_db/src/source/user_mention.rs b/lemmy_db/src/source/user_mention.rs
index 5df17286..64e24d32 100644
--- a/lemmy_db/src/source/user_mention.rs
+++ b/lemmy_db/src/source/user_mention.rs
@@ -79,12 +79,12 @@ impl UserMention {
 #[cfg(test)]
 mod tests {
   use crate::{
-    source::{community::*, user::*, user_mention::*},
+    source::{community::*, user_mention::*},
     tests::establish_unpooled_connection,
     ListingType,
     SortType,
   };
-  use lemmy_db_schema::source::{comment::*, post::*};
+  use lemmy_db_schema::source::{comment::*, post::*, user::*};
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/views/comment_report_view.rs b/lemmy_db/src/views/comment_report_view.rs
index b067a9ec..0bfd6fe8 100644
--- a/lemmy_db/src/views/comment_report_view.rs
+++ b/lemmy_db/src/views/comment_report_view.rs
@@ -3,7 +3,6 @@ use crate::{
   source::{
     comment_report::CommentReport,
     community::{Community, CommunitySafe},
-    user::{UserAlias1, UserAlias2, UserSafe, UserSafeAlias1, UserSafeAlias2, User_},
   },
   views::ViewToVec,
   MaybeOptional,
@@ -12,7 +11,11 @@ use crate::{
 use diesel::{result::Error, *};
 use lemmy_db_schema::{
   schema::{comment, comment_report, community, post, user_, user_alias_1, user_alias_2},
-  source::{comment::Comment, post::Post},
+  source::{
+    comment::Comment,
+    post::Post,
+    user::{UserAlias1, UserAlias2, UserSafe, UserSafeAlias1, UserSafeAlias2, User_},
+  },
 };
 use serde::Serialize;
 
diff --git a/lemmy_db/src/views/comment_view.rs b/lemmy_db/src/views/comment_view.rs
index d4680a34..3628b583 100644
--- a/lemmy_db/src/views/comment_view.rs
+++ b/lemmy_db/src/views/comment_view.rs
@@ -3,10 +3,7 @@ use crate::{
   functions::hot_rank,
   fuzzy_search,
   limit_and_offset,
-  source::{
-    community::{Community, CommunityFollower, CommunitySafe, CommunityUserBan},
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
-  },
+  source::community::{Community, CommunityFollower, CommunitySafe, CommunityUserBan},
   views::ViewToVec,
   ListingType,
   MaybeOptional,
@@ -31,6 +28,7 @@ use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentAlias1, CommentSaved},
     post::Post,
+    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
   },
 };
 use serde::Serialize;
@@ -412,14 +410,14 @@ impl ViewToVec for CommentView {
 #[cfg(test)]
 mod tests {
   use crate::{
-    source::{community::*, user::*},
+    source::community::*,
     tests::establish_unpooled_connection,
     views::comment_view::*,
     Crud,
     Likeable,
     *,
   };
-  use lemmy_db_schema::source::{comment::*, post::*};
+  use lemmy_db_schema::source::{comment::*, post::*, user::*};
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/views/community/community_follower_view.rs b/lemmy_db/src/views/community/community_follower_view.rs
index 243b9142..144481ce 100644
--- a/lemmy_db/src/views/community/community_follower_view.rs
+++ b/lemmy_db/src/views/community/community_follower_view.rs
@@ -1,13 +1,13 @@
 use crate::{
-  source::{
-    community::{Community, CommunitySafe},
-    user::{UserSafe, User_},
-  },
+  source::community::{Community, CommunitySafe},
   views::ViewToVec,
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{community, community_follower, user_};
+use lemmy_db_schema::{
+  schema::{community, community_follower, user_},
+  source::user::{UserSafe, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/community/community_moderator_view.rs b/lemmy_db/src/views/community/community_moderator_view.rs
index 8762b975..ffd2f622 100644
--- a/lemmy_db/src/views/community/community_moderator_view.rs
+++ b/lemmy_db/src/views/community/community_moderator_view.rs
@@ -1,13 +1,13 @@
 use crate::{
-  source::{
-    community::{Community, CommunitySafe},
-    user::{UserSafe, User_},
-  },
+  source::community::{Community, CommunitySafe},
   views::ViewToVec,
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{community, community_moderator, user_};
+use lemmy_db_schema::{
+  schema::{community, community_moderator, user_},
+  source::user::{UserSafe, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/community/community_user_ban_view.rs b/lemmy_db/src/views/community/community_user_ban_view.rs
index 5dba4ebd..80ac78cc 100644
--- a/lemmy_db/src/views/community/community_user_ban_view.rs
+++ b/lemmy_db/src/views/community/community_user_ban_view.rs
@@ -1,12 +1,12 @@
 use crate::{
-  source::{
-    community::{Community, CommunitySafe},
-    user::{UserSafe, User_},
-  },
+  source::community::{Community, CommunitySafe},
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{community, community_user_ban, user_};
+use lemmy_db_schema::{
+  schema::{community, community_user_ban, user_},
+  source::user::{UserSafe, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/community/community_view.rs b/lemmy_db/src/views/community/community_view.rs
index 6c951b33..bd711936 100644
--- a/lemmy_db/src/views/community/community_view.rs
+++ b/lemmy_db/src/views/community/community_view.rs
@@ -6,7 +6,6 @@ use crate::{
   source::{
     category::Category,
     community::{Community, CommunityFollower, CommunitySafe},
-    user::{UserSafe, User_},
   },
   views::ViewToVec,
   MaybeOptional,
@@ -14,12 +13,9 @@ use crate::{
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{
-  category,
-  community,
-  community_aggregates,
-  community_follower,
-  user_,
+use lemmy_db_schema::{
+  schema::{category, community, community_aggregates, community_follower, user_},
+  source::user::{UserSafe, User_},
 };
 use serde::Serialize;
 
diff --git a/lemmy_db/src/views/moderator/mod_add_community_view.rs b/lemmy_db/src/views/moderator/mod_add_community_view.rs
index 1dd7cfc4..2e048322 100644
--- a/lemmy_db/src/views/moderator/mod_add_community_view.rs
+++ b/lemmy_db/src/views/moderator/mod_add_community_view.rs
@@ -3,13 +3,15 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     moderator::ModAddCommunity,
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
   },
   views::ViewToVec,
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{community, mod_add_community, user_, user_alias_1};
+use lemmy_db_schema::{
+  schema::{community, mod_add_community, user_, user_alias_1},
+  source::user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/moderator/mod_add_view.rs b/lemmy_db/src/views/moderator/mod_add_view.rs
index 06648ad7..c724e826 100644
--- a/lemmy_db/src/views/moderator/mod_add_view.rs
+++ b/lemmy_db/src/views/moderator/mod_add_view.rs
@@ -1,14 +1,9 @@
-use crate::{
-  limit_and_offset,
-  source::{
-    moderator::ModAdd,
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
-  },
-  views::ViewToVec,
-  ToSafe,
-};
+use crate::{limit_and_offset, source::moderator::ModAdd, views::ViewToVec, ToSafe};
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{mod_add, user_, user_alias_1};
+use lemmy_db_schema::{
+  schema::{mod_add, user_, user_alias_1},
+  source::user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/moderator/mod_ban_from_community_view.rs b/lemmy_db/src/views/moderator/mod_ban_from_community_view.rs
index 3992518b..e31d6d19 100644
--- a/lemmy_db/src/views/moderator/mod_ban_from_community_view.rs
+++ b/lemmy_db/src/views/moderator/mod_ban_from_community_view.rs
@@ -3,13 +3,15 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     moderator::ModBanFromCommunity,
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
   },
   views::ViewToVec,
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{community, mod_ban_from_community, user_, user_alias_1};
+use lemmy_db_schema::{
+  schema::{community, mod_ban_from_community, user_, user_alias_1},
+  source::user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/moderator/mod_ban_view.rs b/lemmy_db/src/views/moderator/mod_ban_view.rs
index 52e89025..2a3edb6c 100644
--- a/lemmy_db/src/views/moderator/mod_ban_view.rs
+++ b/lemmy_db/src/views/moderator/mod_ban_view.rs
@@ -1,14 +1,9 @@
-use crate::{
-  limit_and_offset,
-  source::{
-    moderator::ModBan,
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
-  },
-  views::ViewToVec,
-  ToSafe,
-};
+use crate::{limit_and_offset, source::moderator::ModBan, views::ViewToVec, ToSafe};
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{mod_ban, user_, user_alias_1};
+use lemmy_db_schema::{
+  schema::{mod_ban, user_, user_alias_1},
+  source::user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/moderator/mod_lock_post_view.rs b/lemmy_db/src/views/moderator/mod_lock_post_view.rs
index 685d83bb..9687e1b5 100644
--- a/lemmy_db/src/views/moderator/mod_lock_post_view.rs
+++ b/lemmy_db/src/views/moderator/mod_lock_post_view.rs
@@ -3,7 +3,6 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     moderator::ModLockPost,
-    user::{UserSafe, User_},
   },
   views::ViewToVec,
   ToSafe,
@@ -11,7 +10,10 @@ use crate::{
 use diesel::{result::Error, *};
 use lemmy_db_schema::{
   schema::{community, mod_lock_post, post, user_},
-  source::post::Post,
+  source::{
+    post::Post,
+    user::{UserSafe, User_},
+  },
 };
 use serde::Serialize;
 
diff --git a/lemmy_db/src/views/moderator/mod_remove_comment_view.rs b/lemmy_db/src/views/moderator/mod_remove_comment_view.rs
index 0c6519de..70fb8cbd 100644
--- a/lemmy_db/src/views/moderator/mod_remove_comment_view.rs
+++ b/lemmy_db/src/views/moderator/mod_remove_comment_view.rs
@@ -3,7 +3,6 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     moderator::ModRemoveComment,
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
   },
   views::ViewToVec,
   ToSafe,
@@ -11,7 +10,11 @@ use crate::{
 use diesel::{result::Error, *};
 use lemmy_db_schema::{
   schema::{comment, community, mod_remove_comment, post, user_, user_alias_1},
-  source::{comment::Comment, post::Post},
+  source::{
+    comment::Comment,
+    post::Post,
+    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
+  },
 };
 use serde::Serialize;
 
diff --git a/lemmy_db/src/views/moderator/mod_remove_community_view.rs b/lemmy_db/src/views/moderator/mod_remove_community_view.rs
index 1700ac2d..9e7fb6a4 100644
--- a/lemmy_db/src/views/moderator/mod_remove_community_view.rs
+++ b/lemmy_db/src/views/moderator/mod_remove_community_view.rs
@@ -3,13 +3,15 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     moderator::ModRemoveCommunity,
-    user::{UserSafe, User_},
   },
   views::ViewToVec,
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{community, mod_remove_community, user_};
+use lemmy_db_schema::{
+  schema::{community, mod_remove_community, user_},
+  source::user::{UserSafe, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/moderator/mod_remove_post_view.rs b/lemmy_db/src/views/moderator/mod_remove_post_view.rs
index 98aefd21..fe976c8e 100644
--- a/lemmy_db/src/views/moderator/mod_remove_post_view.rs
+++ b/lemmy_db/src/views/moderator/mod_remove_post_view.rs
@@ -3,7 +3,6 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     moderator::ModRemovePost,
-    user::{UserSafe, User_},
   },
   views::ViewToVec,
   ToSafe,
@@ -11,7 +10,10 @@ use crate::{
 use diesel::{result::Error, *};
 use lemmy_db_schema::{
   schema::{community, mod_remove_post, post, user_},
-  source::post::Post,
+  source::{
+    post::Post,
+    user::{UserSafe, User_},
+  },
 };
 use serde::Serialize;
 
diff --git a/lemmy_db/src/views/moderator/mod_sticky_post_view.rs b/lemmy_db/src/views/moderator/mod_sticky_post_view.rs
index 40672f8b..c51d083f 100644
--- a/lemmy_db/src/views/moderator/mod_sticky_post_view.rs
+++ b/lemmy_db/src/views/moderator/mod_sticky_post_view.rs
@@ -3,7 +3,6 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     moderator::ModStickyPost,
-    user::{UserSafe, User_},
   },
   views::ViewToVec,
   ToSafe,
@@ -11,7 +10,10 @@ use crate::{
 use diesel::{result::Error, *};
 use lemmy_db_schema::{
   schema::{community, mod_sticky_post, post, user_},
-  source::post::Post,
+  source::{
+    post::Post,
+    user::{UserSafe, User_},
+  },
 };
 use serde::Serialize;
 
diff --git a/lemmy_db/src/views/post_report_view.rs b/lemmy_db/src/views/post_report_view.rs
index 5e186239..9c42f776 100644
--- a/lemmy_db/src/views/post_report_view.rs
+++ b/lemmy_db/src/views/post_report_view.rs
@@ -3,7 +3,6 @@ use crate::{
   source::{
     community::{Community, CommunitySafe},
     post_report::PostReport,
-    user::{UserAlias1, UserAlias2, UserSafe, UserSafeAlias1, UserSafeAlias2, User_},
   },
   views::ViewToVec,
   MaybeOptional,
@@ -12,7 +11,10 @@ use crate::{
 use diesel::{result::Error, *};
 use lemmy_db_schema::{
   schema::{community, post, post_report, user_, user_alias_1, user_alias_2},
-  source::post::Post,
+  source::{
+    post::Post,
+    user::{UserAlias1, UserAlias2, UserSafe, UserSafeAlias1, UserSafeAlias2, User_},
+  },
 };
 use serde::Serialize;
 
diff --git a/lemmy_db/src/views/post_view.rs b/lemmy_db/src/views/post_view.rs
index fb3fbbf3..e3bdd178 100644
--- a/lemmy_db/src/views/post_view.rs
+++ b/lemmy_db/src/views/post_view.rs
@@ -3,10 +3,7 @@ use crate::{
   functions::hot_rank,
   fuzzy_search,
   limit_and_offset,
-  source::{
-    community::{Community, CommunityFollower, CommunitySafe, CommunityUserBan},
-    user::{UserSafe, User_},
-  },
+  source::community::{Community, CommunityFollower, CommunitySafe, CommunityUserBan},
   views::ViewToVec,
   ListingType,
   MaybeOptional,
@@ -26,7 +23,10 @@ use lemmy_db_schema::{
     post_saved,
     user_,
   },
-  source::post::{Post, PostRead, PostSaved},
+  source::{
+    post::{Post, PostRead, PostSaved},
+    user::{UserSafe, User_},
+  },
 };
 use serde::Serialize;
 
@@ -408,14 +408,14 @@ impl ViewToVec for PostView {
 mod tests {
   use crate::{
     aggregates::post_aggregates::PostAggregates,
-    source::{community::*, user::*},
+    source::community::*,
     tests::establish_unpooled_connection,
     views::post_view::{PostQueryBuilder, PostView},
     Crud,
     Likeable,
     *,
   };
-  use lemmy_db_schema::source::post::*;
+  use lemmy_db_schema::source::{post::*, user::*};
 
   #[test]
   fn test_crud() {
diff --git a/lemmy_db/src/views/private_message_view.rs b/lemmy_db/src/views/private_message_view.rs
index 5d594b12..fa531976 100644
--- a/lemmy_db/src/views/private_message_view.rs
+++ b/lemmy_db/src/views/private_message_view.rs
@@ -1,15 +1,15 @@
 use crate::{
   limit_and_offset,
-  source::{
-    private_message::PrivateMessage,
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
-  },
+  source::private_message::PrivateMessage,
   views::ViewToVec,
   MaybeOptional,
   ToSafe,
 };
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{private_message, user_, user_alias_1};
+use lemmy_db_schema::{
+  schema::{private_message, user_, user_alias_1},
+  source::user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, PartialEq, Serialize, Clone)]
diff --git a/lemmy_db/src/views/site_view.rs b/lemmy_db/src/views/site_view.rs
index d956e2e1..362c808d 100644
--- a/lemmy_db/src/views/site_view.rs
+++ b/lemmy_db/src/views/site_view.rs
@@ -1,12 +1,9 @@
-use crate::{
-  source::{
-    site::Site,
-    user::{UserSafe, User_},
-  },
-  ToSafe,
-};
+use crate::{source::site::Site, ToSafe};
 use diesel::{result::Error, *};
-use lemmy_db_schema::schema::{site, user_};
+use lemmy_db_schema::{
+  schema::{site, user_},
+  source::user::{UserSafe, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db/src/views/user_mention_view.rs b/lemmy_db/src/views/user_mention_view.rs
index 61fb5626..61a788a4 100644
--- a/lemmy_db/src/views/user_mention_view.rs
+++ b/lemmy_db/src/views/user_mention_view.rs
@@ -4,7 +4,6 @@ use crate::{
   limit_and_offset,
   source::{
     community::{Community, CommunityFollower, CommunitySafe, CommunityUserBan},
-    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
     user_mention::UserMention,
   },
   views::ViewToVec,
@@ -30,6 +29,7 @@ use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentSaved},
     post::Post,
+    user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
   },
 };
 use serde::Serialize;
diff --git a/lemmy_db/src/views/user_view.rs b/lemmy_db/src/views/user_view.rs
index 8f59691a..f3109011 100644
--- a/lemmy_db/src/views/user_view.rs
+++ b/lemmy_db/src/views/user_view.rs
@@ -2,14 +2,16 @@ use crate::{
   aggregates::user_aggregates::UserAggregates,
   fuzzy_search,
   limit_and_offset,
-  source::user::{UserSafe, User_},
   views::ViewToVec,
   MaybeOptional,
   SortType,
   ToSafe,
 };
 use diesel::{dsl::*, result::Error, *};
-use lemmy_db_schema::schema::{user_, user_aggregates};
+use lemmy_db_schema::{
+  schema::{user_, user_aggregates},
+  source::user::{UserSafe, User_},
+};
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Clone)]
diff --git a/lemmy_db_schema/src/lib.rs b/lemmy_db_schema/src/lib.rs
index 11451d17..3868a3b7 100644
--- a/lemmy_db_schema/src/lib.rs
+++ b/lemmy_db_schema/src/lib.rs
@@ -6,6 +6,7 @@ use chrono::NaiveDateTime;
 pub mod schema;
 pub mod source;
 
+// TODO: can probably move this back to lemmy_db
 pub fn naive_now() -> NaiveDateTime {
   chrono::prelude::Utc::now().naive_utc()
 }
diff --git a/lemmy_db_schema/src/source/comment.rs b/lemmy_db_schema/src/source/comment.rs
index 34577640..8c553a51 100644
--- a/lemmy_db_schema/src/source/comment.rs
+++ b/lemmy_db_schema/src/source/comment.rs
@@ -1,9 +1,7 @@
 use crate::{
-  naive_now,
   schema::{comment, comment_alias_1, comment_like, comment_saved},
   source::post::Post,
 };
-use diesel::{result::Error, PgConnection, *};
 use serde::Serialize;
 use url::{ParseError, Url};
 
@@ -66,85 +64,6 @@ pub struct CommentForm {
   pub local: bool,
 }
 
-impl Comment {
-  pub fn update_ap_id(
-    conn: &PgConnection,
-    comment_id: i32,
-    apub_id: String,
-  ) -> Result<Self, Error> {
-    use crate::schema::comment::dsl::*;
-
-    diesel::update(comment.find(comment_id))
-      .set(ap_id.eq(apub_id))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn permadelete_for_creator(
-    conn: &PgConnection,
-    for_creator_id: i32,
-  ) -> Result<Vec<Self>, Error> {
-    use crate::schema::comment::dsl::*;
-    diesel::update(comment.filter(creator_id.eq(for_creator_id)))
-      .set((
-        content.eq("*Permananently Deleted*"),
-        deleted.eq(true),
-        updated.eq(naive_now()),
-      ))
-      .get_results::<Self>(conn)
-  }
-
-  pub fn update_deleted(
-    conn: &PgConnection,
-    comment_id: i32,
-    new_deleted: bool,
-  ) -> Result<Self, Error> {
-    use crate::schema::comment::dsl::*;
-    diesel::update(comment.find(comment_id))
-      .set((deleted.eq(new_deleted), updated.eq(naive_now())))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn update_removed(
-    conn: &PgConnection,
-    comment_id: i32,
-    new_removed: bool,
-  ) -> Result<Self, Error> {
-    use crate::schema::comment::dsl::*;
-    diesel::update(comment.find(comment_id))
-      .set((removed.eq(new_removed), updated.eq(naive_now())))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn update_removed_for_creator(
-    conn: &PgConnection,
-    for_creator_id: i32,
-    new_removed: bool,
-  ) -> Result<Vec<Self>, Error> {
-    use crate::schema::comment::dsl::*;
-    diesel::update(comment.filter(creator_id.eq(for_creator_id)))
-      .set((removed.eq(new_removed), updated.eq(naive_now())))
-      .get_results::<Self>(conn)
-  }
-
-  pub fn update_read(conn: &PgConnection, comment_id: i32, new_read: bool) -> Result<Self, Error> {
-    use crate::schema::comment::dsl::*;
-    diesel::update(comment.find(comment_id))
-      .set(read.eq(new_read))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn update_content(
-    conn: &PgConnection,
-    comment_id: i32,
-    new_content: &str,
-  ) -> Result<Self, Error> {
-    use crate::schema::comment::dsl::*;
-    diesel::update(comment.find(comment_id))
-      .set((content.eq(new_content), updated.eq(naive_now())))
-      .get_result::<Self>(conn)
-  }
-}
-
 impl CommentForm {
   pub fn get_ap_id(&self) -> Result<Url, ParseError> {
     Url::parse(&self.ap_id.as_ref().unwrap_or(&"not_a_url".to_string()))
diff --git a/lemmy_db_schema/src/source/mod.rs b/lemmy_db_schema/src/source/mod.rs
index 38203b5e..2a5d7a69 100644
--- a/lemmy_db_schema/src/source/mod.rs
+++ b/lemmy_db_schema/src/source/mod.rs
@@ -1,2 +1,3 @@
 pub mod comment;
 pub mod post;
+pub mod user;
diff --git a/lemmy_db_schema/src/source/post.rs b/lemmy_db_schema/src/source/post.rs
index a0b974e2..b0cc78e0 100644
--- a/lemmy_db_schema/src/source/post.rs
+++ b/lemmy_db_schema/src/source/post.rs
@@ -1,8 +1,4 @@
-use crate::{
-  naive_now,
-  schema::{post, post_like, post_read, post_saved},
-};
-use diesel::{result::Error, *};
+use crate::schema::{post, post_like, post_read, post_saved};
 use serde::Serialize;
 use url::{ParseError, Url};
 
@@ -53,118 +49,6 @@ pub struct PostForm {
   pub local: bool,
 }
 
-impl Post {
-  pub fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> {
-    use crate::schema::post::dsl::*;
-    post.filter(id.eq(post_id)).first::<Self>(conn)
-  }
-
-  pub fn list_for_community(
-    conn: &PgConnection,
-    the_community_id: i32,
-  ) -> Result<Vec<Self>, Error> {
-    use crate::schema::post::dsl::*;
-    post
-      .filter(community_id.eq(the_community_id))
-      .then_order_by(published.desc())
-      .then_order_by(stickied.desc())
-      .limit(20)
-      .load::<Self>(conn)
-  }
-
-  pub fn update_ap_id(conn: &PgConnection, post_id: i32, apub_id: String) -> Result<Self, Error> {
-    use crate::schema::post::dsl::*;
-
-    diesel::update(post.find(post_id))
-      .set(ap_id.eq(apub_id))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn permadelete_for_creator(
-    conn: &PgConnection,
-    for_creator_id: i32,
-  ) -> Result<Vec<Self>, Error> {
-    use crate::schema::post::dsl::*;
-
-    let perma_deleted = "*Permananently Deleted*";
-    let perma_deleted_url = "https://deleted.com";
-
-    diesel::update(post.filter(creator_id.eq(for_creator_id)))
-      .set((
-        name.eq(perma_deleted),
-        url.eq(perma_deleted_url),
-        body.eq(perma_deleted),
-        deleted.eq(true),
-        updated.eq(naive_now()),
-      ))
-      .get_results::<Self>(conn)
-  }
-
-  pub fn update_deleted(
-    conn: &PgConnection,
-    post_id: i32,
-    new_deleted: bool,
-  ) -> Result<Self, Error> {
-    use crate::schema::post::dsl::*;
-    diesel::update(post.find(post_id))
-      .set((deleted.eq(new_deleted), updated.eq(naive_now())))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn update_removed(
-    conn: &PgConnection,
-    post_id: i32,
-    new_removed: bool,
-  ) -> Result<Self, Error> {
-    use crate::schema::post::dsl::*;
-    diesel::update(post.find(post_id))
-      .set((removed.eq(new_removed), updated.eq(naive_now())))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn update_removed_for_creator(
-    conn: &PgConnection,
-    for_creator_id: i32,
-    for_community_id: Option<i32>,
-    new_removed: bool,
-  ) -> Result<Vec<Self>, Error> {
-    use crate::schema::post::dsl::*;
-
-    let mut update = diesel::update(post).into_boxed();
-    update = update.filter(creator_id.eq(for_creator_id));
-
-    if let Some(for_community_id) = for_community_id {
-      update = update.filter(community_id.eq(for_community_id));
-    }
-
-    update
-      .set((removed.eq(new_removed), updated.eq(naive_now())))
-      .get_results::<Self>(conn)
-  }
-
-  pub fn update_locked(conn: &PgConnection, post_id: i32, new_locked: bool) -> Result<Self, Error> {
-    use crate::schema::post::dsl::*;
-    diesel::update(post.find(post_id))
-      .set(locked.eq(new_locked))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn update_stickied(
-    conn: &PgConnection,
-    post_id: i32,
-    new_stickied: bool,
-  ) -> Result<Self, Error> {
-    use crate::schema::post::dsl::*;
-    diesel::update(post.find(post_id))
-      .set(stickied.eq(new_stickied))
-      .get_result::<Self>(conn)
-  }
-
-  pub fn is_post_creator(user_id: i32, post_creator_id: i32) -> bool {
-    user_id == post_creator_id
-  }
-}
-
 impl PostForm {
   pub fn get_ap_id(&self) -> Result<Url, ParseError> {
     Url::parse(&self.ap_id.as_ref().unwrap_or(&"not_a_url".to_string()))
diff --git a/lemmy_db_schema/src/source/user.rs b/lemmy_db_schema/src/source/user.rs
new file mode 100644
index 00000000..3d9d9e50
--- /dev/null
+++ b/lemmy_db_schema/src/source/user.rs
@@ -0,0 +1,182 @@
+use crate::schema::{user_, user_alias_1, user_alias_2};
+use serde::Serialize;
+
+#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
+#[table_name = "user_"]
+pub struct User_ {
+  pub id: i32,
+  pub name: String,
+  pub preferred_username: Option<String>,
+  pub password_encrypted: String,
+  pub email: Option<String>,
+  pub avatar: Option<String>,
+  pub admin: bool,
+  pub banned: bool,
+  pub published: chrono::NaiveDateTime,
+  pub updated: Option<chrono::NaiveDateTime>,
+  pub show_nsfw: bool,
+  pub theme: String,
+  pub default_sort_type: i16,
+  pub default_listing_type: i16,
+  pub lang: String,
+  pub show_avatars: bool,
+  pub send_notifications_to_email: bool,
+  pub matrix_user_id: Option<String>,
+  pub actor_id: String,
+  pub bio: Option<String>,
+  pub local: bool,
+  pub private_key: Option<String>,
+  pub public_key: Option<String>,
+  pub last_refreshed_at: chrono::NaiveDateTime,
+  pub banner: Option<String>,
+  pub deleted: bool,
+}
+
+/// A safe representation of user, without the sensitive info
+#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
+#[table_name = "user_"]
+pub struct UserSafe {
+  pub id: i32,
+  pub name: String,
+  pub preferred_username: Option<String>,
+  pub avatar: Option<String>,
+  pub admin: bool,
+  pub banned: bool,
+  pub published: chrono::NaiveDateTime,
+  pub updated: Option<chrono::NaiveDateTime>,
+  pub matrix_user_id: Option<String>,
+  pub actor_id: String,
+  pub bio: Option<String>,
+  pub local: bool,
+  pub banner: Option<String>,
+  pub deleted: bool,
+}
+
+#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
+#[table_name = "user_alias_1"]
+pub struct UserAlias1 {
+  pub id: i32,
+  pub name: String,
+  pub preferred_username: Option<String>,
+  pub password_encrypted: String,
+  pub email: Option<String>,
+  pub avatar: Option<String>,
+  pub admin: bool,
+  pub banned: bool,
+  pub published: chrono::NaiveDateTime,
+  pub updated: Option<chrono::NaiveDateTime>,
+  pub show_nsfw: bool,
+  pub theme: String,
+  pub default_sort_type: i16,
+  pub default_listing_type: i16,
+  pub lang: String,
+  pub show_avatars: bool,
+  pub send_notifications_to_email: bool,
+  pub matrix_user_id: Option<String>,
+  pub actor_id: String,
+  pub bio: Option<String>,
+  pub local: bool,
+  pub private_key: Option<String>,
+  pub public_key: Option<String>,
+  pub last_refreshed_at: chrono::NaiveDateTime,
+  pub banner: Option<String>,
+  pub deleted: bool,
+}
+
+#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
+#[table_name = "user_alias_1"]
+pub struct UserSafeAlias1 {
+  pub id: i32,
+  pub name: String,
+  pub preferred_username: Option<String>,
+  pub avatar: Option<String>,
+  pub admin: bool,
+  pub banned: bool,
+  pub published: chrono::NaiveDateTime,
+  pub updated: Option<chrono::NaiveDateTime>,
+  pub matrix_user_id: Option<String>,
+  pub actor_id: String,
+  pub bio: Option<String>,
+  pub local: bool,
+  pub banner: Option<String>,
+  pub deleted: bool,
+}
+
+#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
+#[table_name = "user_alias_2"]
+pub struct UserAlias2 {
+  pub id: i32,
+  pub name: String,
+  pub preferred_username: Option<String>,
+  pub password_encrypted: String,
+  pub email: Option<String>,
+  pub avatar: Option<String>,
+  pub admin: bool,
+  pub banned: bool,
+  pub published: chrono::NaiveDateTime,
+  pub updated: Option<chrono::NaiveDateTime>,
+  pub show_nsfw: bool,
+  pub theme: String,
+  pub default_sort_type: i16,
+  pub default_listing_type: i16,
+  pub lang: String,
+  pub show_avatars: bool,
+  pub send_notifications_to_email: bool,
+  pub matrix_user_id: Option<String>,
+  pub actor_id: String,
+  pub bio: Option<String>,
+  pub local: bool,
+  pub private_key: Option<String>,
+  pub public_key: Option<String>,
+  pub last_refreshed_at: chrono::NaiveDateTime,
+  pub banner: Option<String>,
+  pub deleted: bool,
+}
+
+#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
+#[table_name = "user_alias_2"]
+pub struct UserSafeAlias2 {
+  pub id: i32,
+  pub name: String,
+  pub preferred_username: Option<String>,
+  pub avatar: Option<String>,
+  pub admin: bool,
+  pub banned: bool,
+  pub published: chrono::NaiveDateTime,
+  pub updated: Option<chrono::NaiveDateTime>,
+  pub matrix_user_id: Option<String>,
+  pub actor_id: String,
+  pub bio: Option<String>,
+  pub local: bool,
+  pub banner: Option<String>,
+  pub deleted: bool,
+}
+
+#[derive(Insertable, AsChangeset, Clone)]
+#[table_name = "user_"]
+pub struct UserForm {
+  pub name: String,
+  pub preferred_username: Option<Option<String>>,
+  pub password_encrypted: String,
+  pub admin: bool,
+  pub banned: Option<bool>,
+  pub email: Option<Option<String>>,
+  pub avatar: Option<Option<String>>,
+  pub published: Option<chrono::NaiveDateTime>,
+  pub updated: Option<chrono::NaiveDateTime>,
+  pub show_nsfw: bool,
+  pub theme: String,
+  pub default_sort_type: i16,
+  pub default_listing_type: i16,
+  pub lang: String,
+  pub show_avatars: bool,
+  pub send_notifications_to_email: bool,
+  pub matrix_user_id: Option<Option<String>>,
+  pub actor_id: Option<String>,
+  pub bio: Option<Option<String>>,
+  pub local: bool,
+  pub private_key: Option<String>,
+  pub public_key: Option<String>,
+  pub last_refreshed_at: Option<chrono::NaiveDateTime>,
+  pub banner: Option<Option<String>>,
+}
diff --git a/lemmy_structs/src/lib.rs b/lemmy_structs/src/lib.rs
index 595f6d07..7c3fc5c3 100644
--- a/lemmy_structs/src/lib.rs
+++ b/lemmy_structs/src/lib.rs
@@ -8,13 +8,13 @@ pub mod websocket;
 use diesel::PgConnection;
 use lemmy_db::{
   source::{
-    user::User_,
+    user::User,
     user_mention::{UserMention, UserMentionForm},
   },
   Crud,
   DbPool,
 };
-use lemmy_db_schema::source::{comment::Comment, post::Post};
+use lemmy_db_schema::source::{comment::Comment, post::Post, user::User_};
 use lemmy_utils::{email::send_email, settings::Settings, utils::MentionData, LemmyError};
 use log::error;
 use serde::{Deserialize, Serialize};
diff --git a/lemmy_structs/src/site.rs b/lemmy_structs/src/site.rs
index 9209a542..0d154295 100644
--- a/lemmy_structs/src/site.rs
+++ b/lemmy_structs/src/site.rs
@@ -1,6 +1,6 @@
 use lemmy_db::{
   aggregates::site_aggregates::SiteAggregates,
-  source::{category::*, user::*},
+  source::category::*,
   views::{
     comment_view::CommentView,
     community::community_view::CommunityView,
@@ -20,6 +20,7 @@ use lemmy_db::{
     user_view::UserViewSafe,
   },
 };
+use lemmy_db_schema::source::user::User_;
 use serde::{Deserialize, Serialize};
 
 #[derive(Deserialize)]
diff --git a/src/code_migrations.rs b/src/code_migrations.rs
index c294be67..2afdfabd 100644
--- a/src/code_migrations.rs
+++ b/src/code_migrations.rs
@@ -5,15 +5,20 @@ use diesel::{
 };
 use lemmy_db::{
   source::{
+    comment::Comment_,
     community::{Community, CommunityForm},
+    post::Post_,
     private_message::PrivateMessage,
-    user::{UserForm, User_},
   },
   Crud,
 };
 use lemmy_db_schema::{
   naive_now,
-  source::{comment::Comment, post::Post},
+  source::{
+    comment::Comment,
+    post::Post,
+    user::{UserForm, User_},
+  },
 };
 use lemmy_utils::{
   apub::{generate_actor_keypair, make_apub_endpoint, EndpointType},
diff --git a/src/routes/feeds.rs b/src/routes/feeds.rs
index 7a4801f4..8a3ecbae 100644
--- a/src/routes/feeds.rs
+++ b/src/routes/feeds.rs
@@ -4,7 +4,7 @@ use chrono::{DateTime, NaiveDateTime, Utc};
 use diesel::PgConnection;
 use lemmy_api::claims::Claims;
 use lemmy_db::{
-  source::{community::Community, user::User_},
+  source::{community::Community, user::User},
   views::{
     comment_view::{CommentQueryBuilder, CommentView},
     post_view::{PostQueryBuilder, PostView},
@@ -14,6 +14,7 @@ use lemmy_db::{
   ListingType,
   SortType,
 };
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::blocking;
 use lemmy_utils::{settings::Settings, utils::markdown_to_html, LemmyError};
 use lemmy_websocket::LemmyContext;
diff --git a/src/routes/webfinger.rs b/src/routes/webfinger.rs
index d59b4e38..57c90c96 100644
--- a/src/routes/webfinger.rs
+++ b/src/routes/webfinger.rs
@@ -1,6 +1,7 @@
 use actix_web::{error::ErrorBadRequest, web::Query, *};
 use anyhow::anyhow;
-use lemmy_db::source::{community::Community, user::User_};
+use lemmy_db::source::{community::Community, user::User};
+use lemmy_db_schema::source::user::User_;
 use lemmy_structs::{blocking, WebFingerLink, WebFingerResponse};
 use lemmy_utils::{
   settings::Settings,
diff --git a/tests/integration_test.rs b/tests/integration_test.rs
index a61c8ff6..5a191352 100644
--- a/tests/integration_test.rs
+++ b/tests/integration_test.rs
@@ -29,14 +29,12 @@ use lemmy_apub::{
   },
 };
 use lemmy_db::{
-  source::{
-    community::{Community, CommunityForm},
-    user::{User_, *},
-  },
+  source::community::{Community, CommunityForm},
   Crud,
   ListingType,
   SortType,
 };
+use lemmy_db_schema::source::user::{UserForm, User_};
 use lemmy_rate_limit::{rate_limiter::RateLimiter, RateLimit};
 use lemmy_utils::{apub::generate_actor_keypair, settings::Settings};
 use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
-- 
2.44.1