Migrate user to use postgres instead of couchdb.

This commit is contained in:
Dorian 2018-09-25 00:49:23 -04:00
parent 35147bb68f
commit f052e6779d
4 changed files with 41 additions and 69 deletions

View File

@ -29,12 +29,8 @@ use serde_json::Value;
#[derive(Serialize, Deserialize, Clone, Debug)] #[derive(Serialize, Deserialize, Clone, Debug)]
pub struct User { pub struct User {
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")] #[serde(skip_serializing)]
id: Option<String>, id: i32,
#[serde(rename = "_rev", skip_serializing_if = "Option::is_none")]
revision: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
type_: Option<String>,
pub username: String, pub username: String,
#[serde(rename = "fullName")] #[serde(rename = "fullName")]
@ -49,9 +45,7 @@ pub struct User {
impl Default for User { impl Default for User {
fn default() -> User { fn default() -> User {
User { User {
id: None, id: 0,
revision: None,
type_: Some(String::from("user")),
username: Default::default(), username: Default::default(),
full_name: Default::default(), full_name: Default::default(),
password: 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)] #[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Page { pub struct Page {
#[serde(skip_serializing)] #[serde(skip_serializing)]
@ -115,7 +124,6 @@ impl Queryable<schema::pages::SqlType, diesel::pg::Pg> for Page {
title: row.2, title: row.2,
content: row.3, content: row.3,
created_at: created_datetime, created_at: created_datetime,
links: HashMap::new(), 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()
}
}
}

View File

@ -2,6 +2,7 @@
extern crate serde_derive; extern crate serde_derive;
extern crate actix_web; extern crate actix_web;
extern crate crypto; extern crate crypto;
extern crate diesel;
extern crate docopt; extern crate docopt;
extern crate env_logger; extern crate env_logger;
extern crate reqwest; extern crate reqwest;
@ -12,8 +13,10 @@ extern crate log;
extern crate rookeries; extern crate rookeries;
use crypto::pbkdf2::pbkdf2_simple; use crypto::pbkdf2::pbkdf2_simple;
use diesel::prelude::*;
use docopt::Docopt; 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::web::run_server;
use rookeries::User; use rookeries::User;
@ -55,9 +58,9 @@ fn main() {
} }
if args.arg_username != "" && args.arg_password != "" { if args.arg_username != "" && args.arg_password != "" {
let couchdb = match Server::configure_from_env() { let database = match configure_database_from_env() {
Err(err) => { Err(err) => {
error!("Unable to connect to CouchDB! {}", err); error!("Unable to connect to Postgres! {}", err);
std::process::exit(1); std::process::exit(1);
} }
Ok(t) => t, Ok(t) => t,
@ -70,7 +73,14 @@ fn main() {
user.password = pbkdf2_simple(&args.arg_password, 5000).unwrap(); user.password = pbkdf2_simple(&args.arg_password, 5000).unwrap();
user.email = format!("{}@rookeries.org", &user.username); 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) => { Err(e) => {
error!( error!(
"Could not create user \"{}\" because of {}", "Could not create user \"{}\" because of {}",

View File

@ -18,7 +18,4 @@ table! {
} }
} }
allow_tables_to_appear_in_same_query!( allow_tables_to_appear_in_same_query!(pages, users,);
pages,
users,
);

View File

@ -14,6 +14,7 @@ use db::{configure_database_from_env, ENV_DATABASE_URI};
use diesel::prelude::*; use diesel::prelude::*;
use diesel::{update, QueryResult}; use diesel::{update, QueryResult};
use schema::pages::dsl::*; use schema::pages::dsl::*;
use schema::users::dsl::*;
use security::{JwtToken, ENV_JWT_SECRET_KEY}; use security::{JwtToken, ENV_JWT_SECRET_KEY};
use {Page, RookeriesDomain, Site, User}; use {Page, RookeriesDomain, Site, User};
@ -36,22 +37,6 @@ struct UserCredentialsRequest {
password: String, 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)] #[derive(Serialize)]
struct QueryForSite { struct QueryForSite {
#[serde(rename = "type")] #[serde(rename = "type")]
@ -82,16 +67,17 @@ fn status(_req: &HttpRequest) -> HttpResponse {
} }
fn auth(credentials: Json<UserCredentialsRequest>) -> HttpResponse { fn auth(credentials: Json<UserCredentialsRequest>) -> HttpResponse {
let couchdb = Server::configure_from_env().unwrap(); let database = configure_database_from_env().unwrap();
info!( info!(
"Attempting to authenticate user \"{}\"", "Attempting to authenticate user \"{}\"",
credentials.username credentials.username
); );
let users_found: Result<Vec<User>, Box<CouchDbError>> = couchdb.find(Query { let users_found = users
selector: QueryOnUsername::new(&credentials.username), .filter(username.eq(&credentials.username))
}); .load::<User>(&database);
if users_found.is_err() { if users_found.is_err() {
error!( error!(
"Unable to retrieve users because: {}", "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 { fn serve_page((page_slug, request): (Path<String>, HttpRequest)) -> HttpResponse {
let page_slug = page_slug.as_ref(); let page_slug = page_slug.as_ref();
let database = configure_database_from_env().unwrap(); let database = configure_database_from_env().unwrap();
let pages_found = pages let pages_found = pages.filter(slug.eq(page_slug)).load::<Page>(&database);
.filter(slug.eq(page_slug))
.load::<Page>(&database);
if pages_found.is_err() { if pages_found.is_err() {
error!( error!(
@ -197,9 +181,7 @@ fn update_page(
let page_slug = page_slug.as_ref(); let page_slug = page_slug.as_ref();
let database = configure_database_from_env().unwrap(); let database = configure_database_from_env().unwrap();
let pages_found = pages let pages_found = pages.filter(slug.eq(page_slug)).load::<Page>(&database);
.filter(slug.eq(page_slug))
.load::<Page>(&database);
if pages_found.is_err() { if pages_found.is_err() {
error!( error!(