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
No related branches found
No related tags found
No related merge requests found
...@@ -686,6 +686,7 @@ dependencies = [ ...@@ -686,6 +686,7 @@ dependencies = [
"futures", "futures",
"rocket", "rocket",
"rocket_contrib", "rocket_contrib",
"serde",
"serde_json", "serde_json",
"uuid", "uuid",
] ]
...@@ -1181,6 +1182,20 @@ name = "serde" ...@@ -1181,6 +1182,20 @@ name = "serde"
version = "1.0.115" version = "1.0.115"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5" 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]] [[package]]
name = "serde_json" name = "serde_json"
......
...@@ -25,7 +25,7 @@ version = "0.4.5" ...@@ -25,7 +25,7 @@ version = "0.4.5"
default-features = false default-features = false
features = ["json", "diesel_postgres_pool"] features = ["json", "diesel_postgres_pool"]
[dependencis.serde] [dependencies.serde]
version = "1.0.115" version = "1.0.115"
features = ["derive"] features = ["derive"]
......
...@@ -7,10 +7,13 @@ extern crate rocket; ...@@ -7,10 +7,13 @@ extern crate rocket;
extern crate rocket_contrib; extern crate rocket_contrib;
use diesel::prelude::*; use diesel::prelude::*;
use dotenv::dotenv;
use rocket::http::RawStr;
use rocket::request::FromParam;
use rocket_contrib::databases::diesel; use rocket_contrib::databases::diesel;
use rocket_contrib::json::Json; use rocket_contrib::json::Json;
use uuid::Uuid;
use dotenv::dotenv;
use media_backend::models::*; use media_backend::models::*;
#[database("mediaflix")] #[database("mediaflix")]
...@@ -24,6 +27,48 @@ fn list_genres(db: MediaflixConnection) -> QueryResult<Json<Vec<Genre>>> { ...@@ -24,6 +27,48 @@ fn list_genres(db: MediaflixConnection) -> QueryResult<Json<Vec<Genre>>> {
Ok(Json(query.load::<Genre>(&db.0)?)) 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() { fn main() {
dotenv().ok(); dotenv().ok();
...@@ -31,7 +76,11 @@ fn main() { ...@@ -31,7 +76,11 @@ fn main() {
.attach(MediaflixConnection::fairing()) .attach(MediaflixConnection::fairing())
.mount( .mount(
"/", "/",
rocket::routes![list_genres], rocket::routes![
list_genres,
get_genre,
get_title
],
) )
.launch(); .launch();
} }
...@@ -148,8 +148,7 @@ pub struct TitleSubtitle { ...@@ -148,8 +148,7 @@ pub struct TitleSubtitle {
pub title_id: uuid::Uuid, pub title_id: uuid::Uuid,
} }
#[derive(Identifiable, Queryable, Associations, Serialize, Deserialize, PartialEq, Debug)] #[derive(Identifiable, Queryable, Serialize, Deserialize, PartialEq, Debug)]
#[belongs_to(TitleEpisode, foreign_key = "parent_id")]
#[table_name = "titles"] #[table_name = "titles"]
pub struct Title { pub struct Title {
pub id: uuid::Uuid, pub id: uuid::Uuid,
...@@ -162,5 +161,4 @@ pub struct Title { ...@@ -162,5 +161,4 @@ pub struct Title {
pub year_end: Option<i32>, pub year_end: Option<i32>,
pub created_at: chrono::DateTime<chrono::Utc>, pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>, pub updated_at: chrono::DateTime<chrono::Utc>,
pub parent_id: Option<uuid::Uuid>,
} }
...@@ -142,7 +142,6 @@ table! { ...@@ -142,7 +142,6 @@ table! {
year_end -> Nullable<Int4>, year_end -> Nullable<Int4>,
created_at -> Timestamptz, created_at -> Timestamptz,
updated_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