Skip to content
Snippets Groups Projects
Verified Commit 2f5ba167 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Created initial solution for loading aggregate data

parent 64e10167
Branches
No related tags found
No related merge requests found
......@@ -686,6 +686,7 @@ dependencies = [
"futures",
"rocket",
"rocket_contrib",
"serde",
"serde_json",
"uuid",
]
......@@ -1181,6 +1182,20 @@ name = "serde"
version = "1.0.115"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.115"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "609feed1d0a73cc36a0182a840a9b37b4a82f0b1150369f0536a9e3f2a31dc48"
dependencies = [
"proc-macro2 1.0.20",
"quote 1.0.7",
"syn 1.0.39",
]
[[package]]
name = "serde_json"
......
......@@ -25,7 +25,7 @@ version = "0.4.5"
default-features = false
features = ["json", "diesel_postgres_pool"]
[dependencis.serde]
[dependencies.serde]
version = "1.0.115"
features = ["derive"]
......
......@@ -7,10 +7,13 @@ extern crate rocket;
extern crate rocket_contrib;
use diesel::prelude::*;
use dotenv::dotenv;
use rocket::http::RawStr;
use rocket::request::FromParam;
use rocket_contrib::databases::diesel;
use rocket_contrib::json::Json;
use uuid::Uuid;
use dotenv::dotenv;
use media_backend::models::*;
#[database("mediaflix")]
......@@ -24,6 +27,48 @@ fn list_genres(db: MediaflixConnection) -> QueryResult<Json<Vec<Genre>>> {
Ok(Json(query.load::<Genre>(&db.0)?))
}
struct ParamUuid(uuid::Uuid);
impl FromParam<'_> for ParamUuid {
type Error = uuid::parser::ParseError;
fn from_param(param: &RawStr) -> Result<Self, Self::Error> {
return Ok(ParamUuid(Uuid::parse_str(param.as_str())?));
}
}
#[get("/api/v1/genres/<genre>")]
fn get_genre(db: MediaflixConnection, genre: ParamUuid) -> QueryResult<Json<Vec<((Title, Vec<TitleName>), Vec<TitleRating>)>>> {
use media_backend::schema::*;
let titles = title_genres::table
.filter(title_genres::genre_id.eq(genre.0))
.inner_join(titles::table)
.select(titles::all_columns)
.load::<Title>(&db.0)?;
let title_akas = TitleName::belonging_to(&titles)
.load::<TitleName>(&db.0)?
.grouped_by(&titles);
let title_ratings = TitleRating::belonging_to(&titles)
.load::<TitleRating>(&db.0)?
.grouped_by(&titles);
let data = titles.into_iter()
.zip(title_akas)
.zip(title_ratings)
.collect::<Vec<_>>();
Ok(Json(data))
}
#[get("/api/v1/titles/<title>")]
fn get_title(db: MediaflixConnection, title: ParamUuid) -> QueryResult<Json<Title>> {
use media_backend::schema::*;
let query = titles::table
.find(title.0)
.into_boxed();
Ok(Json(query.first::<Title>(&db.0)?))
}
fn main() {
dotenv().ok();
......@@ -31,7 +76,11 @@ fn main() {
.attach(MediaflixConnection::fairing())
.mount(
"/",
rocket::routes![list_genres],
rocket::routes![
list_genres,
get_genre,
get_title
],
)
.launch();
}
......@@ -148,8 +148,7 @@ pub struct TitleSubtitle {
pub title_id: uuid::Uuid,
}
#[derive(Identifiable, Queryable, Associations, Serialize, Deserialize, PartialEq, Debug)]
#[belongs_to(TitleEpisode, foreign_key = "parent_id")]
#[derive(Identifiable, Queryable, Serialize, Deserialize, PartialEq, Debug)]
#[table_name = "titles"]
pub struct Title {
pub id: uuid::Uuid,
......@@ -162,5 +161,4 @@ pub struct Title {
pub year_end: Option<i32>,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
pub parent_id: Option<uuid::Uuid>,
}
......@@ -142,7 +142,6 @@ table! {
year_end -> Nullable<Int4>,
created_at -> Timestamptz,
updated_at -> Timestamptz,
parent_id -> Nullable<Uuid>,
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment