Migrate user to use postgres instead of couchdb.
This commit is contained in:
parent
35147bb68f
commit
f052e6779d
53
src/lib.rs
53
src/lib.rs
|
@ -29,12 +29,8 @@ use serde_json::Value;
|
|||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct User {
|
||||
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
|
||||
id: Option<String>,
|
||||
#[serde(rename = "_rev", skip_serializing_if = "Option::is_none")]
|
||||
revision: Option<String>,
|
||||
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
|
||||
type_: Option<String>,
|
||||
#[serde(skip_serializing)]
|
||||
id: i32,
|
||||
|
||||
pub username: String,
|
||||
#[serde(rename = "fullName")]
|
||||
|
@ -49,9 +45,7 @@ pub struct User {
|
|||
impl Default for User {
|
||||
fn default() -> User {
|
||||
User {
|
||||
id: None,
|
||||
revision: None,
|
||||
type_: Some(String::from("user")),
|
||||
id: 0,
|
||||
username: Default::default(),
|
||||
full_name: Default::default(),
|
||||
password: Default::default(),
|
||||
|
@ -61,6 +55,21 @@ impl Default for User {
|
|||
}
|
||||
}
|
||||
|
||||
impl Queryable<schema::users::SqlType, diesel::pg::Pg> for User {
|
||||
type Row = (i32, String, String, String, String);
|
||||
|
||||
fn build(row: Self::Row) -> Self {
|
||||
User {
|
||||
id: row.0,
|
||||
username: row.1,
|
||||
full_name: row.2,
|
||||
password: row.3,
|
||||
email: row.4,
|
||||
links: HashMap::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct Page {
|
||||
#[serde(skip_serializing)]
|
||||
|
@ -115,7 +124,6 @@ impl Queryable<schema::pages::SqlType, diesel::pg::Pg> for Page {
|
|||
title: row.2,
|
||||
content: row.3,
|
||||
created_at: created_datetime,
|
||||
|
||||
links: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
@ -197,28 +205,3 @@ impl RookeriesDomain for Site {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl RookeriesDomain for User {
|
||||
fn id(&self) -> Option<String> {
|
||||
self.id.clone()
|
||||
}
|
||||
|
||||
fn remove_couchdb_details(&self) -> User {
|
||||
User {
|
||||
id: None,
|
||||
revision: None,
|
||||
type_: None,
|
||||
..self.clone()
|
||||
}
|
||||
}
|
||||
|
||||
fn add_self_links(&self, self_link: String) -> User {
|
||||
let mut links = HashMap::new();
|
||||
links.insert(String::from("self"), Value::String(self_link));
|
||||
|
||||
User {
|
||||
links,
|
||||
..self.clone()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
18
src/main.rs
18
src/main.rs
|
@ -2,6 +2,7 @@
|
|||
extern crate serde_derive;
|
||||
extern crate actix_web;
|
||||
extern crate crypto;
|
||||
extern crate diesel;
|
||||
extern crate docopt;
|
||||
extern crate env_logger;
|
||||
extern crate reqwest;
|
||||
|
@ -12,8 +13,10 @@ extern crate log;
|
|||
extern crate rookeries;
|
||||
|
||||
use crypto::pbkdf2::pbkdf2_simple;
|
||||
use diesel::prelude::*;
|
||||
use docopt::Docopt;
|
||||
use rookeries::couchdb::Server;
|
||||
use rookeries::db::configure_database_from_env;
|
||||
use rookeries::schema::users::dsl::*;
|
||||
use rookeries::web::run_server;
|
||||
use rookeries::User;
|
||||
|
||||
|
@ -55,9 +58,9 @@ fn main() {
|
|||
}
|
||||
|
||||
if args.arg_username != "" && args.arg_password != "" {
|
||||
let couchdb = match Server::configure_from_env() {
|
||||
let database = match configure_database_from_env() {
|
||||
Err(err) => {
|
||||
error!("Unable to connect to CouchDB! {}", err);
|
||||
error!("Unable to connect to Postgres! {}", err);
|
||||
std::process::exit(1);
|
||||
}
|
||||
Ok(t) => t,
|
||||
|
@ -70,7 +73,14 @@ fn main() {
|
|||
user.password = pbkdf2_simple(&args.arg_password, 5000).unwrap();
|
||||
user.email = format!("{}@rookeries.org", &user.username);
|
||||
|
||||
match couchdb.update(user) {
|
||||
match diesel::insert_into(users)
|
||||
.values((
|
||||
username.eq(&user.username),
|
||||
password.eq(&user.password),
|
||||
email.eq(&user.email),
|
||||
))
|
||||
.execute(&database)
|
||||
{
|
||||
Err(e) => {
|
||||
error!(
|
||||
"Could not create user \"{}\" because of {}",
|
||||
|
|
|
@ -18,7 +18,4 @@ table! {
|
|||
}
|
||||
}
|
||||
|
||||
allow_tables_to_appear_in_same_query!(
|
||||
pages,
|
||||
users,
|
||||
);
|
||||
allow_tables_to_appear_in_same_query!(pages, users,);
|
||||
|
|
34
src/web.rs
34
src/web.rs
|
@ -14,6 +14,7 @@ use db::{configure_database_from_env, ENV_DATABASE_URI};
|
|||
use diesel::prelude::*;
|
||||
use diesel::{update, QueryResult};
|
||||
use schema::pages::dsl::*;
|
||||
use schema::users::dsl::*;
|
||||
use security::{JwtToken, ENV_JWT_SECRET_KEY};
|
||||
use {Page, RookeriesDomain, Site, User};
|
||||
|
||||
|
@ -36,22 +37,6 @@ struct UserCredentialsRequest {
|
|||
password: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct QueryOnUsername {
|
||||
username: String,
|
||||
#[serde(rename = "type")]
|
||||
type_: String,
|
||||
}
|
||||
|
||||
impl QueryOnUsername {
|
||||
fn new(username: &str) -> QueryOnUsername {
|
||||
QueryOnUsername {
|
||||
username: username.to_string(),
|
||||
type_: String::from("user"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct QueryForSite {
|
||||
#[serde(rename = "type")]
|
||||
|
@ -82,16 +67,17 @@ fn status(_req: &HttpRequest) -> HttpResponse {
|
|||
}
|
||||
|
||||
fn auth(credentials: Json<UserCredentialsRequest>) -> HttpResponse {
|
||||
let couchdb = Server::configure_from_env().unwrap();
|
||||
let database = configure_database_from_env().unwrap();
|
||||
|
||||
info!(
|
||||
"Attempting to authenticate user \"{}\"",
|
||||
credentials.username
|
||||
);
|
||||
|
||||
let users_found: Result<Vec<User>, Box<CouchDbError>> = couchdb.find(Query {
|
||||
selector: QueryOnUsername::new(&credentials.username),
|
||||
});
|
||||
let users_found = users
|
||||
.filter(username.eq(&credentials.username))
|
||||
.load::<User>(&database);
|
||||
|
||||
if users_found.is_err() {
|
||||
error!(
|
||||
"Unable to retrieve users because: {}",
|
||||
|
@ -142,9 +128,7 @@ fn auth(credentials: Json<UserCredentialsRequest>) -> HttpResponse {
|
|||
fn serve_page((page_slug, request): (Path<String>, HttpRequest)) -> HttpResponse {
|
||||
let page_slug = page_slug.as_ref();
|
||||
let database = configure_database_from_env().unwrap();
|
||||
let pages_found = pages
|
||||
.filter(slug.eq(page_slug))
|
||||
.load::<Page>(&database);
|
||||
let pages_found = pages.filter(slug.eq(page_slug)).load::<Page>(&database);
|
||||
|
||||
if pages_found.is_err() {
|
||||
error!(
|
||||
|
@ -197,9 +181,7 @@ fn update_page(
|
|||
|
||||
let page_slug = page_slug.as_ref();
|
||||
let database = configure_database_from_env().unwrap();
|
||||
let pages_found = pages
|
||||
.filter(slug.eq(page_slug))
|
||||
.load::<Page>(&database);
|
||||
let pages_found = pages.filter(slug.eq(page_slug)).load::<Page>(&database);
|
||||
|
||||
if pages_found.is_err() {
|
||||
error!(
|
||||
|
|
Loading…
Reference in New Issue