mirror of
https://github.com/nitnelave/lldap.git
synced 2023-04-12 14:25:13 +00:00
Split the crate in 3, introduce JS frontend
This commit is contained in:
parent
9459f53a13
commit
c58459547b
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,6 +1,9 @@
|
|||||||
# Generated by Cargo
|
# Generated by Cargo
|
||||||
# will have compiled files and executables
|
# will have compiled files and executables
|
||||||
/target/
|
/target/
|
||||||
|
/app/target
|
||||||
|
/app/pkg
|
||||||
|
/model/target
|
||||||
|
|
||||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||||
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
|
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
|
||||||
|
@ -29,6 +29,8 @@ tracing-log = "*"
|
|||||||
tracing-subscriber = "*"
|
tracing-subscriber = "*"
|
||||||
async-trait = "0.1.48"
|
async-trait = "0.1.48"
|
||||||
sea-query = { version = "0.9.4", features = [ "with-chrono" ] }
|
sea-query = { version = "0.9.4", features = [ "with-chrono" ] }
|
||||||
|
lldap_model = { path = "model" }
|
||||||
|
lldap_app = { path = "app" }
|
||||||
|
|
||||||
[dependencies.figment]
|
[dependencies.figment]
|
||||||
features = ["toml", "env"]
|
features = ["toml", "env"]
|
||||||
|
13
app/Cargo.toml
Normal file
13
app/Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[package]
|
||||||
|
name = "lldap_app"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Valentin Tolmer <valentin@tolmer.fr>", "Steve Barrau <steve.barrau@gmail.com>", "Thomas Wickham <mackwic@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
yew = "0.17.4"
|
||||||
|
wasm-bindgen = "0.2.73"
|
||||||
|
lldap_model = { path = "../model" }
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["cdylib"]
|
32
app/src/app.rs
Normal file
32
app/src/app.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
use lldap_model::*;
|
||||||
|
use yew::prelude::*;
|
||||||
|
|
||||||
|
pub struct App {}
|
||||||
|
|
||||||
|
pub enum Msg {
|
||||||
|
BindRequest(BindRequest),
|
||||||
|
ListUsersRequest(ListUsersRequest),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for App {
|
||||||
|
type Message = Msg;
|
||||||
|
type Properties = ();
|
||||||
|
|
||||||
|
fn create(_: Self::Properties, _: ComponentLink<Self>) -> Self {
|
||||||
|
App {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(&mut self, _msg: Self::Message) -> ShouldRender {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn change(&mut self, _: Self::Properties) -> ShouldRender {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn view(&self) -> Html {
|
||||||
|
html! {
|
||||||
|
<p>{ "Hello world!" }</p>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
app/src/lib.rs
Normal file
10
app/src/lib.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
mod app;
|
||||||
|
|
||||||
|
use wasm_bindgen::prelude::*;
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn run_app() -> Result<(), JsValue> {
|
||||||
|
yew::start_app::<app::App>();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
12
model/Cargo.toml
Normal file
12
model/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "lldap_model"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Valentin Tolmer <valentin@tolmer.fr>", "Steve Barrau <steve.barrau@gmail.com>", "Thomas Wickham <mackwic@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
js = []
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
chrono = "*"
|
||||||
|
serde = "*"
|
36
model/src/lib.rs
Normal file
36
model/src/lib.rs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
||||||
|
pub struct BindRequest {
|
||||||
|
pub name: String,
|
||||||
|
pub password: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq)]
|
||||||
|
#[cfg_attr(test, derive(Debug))]
|
||||||
|
pub enum RequestFilter {
|
||||||
|
And(Vec<RequestFilter>),
|
||||||
|
Or(Vec<RequestFilter>),
|
||||||
|
Not(Box<RequestFilter>),
|
||||||
|
Equality(String, String),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
||||||
|
pub struct ListUsersRequest {
|
||||||
|
pub filters: Option<RequestFilter>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
||||||
|
pub struct User {
|
||||||
|
pub user_id: String,
|
||||||
|
pub email: String,
|
||||||
|
pub display_name: String,
|
||||||
|
pub first_name: String,
|
||||||
|
pub last_name: String,
|
||||||
|
// pub avatar: ?,
|
||||||
|
pub creation_date: chrono::NaiveDateTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
||||||
|
pub struct Group {
|
||||||
|
pub display_name: String,
|
||||||
|
pub users: Vec<String>,
|
||||||
|
}
|
@ -5,48 +5,11 @@ use anyhow::{bail, Result};
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
use futures_util::TryStreamExt;
|
use futures_util::TryStreamExt;
|
||||||
|
pub use lldap_model::*;
|
||||||
use log::*;
|
use log::*;
|
||||||
use sea_query::{Expr, Order, Query, SimpleExpr, SqliteQueryBuilder};
|
use sea_query::{Expr, Order, Query, SimpleExpr, SqliteQueryBuilder};
|
||||||
use sqlx::Row;
|
use sqlx::Row;
|
||||||
|
|
||||||
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
|
||||||
pub struct BindRequest {
|
|
||||||
pub name: String,
|
|
||||||
pub password: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(PartialEq, Eq)]
|
|
||||||
#[cfg_attr(test, derive(Debug))]
|
|
||||||
pub enum RequestFilter {
|
|
||||||
And(Vec<RequestFilter>),
|
|
||||||
Or(Vec<RequestFilter>),
|
|
||||||
Not(Box<RequestFilter>),
|
|
||||||
Equality(String, String),
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
|
||||||
pub struct ListUsersRequest {
|
|
||||||
pub filters: Option<RequestFilter>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(sqlx::FromRow)]
|
|
||||||
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
|
||||||
pub struct User {
|
|
||||||
pub user_id: String,
|
|
||||||
pub email: String,
|
|
||||||
pub display_name: String,
|
|
||||||
pub first_name: String,
|
|
||||||
pub last_name: String,
|
|
||||||
// pub avatar: ?,
|
|
||||||
pub creation_date: chrono::NaiveDateTime,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
|
|
||||||
pub struct Group {
|
|
||||||
pub display_name: String,
|
|
||||||
pub users: Vec<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
pub trait BackendHandler: Clone + Send {
|
pub trait BackendHandler: Clone + Send {
|
||||||
async fn bind(&self, request: BindRequest) -> Result<()>;
|
async fn bind(&self, request: BindRequest) -> Result<()>;
|
||||||
@ -142,7 +105,15 @@ impl BackendHandler for SqlBackendHandler {
|
|||||||
query_builder.to_string(SqliteQueryBuilder)
|
query_builder.to_string(SqliteQueryBuilder)
|
||||||
};
|
};
|
||||||
|
|
||||||
let results = sqlx::query_as::<_, User>(&query)
|
let results = sqlx::query(&query)
|
||||||
|
.map(|row: DbRow| User {
|
||||||
|
user_id: row.get::<String, _>("user_id"),
|
||||||
|
email: row.get::<String, _>("email"),
|
||||||
|
display_name: row.get::<String, _>("display_name"),
|
||||||
|
first_name: row.get::<String, _>("first_name"),
|
||||||
|
last_name: row.get::<String, _>("last_name"),
|
||||||
|
creation_date: row.get::<chrono::NaiveDateTime, _>("creation_date"),
|
||||||
|
})
|
||||||
.fetch(&self.sql_pool)
|
.fetch(&self.sql_pool)
|
||||||
.collect::<Vec<sqlx::Result<User>>>()
|
.collect::<Vec<sqlx::Result<User>>>()
|
||||||
.await;
|
.await;
|
||||||
|
@ -2,6 +2,7 @@ use sea_query::*;
|
|||||||
|
|
||||||
pub type Pool = sqlx::sqlite::SqlitePool;
|
pub type Pool = sqlx::sqlite::SqlitePool;
|
||||||
pub type PoolOptions = sqlx::sqlite::SqlitePoolOptions;
|
pub type PoolOptions = sqlx::sqlite::SqlitePoolOptions;
|
||||||
|
pub type DbRow = sqlx::sqlite::SqliteRow;
|
||||||
|
|
||||||
#[derive(Iden)]
|
#[derive(Iden)]
|
||||||
pub enum Users {
|
pub enum Users {
|
||||||
|
Loading…
Reference in New Issue
Block a user