From 2e280d8b8bfa8d6a82b3f004c744dcad38003751 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Fri, 27 Nov 2020 19:15:07 +0100 Subject: [PATCH] Adapted routes to new paths --- src/dto.rs | 54 +++++++++++++++++++++++----------------------- src/dto_helpers.rs | 22 +++++++++---------- src/main.rs | 42 ++++++++++++++++++------------------ 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/dto.rs b/src/dto.rs index 3ce7061..96d5a4f 100644 --- a/src/dto.rs +++ b/src/dto.rs @@ -6,15 +6,15 @@ use crate::models::*; #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] -pub struct TitleDto { - pub ids: TitleIdDto, +pub struct ContentDto { + pub ids: ContentIdDto, pub kind: String, pub original_language: Option<String>, pub runtime: Option<i32>, pub year_start: Option<i32>, pub year_end: Option<i32>, - pub titles: Vec<TitleNameDto>, - pub descriptions: Vec<TitleDescriptionDto>, + pub titles: Vec<ContentNameDto>, + pub descriptions: Vec<ContentDescriptionDto>, pub cast: Vec<CastDto>, pub genres: Vec<GenreDto>, pub ratings: Vec<RatingDto>, @@ -26,11 +26,11 @@ pub struct TitleDto { pub updated_at: chrono::DateTime<chrono::Utc>, } -impl TitleDto { +impl ContentDto { pub fn of( src: Title, - titles: Vec<TitleNameDto>, - descriptions: Vec<TitleDescriptionDto>, + titles: Vec<ContentNameDto>, + descriptions: Vec<ContentDescriptionDto>, cast: Vec<CastDto>, genres: Vec<GenreDto>, ratings: Vec<RatingDto>, @@ -39,8 +39,8 @@ impl TitleDto { subtitles: Vec<SubtitleDto>, preview: Option<String>, ) -> Self { - TitleDto { - ids: TitleIdDto { + ContentDto { + ids: ContentIdDto { uuid: src.id, imdb: src.imdb_id, tmdb: src.tmdb_id, @@ -68,7 +68,7 @@ impl TitleDto { #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] -pub struct TitleIdDto { +pub struct ContentIdDto { pub uuid: uuid::Uuid, pub imdb: Option<String>, pub tmdb: Option<i32>, @@ -77,16 +77,16 @@ pub struct TitleIdDto { #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] -pub struct TitleNameDto { +pub struct ContentNameDto { pub region: Option<String>, pub languages: Vec<String>, pub kind: String, pub name: String, } -impl From<TitleName> for TitleNameDto { +impl From<TitleName> for ContentNameDto { fn from(src: TitleName) -> Self { - TitleNameDto { + ContentNameDto { region: src.region, languages: src.languages, kind: src.kind, @@ -97,7 +97,7 @@ impl From<TitleName> for TitleNameDto { #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] -pub struct TitleDescriptionDto { +pub struct ContentDescriptionDto { pub region: Option<String>, pub languages: Vec<String>, pub kind: String, @@ -105,9 +105,9 @@ pub struct TitleDescriptionDto { pub tagline: Option<String>, } -impl From<TitleDescription> for TitleDescriptionDto { +impl From<TitleDescription> for ContentDescriptionDto { fn from(src: TitleDescription) -> Self { - TitleDescriptionDto { + ContentDescriptionDto { region: src.region, languages: src.languages, kind: src.kind, @@ -175,20 +175,20 @@ impl From<Person> for PersonDto { #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] -pub struct EpisodeDto { +pub struct InstalmentDto { pub season: Option<String>, pub episode: Option<String>, pub air_date: Option<chrono::NaiveDate>, - pub title: TitleDto, + pub content: ContentDto, } -impl EpisodeDto { - pub fn of(episode: TitleEpisode, title: TitleDto) -> Self { - EpisodeDto { +impl InstalmentDto { + pub fn of(episode: TitleEpisode, content: ContentDto) -> Self { + InstalmentDto { season: episode.season_number, episode: episode.episode_number, air_date: episode.air_date, - title, + content, } } } @@ -271,14 +271,14 @@ impl SubtitleDto { #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] -pub struct GenreWithTitlesDto { +pub struct GenreWithContentDto { pub genre: GenreDto, - pub titles: Vec<TitleDto>, + pub content: Vec<ContentDto>, } #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] -pub struct TitleMetaDto { - pub title: TitleDto, - pub show: Option<EpisodeDto>, +pub struct ContentMetaDto { + pub content: ContentDto, + pub instalment: Option<InstalmentDto>, } \ No newline at end of file diff --git a/src/dto_helpers.rs b/src/dto_helpers.rs index 90be9f4..c4872be 100644 --- a/src/dto_helpers.rs +++ b/src/dto_helpers.rs @@ -7,7 +7,7 @@ use crate::dto::*; use crate::models::*; 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 .filter(title_episodes::show_id.eq(title_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 let (episodes, titles): (Vec<TitleEpisode>, Vec<Title>) = titles.into_iter().unzip(); let titles = load_titles(db, config, titles)?; Ok(episodes.into_iter().zip(titles) - .map(|(episode, title)| EpisodeDto::of(episode, title)) + .map(|(episode, title)| InstalmentDto::of(episode, title)) .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 .filter(title_episodes::episode_id.eq(title_id)) .inner_join(titles::table.on(titles::id.eq(title_episodes::show_id))) .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) .load::<TitleName>(db)?; let title_descriptions: Vec<TitleDescription> = TitleDescription::belonging_to(&title) @@ -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) .load::<TitleName>(db)? .grouped_by(&titles); @@ -113,7 +113,7 @@ pub fn load_titles(db: &PgConnection, config: &Config, titles: Vec<Title>) -> Qu images, media, subtitles, preview, ) - }).collect::<Vec<TitleDto>>()) + }).collect::<Vec<ContentDto>>()) } fn process_title( @@ -122,14 +122,14 @@ fn process_title( cast: Vec<(TitleCast, Person)>, genres: Vec<(TitleGenre, Genre)>, ratings: Vec<TitleRating>, images: Vec<TitleImage>, media: Vec<TitleMedium>, subtitles: Vec<TitleSubtitle>, preview: Option<TitlePreview>, -) -> TitleDto { - TitleDto::of( +) -> ContentDto { + ContentDto::of( title, names.into_iter().map(|src| { - TitleNameDto::from(src) + ContentNameDto::from(src) }).collect::<Vec<_>>(), descriptions.into_iter().map(|src| { - TitleDescriptionDto::from(src) + ContentDescriptionDto::from(src) }).collect::<Vec<_>>(), cast.into_iter().map(|src| { let (cast, person) = src; diff --git a/src/main.rs b/src/main.rs index 7e17269..5092a96 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,7 +34,7 @@ fn list_genres(db: MediaflixConnection) -> QueryResult<Json<Vec<GenreDto>>> { } #[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::*; let genre: Genre = genres::table .find(genre_id.uuid()) @@ -44,47 +44,47 @@ fn get_genre(db: MediaflixConnection, config: State<Config>, genre_id: ParamUuid .inner_join(titles::table) .select(titles::all_columns) .load::<Title>(&db.0)?; - Ok(Json(GenreWithTitlesDto { + Ok(Json(GenreWithContentDto { genre: GenreDto::from(genre), - titles: load_titles(&db.0, &config, titles)?, + content: load_titles(&db.0, &config, titles)?, })) } -#[get("/api/v1/titles")] -fn list_titles(db: MediaflixConnection, config: State<Config>) -> QueryResult<Json<Vec<TitleDto>>> { +#[get("/api/v1/content")] +fn list_content(db: MediaflixConnection, config: State<Config>) -> QueryResult<Json<Vec<ContentDto>>> { 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))) .filter(title_episodes::id.is_null()) .select(titles::all_columns) .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>")] -fn get_title(db: MediaflixConnection, config: State<Config>, title_id: ParamUuid) -> QueryResult<Json<TitleMetaDto>> { +#[get("/api/v1/content/<content_id>")] +fn get_content(db: MediaflixConnection, config: State<Config>, content_id: ParamUuid) -> QueryResult<Json<ContentMetaDto>> { use media_backend::schema::*; - let title = load_title( + let content = load_title( &db.0, &config, titles::table - .find(title_id.uuid()) + .find(content_id.uuid()) .first::<Title>(&db.0)?, )?; - match title.kind.as_str() { + match content.kind.as_str() { "episode" => { - let show = load_show(&db.0, &config, title.ids.uuid)?; - Ok(Json(TitleMetaDto { title, show: Some(show) })) + let show = load_show(&db.0, &config, content.ids.uuid)?; + 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")] -fn list_episodes(db: MediaflixConnection, config: State<Config>, title_id: ParamUuid) -> QueryResult<Json<Vec<EpisodeDto>>> { - Ok(Json(load_episodes(&db.0, &config, title_id.uuid())?)) +#[get("/api/v1/content/<content_id>/episodes")] +fn list_episodes(db: MediaflixConnection, config: State<Config>, content_id: ParamUuid) -> QueryResult<Json<Vec<InstalmentDto>>> { + Ok(Json(load_episodes(&db.0, &config, content_id.uuid())?)) } fn main() -> Result<(), Box<dyn std::error::Error>> { @@ -100,12 +100,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> { rocket::routes![ list_genres, get_genre, - list_titles, - get_title, + list_content, + get_content, list_episodes ], ) - .mount("/static", StaticFiles::from(env::var("MEDIAFLIX_PATH")?)) + .mount("/media", StaticFiles::from(env::var("MEDIAFLIX_PATH")?)) .attach(MediaflixConnection::fairing()) .attach(rocket_cors::CorsOptions { allowed_headers: AllowedHeaders::some(&["Authorization", "Accept", "Accept-Language"]), -- GitLab