Added things
This commit is contained in:
parent
578100100e
commit
7bc3b38ac8
|
@ -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