Added things
This commit is contained in:
		
							parent
							
								
									578100100e
								
							
						
					
					
						commit
						e7dd6df349
					
				| 
						 | 
				
			
			@ -3,6 +3,6 @@ CREATE TABLE channels (
 | 
			
		|||
    id BIGINT NOT NULL AUTO_INCREMENT,
 | 
			
		||||
    user BIGINT NOT NULL,
 | 
			
		||||
    name VARCHAR(255) NOT NULL,
 | 
			
		||||
    Bio text,
 | 
			
		||||
    bio text,
 | 
			
		||||
    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 rand::{thread_rng, Rng};
 | 
			
		||||
 | 
			
		||||
pub enum UserCreationStatus {
 | 
			
		||||
pub enum CreationStatus {
 | 
			
		||||
    Success,
 | 
			
		||||
    UserExists,
 | 
			
		||||
    ElementExists,
 | 
			
		||||
    Unauthorized,
 | 
			
		||||
    QueryError(Error),
 | 
			
		||||
    DatabaseError(DatabaseErrorKind),
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +31,7 @@ pub enum UserSelectionStatus<T> {
 | 
			
		|||
    Success(T),
 | 
			
		||||
    UserDoesntExist,
 | 
			
		||||
    QueryError(Error),
 | 
			
		||||
    DatabaseError(DatabaseErrorKind)
 | 
			
		||||
    DatabaseError(DatabaseErrorKind),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn create_connection() -> MysqlConnection {
 | 
			
		||||
| 
						 | 
				
			
			@ -40,23 +41,27 @@ pub fn create_connection() -> MysqlConnection {
 | 
			
		|||
    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::*;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    let users_matching_email = match users
 | 
			
		||||
        .filter(email.eq(user_email))
 | 
			
		||||
        .limit(1)
 | 
			
		||||
        .select(User::as_select())
 | 
			
		||||
        .load(connection) {
 | 
			
		||||
        .load(connection)
 | 
			
		||||
    {
 | 
			
		||||
        Ok(v) => v,
 | 
			
		||||
        Err(_e) => vec![]
 | 
			
		||||
        Err(e) => return UserSelectionStatus::QueryError(e),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let user = match users_matching_email.get(0) {
 | 
			
		||||
        Some(v) => v,
 | 
			
		||||
        None => return UserSelectionStatus::UserDoesntExist 
 | 
			
		||||
        None => return UserSelectionStatus::UserDoesntExist,
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    UserSelectionStatus::Success(user.id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -65,21 +70,26 @@ pub fn check_password(
 | 
			
		|||
    password: String,
 | 
			
		||||
    connection: &mut MysqlConnection,
 | 
			
		||||
) -> UserSelectionStatus<bool> {
 | 
			
		||||
 | 
			
		||||
    use self::schema::users::dsl::*;
 | 
			
		||||
 | 
			
		||||
    let users_matching = match users
 | 
			
		||||
        .filter(id.eq(user_id))
 | 
			
		||||
        .limit(1)
 | 
			
		||||
        .select(User::as_select())
 | 
			
		||||
        .load(connection) {
 | 
			
		||||
        .load(connection)
 | 
			
		||||
    {
 | 
			
		||||
        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) {
 | 
			
		||||
        Some(v) => v,
 | 
			
		||||
        None => return UserSelectionStatus::UserDoesntExist
 | 
			
		||||
        None => return UserSelectionStatus::UserDoesntExist,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut hasher = Sha256::new();
 | 
			
		||||
| 
						 | 
				
			
			@ -90,12 +100,48 @@ pub fn check_password(
 | 
			
		|||
    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(
 | 
			
		||||
    username: String,
 | 
			
		||||
    email: String,
 | 
			
		||||
    password: String,
 | 
			
		||||
    connection: &mut MysqlConnection,
 | 
			
		||||
) -> UserCreationStatus {
 | 
			
		||||
) -> CreationStatus {
 | 
			
		||||
    use schema::users::dsl::users;
 | 
			
		||||
 | 
			
		||||
    let joined = OffsetDateTime::now_utc().date();
 | 
			
		||||
| 
						 | 
				
			
			@ -130,13 +176,13 @@ pub fn add_user(
 | 
			
		|||
        .values(&new_user)
 | 
			
		||||
        .execute(connection)
 | 
			
		||||
    {
 | 
			
		||||
        Ok(_) => UserCreationStatus::Success,
 | 
			
		||||
        Ok(_) => CreationStatus::Success,
 | 
			
		||||
        Err(e) => match e {
 | 
			
		||||
            Error::DatabaseError(database_error_kind, _) => match database_error_kind {
 | 
			
		||||
                DatabaseErrorKind::UniqueViolation => UserCreationStatus::UserExists,
 | 
			
		||||
                _ => UserCreationStatus::DatabaseError(database_error_kind),
 | 
			
		||||
                DatabaseErrorKind::UniqueViolation => CreationStatus::ElementExists,
 | 
			
		||||
                _ => 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)]
 | 
			
		||||
#[diesel(table_name = crate::schema::users)]
 | 
			
		||||
#[diesel(check_for_backend(diesel::mysql::Mysql))]
 | 
			
		||||
pub struct NewUser {
 | 
			
		||||
    pub username: String,
 | 
			
		||||
    pub email: String,
 | 
			
		||||
| 
						 | 
				
			
			@ -21,3 +22,39 @@ pub struct NewUser {
 | 
			
		|||
    pub pass: String,
 | 
			
		||||
    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,
 | 
			
		||||
        #[max_length = 255]
 | 
			
		||||
        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