summaryrefslogtreecommitdiff
path: root/src/views.rs
diff options
context:
space:
mode:
authorAndrew Guschin <saintruler@gmail.com>2021-04-18 16:25:48 +0400
committerAndrew Guschin <saintruler@gmail.com>2021-04-18 16:25:48 +0400
commit0ad35b9b50dfaa1083f3f5acc633ec769bc10e37 (patch)
tree4acfde7b0b09fb258002055a8d0e2d5e1a9c5c3e /src/views.rs
Initial commit
Diffstat (limited to 'src/views.rs')
-rw-r--r--src/views.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/views.rs b/src/views.rs
new file mode 100644
index 0000000..3622719
--- /dev/null
+++ b/src/views.rs
@@ -0,0 +1,45 @@
+use actix_web::{get, post, HttpResponse, Responder};
+use diesel::prelude::*;
+use crate::models::{Post, PostResponse};
+use crate::validator::Validator;
+use crate::db;
+use serde_json;
+
+#[get("/")]
+pub async fn hello() -> impl Responder {
+ HttpResponse::Ok().body("Hello world!")
+}
+
+#[post("/api/posts/add")]
+pub async fn echo(req_body: String) -> impl Responder {
+ let validator = Validator::from_file("schemas/post.json").unwrap();
+ let result = validator.check(&req_body);
+
+ if !result {
+ return HttpResponse::BadRequest().json(PostResponse {
+ msg: "Message doesn't conform to schema"
+ });
+ }
+
+ let conn = db::establish_connection();
+ let new_post: Post = serde_json::from_str(&req_body).unwrap();
+ let result = db::create_post(&conn, &new_post);
+ return match result {
+ Ok(_) => HttpResponse::Ok().json(new_post),
+ Err(res) => HttpResponse::InternalServerError().json(PostResponse {
+ msg: &res.to_string()
+ })
+ };
+}
+
+#[get("/api/posts")]
+pub async fn get_posts() -> impl Responder {
+ use crate::schema::posts::dsl::*;
+ let connection = db::establish_connection();
+ let results = posts.filter(published.eq(true))
+ .limit(5)
+ .load::<Post>(&connection)
+ .expect("Error loading posts");
+ HttpResponse::Ok().json(&results)
+}
+