92 lines
2.2 KiB
Rust
92 lines
2.2 KiB
Rust
use std::fmt;
|
|
|
|
use diesel::expression::AsExpression;
|
|
use diesel::prelude::*;
|
|
use diesel::sql_types::Text;
|
|
|
|
#[derive(AsExpression, Debug, Clone)]
|
|
#[diesel(sql_type = Text)]
|
|
pub enum ProjectRole {
|
|
Member,
|
|
Admin,
|
|
}
|
|
|
|
impl fmt::Display for ProjectRole {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
match self {
|
|
ProjectRole::Member => write!(f, "member"),
|
|
ProjectRole::Admin => write!(f, "admin"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<S> From<S> for ProjectRole
|
|
where
|
|
S: AsRef<str>,
|
|
String: std::convert::From<S>,
|
|
{
|
|
fn from(status: S) -> Self {
|
|
match status.as_ref() {
|
|
"member" => ProjectRole::Member,
|
|
"admin" => ProjectRole::Admin,
|
|
_ => ProjectRole::Member,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<ProjectRole> for String {
|
|
fn from(role: ProjectRole) -> Self {
|
|
match role {
|
|
ProjectRole::Member => "member".to_string(),
|
|
ProjectRole::Admin => "admin".to_string(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Queryable, Selectable, Debug, Clone)]
|
|
#[diesel(table_name = crate::schema::project_memberships)]
|
|
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]
|
|
pub struct ProjectMembership {
|
|
pub id: i32,
|
|
pub user_id: String,
|
|
pub project_id: String,
|
|
|
|
#[diesel(serialize_as = String, deserialize_as = String)]
|
|
pub role: ProjectRole,
|
|
}
|
|
|
|
#[derive(Insertable)]
|
|
#[diesel(table_name = crate::schema::project_memberships)]
|
|
pub struct NewProjectMembership {
|
|
pub user_id: String,
|
|
pub project_id: String,
|
|
|
|
#[diesel(serialize_as = String, deserialize_as = String)]
|
|
pub role: ProjectRole,
|
|
}
|
|
|
|
pub mod q {
|
|
use diesel::SqliteConnection;
|
|
|
|
use super::*;
|
|
|
|
pub fn create(
|
|
conn: &mut SqliteConnection,
|
|
user_id: &str,
|
|
project_id: &str,
|
|
role: ProjectRole,
|
|
) -> Result<ProjectMembership, diesel::result::Error> {
|
|
use crate::schema::project_memberships::dsl as pm;
|
|
|
|
let new_membership = NewProjectMembership {
|
|
user_id: user_id.to_string(),
|
|
project_id: project_id.to_string(),
|
|
role,
|
|
};
|
|
|
|
let membership =
|
|
diesel::insert_into(pm::project_memberships).values(new_membership).get_result(conn)?;
|
|
|
|
Ok(membership)
|
|
}
|
|
}
|