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)]
|
#[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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
18
src/main.rs
18
src/main.rs
|
@ -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 {}",
|
||||||
|
|
|
@ -18,7 +18,4 @@ table! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allow_tables_to_appear_in_same_query!(
|
allow_tables_to_appear_in_same_query!(pages, users,);
|
||||||
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::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!(
|
||||||
|
|
Loading…
Reference in New Issue