mirror of https://github.com/LemmyNet/lemmy
Adding User and Community types.
parent
bb572f59a5
commit
b1cdbf7154
@ -1,8 +1,10 @@
|
||||
create table user_ (
|
||||
id serial primary key,
|
||||
name varchar(20) not null,
|
||||
password_encrypted varchar(200) not null,
|
||||
email varchar(200),
|
||||
preferred_username varchar(20),
|
||||
password_encrypted text not null,
|
||||
email text,
|
||||
icon bytea,
|
||||
startTime timestamp not null default now()
|
||||
)
|
||||
start_time timestamp not null default now()
|
||||
);
|
||||
|
||||
|
@ -1 +1,3 @@
|
||||
drop table community
|
||||
drop table community_user;
|
||||
drop table community_follower;
|
||||
drop table community;
|
||||
|
@ -1,5 +1,19 @@
|
||||
create table community (
|
||||
id serial primary key,
|
||||
name varchar(20) not null,
|
||||
starttime timestamp not null default now()
|
||||
)
|
||||
start_time timestamp not null default now()
|
||||
);
|
||||
|
||||
create table community_user (
|
||||
id serial primary key,
|
||||
community_id int references community on update cascade on delete cascade not null,
|
||||
fedi_user_id text not null,
|
||||
start_time timestamp not null default now()
|
||||
);
|
||||
|
||||
create table community_follower (
|
||||
id serial primary key,
|
||||
community_id int references community on update cascade on delete cascade not null,
|
||||
fedi_user_id text not null,
|
||||
start_time timestamp not null default now()
|
||||
);
|
||||
|
@ -1,2 +0,0 @@
|
||||
drop table community_user;
|
||||
-- drop type community_user_type;
|
@ -1,10 +0,0 @@
|
||||
-- No support for types yet, so just do 0,1,2
|
||||
-- create type community_user_type as enum ('creator', 'moderator', 'user');
|
||||
|
||||
create table community_user (
|
||||
id serial primary key,
|
||||
fedi_user_id varchar(100) not null,
|
||||
community_id int references community on update cascade on delete cascade,
|
||||
community_user_type smallint not null default 2,
|
||||
starttime timestamp not null default now()
|
||||
)
|
@ -0,0 +1,3 @@
|
||||
drop table post_like;
|
||||
drop table post_dislike;
|
||||
drop table post;
|
@ -0,0 +1,22 @@
|
||||
create table post (
|
||||
id serial primary key,
|
||||
name varchar(100) not null,
|
||||
url text not null,
|
||||
attributed_to text not null,
|
||||
start_time timestamp not null default now()
|
||||
);
|
||||
|
||||
create table post_like (
|
||||
id serial primary key,
|
||||
fedi_user_id text not null,
|
||||
post_id int references post on update cascade on delete cascade,
|
||||
start_time timestamp not null default now()
|
||||
);
|
||||
|
||||
create table post_dislike (
|
||||
id serial primary key,
|
||||
fedi_user_id text not null,
|
||||
post_id int references post on update cascade on delete cascade,
|
||||
start_time timestamp not null default now()
|
||||
);
|
||||
|
@ -0,0 +1,197 @@
|
||||
extern crate diesel;
|
||||
use schema::{community, community_user, community_follower};
|
||||
use diesel::*;
|
||||
use diesel::result::Error;
|
||||
use {Crud, Followable, Joinable};
|
||||
|
||||
#[derive(Queryable, Identifiable, PartialEq, Debug)]
|
||||
#[table_name="community"]
|
||||
pub struct Community {
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
pub start_time: chrono::NaiveDateTime
|
||||
}
|
||||
|
||||
#[derive(Insertable, AsChangeset, Clone, Copy)]
|
||||
#[table_name="community"]
|
||||
pub struct CommunityForm<'a> {
|
||||
pub name: &'a str,
|
||||
}
|
||||
|
||||
#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)]
|
||||
#[belongs_to(Community)]
|
||||
#[table_name = "community_user"]
|
||||
pub struct CommunityUser {
|
||||
pub id: i32,
|
||||
pub community_id: i32,
|
||||
pub fedi_user_id: String,
|
||||
pub start_time: chrono::NaiveDateTime
|
||||
}
|
||||
|
||||
#[derive(Insertable, AsChangeset, Clone, Copy)]
|
||||
#[table_name="community_user"]
|
||||
pub struct CommunityUserForm<'a> {
|
||||
pub community_id: &'a i32,
|
||||
pub fedi_user_id: &'a str,
|
||||
}
|
||||
|
||||
#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)]
|
||||
#[belongs_to(Community)]
|
||||
#[table_name = "community_follower"]
|
||||
pub struct CommunityFollower {
|
||||
pub id: i32,
|
||||
pub community_id: i32,
|
||||
pub fedi_user_id: String,
|
||||
pub start_time: chrono::NaiveDateTime
|
||||
}
|
||||
|
||||
#[derive(Insertable, AsChangeset, Clone, Copy)]
|
||||
#[table_name="community_follower"]
|
||||
pub struct CommunityFollowerForm<'a> {
|
||||
pub community_id: &'a i32,
|
||||
pub fedi_user_id: &'a str,
|
||||
}
|
||||
|
||||
|
||||
impl<'a> Crud<CommunityForm<'a>> for Community {
|
||||
fn read(conn: &PgConnection, community_id: i32) -> Community {
|
||||
use schema::community::dsl::*;
|
||||
community.find(community_id)
|
||||
.first::<Community>(conn)
|
||||
.expect("Error in query")
|
||||
}
|
||||
|
||||
fn delete(conn: &PgConnection, community_id: i32) -> usize {
|
||||
use schema::community::dsl::*;
|
||||
diesel::delete(community.find(community_id))
|
||||
.execute(conn)
|
||||
.expect("Error deleting.")
|
||||
}
|
||||
|
||||
fn create(conn: &PgConnection, new_community: CommunityForm) -> Result<Community, Error> {
|
||||
use schema::community::dsl::*;
|
||||
insert_into(community)
|
||||
.values(new_community)
|
||||
.get_result::<Community>(conn)
|
||||
}
|
||||
|
||||
fn update(conn: &PgConnection, community_id: i32, new_community: CommunityForm) -> Community {
|
||||
use schema::community::dsl::*;
|
||||
diesel::update(community.find(community_id))
|
||||
.set(new_community)
|
||||
.get_result::<Community>(conn)
|
||||
.expect(&format!("Unable to find {}", community_id))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Followable<CommunityFollowerForm<'a>> for CommunityFollower {
|
||||
fn follow(conn: &PgConnection, community_follower_form: CommunityFollowerForm) -> Result<CommunityFollower, Error> {
|
||||
use schema::community_follower::dsl::*;
|
||||
insert_into(community_follower)
|
||||
.values(community_follower_form)
|
||||
.get_result::<CommunityFollower>(conn)
|
||||
}
|
||||
fn ignore(conn: &PgConnection, community_follower_form: CommunityFollowerForm) -> usize {
|
||||
use schema::community_follower::dsl::*;
|
||||
diesel::delete(community_follower
|
||||
.filter(community_id.eq(community_follower_form.community_id))
|
||||
.filter(fedi_user_id.eq(community_follower_form.fedi_user_id)))
|
||||
.execute(conn)
|
||||
.expect("Error deleting.")
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Joinable<CommunityUserForm<'a>> for CommunityUser {
|
||||
fn join(conn: &PgConnection, community_user_form: CommunityUserForm) -> Result<CommunityUser, Error> {
|
||||
use schema::community_user::dsl::*;
|
||||
insert_into(community_user)
|
||||
.values(community_user_form)
|
||||
.get_result::<CommunityUser>(conn)
|
||||
}
|
||||
fn leave(conn: &PgConnection, community_user_form: CommunityUserForm) -> usize {
|
||||
use schema::community_user::dsl::*;
|
||||
diesel::delete(community_user
|
||||
.filter(community_id.eq(community_user_form.community_id))
|
||||
.filter(fedi_user_id.eq(community_user_form.fedi_user_id)))
|
||||
.execute(conn)
|
||||
.expect("Error deleting.")
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use establish_connection;
|
||||
use super::*;
|
||||
use actions::user::*;
|
||||
use Crud;
|
||||
#[test]
|
||||
fn test_crud() {
|
||||
let conn = establish_connection();
|
||||
|
||||
let new_community = CommunityForm {
|
||||
name: "TIL".into(),
|
||||
};
|
||||
|
||||
let inserted_community = Community::create(&conn, new_community).unwrap();
|
||||
|
||||
let expected_community = Community {
|
||||
id: inserted_community.id,
|
||||
name: "TIL".into(),
|
||||
start_time: inserted_community.start_time
|
||||
};
|
||||
|
||||
let new_user = UserForm {
|
||||
name: "thom".into(),
|
||||
preferred_username: None,
|
||||
password_encrypted: "nope".into(),
|
||||
email: None
|
||||
};
|
||||
|
||||
let inserted_user = User_::create(&conn, new_user).unwrap();
|
||||
|
||||
let community_follower_form = CommunityFollowerForm {
|
||||
community_id: &inserted_community.id,
|
||||
fedi_user_id: "test".into()
|
||||
};
|
||||
|
||||
let inserted_community_follower = CommunityFollower::follow(&conn, community_follower_form).unwrap();
|
||||
|
||||
let expected_community_follower = CommunityFollower {
|
||||
id: inserted_community_follower.id,
|
||||
community_id: inserted_community.id,
|
||||
fedi_user_id: "test".into(),
|
||||
start_time: inserted_community_follower.start_time
|
||||
};
|
||||
|
||||
let community_user_form = CommunityUserForm {
|
||||
community_id: &inserted_community.id,
|
||||
fedi_user_id: "test".into()
|
||||
};
|
||||
|
||||
let inserted_community_user = CommunityUser::join(&conn, community_user_form).unwrap();
|
||||
|
||||
let expected_community_user = CommunityUser {
|
||||
id: inserted_community_user.id,
|
||||
community_id: inserted_community.id,
|
||||
fedi_user_id: "test".into(),
|
||||
start_time: inserted_community_user.start_time
|
||||
};
|
||||
|
||||
let read_community = Community::read(&conn, inserted_community.id);
|
||||
let updated_community = Community::update(&conn, inserted_community.id, new_community);
|
||||
let ignored_community = CommunityFollower::ignore(&conn, community_follower_form);
|
||||
let left_community = CommunityUser::leave(&conn, community_user_form);
|
||||
let num_deleted = Community::delete(&conn, inserted_community.id);
|
||||
User_::delete(&conn, inserted_user.id);
|
||||
|
||||
assert_eq!(expected_community, read_community);
|
||||
assert_eq!(expected_community, inserted_community);
|
||||
assert_eq!(expected_community, updated_community);
|
||||
assert_eq!(expected_community_follower, inserted_community_follower);
|
||||
assert_eq!(expected_community_user, inserted_community_user);
|
||||
assert_eq!(1, ignored_community);
|
||||
assert_eq!(1, left_community);
|
||||
assert_eq!(1, num_deleted);
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,3 @@
|
||||
use diesel::*;
|
||||
pub mod user;
|
||||
|
||||
pub mod community;
|
||||
pub mod post;
|
||||
|
@ -0,0 +1,95 @@
|
||||
extern crate diesel;
|
||||
use schema::user_;
|
||||
use diesel::*;
|
||||
use diesel::result::Error;
|
||||
use schema::user_::dsl::*;
|
||||
|
||||
#[derive(Queryable, PartialEq, Debug)]
|
||||
pub struct User_ {
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
pub preferred_username: Option<String>,
|
||||
pub password_encrypted: String,
|
||||
pub email: Option<String>,
|
||||
pub icon: Option<Vec<u8>>,
|
||||
pub start_time: chrono::NaiveDateTime
|
||||
}
|
||||
|
||||
#[derive(Insertable, AsChangeset, Clone, Copy)]
|
||||
#[table_name="user_"]
|
||||
pub struct NewUser<'a> {
|
||||
pub name: &'a str,
|
||||
pub preferred_username: Option<&'a str>,
|
||||
pub password_encrypted: &'a str,
|
||||
pub email: Option<&'a str>,
|
||||
}
|
||||
|
||||
pub fn read(conn: &PgConnection, user_id: i32) -> User_ {
|
||||
user_.find(user_id)
|
||||
.first::<User_>(conn)
|
||||
.expect("Error in query")
|
||||
}
|
||||
|
||||
pub fn delete(conn: &PgConnection, user_id: i32) -> usize {
|
||||
diesel::delete(user_.find(user_id))
|
||||
.execute(conn)
|
||||
.expect("Error deleting.")
|
||||
}
|
||||
|
||||
pub fn create(conn: &PgConnection, new_user: &NewUser) -> Result<User_, Error> {
|
||||
let mut edited_user = new_user.clone();
|
||||
// Add the rust crypt
|
||||
edited_user.password_encrypted = "here";
|
||||
// edited_user.password_encrypted;
|
||||
insert_into(user_)
|
||||
.values(edited_user)
|
||||
.get_result::<User_>(conn)
|
||||
}
|
||||
|
||||
pub fn update(conn: &PgConnection, user_id: i32, new_user: &NewUser) -> User_ {
|
||||
let mut edited_user = new_user.clone();
|
||||
edited_user.password_encrypted = "here";
|
||||
diesel::update(user_.find(user_id))
|
||||
.set(edited_user)
|
||||
.get_result::<User_>(conn)
|
||||
.expect(&format!("Unable to find user {}", user_id))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use establish_connection;
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_crud() {
|
||||
let conn = establish_connection();
|
||||
|
||||
let new_user = NewUser {
|
||||
name: "thom".into(),
|
||||
preferred_username: None,
|
||||
password_encrypted: "nope".into(),
|
||||
email: None
|
||||
};
|
||||
|
||||
let inserted_user = create(&conn, &new_user).unwrap();
|
||||
|
||||
let expected_user = User_ {
|
||||
id: inserted_user.id,
|
||||
name: "thom".into(),
|
||||
preferred_username: None,
|
||||
password_encrypted: "here".into(),
|
||||
email: None,
|
||||
icon: None,
|
||||
start_time: inserted_user.start_time
|
||||
};
|
||||
|
||||
let read_user = read(&conn, inserted_user.id);
|
||||
let updated_user = update(&conn, inserted_user.id, &new_user);
|
||||
let num_deleted = delete(&conn, inserted_user.id);
|
||||
|
||||
assert_eq!(expected_user, read_user);
|
||||
assert_eq!(expected_user, inserted_user);
|
||||
assert_eq!(expected_user, updated_user);
|
||||
assert_eq!(1, num_deleted);
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
table! {
|
||||
community (id) {
|
||||
id -> Int4,
|
||||
name -> Varchar,
|
||||
start_time -> Timestamp,
|
||||
}
|
||||
}
|
||||
|
||||
table! {
|
||||
community_follower (id) {
|
||||
id -> Int4,
|
||||
fedi_user_id -> Text,
|
||||
community_id -> Nullable<Int4>,
|
||||
start_time -> Timestamp,
|
||||
}
|
||||
}
|
||||
|
||||
table! {
|
||||
community_user (id) {
|
||||
id -> Int4,
|
||||
fedi_user_id -> Text,
|
||||
community_id -> Nullable<Int4>,
|
||||
start_time -> Timestamp,
|
||||
}
|
||||
}
|
||||
|
||||
table! {
|
||||
post (id) {
|
||||
id -> Int4,
|
||||
name -> Varchar,
|
||||
url -> Text,
|
||||
attributed_to -> Text,
|
||||
start_time -> Timestamp,
|
||||
}
|
||||
}
|
||||
|
||||
table! {
|
||||
post_dislike (id) {
|
||||
id -> Int4,
|
||||
fedi_user_id -> Text,
|
||||
post_id -> Nullable<Int4>,
|
||||
start_time -> Timestamp,
|
||||
}
|
||||
}
|
||||
|
||||
table! {
|
||||
post_like (id) {
|
||||
id -> Int4,
|
||||
fedi_user_id -> Text,
|
||||
post_id -> Nullable<Int4>,
|
||||
start_time -> Timestamp,
|
||||
}
|
||||
}
|
||||
|
||||
table! {
|
||||
user_ (id) {
|
||||
id -> Int4,
|
||||
name -> Varchar,
|
||||
preferred_username -> Nullable<Varchar>,
|
||||
password_encrypted -> Text,
|
||||
email -> Nullable<Text>,
|
||||
icon -> Nullable<Bytea>,
|
||||
start_time -> Timestamp,
|
||||
}
|
||||
}
|
||||
|
||||
joinable!(community_follower -> community (community_id));
|
||||
joinable!(community_user -> community (community_id));
|
||||
joinable!(post_dislike -> post (post_id));
|
||||
joinable!(post_like -> post (post_id));
|
||||
|
||||
allow_tables_to_appear_in_same_query!(
|
||||
community,
|
||||
community_follower,
|
||||
community_user,
|
||||
post,
|
||||
post_dislike,
|
||||
post_like,
|
||||
user_,
|
||||
);
|
@ -1,83 +1,108 @@
|
||||
extern crate diesel;
|
||||
extern crate activitypub;
|
||||
use schema::user_;
|
||||
use diesel::*;
|
||||
use diesel::result::Error;
|
||||
use schema::user_::dsl::*;
|
||||
// use self::activitypub::{context, actor::Person};
|
||||
use Crud;
|
||||
|
||||
#[derive(Queryable, PartialEq, Debug)]
|
||||
#[derive(Queryable, Identifiable, PartialEq, Debug)]
|
||||
#[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 icon: Option<Vec<u8>>,
|
||||
pub start_time: chrono::NaiveDateTime
|
||||
}
|
||||
|
||||
#[derive(Insertable)]
|
||||
#[derive(Insertable, AsChangeset, Clone, Copy)]
|
||||
#[table_name="user_"]
|
||||
pub struct NewUser<'a> {
|
||||
pub struct UserForm<'a> {
|
||||
pub name: &'a str,
|
||||
pub preferred_username: Option<&'a str>,
|
||||
pub password_encrypted: &'a str,
|
||||
pub email: Option<&'a str>,
|
||||
}
|
||||
|
||||
impl Crud for User_ {
|
||||
impl<'a> Crud<UserForm<'a>> for User_ {
|
||||
fn read(conn: &PgConnection, user_id: i32) -> User_ {
|
||||
user_.find(user_id)
|
||||
.first::<User_>(conn)
|
||||
.expect("Error in query")
|
||||
}
|
||||
|
||||
fn delete(conn: &PgConnection, user_id: i32) -> usize {
|
||||
fn delete(conn: &PgConnection, user_id: i32) -> usize {
|
||||
diesel::delete(user_.find(user_id))
|
||||
.execute(conn)
|
||||
.expect("Error deleting.")
|
||||
}
|
||||
|
||||
// fn create<NewUser>(conn: &PgConnection, mut new_user: NewUser) -> Result<User_, Error> {
|
||||
fn create(conn: &PgConnection, form: UserForm) -> Result<User_, Error> {
|
||||
let mut edited_user = form.clone();
|
||||
// Add the rust crypt
|
||||
edited_user.password_encrypted = "here";
|
||||
// edited_user.password_encrypted;
|
||||
insert_into(user_)
|
||||
.values(edited_user)
|
||||
.get_result::<User_>(conn)
|
||||
}
|
||||
fn update(conn: &PgConnection, user_id: i32, form: UserForm) -> User_ {
|
||||
let mut edited_user = form.clone();
|
||||
edited_user.password_encrypted = "here";
|
||||
diesel::update(user_.find(user_id))
|
||||
.set(edited_user)
|
||||
.get_result::<User_>(conn)
|
||||
.expect(&format!("Unable to find user {}", user_id))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create(conn: &PgConnection, mut new_user: NewUser) -> Result<User_, Error> {
|
||||
new_user.password_encrypted = "here";
|
||||
// new_user.password_encrypted;
|
||||
insert_into(user_)
|
||||
.values(new_user)
|
||||
.get_result(conn)
|
||||
}
|
||||
|
||||
// TODO
|
||||
// pub fn person(user: &User_) -> Person {
|
||||
// let mut person = Person::default();
|
||||
// person.object_props.set_context_object(context());
|
||||
// person.ap_actor_props.set_preferred_username_string("set".into());
|
||||
|
||||
// person
|
||||
// }
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use establish_connection;
|
||||
use super::*;
|
||||
use super::{User_, UserForm};
|
||||
use Crud;
|
||||
#[test]
|
||||
fn test_crud() {
|
||||
let conn = establish_connection();
|
||||
|
||||
let new_user = NewUser {
|
||||
let new_user = UserForm {
|
||||
name: "thom".into(),
|
||||
preferred_username: None,
|
||||
password_encrypted: "nope".into(),
|
||||
email: None
|
||||
};
|
||||
|
||||
let inserted_user = create(&conn, new_user).unwrap();
|
||||
let inserted_user = User_::create(&conn, new_user).unwrap();
|
||||
|
||||
let expected_user = User_ {
|
||||
id: inserted_user.id,
|
||||
name: "thom".into(),
|
||||
preferred_username: None,
|
||||
password_encrypted: "here".into(),
|
||||
email: None,
|
||||
icon: None,
|
||||
start_time: inserted_user.start_time
|
||||
};
|
||||
|
||||
|
||||
let read_user = User_::read(&conn, inserted_user.id);
|
||||
let updated_user = User_::update(&conn, inserted_user.id, new_user);
|
||||
let num_deleted = User_::delete(&conn, inserted_user.id);
|
||||
|
||||
|
||||
assert_eq!(expected_user, read_user);
|
||||
assert_eq!(expected_user, inserted_user);
|
||||
assert_eq!(expected_user, updated_user);
|
||||
assert_eq!(1, num_deleted);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +0,0 @@
|
||||
extern crate activitypub;
|
||||
extern crate failure;
|
||||
extern crate serde_json;
|
||||
|
||||
// fn user -> Result<(), Error> {
|
||||
|
||||
// }
|
@ -1,19 +1,19 @@
|
||||
|
||||
enum CommunityUserType {
|
||||
CREATOR = 0,
|
||||
MODERATOR = 1,
|
||||
USER = 2
|
||||
}
|
||||
// enum CommunityUserType {
|
||||
// CREATOR = 0,
|
||||
// MODERATOR = 1,
|
||||
// USER = 2
|
||||
// }
|
||||
|
||||
impl CommunityUserType {
|
||||
fn from_u32(value: u32) -> CommunityUserType {
|
||||
match value {
|
||||
0 => CommunityUserType::CREATOR,
|
||||
1 => CommunityUserType::MODERATOR,
|
||||
2 => CommunityUserType::USER,
|
||||
_ => panic!("Unknown value: {}", value),
|
||||
}
|
||||
}
|
||||
}
|
||||
// impl CommunityUserType {
|
||||
// fn from_u32(value: u32) -> CommunityUserType {
|
||||
// match value {
|
||||
// 0 => CommunityUserType::CREATOR,
|
||||
// 1 => CommunityUserType::MODERATOR,
|
||||
// 2 => CommunityUserType::USER,
|
||||
// _ => panic!("Unknown value: {}", value),
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue