Skip to content

Commit 0342022

Browse files
authored
Persistent query params (#902)
* fix(frontend): do not pass default tab as search params default * feat(frontend): basic component to save search params * refactor(frontend): function to get whether workout is active * feat(frontend): better cookie support * fix(frontend): change position of affix * refactor(frontend): extract common query param * feat(frontend): enhanced hook for query param * feat(frontend): utility to respect new params * refactor(frontend): functions to enhance redirect * fix(frontend): do not include non-encodeable stuff in query params * feat(frontend): use more predictable cookie names * fix(frontend): use new strategy to enhance queries * feat(frontend): allow persisting for exercises list * feat(frontend): more intelligent workout selection * feat(frontend): add tooltip to affix * feat(frontend): remove useless query params * refactor(frontend): change name of module * refactor(frontend): do not expose timer atom directly * feat(frontend): basic atom for measurements drawer * chore(frontend): import from new module * feat(frontend): add log when login for oidc fails * feat(frontend): allow opening measurements from anywhere * feat(frontend): log when register fails * chore(frontend): add more logging * feat(frontend): use enhanced query params on media list page * feat(frontend): use enhanced query params on person list page * feat(frontend): also remember query params * fix(frontend): get measurements creation working * build(ts): upgrade deps * fix(frontend): order of loader returns * fix(frontend): layout of filter off icon * chore(backend): order of attributes * feat(frontend): add new preference param * feat(database): migration to add new general preference * chore(backend): order of attributes * feat(frontend): new preference * feat(frontend): respect new user preference * feat(frontend): new schema for measurement creation * Revert "feat(frontend): new schema for measurement creation" This reverts commit 151f43b. * refactor(backend): do not create custom items from media_tracker * chore(backend): remove useless field from this
1 parent 2a62eb8 commit 0342022

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+676
-609
lines changed

apps/backend/src/importer/audiobookshelf.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ use crate::{
1414
entities::metadata,
1515
importer::{ImportFailStep, ImportFailedItem, ImportResult},
1616
miscellaneous::{audiobookshelf_models, itunes_podcast_episode_by_name},
17-
models::media::{
18-
CommitMediaInput, ImportOrExportItemIdentifier, ImportOrExportMediaItem,
19-
ImportOrExportMediaItemSeen,
20-
},
17+
models::media::{CommitMediaInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen},
2118
providers::google_books::GoogleBooksService,
2219
utils::get_base_http_client,
2320
};
@@ -159,10 +156,9 @@ where
159156
media.push(ImportOrExportMediaItem {
160157
lot,
161158
source,
162-
source_id: metadata.title,
163-
identifier: "".to_string(),
164-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(identifier)),
159+
identifier,
165160
seen_history,
161+
source_id: metadata.title,
166162
collections: vec![],
167163
reviews: vec![],
168164
})

apps/backend/src/importer/generic_json.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use itertools::Itertools;
77
use crate::{
88
fitness::resolver::ExerciseService,
99
importer::{DeployJsonImportInput, ImportResult},
10-
models::{media::ImportOrExportItemIdentifier, CompleteExport},
10+
models::CompleteExport,
1111
};
1212

1313
pub async fn import(
@@ -22,9 +22,6 @@ pub async fn import(
2222
.unwrap_or_default()
2323
.iter_mut()
2424
.map(|m| {
25-
m.internal_identifier = Some(ImportOrExportItemIdentifier::NeedsDetails(
26-
m.identifier.clone(),
27-
));
2825
m.seen_history.iter_mut().for_each(|s| {
2926
s.provider_watched_on = Some(ImportSource::GenericJson.to_string());
3027
});

apps/backend/src/importer/goodreads.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use serde::Deserialize;
1111
use crate::{
1212
importer::{DeployGenericCsvImportInput, ImportFailStep, ImportFailedItem, ImportResult},
1313
models::media::{
14-
ImportOrExportItemIdentifier, ImportOrExportItemRating, ImportOrExportItemReview,
15-
ImportOrExportMediaItem, ImportOrExportMediaItemSeen,
14+
ImportOrExportItemRating, ImportOrExportItemReview, ImportOrExportMediaItem,
15+
ImportOrExportMediaItemSeen,
1616
},
1717
providers::google_books::GoogleBooksService,
1818
};
@@ -127,8 +127,7 @@ pub async fn import(
127127
source_id: record.title.clone(),
128128
lot,
129129
source,
130-
identifier: "".to_string(),
131-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(identifier)),
130+
identifier,
132131
seen_history,
133132
reviews,
134133
collections,

apps/backend/src/importer/igdb.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ use serde::Deserialize;
77

88
use crate::{
99
miscellaneous::DefaultCollection,
10-
models::media::{
11-
ImportOrExportItemIdentifier, ImportOrExportMediaItem, ImportOrExportMediaItemSeen,
12-
},
10+
models::media::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen},
1311
};
1412

1513
use super::{DeployIgdbImportInput, ImportFailStep, ImportFailedItem, ImportResult};
@@ -56,13 +54,12 @@ pub async fn import(input: DeployIgdbImportInput) -> Result<ImportResult> {
5654
}
5755
};
5856
media.push(ImportOrExportMediaItem {
59-
collections: vec![collection.clone()],
60-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(record.id)),
6157
lot,
6258
source,
6359
source_id: record.game,
64-
identifier: "".to_string(),
60+
identifier: record.id,
6561
seen_history: seen_history.clone(),
62+
collections: vec![collection.clone()],
6663
reviews: vec![],
6764
});
6865
}

apps/backend/src/importer/imdb.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use serde::Deserialize;
77
use crate::{
88
importer::{DeployGenericCsvImportInput, ImportFailStep, ImportFailedItem, ImportResult},
99
miscellaneous::DefaultCollection,
10-
models::media::{ImportOrExportItemIdentifier, ImportOrExportMediaItem},
10+
models::media::ImportOrExportMediaItem,
1111
providers::tmdb::NonMediaTmdbService,
1212
};
1313

@@ -58,7 +58,7 @@ pub async fn import(
5858
continue;
5959
}
6060
};
61-
let tmdb_identifier = match tmdb_service
61+
let identifier = match tmdb_service
6262
.find_by_external_id(&record.id, "imdb_id")
6363
.await
6464
{
@@ -73,14 +73,13 @@ pub async fn import(
7373
continue;
7474
}
7575
};
76-
tracing::debug!("Found tmdb id: {} ({}/{})", tmdb_identifier, idx + 1, total);
76+
tracing::debug!("Found tmdb id: {} ({}/{})", identifier, idx + 1, total);
7777
media.push(ImportOrExportMediaItem {
78-
collections: vec![DefaultCollection::Watchlist.to_string()],
79-
identifier: "".to_string(),
80-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(tmdb_identifier)),
78+
identifier,
8179
lot,
8280
source,
8381
source_id: record.id,
82+
collections: vec![DefaultCollection::Watchlist.to_string()],
8483
reviews: vec![],
8584
seen_history: vec![],
8685
});

apps/backend/src/importer/jellyfin.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ use crate::{
1313
importer::{
1414
DeployUrlAndKeyAndUsernameImportInput, ImportFailStep, ImportFailedItem, ImportResult,
1515
},
16-
models::media::{
17-
ImportOrExportItemIdentifier, ImportOrExportMediaItem, ImportOrExportMediaItemSeen,
18-
},
16+
models::media::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen},
1917
utils::{JSON, USER_AGENT_STR},
2018
};
2119

@@ -175,9 +173,6 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<Impo
175173
lot,
176174
source_id: item.series_name.unwrap_or(item.name),
177175
source: MediaSource::Tmdb,
178-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(
179-
tmdb_id.clone(),
180-
)),
181176
seen_history: vec![seen],
182177
identifier: tmdb_id,
183178
reviews: vec![],

apps/backend/src/importer/mal.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize};
1616
use crate::{
1717
importer::{DeployMalImportInput, ImportResult},
1818
models::media::{
19-
ImportOrExportItemIdentifier, ImportOrExportItemRating, ImportOrExportMediaItem,
20-
ImportOrExportMediaItemSeen,
19+
ImportOrExportItemRating, ImportOrExportMediaItem, ImportOrExportMediaItemSeen,
2120
},
2221
};
2322

@@ -91,14 +90,11 @@ fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMediaItem {
9190
..Default::default()
9291
};
9392
ImportOrExportMediaItem {
94-
source_id: item.title.clone(),
9593
lot,
9694
source: MediaSource::Mal,
97-
identifier: "".to_string(),
98-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(
99-
item.identifier.to_string(),
100-
)),
95+
identifier: item.identifier.to_string(),
10196
seen_history,
97+
source_id: item.title.clone(),
10298
reviews: vec![review_item],
10399
collections: vec![],
104100
}

apps/backend/src/importer/media_tracker.rs

Lines changed: 10 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use async_graphql::Result;
22
use database::{ImportSource, MediaLot, MediaSource};
3-
use nanoid::nanoid;
43
use reqwest::{
54
header::{HeaderMap, HeaderValue, USER_AGENT},
65
ClientBuilder,
@@ -18,9 +17,8 @@ use crate::{
1817
},
1918
models::{
2019
media::{
21-
BookSpecifics, CreateOrUpdateCollectionInput, ImportOrExportItemIdentifier,
22-
ImportOrExportItemRating, ImportOrExportItemReview, ImportOrExportMediaItemSeen,
23-
MediaDetails, MetadataFreeCreator,
20+
CreateOrUpdateCollectionInput, ImportOrExportItemRating, ImportOrExportItemReview,
21+
ImportOrExportMediaItemSeen,
2422
},
2523
IdObject,
2624
},
@@ -116,13 +114,6 @@ struct ItemSeen {
116114
episode_id: Option<i32>,
117115
}
118116

119-
#[derive(Debug, Serialize, Deserialize, Clone)]
120-
#[serde(untagged)]
121-
enum ItemNumberOfPages {
122-
Nothing(String),
123-
Something(i32),
124-
}
125-
126117
#[derive(Debug, Serialize, Deserialize, Clone)]
127118
#[serde(rename_all = "camelCase")]
128119
struct ItemDetails {
@@ -135,10 +126,6 @@ struct ItemDetails {
135126
tmdb_id: Option<i32>,
136127
openlibrary_id: Option<String>,
137128
goodreads_id: Option<i32>,
138-
title: String,
139-
overview: Option<String>,
140-
authors: Option<Vec<String>>,
141-
number_of_pages: Option<ItemNumberOfPages>,
142129
}
143130

144131
pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
@@ -244,7 +231,13 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
244231
let (identifier, source) = match media_type {
245232
MediaType::Book => {
246233
if let Some(_g_id) = details.goodreads_id {
247-
(nanoid!(10), MediaSource::Custom)
234+
failed_items.push(ImportFailedItem {
235+
lot: Some(lot),
236+
step: ImportFailStep::ItemDetailsFromSource,
237+
identifier: d.id.to_string(),
238+
error: Some("Goodreads ID not supported".to_string()),
239+
});
240+
continue;
248241
} else {
249242
(
250243
get_key(&details.openlibrary_id.clone().unwrap()),
@@ -265,7 +258,6 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
265258
total = data_len,
266259
seen = details.seen_history.len()
267260
);
268-
let need_details = details.goodreads_id.is_none();
269261

270262
let mut collections = vec![];
271263
for list in lists.iter() {
@@ -276,52 +268,12 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
276268
}
277269
}
278270

279-
let num_pages = details.number_of_pages.and_then(|d| match d {
280-
ItemNumberOfPages::Nothing(_) => None,
281-
ItemNumberOfPages::Something(s) => Some(s),
282-
});
283-
284271
let item = ImportOrExportMediaItem {
285272
source_id: d.id.to_string(),
286273
source,
287274
lot,
288275
collections,
289-
identifier: "".to_string(),
290-
internal_identifier: Some(match need_details {
291-
false => ImportOrExportItemIdentifier::AlreadyFilled(Box::new(MediaDetails {
292-
identifier,
293-
title: details.title,
294-
description: details.overview,
295-
lot,
296-
source: MediaSource::Custom,
297-
creators: details
298-
.authors
299-
.unwrap_or_default()
300-
.into_iter()
301-
.map(|a| MetadataFreeCreator {
302-
name: a,
303-
role: "Author".to_owned(),
304-
image: None,
305-
})
306-
.collect(),
307-
provider_rating: None,
308-
genres: vec![],
309-
url_images: vec![],
310-
videos: vec![],
311-
publish_year: None,
312-
publish_date: None,
313-
suggestions: vec![],
314-
group_identifiers: vec![],
315-
is_nsfw: None,
316-
production_status: None,
317-
people: vec![],
318-
s3_images: vec![],
319-
original_language: None,
320-
book_specifics: Some(BookSpecifics { pages: num_pages }),
321-
..Default::default()
322-
})),
323-
true => ImportOrExportItemIdentifier::NeedsDetails(identifier),
324-
}),
276+
identifier,
325277
reviews: Vec::from_iter(details.user_rating.map(|r| {
326278
let review = if let Some(_s) = r.clone().review {
327279
Some(ImportOrExportItemReview {

apps/backend/src/importer/mod.rs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ use crate::{
2323
fitness::UserWorkoutInput,
2424
media::{
2525
CommitMediaInput, CommitPersonInput, CreateOrUpdateCollectionInput,
26-
ImportOrExportItemIdentifier, ImportOrExportItemRating, ImportOrExportMediaGroupItem,
27-
ImportOrExportMediaItem, ImportOrExportPersonItem, PostReviewInput,
28-
ProgressUpdateInput,
26+
ImportOrExportItemRating, ImportOrExportMediaGroupItem, ImportOrExportMediaItem,
27+
ImportOrExportPersonItem, PostReviewInput, ProgressUpdateInput,
2928
},
3029
BackgroundJob, ChangeCollectionToEntityInput,
3130
},
@@ -341,24 +340,16 @@ impl ImporterService {
341340
iden = &item.source_id
342341
);
343342
let rev_length = item.reviews.len();
344-
let identifier = item.internal_identifier.clone().unwrap();
345-
let data = match identifier {
346-
ImportOrExportItemIdentifier::NeedsDetails(identifier) => {
347-
self.media_service
348-
.commit_metadata(CommitMediaInput {
349-
identifier,
350-
lot: item.lot,
351-
source: item.source,
352-
force_update: Some(true),
353-
})
354-
.await
355-
}
356-
ImportOrExportItemIdentifier::AlreadyFilled(a) => {
357-
self.media_service
358-
.commit_metadata_internal(*a.clone(), None)
359-
.await
360-
}
361-
};
343+
let identifier = item.identifier.clone();
344+
let data = self
345+
.media_service
346+
.commit_metadata(CommitMediaInput {
347+
identifier,
348+
lot: item.lot,
349+
source: item.source,
350+
force_update: Some(true),
351+
})
352+
.await;
362353
let metadata = match data {
363354
Ok(r) => r,
364355
Err(e) => {

apps/backend/src/importer/movary.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use serde::{Deserialize, Serialize};
99

1010
use crate::{
1111
importer::{
12-
DeployMovaryImportInput, ImportFailStep, ImportFailedItem, ImportOrExportItemIdentifier,
13-
ImportOrExportMediaItem, ImportResult,
12+
DeployMovaryImportInput, ImportFailStep, ImportFailedItem, ImportOrExportMediaItem,
13+
ImportResult,
1414
},
1515
miscellaneous::DefaultCollection,
1616
models::media::{
@@ -65,10 +65,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
6565
source_id: record.common.title.clone(),
6666
lot,
6767
source,
68-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(
69-
record.common.tmdb_id.to_string(),
70-
)),
71-
identifier: "".to_string(),
68+
identifier: record.common.tmdb_id.to_string(),
7269
seen_history: vec![],
7370
reviews: vec![ImportOrExportItemRating {
7471
// DEV: Rates items out of 10
@@ -96,10 +93,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
9693
source_id: record.title.clone(),
9794
lot,
9895
source,
99-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(
100-
record.tmdb_id.to_string(),
101-
)),
102-
identifier: "".to_string(),
96+
identifier: record.tmdb_id.to_string(),
10397
seen_history: vec![],
10498
reviews: vec![],
10599
collections: vec![DefaultCollection::Watchlist.to_string()],
@@ -159,10 +153,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
159153
source_id: record.common.title.clone(),
160154
lot,
161155
source,
162-
identifier: "".to_string(),
163-
internal_identifier: Some(ImportOrExportItemIdentifier::NeedsDetails(
164-
record.common.tmdb_id.to_string(),
165-
)),
156+
identifier: record.common.tmdb_id.to_string(),
166157
seen_history: vec![seen_item],
167158
reviews,
168159
collections: vec![],

0 commit comments

Comments
 (0)