summaryrefslogtreecommitdiff
path: root/src/views.rs
blob: 36227196f23744f6fe8c210fe29441132249b8cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)
}