Added things
This commit is contained in:
		
							parent
							
								
									578100100e
								
							
						
					
					
						commit
						e7dd6df349
					
				| 
						 | 
					@ -3,6 +3,6 @@ CREATE TABLE channels (
 | 
				
			||||||
    id BIGINT NOT NULL AUTO_INCREMENT,
 | 
					    id BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
    user BIGINT NOT NULL,
 | 
					    user BIGINT NOT NULL,
 | 
				
			||||||
    name VARCHAR(255) NOT NULL,
 | 
					    name VARCHAR(255) NOT NULL,
 | 
				
			||||||
    Bio text,
 | 
					    bio text,
 | 
				
			||||||
    PRIMARY KEY(id)
 | 
					    PRIMARY KEY(id)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								migrations/2023-08-27-161051_subscription/down.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								migrations/2023-08-27-161051_subscription/down.sql
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					-- This file should undo anything in `up.sql`
 | 
				
			||||||
 | 
					DROP TABLE subscription;
 | 
				
			||||||
							
								
								
									
										8
									
								
								migrations/2023-08-27-161051_subscription/up.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								migrations/2023-08-27-161051_subscription/up.sql
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					-- Your SQL goes here
 | 
				
			||||||
 | 
					CREATE TABLE subscription (
 | 
				
			||||||
 | 
					    subscription_id BIGINT AUTO_INCREMENT NOT NULL ,
 | 
				
			||||||
 | 
					    user_id BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    channel_id BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    PRIMARY KEY(subscription_id),
 | 
				
			||||||
 | 
					    CONSTRAINT UC_Sub UNIQUE(user_id,channel_id)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
							
								
								
									
										82
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								src/lib.rs
									
									
									
									
									
								
							| 
						 | 
					@ -19,9 +19,10 @@ use crypto::digest::Digest;
 | 
				
			||||||
use crypto::sha2::Sha256;
 | 
					use crypto::sha2::Sha256;
 | 
				
			||||||
use rand::{thread_rng, Rng};
 | 
					use rand::{thread_rng, Rng};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub enum UserCreationStatus {
 | 
					pub enum CreationStatus {
 | 
				
			||||||
    Success,
 | 
					    Success,
 | 
				
			||||||
    UserExists,
 | 
					    ElementExists,
 | 
				
			||||||
 | 
					    Unauthorized,
 | 
				
			||||||
    QueryError(Error),
 | 
					    QueryError(Error),
 | 
				
			||||||
    DatabaseError(DatabaseErrorKind),
 | 
					    DatabaseError(DatabaseErrorKind),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -30,7 +31,7 @@ pub enum UserSelectionStatus<T> {
 | 
				
			||||||
    Success(T),
 | 
					    Success(T),
 | 
				
			||||||
    UserDoesntExist,
 | 
					    UserDoesntExist,
 | 
				
			||||||
    QueryError(Error),
 | 
					    QueryError(Error),
 | 
				
			||||||
    DatabaseError(DatabaseErrorKind)
 | 
					    DatabaseError(DatabaseErrorKind),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn create_connection() -> MysqlConnection {
 | 
					pub fn create_connection() -> MysqlConnection {
 | 
				
			||||||
| 
						 | 
					@ -40,23 +41,27 @@ pub fn create_connection() -> MysqlConnection {
 | 
				
			||||||
    MysqlConnection::establish(&database_url).unwrap()
 | 
					    MysqlConnection::establish(&database_url).unwrap()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn get_id_from_email(user_email: String, connection: &mut MysqlConnection) -> UserSelectionStatus<i64> {
 | 
					pub fn get_id_from_email(
 | 
				
			||||||
 | 
					    user_email: String,
 | 
				
			||||||
 | 
					    connection: &mut MysqlConnection,
 | 
				
			||||||
 | 
					) -> UserSelectionStatus<i64> {
 | 
				
			||||||
    use schema::users::dsl::*;
 | 
					    use schema::users::dsl::*;
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    let users_matching_email = match users
 | 
					    let users_matching_email = match users
 | 
				
			||||||
        .filter(email.eq(user_email))
 | 
					        .filter(email.eq(user_email))
 | 
				
			||||||
        .limit(1)
 | 
					        .limit(1)
 | 
				
			||||||
        .select(User::as_select())
 | 
					        .select(User::as_select())
 | 
				
			||||||
        .load(connection) {
 | 
					        .load(connection)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        Ok(v) => v,
 | 
					        Ok(v) => v,
 | 
				
			||||||
        Err(_e) => vec![]
 | 
					        Err(e) => return UserSelectionStatus::QueryError(e),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let user = match users_matching_email.get(0) {
 | 
					    let user = match users_matching_email.get(0) {
 | 
				
			||||||
        Some(v) => v,
 | 
					        Some(v) => v,
 | 
				
			||||||
        None => return UserSelectionStatus::UserDoesntExist 
 | 
					        None => return UserSelectionStatus::UserDoesntExist,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    UserSelectionStatus::Success(user.id)
 | 
					    UserSelectionStatus::Success(user.id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,21 +70,26 @@ pub fn check_password(
 | 
				
			||||||
    password: String,
 | 
					    password: String,
 | 
				
			||||||
    connection: &mut MysqlConnection,
 | 
					    connection: &mut MysqlConnection,
 | 
				
			||||||
) -> UserSelectionStatus<bool> {
 | 
					) -> UserSelectionStatus<bool> {
 | 
				
			||||||
 | 
					 | 
				
			||||||
    use self::schema::users::dsl::*;
 | 
					    use self::schema::users::dsl::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let users_matching = match users
 | 
					    let users_matching = match users
 | 
				
			||||||
        .filter(id.eq(user_id))
 | 
					        .filter(id.eq(user_id))
 | 
				
			||||||
        .limit(1)
 | 
					        .limit(1)
 | 
				
			||||||
        .select(User::as_select())
 | 
					        .select(User::as_select())
 | 
				
			||||||
        .load(connection) {
 | 
					        .load(connection)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        Ok(v) => v,
 | 
					        Ok(v) => v,
 | 
				
			||||||
        Err(_e) => vec![]
 | 
					        Err(error) => match error {
 | 
				
			||||||
 | 
					            Error::DatabaseError(error_kind, _) => {
 | 
				
			||||||
 | 
					                return UserSelectionStatus::DatabaseError(error_kind)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            _ => return UserSelectionStatus::QueryError(error),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let user = match users_matching.get(0) {
 | 
					    let user = match users_matching.get(0) {
 | 
				
			||||||
        Some(v) => v,
 | 
					        Some(v) => v,
 | 
				
			||||||
        None => return UserSelectionStatus::UserDoesntExist
 | 
					        None => return UserSelectionStatus::UserDoesntExist,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut hasher = Sha256::new();
 | 
					    let mut hasher = Sha256::new();
 | 
				
			||||||
| 
						 | 
					@ -90,12 +100,48 @@ pub fn check_password(
 | 
				
			||||||
    UserSelectionStatus::Success(user.pass == hashed)
 | 
					    UserSelectionStatus::Success(user.pass == hashed)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn subscribe(
 | 
				
			||||||
 | 
					    user_id: i64,
 | 
				
			||||||
 | 
					    channel_id: i64,
 | 
				
			||||||
 | 
					    password: String,
 | 
				
			||||||
 | 
					    connection: &mut MysqlConnection,
 | 
				
			||||||
 | 
					) -> CreationStatus {
 | 
				
			||||||
 | 
					    match check_password(user_id, password, connection) {
 | 
				
			||||||
 | 
					        UserSelectionStatus::Success(b) => match b {
 | 
				
			||||||
 | 
					            true => (),
 | 
				
			||||||
 | 
					            false => return CreationStatus::Unauthorized,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        UserSelectionStatus::UserDoesntExist => return CreationStatus::Unauthorized,
 | 
				
			||||||
 | 
					        UserSelectionStatus::QueryError(e) => return CreationStatus::QueryError(e),
 | 
				
			||||||
 | 
					        UserSelectionStatus::DatabaseError(e) => return CreationStatus::DatabaseError(e),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let new_subscription = model::NewSubscription {
 | 
				
			||||||
 | 
					        user_id,
 | 
				
			||||||
 | 
					        channel_id,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    match diesel::insert_into(schema::subscription::dsl::subscription)
 | 
				
			||||||
 | 
					        .values(&new_subscription)
 | 
				
			||||||
 | 
					        .execute(connection)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Ok(_) => CreationStatus::Success,
 | 
				
			||||||
 | 
					        Err(e) => match e {
 | 
				
			||||||
 | 
					            Error::DatabaseError(database_error_kind, _) => match database_error_kind {
 | 
				
			||||||
 | 
					                DatabaseErrorKind::UniqueViolation => CreationStatus::ElementExists,
 | 
				
			||||||
 | 
					                _ => CreationStatus::DatabaseError(database_error_kind),
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            _ => CreationStatus::QueryError(e),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn add_user(
 | 
					pub fn add_user(
 | 
				
			||||||
    username: String,
 | 
					    username: String,
 | 
				
			||||||
    email: String,
 | 
					    email: String,
 | 
				
			||||||
    password: String,
 | 
					    password: String,
 | 
				
			||||||
    connection: &mut MysqlConnection,
 | 
					    connection: &mut MysqlConnection,
 | 
				
			||||||
) -> UserCreationStatus {
 | 
					) -> CreationStatus {
 | 
				
			||||||
    use schema::users::dsl::users;
 | 
					    use schema::users::dsl::users;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let joined = OffsetDateTime::now_utc().date();
 | 
					    let joined = OffsetDateTime::now_utc().date();
 | 
				
			||||||
| 
						 | 
					@ -130,13 +176,13 @@ pub fn add_user(
 | 
				
			||||||
        .values(&new_user)
 | 
					        .values(&new_user)
 | 
				
			||||||
        .execute(connection)
 | 
					        .execute(connection)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Ok(_) => UserCreationStatus::Success,
 | 
					        Ok(_) => CreationStatus::Success,
 | 
				
			||||||
        Err(e) => match e {
 | 
					        Err(e) => match e {
 | 
				
			||||||
            Error::DatabaseError(database_error_kind, _) => match database_error_kind {
 | 
					            Error::DatabaseError(database_error_kind, _) => match database_error_kind {
 | 
				
			||||||
                DatabaseErrorKind::UniqueViolation => UserCreationStatus::UserExists,
 | 
					                DatabaseErrorKind::UniqueViolation => CreationStatus::ElementExists,
 | 
				
			||||||
                _ => UserCreationStatus::DatabaseError(database_error_kind),
 | 
					                _ => CreationStatus::DatabaseError(database_error_kind),
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            _ => UserCreationStatus::QueryError(e),
 | 
					            _ => CreationStatus::QueryError(e),
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										37
									
								
								src/model.rs
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								src/model.rs
									
									
									
									
									
								
							| 
						 | 
					@ -14,6 +14,7 @@ pub struct User {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Insertable)]
 | 
					#[derive(Insertable)]
 | 
				
			||||||
#[diesel(table_name = crate::schema::users)]
 | 
					#[diesel(table_name = crate::schema::users)]
 | 
				
			||||||
 | 
					#[diesel(check_for_backend(diesel::mysql::Mysql))]
 | 
				
			||||||
pub struct NewUser {
 | 
					pub struct NewUser {
 | 
				
			||||||
    pub username: String,
 | 
					    pub username: String,
 | 
				
			||||||
    pub email: String,
 | 
					    pub email: String,
 | 
				
			||||||
| 
						 | 
					@ -21,3 +22,39 @@ pub struct NewUser {
 | 
				
			||||||
    pub pass: String,
 | 
					    pub pass: String,
 | 
				
			||||||
    pub joined: Date,
 | 
					    pub joined: Date,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Queryable, Selectable)]
 | 
				
			||||||
 | 
					#[diesel(table_name = crate::schema::channels)]
 | 
				
			||||||
 | 
					#[diesel(check_for_backend(diesel::mysql::Mysql))]
 | 
				
			||||||
 | 
					pub struct Channel {
 | 
				
			||||||
 | 
					    pub id: i64,
 | 
				
			||||||
 | 
					    pub user: i64,
 | 
				
			||||||
 | 
					    pub name: String,
 | 
				
			||||||
 | 
					    pub bio: Option<String>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Insertable)]
 | 
				
			||||||
 | 
					#[diesel(table_name = crate::schema::channels)]
 | 
				
			||||||
 | 
					#[diesel(check_for_backend(diesel::mysql::Mysql))]
 | 
				
			||||||
 | 
					pub struct NewChannel {
 | 
				
			||||||
 | 
					    pub user: i64,
 | 
				
			||||||
 | 
					    pub name: String,
 | 
				
			||||||
 | 
					    pub bio: Option<String>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Queryable, Selectable)]
 | 
				
			||||||
 | 
					#[diesel(table_name = crate::schema::subscription)]
 | 
				
			||||||
 | 
					#[diesel(check_for_backend(diesel::mysql::Mysql))]
 | 
				
			||||||
 | 
					pub struct Subscription {
 | 
				
			||||||
 | 
					    pub subscription_id: i64,
 | 
				
			||||||
 | 
					    pub user_id: i64,
 | 
				
			||||||
 | 
					    pub channel_id: i64,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Insertable)]
 | 
				
			||||||
 | 
					#[diesel(table_name = crate::schema::subscription)]
 | 
				
			||||||
 | 
					#[diesel(check_for_backend(diesel::mysql::Mysql))]
 | 
				
			||||||
 | 
					pub struct NewSubscription {
 | 
				
			||||||
 | 
					    pub user_id: i64,
 | 
				
			||||||
 | 
					    pub channel_id: i64,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,15 @@ diesel::table! {
 | 
				
			||||||
        user -> Bigint,
 | 
					        user -> Bigint,
 | 
				
			||||||
        #[max_length = 255]
 | 
					        #[max_length = 255]
 | 
				
			||||||
        name -> Varchar,
 | 
					        name -> Varchar,
 | 
				
			||||||
        Bio -> Nullable<Text>,
 | 
					        bio -> Nullable<Text>,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diesel::table! {
 | 
				
			||||||
 | 
					    subscription (subscription_id) {
 | 
				
			||||||
 | 
					        subscription_id -> Bigint,
 | 
				
			||||||
 | 
					        user_id -> Bigint,
 | 
				
			||||||
 | 
					        channel_id -> Bigint,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,4 +33,4 @@ diesel::table! {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
diesel::allow_tables_to_appear_in_same_query!(channels, users,);
 | 
					diesel::allow_tables_to_appear_in_same_query!(channels, subscription, users,);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue