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)]
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()
}
}
}

View File

@ -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 {}",

View File

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

View File

@ -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!(