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::(&connection) .expect("Error loading posts"); HttpResponse::Ok().json(&results) }