features/curl #6

Closed
supercmmetry wants to merge 3 commits from features/curl into master
11 changed files with 77 additions and 39 deletions

View File

@ -1,18 +1,28 @@
use std::ops::DerefMut;
use diesel::result::Error;
use rocket::{http::{Cookies, Status}, response::status, Rocket};
use rocket::response::status::Custom;
use rocket::{
http::{Cookies, Status},
response::status,
Rocket,
};
use rocket_contrib::json::Json;
use serde_json::Value;
use crate::api::catchers::{forbidden, internal_server_error, not_found, unprocessable_entity};
use crate::api::guards::db::DbConn;
use crate::core::paste::{entity::Paste, service::{create_paste, fetch_paste, update_paste}};
use crate::core::paste::{
entity::Paste,
service::{create_paste, fetch_paste, update_paste},
};
use crate::core::users::entity::User;
use crate::core::users::service::{create_or_fetch_user, fetch_user};
use crate::utils::phonetic_key;
use crate::utils::users::get_session_id;
use crate::core::users::entity::User;
use crate::{
api::catchers::{forbidden, internal_server_error, not_found, unprocessable_entity},
utils::domain::get_domain,
};
#[post("/", data = "<paste>")]
fn create(mut paste: Json<Paste>, conn: DbConn, mut ck: Cookies) -> Custom<Json<Value>> {
@ -53,12 +63,10 @@ fn fetch(id: String, conn: DbConn, mut ck: Cookies) -> Custom<Json<Value>> {
let r_user = fetch_user(user_id, &conn);
let user = match r_user {
Ok(user) => user,
Err(e) => {
match e.downcast_ref::<Error>() {
Some(Error::NotFound) => User::new(),
_ => return internal_server_error(),
}
}
Err(e) => match e.downcast_ref::<Error>() {
Some(Error::NotFound) => User::new(),
_ => return internal_server_error(),
},
};
let paste = match fetch_paste(id, &conn) {
@ -73,17 +81,20 @@ fn fetch(id: String, conn: DbConn, mut ck: Cookies) -> Custom<Json<Value>> {
let belongs_to = paste.belongs_to.as_ref().unwrap();
return if user.id == *belongs_to {
Custom(Status::Ok, Json(json!({
"id": paste.id,
"belongs_to": *belongs_to,
"is_url": paste.is_url.unwrap(),
"content": paste.content,
"is_owner": true
})))
if user.id == *belongs_to {
Custom(
Status::Ok,
Json(json!({
"id": paste.id,
"belongs_to": *belongs_to,
"is_url": paste.is_url.unwrap(),
"content": paste.content,
"is_owner": true
})),
)
} else {
Custom(Status::Ok, Json(json!(paste)))
};
}
}
#[patch("/", data = "<paste>")]
@ -107,7 +118,7 @@ fn update(mut paste: Json<Paste>, conn: DbConn, mut ck: Cookies) -> Custom<Json<
new_paste.belongs_to = match fetch_paste(new_paste.id.as_ref().unwrap().clone(), &conn) {
Ok(paste) => paste.belongs_to,
Err(_) => return internal_server_error()
Err(_) => return internal_server_error(),
};
if new_paste.belongs_to.is_some() {
@ -116,9 +127,9 @@ fn update(mut paste: Json<Paste>, conn: DbConn, mut ck: Cookies) -> Custom<Json<
Ok(_) => status::Custom(
Status::Created,
Json(json!({
"msg": "Successfully created paste",
"paste_id": new_paste.id
})),
"msg": "Successfully created paste",
"paste_id": new_paste.id
})),
),
Err(_) => internal_server_error(),
}
@ -130,6 +141,25 @@ fn update(mut paste: Json<Paste>, conn: DbConn, mut ck: Cookies) -> Custom<Json<
}
}
pub fn fuel(rocket: Rocket) -> Rocket {
rocket.mount("/api/paste", routes![create, fetch, update])
#[post("/", data = "<input>")]
fn anonymous(input: String, conn: DbConn) -> String {
let mut new_paste = Paste {
id: Some(phonetic_key::get_random_id()),
belongs_to: None,
content: input,
is_url: None,
};
dbg!(new_paste.id.clone());
match create_paste(&mut new_paste, &conn) {
Ok(_) => format!("{}/{}", get_domain(), new_paste.id.unwrap()),
Err(_) => String::from("Internal Server Error"),
}
}
pub fn fuel(rocket: Rocket) -> Rocket {
rocket
.mount("/api/paste", routes![create, fetch, update])
.mount("/api", routes![anonymous])
}

View File

@ -1,11 +1,7 @@
use anyhow::Result;
use rocket::{
http::Status,
response::status,
Rocket,
};
use rocket::http::Cookies;
use rocket::response::status::Custom;
use rocket::{http::Status, response::status, Rocket};
use rocket_contrib::json::Json;
use serde_json::Value;

View File

@ -1,7 +1,7 @@
use crate::schema::pastes;
#[table_name = "pastes"]
#[derive(AsChangeset, Serialize, Deserialize, Queryable, Insertable)]
#[table_name = "pastes"]
pub struct Paste {
pub id: Option<String>,
pub belongs_to: Option<String>,

View File

@ -16,7 +16,9 @@ pub fn create_paste(paste: &Paste, conn: &PgConnection) -> Result<usize> {
pub fn update_paste(paste: &Paste, conn: &PgConnection) -> Result<Paste> {
use crate::schema::pastes::dsl::*;
let updated_user = diesel::update(pastes.filter(id.eq(paste.id.as_ref().unwrap()))).set(paste).get_result(conn)?;
let updated_user = diesel::update(pastes.filter(id.eq(paste.id.as_ref().unwrap())))
.set(paste)
.get_result(conn)?;
Ok(updated_user)
}

View File

@ -1,7 +1,7 @@
use crate::schema::users;
#[derive(Default, AsChangeset, Serialize, Deserialize, Queryable, Insertable)]
#[table_name = "users"]
#[derive(AsChangeset, Serialize, Deserialize, Queryable, Insertable)]
pub struct User {
pub id: String,
pub username: Option<String>,

View File

@ -19,7 +19,7 @@ pub fn create_or_fetch_user(id: String, conn: &PgConnection) -> Result<User> {
Err(err) => match err.downcast_ref::<Error>() {
Some(Error::NotFound) => {
let new_user = User {
id: id.clone(),
id,
username: None,
password: None,
activated: Some(false),

View File

@ -15,8 +15,6 @@ extern crate serde_json;
extern crate slog;
use slog::{Drain, Logger};
use slog_async;
use slog_term;
pub mod api;
pub mod core;
@ -40,7 +38,7 @@ fn main() {
let drain = slog_async::Async::new(drain).build().fuse();
let logger = slog::Logger::root(drain, o!());
// run_migrations(&logger);
run_migrations(&logger);
let mut rocket = rocket::ignite();

View File

@ -7,7 +7,10 @@ pub type Pool = r2d2::Pool<ConnectionManager<PgConnection>>;
pub fn pool() -> Pool {
let manager = ConnectionManager::<PgConnection>::new(database_url());
let pool_size = env::var("KATBIN_POOL_SIZE").unwrap().parse::<u32>().expect("pool size");
let pool_size = env::var("KATBIN_POOL_SIZE")
.unwrap()
.parse::<u32>()
.expect("pool size");
Pool::builder().max_size(pool_size).build(manager).unwrap()
}

8
src/utils/domain.rs Normal file
View File

@ -0,0 +1,8 @@
use std::env;
pub fn get_domain() -> String {
env::var("KATBIN_DOMAIN_NAME")
.unwrap()
.parse::<String>()
.expect("domain name")
}

View File

@ -64,7 +64,7 @@ impl Error {
}
fn set_msg(mut self) -> Self {
self.msg = match self.code.clone() {
self.msg = match self.code {
ErrorCode::InvalidCredentials => "invalid credentials were provided".to_string(),
ErrorCode::MultipleAuthToken => {
"multiple authorization tokens were provided".to_string()

View File

@ -1,4 +1,5 @@
pub mod db;
pub mod domain;
pub mod errors;
pub mod phonetic_key;
pub mod users;