2018-10-21 16:22:27 +00:00
|
|
|
use canapi::{Error, Provider};
|
2018-10-21 13:19:07 +00:00
|
|
|
use chrono::NaiveDateTime;
|
2018-10-21 16:22:27 +00:00
|
|
|
use diesel::{self, RunQueryDsl, QueryDsl, ExpressionMethods};
|
|
|
|
use openssl::rand::rand_bytes;
|
2018-10-21 13:19:07 +00:00
|
|
|
|
2018-10-21 16:22:27 +00:00
|
|
|
use plume_api::apps::AppEndpoint;
|
|
|
|
use Connection;
|
2018-10-21 13:19:07 +00:00
|
|
|
use schema::apps;
|
|
|
|
|
2018-10-21 16:22:27 +00:00
|
|
|
#[derive(Clone, Queryable)]
|
2018-10-21 13:19:07 +00:00
|
|
|
pub struct App {
|
|
|
|
pub id: i32,
|
|
|
|
pub name: String,
|
|
|
|
pub client_id: String,
|
|
|
|
pub client_secret: String,
|
|
|
|
pub redirect_uri: Option<String>,
|
|
|
|
pub website: Option<String>,
|
|
|
|
pub creation_date: NaiveDateTime,
|
|
|
|
}
|
|
|
|
|
2018-10-21 16:22:27 +00:00
|
|
|
#[derive(Insertable)]
|
|
|
|
#[table_name= "apps"]
|
|
|
|
pub struct NewApp {
|
|
|
|
pub name: String,
|
|
|
|
pub client_id: String,
|
|
|
|
pub client_secret: String,
|
|
|
|
pub redirect_uri: Option<String>,
|
|
|
|
pub website: Option<String>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Provider<Connection> for App {
|
|
|
|
type Data = AppEndpoint;
|
|
|
|
|
|
|
|
fn get(conn: &Connection, id: i32) -> Result<AppEndpoint, Error> {
|
|
|
|
unimplemented!()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn list(conn: &Connection, query: AppEndpoint) -> Vec<AppEndpoint> {
|
|
|
|
unimplemented!()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn create(conn: &Connection, data: AppEndpoint) -> Result<AppEndpoint, Error> {
|
|
|
|
let mut id = [0; 32];
|
|
|
|
rand_bytes(&mut id).expect("Error while generating client id");
|
|
|
|
let client_id = id.into_iter().fold(String::new(), |res, byte| format!("{}{:x}", res, byte));
|
|
|
|
|
|
|
|
let mut secret = [0; 32];
|
|
|
|
rand_bytes(&mut secret).expect("Error while generating client secret");
|
|
|
|
let client_secret = secret.into_iter().fold(String::new(), |res, byte| format!("{}{:x}", res, byte));
|
|
|
|
let app = App::insert(conn, NewApp {
|
|
|
|
name: data.name.expect("App::create: name is required"),
|
|
|
|
client_id: client_id,
|
|
|
|
client_secret: client_secret,
|
|
|
|
redirect_uri: data.redirect_uri,
|
|
|
|
website: data.website,
|
|
|
|
});
|
|
|
|
|
|
|
|
Ok(AppEndpoint {
|
|
|
|
id: Some(app.id),
|
|
|
|
name: Some(app.name),
|
|
|
|
client_id: Some(app.client_id),
|
|
|
|
client_secret: Some(app.client_secret),
|
|
|
|
redirect_uri: app.redirect_uri,
|
|
|
|
website: app.website,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
fn update(conn: &Connection, id: i32, new_data: AppEndpoint) -> Result<AppEndpoint, Error> {
|
|
|
|
unimplemented!()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn delete(conn: &Connection, id: i32) {
|
|
|
|
unimplemented!()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-21 13:19:07 +00:00
|
|
|
impl App {
|
2018-10-21 16:22:27 +00:00
|
|
|
get!(apps);
|
2018-10-21 13:19:07 +00:00
|
|
|
insert!(apps, NewApp);
|
|
|
|
}
|