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

Adapted routes to new paths

parent c9d4bf9b
Branches
Tags v0.0.5
No related merge requests found
...@@ -6,15 +6,15 @@ use crate::models::*; ...@@ -6,15 +6,15 @@ use crate::models::*;
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct TitleDto { pub struct ContentDto {
pub ids: TitleIdDto, pub ids: ContentIdDto,
pub kind: String, pub kind: String,
pub original_language: Option<String>, pub original_language: Option<String>,
pub runtime: Option<i32>, pub runtime: Option<i32>,
pub year_start: Option<i32>, pub year_start: Option<i32>,
pub year_end: Option<i32>, pub year_end: Option<i32>,
pub titles: Vec<TitleNameDto>, pub titles: Vec<ContentNameDto>,
pub descriptions: Vec<TitleDescriptionDto>, pub descriptions: Vec<ContentDescriptionDto>,
pub cast: Vec<CastDto>, pub cast: Vec<CastDto>,
pub genres: Vec<GenreDto>, pub genres: Vec<GenreDto>,
pub ratings: Vec<RatingDto>, pub ratings: Vec<RatingDto>,
...@@ -26,11 +26,11 @@ pub struct TitleDto { ...@@ -26,11 +26,11 @@ pub struct TitleDto {
pub updated_at: chrono::DateTime<chrono::Utc>, pub updated_at: chrono::DateTime<chrono::Utc>,
} }
impl TitleDto { impl ContentDto {
pub fn of( pub fn of(
src: Title, src: Title,
titles: Vec<TitleNameDto>, titles: Vec<ContentNameDto>,
descriptions: Vec<TitleDescriptionDto>, descriptions: Vec<ContentDescriptionDto>,
cast: Vec<CastDto>, cast: Vec<CastDto>,
genres: Vec<GenreDto>, genres: Vec<GenreDto>,
ratings: Vec<RatingDto>, ratings: Vec<RatingDto>,
...@@ -39,8 +39,8 @@ impl TitleDto { ...@@ -39,8 +39,8 @@ impl TitleDto {
subtitles: Vec<SubtitleDto>, subtitles: Vec<SubtitleDto>,
preview: Option<String>, preview: Option<String>,
) -> Self { ) -> Self {
TitleDto { ContentDto {
ids: TitleIdDto { ids: ContentIdDto {
uuid: src.id, uuid: src.id,
imdb: src.imdb_id, imdb: src.imdb_id,
tmdb: src.tmdb_id, tmdb: src.tmdb_id,
...@@ -68,7 +68,7 @@ impl TitleDto { ...@@ -68,7 +68,7 @@ impl TitleDto {
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct TitleIdDto { pub struct ContentIdDto {
pub uuid: uuid::Uuid, pub uuid: uuid::Uuid,
pub imdb: Option<String>, pub imdb: Option<String>,
pub tmdb: Option<i32>, pub tmdb: Option<i32>,
...@@ -77,16 +77,16 @@ pub struct TitleIdDto { ...@@ -77,16 +77,16 @@ pub struct TitleIdDto {
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct TitleNameDto { pub struct ContentNameDto {
pub region: Option<String>, pub region: Option<String>,
pub languages: Vec<String>, pub languages: Vec<String>,
pub kind: String, pub kind: String,
pub name: String, pub name: String,
} }
impl From<TitleName> for TitleNameDto { impl From<TitleName> for ContentNameDto {
fn from(src: TitleName) -> Self { fn from(src: TitleName) -> Self {
TitleNameDto { ContentNameDto {
region: src.region, region: src.region,
languages: src.languages, languages: src.languages,
kind: src.kind, kind: src.kind,
...@@ -97,7 +97,7 @@ impl From<TitleName> for TitleNameDto { ...@@ -97,7 +97,7 @@ impl From<TitleName> for TitleNameDto {
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct TitleDescriptionDto { pub struct ContentDescriptionDto {
pub region: Option<String>, pub region: Option<String>,
pub languages: Vec<String>, pub languages: Vec<String>,
pub kind: String, pub kind: String,
...@@ -105,9 +105,9 @@ pub struct TitleDescriptionDto { ...@@ -105,9 +105,9 @@ pub struct TitleDescriptionDto {
pub tagline: Option<String>, pub tagline: Option<String>,
} }
impl From<TitleDescription> for TitleDescriptionDto { impl From<TitleDescription> for ContentDescriptionDto {
fn from(src: TitleDescription) -> Self { fn from(src: TitleDescription) -> Self {
TitleDescriptionDto { ContentDescriptionDto {
region: src.region, region: src.region,
languages: src.languages, languages: src.languages,
kind: src.kind, kind: src.kind,
...@@ -175,20 +175,20 @@ impl From<Person> for PersonDto { ...@@ -175,20 +175,20 @@ impl From<Person> for PersonDto {
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct EpisodeDto { pub struct InstalmentDto {
pub season: Option<String>, pub season: Option<String>,
pub episode: Option<String>, pub episode: Option<String>,
pub air_date: Option<chrono::NaiveDate>, pub air_date: Option<chrono::NaiveDate>,
pub title: TitleDto, pub content: ContentDto,
} }
impl EpisodeDto { impl InstalmentDto {
pub fn of(episode: TitleEpisode, title: TitleDto) -> Self { pub fn of(episode: TitleEpisode, content: ContentDto) -> Self {
EpisodeDto { InstalmentDto {
season: episode.season_number, season: episode.season_number,
episode: episode.episode_number, episode: episode.episode_number,
air_date: episode.air_date, air_date: episode.air_date,
title, content,
} }
} }
} }
...@@ -271,14 +271,14 @@ impl SubtitleDto { ...@@ -271,14 +271,14 @@ impl SubtitleDto {
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct GenreWithTitlesDto { pub struct GenreWithContentDto {
pub genre: GenreDto, pub genre: GenreDto,
pub titles: Vec<TitleDto>, pub content: Vec<ContentDto>,
} }
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct TitleMetaDto { pub struct ContentMetaDto {
pub title: TitleDto, pub content: ContentDto,
pub show: Option<EpisodeDto>, pub instalment: Option<InstalmentDto>,
} }
\ No newline at end of file
...@@ -7,7 +7,7 @@ use crate::dto::*; ...@@ -7,7 +7,7 @@ use crate::dto::*;
use crate::models::*; use crate::models::*;
use crate::schema::*; use crate::schema::*;
pub fn load_episodes(db: &PgConnection, config: &Config, title_id: Uuid) -> QueryResult<Vec<EpisodeDto>> { pub fn load_episodes(db: &PgConnection, config: &Config, title_id: Uuid) -> QueryResult<Vec<InstalmentDto>> {
let titles: Vec<(TitleEpisode, Title)> = title_episodes::table let titles: Vec<(TitleEpisode, Title)> = title_episodes::table
.filter(title_episodes::show_id.eq(title_id)) .filter(title_episodes::show_id.eq(title_id))
.inner_join(titles::table.on(titles::id.eq(title_episodes::episode_id))) .inner_join(titles::table.on(titles::id.eq(title_episodes::episode_id)))
...@@ -16,19 +16,19 @@ pub fn load_episodes(db: &PgConnection, config: &Config, title_id: Uuid) -> Quer ...@@ -16,19 +16,19 @@ pub fn load_episodes(db: &PgConnection, config: &Config, title_id: Uuid) -> Quer
let (episodes, titles): (Vec<TitleEpisode>, Vec<Title>) = titles.into_iter().unzip(); let (episodes, titles): (Vec<TitleEpisode>, Vec<Title>) = titles.into_iter().unzip();
let titles = load_titles(db, config, titles)?; let titles = load_titles(db, config, titles)?;
Ok(episodes.into_iter().zip(titles) Ok(episodes.into_iter().zip(titles)
.map(|(episode, title)| EpisodeDto::of(episode, title)) .map(|(episode, title)| InstalmentDto::of(episode, title))
.collect::<Vec<_>>()) .collect::<Vec<_>>())
} }
pub fn load_show(db: &PgConnection, config: &Config, title_id: Uuid) -> QueryResult<EpisodeDto> { pub fn load_show(db: &PgConnection, config: &Config, title_id: Uuid) -> QueryResult<InstalmentDto> {
let (episode, show) = title_episodes::table let (episode, show) = title_episodes::table
.filter(title_episodes::episode_id.eq(title_id)) .filter(title_episodes::episode_id.eq(title_id))
.inner_join(titles::table.on(titles::id.eq(title_episodes::show_id))) .inner_join(titles::table.on(titles::id.eq(title_episodes::show_id)))
.first::<(TitleEpisode, Title)>(db)?; .first::<(TitleEpisode, Title)>(db)?;
Ok(EpisodeDto::of(episode, load_title(db, config, show)?)) Ok(InstalmentDto::of(episode, load_title(db, config, show)?))
} }
pub fn load_title(db: &PgConnection, config: &Config, title: Title) -> QueryResult<TitleDto> { pub fn load_title(db: &PgConnection, config: &Config, title: Title) -> QueryResult<ContentDto> {
let title_names: Vec<TitleName> = TitleName::belonging_to(&title) let title_names: Vec<TitleName> = TitleName::belonging_to(&title)
.load::<TitleName>(db)?; .load::<TitleName>(db)?;
let title_descriptions: Vec<TitleDescription> = TitleDescription::belonging_to(&title) let title_descriptions: Vec<TitleDescription> = TitleDescription::belonging_to(&title)
...@@ -59,7 +59,7 @@ pub fn load_title(db: &PgConnection, config: &Config, title: Title) -> QueryResu ...@@ -59,7 +59,7 @@ pub fn load_title(db: &PgConnection, config: &Config, title: Title) -> QueryResu
)) ))
} }
pub fn load_titles(db: &PgConnection, config: &Config, titles: Vec<Title>) -> QueryResult<Vec<TitleDto>> { pub fn load_titles(db: &PgConnection, config: &Config, titles: Vec<Title>) -> QueryResult<Vec<ContentDto>> {
let title_names: Vec<Vec<TitleName>> = TitleName::belonging_to(&titles) let title_names: Vec<Vec<TitleName>> = TitleName::belonging_to(&titles)
.load::<TitleName>(db)? .load::<TitleName>(db)?
.grouped_by(&titles); .grouped_by(&titles);
...@@ -113,7 +113,7 @@ pub fn load_titles(db: &PgConnection, config: &Config, titles: Vec<Title>) -> Qu ...@@ -113,7 +113,7 @@ pub fn load_titles(db: &PgConnection, config: &Config, titles: Vec<Title>) -> Qu
images, media, subtitles, images, media, subtitles,
preview, preview,
) )
}).collect::<Vec<TitleDto>>()) }).collect::<Vec<ContentDto>>())
} }
fn process_title( fn process_title(
...@@ -122,14 +122,14 @@ fn process_title( ...@@ -122,14 +122,14 @@ fn process_title(
cast: Vec<(TitleCast, Person)>, genres: Vec<(TitleGenre, Genre)>, ratings: Vec<TitleRating>, cast: Vec<(TitleCast, Person)>, genres: Vec<(TitleGenre, Genre)>, ratings: Vec<TitleRating>,
images: Vec<TitleImage>, media: Vec<TitleMedium>, subtitles: Vec<TitleSubtitle>, images: Vec<TitleImage>, media: Vec<TitleMedium>, subtitles: Vec<TitleSubtitle>,
preview: Option<TitlePreview>, preview: Option<TitlePreview>,
) -> TitleDto { ) -> ContentDto {
TitleDto::of( ContentDto::of(
title, title,
names.into_iter().map(|src| { names.into_iter().map(|src| {
TitleNameDto::from(src) ContentNameDto::from(src)
}).collect::<Vec<_>>(), }).collect::<Vec<_>>(),
descriptions.into_iter().map(|src| { descriptions.into_iter().map(|src| {
TitleDescriptionDto::from(src) ContentDescriptionDto::from(src)
}).collect::<Vec<_>>(), }).collect::<Vec<_>>(),
cast.into_iter().map(|src| { cast.into_iter().map(|src| {
let (cast, person) = src; let (cast, person) = src;
......
...@@ -34,7 +34,7 @@ fn list_genres(db: MediaflixConnection) -> QueryResult<Json<Vec<GenreDto>>> { ...@@ -34,7 +34,7 @@ fn list_genres(db: MediaflixConnection) -> QueryResult<Json<Vec<GenreDto>>> {
} }
#[get("/api/v1/genres/<genre_id>")] #[get("/api/v1/genres/<genre_id>")]
fn get_genre(db: MediaflixConnection, config: State<Config>, genre_id: ParamUuid) -> QueryResult<Json<GenreWithTitlesDto>> { fn get_genre(db: MediaflixConnection, config: State<Config>, genre_id: ParamUuid) -> QueryResult<Json<GenreWithContentDto>> {
use media_backend::schema::*; use media_backend::schema::*;
let genre: Genre = genres::table let genre: Genre = genres::table
.find(genre_id.uuid()) .find(genre_id.uuid())
...@@ -44,47 +44,47 @@ fn get_genre(db: MediaflixConnection, config: State<Config>, genre_id: ParamUuid ...@@ -44,47 +44,47 @@ fn get_genre(db: MediaflixConnection, config: State<Config>, genre_id: ParamUuid
.inner_join(titles::table) .inner_join(titles::table)
.select(titles::all_columns) .select(titles::all_columns)
.load::<Title>(&db.0)?; .load::<Title>(&db.0)?;
Ok(Json(GenreWithTitlesDto { Ok(Json(GenreWithContentDto {
genre: GenreDto::from(genre), genre: GenreDto::from(genre),
titles: load_titles(&db.0, &config, titles)?, content: load_titles(&db.0, &config, titles)?,
})) }))
} }
#[get("/api/v1/titles")] #[get("/api/v1/content")]
fn list_titles(db: MediaflixConnection, config: State<Config>) -> QueryResult<Json<Vec<TitleDto>>> { fn list_content(db: MediaflixConnection, config: State<Config>) -> QueryResult<Json<Vec<ContentDto>>> {
use media_backend::schema::*; use media_backend::schema::*;
let titles = titles::table let content = titles::table
.left_outer_join(title_episodes::table.on(title_episodes::episode_id.eq(titles::id))) .left_outer_join(title_episodes::table.on(title_episodes::episode_id.eq(titles::id)))
.filter(title_episodes::id.is_null()) .filter(title_episodes::id.is_null())
.select(titles::all_columns) .select(titles::all_columns)
.load::<Title>(&db.0)?; .load::<Title>(&db.0)?;
Ok(Json(load_titles(&db.0, &config, titles)?)) Ok(Json(load_titles(&db.0, &config, content)?))
} }
#[get("/api/v1/titles/<title_id>")] #[get("/api/v1/content/<content_id>")]
fn get_title(db: MediaflixConnection, config: State<Config>, title_id: ParamUuid) -> QueryResult<Json<TitleMetaDto>> { fn get_content(db: MediaflixConnection, config: State<Config>, content_id: ParamUuid) -> QueryResult<Json<ContentMetaDto>> {
use media_backend::schema::*; use media_backend::schema::*;
let title = load_title( let content = load_title(
&db.0, &db.0,
&config, &config,
titles::table titles::table
.find(title_id.uuid()) .find(content_id.uuid())
.first::<Title>(&db.0)?, .first::<Title>(&db.0)?,
)?; )?;
match title.kind.as_str() { match content.kind.as_str() {
"episode" => { "episode" => {
let show = load_show(&db.0, &config, title.ids.uuid)?; let show = load_show(&db.0, &config, content.ids.uuid)?;
Ok(Json(TitleMetaDto { title, show: Some(show) })) Ok(Json(ContentMetaDto { content, instalment: Some(show) }))
} }
_ => { _ => {
Ok(Json(TitleMetaDto { title, show: None })) Ok(Json(ContentMetaDto { content, instalment: None }))
} }
} }
} }
#[get("/api/v1/titles/<title_id>/episodes")] #[get("/api/v1/content/<content_id>/episodes")]
fn list_episodes(db: MediaflixConnection, config: State<Config>, title_id: ParamUuid) -> QueryResult<Json<Vec<EpisodeDto>>> { fn list_episodes(db: MediaflixConnection, config: State<Config>, content_id: ParamUuid) -> QueryResult<Json<Vec<InstalmentDto>>> {
Ok(Json(load_episodes(&db.0, &config, title_id.uuid())?)) Ok(Json(load_episodes(&db.0, &config, content_id.uuid())?))
} }
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
...@@ -100,12 +100,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> { ...@@ -100,12 +100,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
rocket::routes![ rocket::routes![
list_genres, list_genres,
get_genre, get_genre,
list_titles, list_content,
get_title, get_content,
list_episodes list_episodes
], ],
) )
.mount("/static", StaticFiles::from(env::var("MEDIAFLIX_PATH")?)) .mount("/media", StaticFiles::from(env::var("MEDIAFLIX_PATH")?))
.attach(MediaflixConnection::fairing()) .attach(MediaflixConnection::fairing())
.attach(rocket_cors::CorsOptions { .attach(rocket_cors::CorsOptions {
allowed_headers: AllowedHeaders::some(&["Authorization", "Accept", "Accept-Language"]), allowed_headers: AllowedHeaders::some(&["Authorization", "Accept", "Accept-Language"]),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment