Repository: IgnisDa/ryot (language: rust)

Issue:
Allow hiding collections
Add a new field to `user_to_entity` called `collection_extra_information`.


Discussion / hints:

Fix patch:
diff --git a/apps/frontend/app/components/common.tsx b/apps/frontend/app/components/common.tsx
index 7535473eb5..df895e1837 100644
--- a/apps/frontend/app/components/common.tsx
+++ b/apps/frontend/app/components/common.tsx
@@ -107,7 +107,7 @@ import {
 	useFallbackImageUrl,
 	useGetMantineColors,
 	useGetRandomMantineColor,
-	useUserCollections,
+	useNonHiddenUserCollections,
 	useUserDetails,
 	useUserPreferences,
 	useUserUnitSystem,
@@ -265,7 +265,7 @@ export const DebouncedSearchInput = (props: {
 	);
 
 	useDidUpdate(() => {
-		setP(props.queryParam || "query", debounced);
+		setP(props.queryParam || "query", debounced.trim());
 	}, [debounced]);
 
 	return (
@@ -508,7 +508,7 @@ export const CollectionsFilter = (props: {
 	collections?: string[];
 	invertCollection?: boolean;
 }) => {
-	const collections = useUserCollections();
+	const collections = useNonHiddenUserCollections();
 	const [_, { setP }] = useAppSearchParam(props.cookieName);
 
 	return (
@@ -525,8 +525,8 @@ export const CollectionsFilter = (props: {
 				{
 					group: "My collections",
 					items: collections.map((c) => ({
-						value: c.id.toString(),
 						label: c.name,
+						value: c.id.toString(),
 					})),
 				},
 			]}
diff --git a/apps/frontend/app/lib/hooks.ts b/apps/frontend/app/lib/hooks.ts
index 7596880bbf..c413230e43 100644
--- a/apps/frontend/app/lib/hooks.ts
+++ b/apps/frontend/app/lib/hooks.ts
@@ -145,6 +145,17 @@ export const useUserPreferences = () => useUserDetails().preferences;
 export const useUserCollections = () =>
 	useDashboardLayoutData().userCollections;
 
+export const useNonHiddenUserCollections = () => {
+	const userCollections = useUserCollections();
+	const userDetails = useUserDetails();
+	const toDisplay = userCollections.filter(
+		(c) =>
+			c.collaborators.find((c) => c.collaborator.id === userDetails.id)
+				?.extraInformation?.isHidden !== true,
+	);
+	return toDisplay;
+};
+
 export const useUserUnitSystem = () =>
 	useUserPreferences().fitness.exercises.unitSystem;
 
diff --git a/apps/frontend/app/routes/_dashboard.collections.list.tsx b/apps/frontend/app/routes/_dashboard.collections.list.tsx
index ce0c860a3d..4deb69a839 100644
--- a/apps/frontend/app/routes/_dashboard.collections.list.tsx
+++ b/apps/frontend/app/routes/_dashboard.collections.list.tsx
@@ -52,13 +52,7 @@ import {
 import { useQuery } from "@tanstack/react-query";
 import { ClientError } from "graphql-request";
 import { useEffect, useState } from "react";
-import {
-	Form,
-	Link,
-	useLoaderData,
-	useNavigation,
-	useSearchParams,
-} from "react-router";
+import { Form, Link, useLoaderData, useNavigation } from "react-router";
 import { Virtuoso } from "react-virtuoso";
 import { $path } from "safe-routes";
 import { match } from "ts-pattern";
@@ -79,6 +73,7 @@ import {
 	zodCommaDelimitedString,
 } from "~/lib/generals";
 import {
+	useAppSearchParam,
 	useConfirmSubmit,
 	useCoreDetails,
 	useFallbackImageUrl,
@@ -181,6 +176,9 @@ const createOrUpdateSchema = z.object({
 	updateId: z.string().optional(),
 	description: z.string().optional(),
 	collaborators: zodCommaDelimitedString,
+	extraInformation: z
+		.object({ isHidden: zodCheckboxAsString.optional() })
+		.optional(),
 	informationTemplate: z
 		.array(
 			z.object({
@@ -205,23 +203,30 @@ type UpdateCollectionInput = {
 
 export default function Page() {
 	const transition = useNavigation();
+	const userDetails = useUserDetails();
 	const collections = useUserCollections();
 	const loaderData = useLoaderData<typeof loader>();
-	const [params] = useSearchParams();
-	const query = params.get("query") || undefined;
-
-	const filteredCollections = collections.filter((c) =>
-		query ? c.name.toLowerCase().includes(query.toLowerCase()) : true,
-	);
-
 	const [toUpdateCollection, setToUpdateCollection] =
 		useState<UpdateCollectionInput | null>(null);
+	const [params, { setP }] = useAppSearchParam(loaderData.cookieName);
+	const query = params.get("query") || undefined;
+	const showHidden = Boolean(params.get("showHidden"));
+
 	useEffect(() => {
-		if (transition.state !== "submitting") {
-			setToUpdateCollection(null);
-		}
+		if (transition.state !== "submitting") setToUpdateCollection(null);
 	}, [transition.state]);
 
+	const filteredCollections = collections
+		.filter((c) =>
+			showHidden
+				? true
+				: c.collaborators.find((c) => c.collaborator.id === userDetails.id)
+						?.extraInformation?.isHidden !== true,
+		)
+		.filter((c) =>
+			query ? c.name.toLowerCase().includes(query.toLowerCase()) : true,
+		);
+
 	return (
 		<Container size="sm">
 			<Stack>
@@ -249,10 +254,19 @@ export default function Page() {
 						cacheId={loaderData.userCollectionsList.cacheId}
 					/>
 				</Group>
-				<DebouncedSearchInput
-					initialValue={query}
-					enhancedQueryParams={loaderData.cookieName}
-				/>
+				<Group wrap="nowrap">
+					<DebouncedSearchInput
+						initialValue={query}
+						enhancedQueryParams={loaderData.cookieName}
+					/>
+					<Checkbox
+						size="xs"
+						name="showHidden"
+						label="Show hidden"
+						defaultChecked={showHidden}
+						onChange={(e) => setP("showHidden", e.target.checked ? "yes" : "")}
+					/>
+				</Group>
 				<Virtuoso
 					style={{ height: "80vh" }}
 					data={filteredCollections}
@@ -330,9 +344,9 @@ const DisplayCollection = (props: {
 		additionalDisplay.push(`By ${props.collection.creator.name}`);
 	if (props.collection.count > 0)
 		additionalDisplay.push(`${props.collection.count} items`);
-	if (props.collection.collaborators.length > 0)
+	if (props.collection.collaborators.length > 1)
 		additionalDisplay.push(
-			`${props.collection.collaborators.length} collaborators`,
+			`${props.collection.collaborators.length - 1} collaborators`,
 		);
 
 	const FallBackImage = () => (
@@ -538,6 +552,21 @@ const CreateOrUpdateModal = (props: {
 					label="Description"
 					defaultValue={props.toUpdateCollection?.description}
 				/>
+				<Tooltip
+					label={PRO_REQUIRED_MESSAGE}
+					disabled={coreDetails.isServerKeyValidated}
+				>
+					<Checkbox
+						label="Hide collection"
+						name="extraInformation.isHidden"
+						disabled={!coreDetails.isServerKeyValidated}
+						defaultChecked={
+							props.toUpdateCollection?.collaborators?.find(
+								(c) => c.collaborator.id === userDetails.id,
+							)?.extraInformation?.isHidden || undefined
+						}
+					/>
+				</Tooltip>
 				<Tooltip
 					label={PRO_REQUIRED_MESSAGE}
 					disabled={coreDetails.isServerKeyValidated}
@@ -548,7 +577,7 @@ const CreateOrUpdateModal = (props: {
 						disabled={!coreDetails.isServerKeyValidated}
 						description="Add collaborators to this collection"
 						defaultValue={(props.toUpdateCollection?.collaborators || []).map(
-							(c) => c.id,
+							(c) => c.collaborator.id,
 						)}
 						data={loaderData.usersList.map((u) => ({
 							value: u.id,
diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
index 1cc4828ea5..5d4b0e1dcb 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
@@ -73,7 +73,7 @@ import {
 	useAppSearchParam,
 	useCoreDetails,
 	useIsFitnessActionActive,
-	useUserCollections,
+	useNonHiddenUserCollections,
 	useUserPreferences,
 } from "~/lib/hooks";
 import {
@@ -331,7 +331,7 @@ export default function Page() {
 const FiltersModalForm = () => {
 	const loaderData = useLoaderData<typeof loader>();
 	const coreDetails = useCoreDetails();
-	const collections = useUserCollections();
+	const collections = useNonHiddenUserCollections();
 	const [_, { setP }] = useAppSearchParam(loaderData.cookieName);
 
 	return (
diff --git a/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx b/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx
index 390ccceec1..2c6ca993da 100644
--- a/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx
@@ -48,7 +48,7 @@ import {
 	useApplicationEvents,
 	useConfirmSubmit,
 	useCoreDetails,
-	useUserCollections,
+	useNonHiddenUserCollections,
 } from "~/lib/hooks";
 import {
 	createToastHeaders,
@@ -188,7 +188,7 @@ export default function Page() {
 	const coreDetails = useCoreDetails();
 	const submit = useConfirmSubmit();
 	const fileUploadNotAllowed = !coreDetails.fileStorageEnabled;
-	const userCollections = useUserCollections();
+	const userCollections = useNonHiddenUserCollections();
 	const events = useApplicationEvents();
 	const [deployImportSource, setDeployImportSource] = useState<ImportSource>();
 
diff --git a/apps/frontend/app/routes/_dashboard.settings.integrations.tsx b/apps/frontend/app/routes/_dashboard.settings.integrations.tsx
index c1fdeb5e4a..2de7043678 100644
--- a/apps/frontend/app/routes/_dashboard.settings.integrations.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.integrations.tsx
@@ -61,7 +61,7 @@ import {
 import {
 	useConfirmSubmit,
 	useCoreDetails,
-	useUserCollections,
+	useNonHiddenUserCollections,
 } from "~/lib/hooks";
 import { createToastHeaders, serverGqlService } from "~/lib/utilities.server";
 import type { Route } from "./+types/_dashboard.settings.integrations";
@@ -625,7 +625,7 @@ const CreateIntegrationModal = (props: {
 };
 
 const ArrInputs = (props: { name: string }) => {
-	const collections = useUserCollections();
+	const collections = useNonHiddenUserCollections();
 
 	return (
 		<>
diff --git a/apps/frontend/app/routes/_dashboard.tsx b/apps/frontend/app/routes/_dashboard.tsx
index bff45c946b..690334a176 100644
--- a/apps/frontend/app/routes/_dashboard.tsx
+++ b/apps/frontend/app/routes/_dashboard.tsx
@@ -141,7 +141,7 @@ import {
 	useGetWatchProviders,
 	useIsFitnessActionActive,
 	useMetadataDetails,
-	useUserCollections,
+	useNonHiddenUserCollections,
 	useUserDetails,
 	useUserMetadataDetails,
 	useUserPreferences,
@@ -1776,7 +1776,7 @@ const AddEntityToCollectionForm = ({
 	closeAddEntityToCollectionModal: () => void;
 }) => {
 	const userDetails = useUserDetails();
-	const collections = useUserCollections();
+	const collections = useNonHiddenUserCollections();
 	const events = useApplicationEvents();
 	const submit = useConfirmSubmit();
 	const [selectedCollection, setSelectedCollection] =
diff --git a/crates/migrations/src/lib.rs b/crates/migrations/src/lib.rs
index a498df36cc..e5e6484934 100644
--- a/crates/migrations/src/lib.rs
+++ b/crates/migrations/src/lib.rs
@@ -30,6 +30,7 @@ mod m20250118_is_v8_migration;
 mod m20250122_changes_for_issue_1188;
 mod m20250126_changes_for_issue_1201;
 mod m20250201_changes_for_issue_1211;
+mod m20250204_changes_for_issue_1231;
 
 pub use m20230404_create_user::User as AliasedUser;
 pub use m20230410_create_metadata::Metadata as AliasedMetadata;
@@ -81,6 +82,7 @@ impl MigratorTrait for Migrator {
             Box::new(m20250122_changes_for_issue_1188::Migration),
             Box::new(m20250126_changes_for_issue_1201::Migration),
             Box::new(m20250201_changes_for_issue_1211::Migration),
+            Box::new(m20250204_changes_for_issue_1231::Migration),
         ]
     }
 }
diff --git a/crates/migrations/src/m20231017_create_user_to_entity.rs b/crates/migrations/src/m20231017_create_user_to_entity.rs
index ed466e23a7..4b8530140c 100644
--- a/crates/migrations/src/m20231017_create_user_to_entity.rs
+++ b/crates/migrations/src/m20231017_create_user_to_entity.rs
@@ -2,8 +2,8 @@ use indoc::indoc;
 use sea_orm_migration::prelude::*;
 
 use super::{
-    m20230410_create_metadata::Metadata, m20230413_create_person::Person,
-    m20230404_create_user::User, m20230411_create_metadata_group::MetadataGroup,
+    m20230404_create_user::User, m20230410_create_metadata::Metadata,
+    m20230411_create_metadata_group::MetadataGroup, m20230413_create_person::Person,
     m20230504_create_collection::Collection, m20230505_create_exercise::Exercise,
 };
 
@@ -36,22 +36,21 @@ pub static CONSTRAINT_SQL: &str = indoc! { r#"
 /// - has reviewed it
 #[derive(Iden)]
 pub enum UserToEntity {
-    Table,
     Id,
+    Table,
     UserId,
+    PersonId,
     CreatedOn,
-    LastUpdatedOn,
-    NeedsToBeUpdated,
-    // the entities that can be associated
     MetadataId,
     ExerciseId,
-    PersonId,
-    MetadataGroupId,
+    MediaReason,
     CollectionId,
-    // specifics
+    LastUpdatedOn,
+    MetadataGroupId,
+    NeedsToBeUpdated,
     ExerciseExtraInformation,
+    CollectionExtraInformation,
     ExerciseNumTimesInteracted,
-    MediaReason,
 }
 
 #[async_trait::async_trait]
@@ -91,6 +90,7 @@ impl MigrationTrait for Migration {
                             .default(PgFunc::gen_random_uuid())
                             .primary_key(),
                     )
+                    .col(ColumnDef::new(UserToEntity::CollectionExtraInformation).json_binary())
                     .foreign_key(
                         ForeignKey::create()
                             .name("user_to_entity-fk1")
diff --git a/crates/migrations/src/m20250204_changes_for_issue_1231.rs b/crates/migrations/src/m20250204_changes_for_issue_1231.rs
new file mode 100644
index 0000000000..026af6b435
--- /dev/null
+++ b/crates/migrations/src/m20250204_changes_for_issue_1231.rs
@@ -0,0 +1,20 @@
+use sea_orm_migration::prelude::*;
+
+#[derive(DeriveMigrationName)]
+pub struct Migration;
+
+#[async_trait::async_trait]
+impl MigrationTrait for Migration {
+    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+        let db = manager.get_connection();
+        db.execute_unprepared(
+            r#"ALTER TABLE "user_to_entity" ADD COLUMN "collection_extra_information" JSONB"#,
+        )
+        .await?;
+        Ok(())
+    }
+
+    async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> {
+        Ok(())
+    }
+}
diff --git a/crates/models/common/src/lib.rs b/crates/models/common/src/lib.rs
index 0c7e5a40b1..237ddffae3 100644
--- a/crates/models/common/src/lib.rs
+++ b/crates/models/common/src/lib.rs
@@ -345,3 +345,20 @@ pub struct YoutubeMusicSongListened {
     pub id: String,
     pub listened_on: NaiveDate,
 }
+
+#[derive(
+    Eq,
+    Debug,
+    Clone,
+    Default,
+    Serialize,
+    PartialEq,
+    InputObject,
+    Deserialize,
+    SimpleObject,
+    FromJsonQueryResult,
+)]
+#[graphql(input_name = "UserToCollectionExtraInformationInput")]
+pub struct UserToCollectionExtraInformation {
+    pub is_hidden: Option<bool>,
+}
diff --git a/crates/models/database/src/user_to_entity.rs b/crates/models/database/src/user_to_entity.rs
index a64758e11b..35c03836cc 100644
--- a/crates/models/database/src/user_to_entity.rs
+++ b/crates/models/database/src/user_to_entity.rs
@@ -1,6 +1,7 @@
 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.14
 
 use async_graphql::SimpleObject;
+use common_models::UserToCollectionExtraInformation;
 use enum_models::UserToMediaReason;
 use fitness_models::UserToExerciseExtraInformation;
 use sea_orm::entity::prelude::*;
@@ -14,20 +15,21 @@ pub struct Model {
     #[sea_orm(primary_key)]
     #[graphql(skip)]
     pub id: Uuid,
-    pub created_on: DateTimeUtc,
-    pub last_updated_on: DateTimeUtc,
     pub user_id: String,
+    pub created_on: DateTimeUtc,
     pub person_id: Option<String>,
     pub metadata_id: Option<String>,
     pub exercise_id: Option<String>,
+    pub last_updated_on: DateTimeUtc,
     pub collection_id: Option<String>,
-    pub exercise_extra_information: Option<UserToExerciseExtraInformation>,
-    pub exercise_num_times_interacted: Option<i32>,
-    #[graphql(skip)]
-    pub media_reason: Option<Vec<UserToMediaReason>>,
     #[graphql(skip)]
     pub needs_to_be_updated: Option<bool>,
     pub metadata_group_id: Option<String>,
+    pub exercise_num_times_interacted: Option<i32>,
+    #[graphql(skip)]
+    pub media_reason: Option<Vec<UserToMediaReason>>,
+    pub exercise_extra_information: Option<UserToExerciseExtraInformation>,
+    pub collection_extra_information: Option<UserToCollectionExtraInformation>,
 }
 
 #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
diff --git a/crates/models/media/src/lib.rs b/crates/models/media/src/lib.rs
index 6a4686d96c..81e6e511a5 100644
--- a/crates/models/media/src/lib.rs
+++ b/crates/models/media/src/lib.rs
@@ -5,7 +5,7 @@ use boilermates::boilermates;
 use chrono::{NaiveDate, NaiveDateTime};
 use common_models::{
     ApplicationDateRange, CollectionExtraInformation, IdAndNamedObject, PersonSourceSpecifics,
-    StoredUrl, StringIdObject,
+    StoredUrl, StringIdObject, UserToCollectionExtraInformation,
 };
 use common_utils::deserialize_date;
 use enum_models::{
@@ -27,9 +27,10 @@ pub struct EntityWithLot {
 #[derive(Debug, InputObject, Default, Clone, Serialize)]
 pub struct CreateOrUpdateCollectionInput {
     pub name: String,
-    pub description: Option<String>,
     pub update_id: Option<String>,
+    pub description: Option<String>,
     pub collaborators: Option<Vec<String>>,
+    pub extra_information: Option<UserToCollectionExtraInformation>,
     pub information_template: Option<Vec<CollectionExtraInformation>>,
 }
 
@@ -1149,6 +1150,14 @@ pub struct CollectionContentsFilter {
     pub metadata_lot: Option<MediaLot>,
 }
 
+#[derive(
+    Debug, Clone, SimpleObject, FromJsonQueryResult, PartialEq, Eq, Serialize, Deserialize,
+)]
+pub struct CollectionItemCollaboratorInformation {
+    pub collaborator: IdAndNamedObject,
+    pub extra_information: Option<UserToCollectionExtraInformation>,
+}
+
 #[derive(Debug, Clone, SimpleObject, FromQueryResult, PartialEq, Eq, Serialize, Deserialize)]
 pub struct CollectionItem {
     pub id: String,
@@ -1157,7 +1166,7 @@ pub struct CollectionItem {
     pub is_default: bool,
     pub creator: IdAndNamedObject,
     pub description: Option<String>,
-    pub collaborators: Vec<IdAndNamedObject>,
+    pub collaborators: Vec<CollectionItemCollaboratorInformation>,
     pub information_template: Option<Vec<CollectionExtraInformation>>,
 }
 
diff --git a/crates/resolvers/collection/src/lib.rs b/crates/resolvers/collection/src/lib.rs
index 94a6bd3722..62ceff08b4 100644
--- a/crates/resolvers/collection/src/lib.rs
+++ b/crates/resolvers/collection/src/lib.rs
@@ -21,11 +21,10 @@ impl CollectionQuery {
     async fn user_collections_list(
         &self,
         gql_ctx: &Context<'_>,
-        name: Option<String>,
     ) -> Result<CachedResponse<UserCollectionsListResponse>> {
         let service = gql_ctx.data_unchecked::<Arc<CollectionService>>();
         let user_id = self.user_id_from_ctx(gql_ctx).await?;
-        service.user_collections_list(&user_id, name).await
+        service.user_collections_list(&user_id).await
     }
 
     /// Get the contents of a collection and respect visibility.
diff --git a/crates/services/collection/src/lib.rs b/crates/services/collection/src/lib.rs
index 40659d0485..74d2315692 100644
--- a/crates/services/collection/src/lib.rs
+++ b/crates/services/collection/src/lib.rs
@@ -47,7 +47,6 @@ impl CollectionService {
     pub async fn user_collections_list(
         &self,
         user_id: &String,
-        name: Option<String>,
     ) -> Result<CachedResponse<UserCollectionsListResponse>> {
         let cc = &self.0.cache_service;
         let cache_key = ApplicationCacheKey::UserCollectionsList(UserLevelCacheKey {
@@ -67,9 +66,22 @@ impl CollectionService {
                 Expr::col((AliasedUser::Table, AliasedUser::Name)),
             ),
         ]);
+        let outer_collaborator = PgFunc::json_build_object(vec![
+            (
+                Expr::val("collaborator"),
+                Expr::expr(user_jsonb_build_object.clone()),
+            ),
+            (
+                Expr::val("extra_information"),
+                Expr::col((
+                    AliasedUserToEntity::Table,
+                    AliasedUserToEntity::CollectionExtraInformation,
+                )),
+            ),
+        ]);
         let collaborators_subquery = Query::select()
             .from(UserToEntity)
-            .expr(PgFunc::json_agg(user_jsonb_build_object.clone()))
+            .expr(PgFunc::json_agg(outer_collaborator.clone()))
             .join(
                 JoinType::InnerJoin,
                 AliasedUser::Table,
@@ -83,10 +95,6 @@ impl CollectionService {
                 ))
                 .equals((AliasedCollection::Table, AliasedCollection::Id)),
             )
-            .and_where(
-                Expr::col((AliasedUser::Table, AliasedUser::Id))
-                    .not_equals((AliasedCollection::Table, AliasedCollection::UserId)),
-            )
             .to_owned();
         let count_subquery = Query::select()
             .expr(collection_to_entity::Column::Id.count())
@@ -103,9 +111,6 @@ impl CollectionService {
             )
             .to_owned();
         let response = Collection::find()
-            .apply_if(name, |query, v| {
-                query.filter(collection::Column::Name.eq(v))
-            })
             .select_only()
             .column(collection::Column::Id)
             .column(collection::Column::Name)
diff --git a/crates/services/importer/src/trakt.rs b/crates/services/importer/src/trakt.rs
index 64f0568b9b..aabd46487f 100644
--- a/crates/services/importer/src/trakt.rs
+++ b/crates/services/importer/src/trakt.rs
@@ -239,6 +239,7 @@ fn process_item(i: &ListItemResponse) -> Result<ImportOrExportMetadataItem, Impo
         (d.ids.trakt, d.ids.tmdb, MediaLot::Show)
     } else {
         return Err(ImportFailedItem {
+            identifier: format!("{:#?}", i),
             step: ImportFailStep::ItemDetailsFromSource,
             error: Some("Item is neither a movie or a show".to_owned()),
             ..Default::default()
@@ -253,6 +254,7 @@ fn process_item(i: &ListItemResponse) -> Result<ImportOrExportMetadataItem, Impo
             ..Default::default()
         }),
         None => Err(ImportFailedItem {
+            identifier: format!("{:#?}", i),
             step: ImportFailStep::ItemDetailsFromSource,
             error: Some("Item does not have an associated TMDB id".to_owned()),
             ..Default::default()
diff --git a/crates/services/integration/src/lib.rs b/crates/services/integration/src/lib.rs
index 79c47c6c59..b4f232babf 100644
--- a/crates/services/integration/src/lib.rs
+++ b/crates/services/integration/src/lib.rs
@@ -308,7 +308,7 @@ impl IntegrationService {
             };
             match response {
                 Ok(update) => progress_updates.push((integration, update)),
-                Err(e) => ryot_log!(warn, "Error yanking integrations data: {:?}", e),
+                Err(e) => ryot_log!(debug, "Error yanking integrations data: {:?}", e),
             };
         }
         for (integration, progress_updates) in progress_updates.into_iter() {
diff --git a/crates/utils/dependent/src/lib.rs b/crates/utils/dependent/src/lib.rs
index cd04213244..97930508a4 100644
--- a/crates/utils/dependent/src/lib.rs
+++ b/crates/utils/dependent/src/lib.rs
@@ -2715,17 +2715,32 @@ pub async fn create_or_update_collection(
             if let Some(input_collaborators) = input.collaborators {
                 collaborators.extend(input_collaborators);
             }
-            let inserts = collaborators
-                .into_iter()
-                .map(|c| user_to_entity::ActiveModel {
-                    user_id: ActiveValue::Set(c),
+            for c in collaborators {
+                UserToEntity::insert(user_to_entity::ActiveModel {
+                    user_id: ActiveValue::Set(c.clone()),
+                    last_updated_on: ActiveValue::Set(Utc::now()),
                     collection_id: ActiveValue::Set(Some(id.clone())),
+                    collection_extra_information: match &c == user_id {
+                        true => ActiveValue::Set(input.extra_information.clone()),
+                        _ => Default::default(),
+                    },
                     ..Default::default()
-                });
-            UserToEntity::insert_many(inserts)
-                .on_conflict(OnConflict::new().do_nothing().to_owned())
+                })
+                .on_conflict(
+                    OnConflict::new()
+                        .exprs([
+                            Expr::col(user_to_entity::Column::UserId),
+                            Expr::col(user_to_entity::Column::CollectionId),
+                        ])
+                        .update_columns([
+                            user_to_entity::Column::CollectionExtraInformation,
+                            user_to_entity::Column::LastUpdatedOn,
+                        ])
+                        .to_owned(),
+                )
                 .exec_without_returning(&txn)
                 .await?;
+            }
             id
         }
     };
diff --git a/docs/content/guides/exporting.md b/docs/content/guides/exporting.md
index 6678b9acaf..c5fd5357c3 100644
--- a/docs/content/guides/exporting.md
+++ b/docs/content/guides/exporting.md
@@ -6,9 +6,10 @@ configuration parameters under the
 in JSON format and always follows the schema (`CompleteExport`) described below.
 
 You can export your data from the app by going to the "Imports and Exports" settings page
-and then clicking the button under the "Export" tab.
+and then clicking the button under the "Export" tab. Once the export is complete, it will
+appear along with a button to download it.
 
-Once the export is complete, it will appear along with a button to download it.
+You can import it back using the [Generic JSON Importer](../importing.md#generic-json).
 
 ## One time file storage
 
diff --git a/libs/generated/src/graphql/backend/gql.ts b/libs/generated/src/graphql/backend/gql.ts
index 8e8b86c764..45d3777bfc 100644
--- a/libs/generated/src/graphql/backend/gql.ts
+++ b/libs/generated/src/graphql/backend/gql.ts
@@ -22,7 +22,7 @@ type Documents = {
     "query UserExerciseDetails($exerciseId: String!) {\n  userExerciseDetails(exerciseId: $exerciseId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    history {\n      idx\n      workoutId\n      workoutEndOn\n      bestSet {\n        ...WorkoutSetRecordPart\n      }\n    }\n    details {\n      exerciseId\n      createdOn\n      lastUpdatedOn\n      exerciseNumTimesInteracted\n      exerciseExtraInformation {\n        settings {\n          excludeFromAnalytics\n          setRestTimers {\n            ...SetRestTimersPart\n          }\n        }\n        lifetimeStats {\n          weight\n          reps\n          distance\n          duration\n          personalBestsAchieved\n        }\n        personalBests {\n          lot\n          sets {\n            setIdx\n            workoutId\n            exerciseIdx\n          }\n        }\n      }\n    }\n  }\n}": typeof types.UserExerciseDetailsDocument,
     "query UserMeasurementsList($input: UserMeasurementsListInput!) {\n  userMeasurementsList(input: $input) {\n    timestamp\n    name\n    comment\n    stats {\n      weight\n      bodyMassIndex\n      totalBodyWater\n      muscle\n      leanBodyMass\n      bodyFat\n      boneMass\n      visceralFat\n      waistCircumference\n      waistToHeightRatio\n      hipCircumference\n      waistToHipRatio\n      chestCircumference\n      thighCircumference\n      bicepsCircumference\n      neckCircumference\n      bodyFatCaliper\n      chestSkinfold\n      abdominalSkinfold\n      thighSkinfold\n      basalMetabolicRate\n      totalDailyEnergyExpenditure\n      calories\n      custom\n    }\n  }\n}": typeof types.UserMeasurementsListDocument,
     "query UserMetadataDetails($metadataId: String!) {\n  userMetadataDetails(metadataId: $metadataId) {\n    mediaReason\n    hasInteracted\n    averageRating\n    seenByAllCount\n    seenByUserCount\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    history {\n      ...SeenPart\n    }\n    nextEntry {\n      season\n      volume\n      episode\n      chapter\n    }\n    inProgress {\n      ...SeenPart\n    }\n    collections {\n      ...CollectionPart\n    }\n    showProgress {\n      timesSeen\n      seasonNumber\n      episodes {\n        episodeNumber\n        timesSeen\n      }\n    }\n    podcastProgress {\n      episodeNumber\n      timesSeen\n    }\n  }\n}": typeof types.UserMetadataDetailsDocument,
-    "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        id\n        name\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}": typeof types.GetOidcRedirectUrlDocument,
+    "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList {\n  userCollectionsList {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        extraInformation {\n          isHidden\n        }\n        collaborator {\n          id\n          name\n        }\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}": typeof types.GetOidcRedirectUrlDocument,
     "fragment SeenPodcastExtraInformationPart on SeenPodcastExtraInformation {\n  episode\n}\n\nfragment SeenShowExtraInformationPart on SeenShowExtraInformation {\n  episode\n  season\n}\n\nfragment SeenAnimeExtraInformationPart on SeenAnimeExtraInformation {\n  episode\n}\n\nfragment SeenMangaExtraInformationPart on SeenMangaExtraInformation {\n  volume\n  chapter\n}\n\nfragment CalendarEventPart on GraphqlCalendarEvent {\n  date\n  metadataId\n  metadataLot\n  metadataText\n  metadataImage\n  calendarEventId\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n}\n\nfragment SeenPart on Seen {\n  id\n  state\n  progress\n  reviewId\n  startedOn\n  finishedOn\n  lastUpdatedOn\n  manualTimeSpent\n  numTimesUpdated\n  providerWatchedOn\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n  mangaExtraInformation {\n    ...SeenMangaExtraInformationPart\n  }\n}\n\nfragment MetadataSearchItemPart on MetadataSearchItem {\n  title\n  image\n  identifier\n  publishYear\n}\n\nfragment WorkoutOrExerciseTotalsPart on WorkoutOrExerciseTotals {\n  reps\n  weight\n  distance\n  duration\n  restTime\n  personalBestsAchieved\n}\n\nfragment EntityAssetsPart on EntityAssets {\n  images\n  videos\n}\n\nfragment WorkoutSetStatisticPart on WorkoutSetStatistic {\n  reps\n  pace\n  oneRm\n  weight\n  volume\n  duration\n  distance\n}\n\nfragment WorkoutSetRecordPart on WorkoutSetRecord {\n  lot\n  personalBests\n  statistic {\n    ...WorkoutSetStatisticPart\n  }\n}\n\nfragment WorkoutSummaryPart on WorkoutSummary {\n  total {\n    ...WorkoutOrExerciseTotalsPart\n  }\n  exercises {\n    id\n    lot\n    numSets\n    bestSet {\n      ...WorkoutSetRecordPart\n    }\n  }\n  focused {\n    lots {\n      lot\n      exercises\n    }\n    levels {\n      level\n      exercises\n    }\n    forces {\n      force\n      exercises\n    }\n    muscles {\n      muscle\n      exercises\n    }\n    equipments {\n      equipment\n      exercises\n    }\n  }\n}\n\nfragment CollectionPart on Collection {\n  id\n  name\n  userId\n}\n\nfragment ReviewItemPart on ReviewItem {\n  id\n  rating\n  postedOn\n  isSpoiler\n  visibility\n  textOriginal\n  textRendered\n  seenItemsAssociatedWith\n  postedBy {\n    id\n    name\n  }\n  comments {\n    id\n    text\n    likedBy\n    createdOn\n    user {\n      id\n      name\n    }\n  }\n  showExtraInformation {\n    season\n    episode\n  }\n  podcastExtraInformation {\n    episode\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n  mangaExtraInformation {\n    ...SeenMangaExtraInformationPart\n  }\n}\n\nfragment WorkoutInformationPart on WorkoutInformation {\n  comment\n  assets {\n    ...EntityAssetsPart\n  }\n  supersets {\n    color\n    exercises\n  }\n  exercises {\n    id\n    lot\n    notes\n    total {\n      ...WorkoutOrExerciseTotalsPart\n    }\n    assets {\n      ...EntityAssetsPart\n    }\n    sets {\n      lot\n      rpe\n      note\n      restTime\n      confirmedAt\n      personalBests\n      statistic {\n        ...WorkoutSetStatisticPart\n      }\n    }\n  }\n}\n\nfragment SetRestTimersPart on SetRestTimersSettings {\n  drop\n  warmup\n  normal\n  failure\n}\n\nfragment PersonDetailsGroupedByRolePart on PersonDetailsGroupedByRole {\n  name\n  count\n  items {\n    entityId\n    character\n  }\n}": typeof types.SeenPodcastExtraInformationPartFragmentDoc,
 };
 const documents: Documents = {
@@ -34,7 +34,7 @@ const documents: Documents = {
     "query UserExerciseDetails($exerciseId: String!) {\n  userExerciseDetails(exerciseId: $exerciseId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    history {\n      idx\n      workoutId\n      workoutEndOn\n      bestSet {\n        ...WorkoutSetRecordPart\n      }\n    }\n    details {\n      exerciseId\n      createdOn\n      lastUpdatedOn\n      exerciseNumTimesInteracted\n      exerciseExtraInformation {\n        settings {\n          excludeFromAnalytics\n          setRestTimers {\n            ...SetRestTimersPart\n          }\n        }\n        lifetimeStats {\n          weight\n          reps\n          distance\n          duration\n          personalBestsAchieved\n        }\n        personalBests {\n          lot\n          sets {\n            setIdx\n            workoutId\n            exerciseIdx\n          }\n        }\n      }\n    }\n  }\n}": types.UserExerciseDetailsDocument,
     "query UserMeasurementsList($input: UserMeasurementsListInput!) {\n  userMeasurementsList(input: $input) {\n    timestamp\n    name\n    comment\n    stats {\n      weight\n      bodyMassIndex\n      totalBodyWater\n      muscle\n      leanBodyMass\n      bodyFat\n      boneMass\n      visceralFat\n      waistCircumference\n      waistToHeightRatio\n      hipCircumference\n      waistToHipRatio\n      chestCircumference\n      thighCircumference\n      bicepsCircumference\n      neckCircumference\n      bodyFatCaliper\n      chestSkinfold\n      abdominalSkinfold\n      thighSkinfold\n      basalMetabolicRate\n      totalDailyEnergyExpenditure\n      calories\n      custom\n    }\n  }\n}": types.UserMeasurementsListDocument,
     "query UserMetadataDetails($metadataId: String!) {\n  userMetadataDetails(metadataId: $metadataId) {\n    mediaReason\n    hasInteracted\n    averageRating\n    seenByAllCount\n    seenByUserCount\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    history {\n      ...SeenPart\n    }\n    nextEntry {\n      season\n      volume\n      episode\n      chapter\n    }\n    inProgress {\n      ...SeenPart\n    }\n    collections {\n      ...CollectionPart\n    }\n    showProgress {\n      timesSeen\n      seasonNumber\n      episodes {\n        episodeNumber\n        timesSeen\n      }\n    }\n    podcastProgress {\n      episodeNumber\n      timesSeen\n    }\n  }\n}": types.UserMetadataDetailsDocument,
-    "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        id\n        name\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}": types.GetOidcRedirectUrlDocument,
+    "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList {\n  userCollectionsList {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        extraInformation {\n          isHidden\n        }\n        collaborator {\n          id\n          name\n        }\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}": types.GetOidcRedirectUrlDocument,
     "fragment SeenPodcastExtraInformationPart on SeenPodcastExtraInformation {\n  episode\n}\n\nfragment SeenShowExtraInformationPart on SeenShowExtraInformation {\n  episode\n  season\n}\n\nfragment SeenAnimeExtraInformationPart on SeenAnimeExtraInformation {\n  episode\n}\n\nfragment SeenMangaExtraInformationPart on SeenMangaExtraInformation {\n  volume\n  chapter\n}\n\nfragment CalendarEventPart on GraphqlCalendarEvent {\n  date\n  metadataId\n  metadataLot\n  metadataText\n  metadataImage\n  calendarEventId\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n}\n\nfragment SeenPart on Seen {\n  id\n  state\n  progress\n  reviewId\n  startedOn\n  finishedOn\n  lastUpdatedOn\n  manualTimeSpent\n  numTimesUpdated\n  providerWatchedOn\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n  mangaExtraInformation {\n    ...SeenMangaExtraInformationPart\n  }\n}\n\nfragment MetadataSearchItemPart on MetadataSearchItem {\n  title\n  image\n  identifier\n  publishYear\n}\n\nfragment WorkoutOrExerciseTotalsPart on WorkoutOrExerciseTotals {\n  reps\n  weight\n  distance\n  duration\n  restTime\n  personalBestsAchieved\n}\n\nfragment EntityAssetsPart on EntityAssets {\n  images\n  videos\n}\n\nfragment WorkoutSetStatisticPart on WorkoutSetStatistic {\n  reps\n  pace\n  oneRm\n  weight\n  volume\n  duration\n  distance\n}\n\nfragment WorkoutSetRecordPart on WorkoutSetRecord {\n  lot\n  personalBests\n  statistic {\n    ...WorkoutSetStatisticPart\n  }\n}\n\nfragment WorkoutSummaryPart on WorkoutSummary {\n  total {\n    ...WorkoutOrExerciseTotalsPart\n  }\n  exercises {\n    id\n    lot\n    numSets\n    bestSet {\n      ...WorkoutSetRecordPart\n    }\n  }\n  focused {\n    lots {\n      lot\n      exercises\n    }\n    levels {\n      level\n      exercises\n    }\n    forces {\n      force\n      exercises\n    }\n    muscles {\n      muscle\n      exercises\n    }\n    equipments {\n      equipment\n      exercises\n    }\n  }\n}\n\nfragment CollectionPart on Collection {\n  id\n  name\n  userId\n}\n\nfragment ReviewItemPart on ReviewItem {\n  id\n  rating\n  postedOn\n  isSpoiler\n  visibility\n  textOriginal\n  textRendered\n  seenItemsAssociatedWith\n  postedBy {\n    id\n    name\n  }\n  comments {\n    id\n    text\n    likedBy\n    createdOn\n    user {\n      id\n      name\n    }\n  }\n  showExtraInformation {\n    season\n    episode\n  }\n  podcastExtraInformation {\n    episode\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n  mangaExtraInformation {\n    ...SeenMangaExtraInformationPart\n  }\n}\n\nfragment WorkoutInformationPart on WorkoutInformation {\n  comment\n  assets {\n    ...EntityAssetsPart\n  }\n  supersets {\n    color\n    exercises\n  }\n  exercises {\n    id\n    lot\n    notes\n    total {\n      ...WorkoutOrExerciseTotalsPart\n    }\n    assets {\n      ...EntityAssetsPart\n    }\n    sets {\n      lot\n      rpe\n      note\n      restTime\n      confirmedAt\n      personalBests\n      statistic {\n        ...WorkoutSetStatisticPart\n      }\n    }\n  }\n}\n\nfragment SetRestTimersPart on SetRestTimersSettings {\n  drop\n  warmup\n  normal\n  failure\n}\n\nfragment PersonDetailsGroupedByRolePart on PersonDetailsGroupedByRole {\n  name\n  count\n  items {\n    entityId\n    character\n  }\n}": types.SeenPodcastExtraInformationPartFragmentDoc,
 };
 
@@ -87,7 +87,7 @@ export function graphql(source: "query UserMetadataDetails($metadataId: String!)
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
-export function graphql(source: "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        id\n        name\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}"): (typeof documents)["query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        id\n        name\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}"];
+export function graphql(source: "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList {\n  userCollectionsList {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        extraInformation {\n          isHidden\n        }\n        collaborator {\n          id\n          name\n        }\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}"): (typeof documents)["query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    key\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList {\n  userCollectionsList {\n    cacheId\n    response {\n      id\n      name\n      count\n      isDefault\n      description\n      creator {\n        id\n        name\n      }\n      collaborators {\n        extraInformation {\n          isHidden\n        }\n        collaborator {\n          id\n          name\n        }\n      }\n      informationTemplate {\n        lot\n        name\n        required\n        description\n        defaultValue\n      }\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    name\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserMetadataRecommendations {\n  userMetadataRecommendations {\n    cacheId\n    response\n  }\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery UserMetadataGroupsList($input: UserMetadataGroupsListInput!) {\n  userMetadataGroupsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserPeopleList($input: UserPeopleListInput!) {\n  userPeopleList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    name\n    level\n    force\n    source\n    muscles\n    mechanic\n    equipment\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery UserExercisesList($input: UserExercisesListInput!) {\n  userExercisesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    estimatedFinishTime\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    items\n    details {\n      total\n      nextPage\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    cacheId\n    response {\n      totalItems\n      user {\n        id\n        name\n      }\n      reviews {\n        ...ReviewItemPart\n      }\n      details {\n        name\n        createdOn\n        description\n      }\n      results {\n        details {\n          total\n          nextPage\n        }\n        items {\n          entityId\n          entityLot\n        }\n      }\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    peopleSearchSources\n    isServerKeyValidated\n    metadataGroupSourceLotMappings {\n      lot\n      source\n    }\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      lotMapping {\n        lot\n        bests\n      }\n      filters {\n        type\n        level\n        force\n        muscle\n        mechanic\n        equipment\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    details {\n      id\n      lot\n      title\n      parts\n      source\n      isPartial\n      sourceUrl\n      identifier\n      description\n      displayImages\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery UserMetadataList($input: UserMetadataListInput!) {\n  userMetadataList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      title\n      image\n      publishYear\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    recentlyConsumed\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    recentlyConsumed\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      caloriesBurnt\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutsList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: UserTemplatesOrWorkoutsListInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    cacheId\n    response {\n      items\n      details {\n        total\n        nextPage\n      }\n    }\n  }\n}\n\nquery UserAnalyticsParameters {\n  userAnalyticsParameters {\n    endDate\n    startDate\n  }\n}\n\nquery UserPendingNotifications {\n  userPendingNotifications {\n    id\n    message\n    createdOn\n  }\n}"];
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
diff --git a/libs/generated/src/graphql/backend/graphql.ts b/libs/generated/src/graphql/backend/graphql.ts
index 03129bf674..af857fff45 100644
--- a/libs/generated/src/graphql/backend/graphql.ts
+++ b/libs/generated/src/graphql/backend/graphql.ts
@@ -237,7 +237,7 @@ export enum CollectionExtraInformationLot {
 }
 
 export type CollectionItem = {
-  collaborators: Array<IdAndNamedObject>;
+  collaborators: Array<CollectionItemCollaboratorInformation>;
   count: Scalars['Int']['output'];
   creator: IdAndNamedObject;
   description?: Maybe<Scalars['String']['output']>;
@@ -247,6 +247,11 @@ export type CollectionItem = {
   name: Scalars['String']['output'];
 };
 
+export type CollectionItemCollaboratorInformation = {
+  collaborator: IdAndNamedObject;
+  extraInformation?: Maybe<UserToCollectionExtraInformation>;
+};
+
 export type CommitMediaInput = {
   name: Scalars['String']['input'];
   unique: UniqueMediaIdentifier;
@@ -316,6 +321,7 @@ export type CreateCustomMetadataInput = {
 export type CreateOrUpdateCollectionInput = {
   collaborators?: InputMaybe<Array<Scalars['String']['input']>>;
   description?: InputMaybe<Scalars['String']['input']>;
+  extraInformation?: InputMaybe<UserToCollectionExtraInformationInput>;
   informationTemplate?: InputMaybe<Array<CollectionExtraInformationInput>>;
   name: Scalars['String']['input'];
   updateId?: InputMaybe<Scalars['String']['input']>;
@@ -1932,11 +1938,6 @@ export type QueryRootUserCalendarEventsArgs = {
 };
 
 
-export type QueryRootUserCollectionsListArgs = {
-  name?: InputMaybe<Scalars['String']['input']>;
-};
-
-
 export type QueryRootUserExerciseDetailsArgs = {
   exerciseId: Scalars['String']['input'];
 };
@@ -2801,7 +2802,16 @@ export enum UserTemplatesOrWorkoutsListSortBy {
   Time = 'TIME'
 }
 
+export type UserToCollectionExtraInformation = {
+  isHidden?: Maybe<Scalars['Boolean']['output']>;
+};
+
+export type UserToCollectionExtraInformationInput = {
+  isHidden?: InputMaybe<Scalars['Boolean']['input']>;
+};
+
 export type UserToEntity = {
+  collectionExtraInformation?: Maybe<UserToCollectionExtraInformation>;
   collectionId?: Maybe<Scalars['String']['output']>;
   createdOn: Scalars['DateTime']['output'];
   exerciseExtraInformation?: Maybe<UserToExerciseExtraInformation>;
@@ -3548,12 +3558,10 @@ export type UserExportsQueryVariables = Exact<{ [key: string]: never; }>;
 
 export type UserExportsQuery = { userExports: Array<{ url: string, key: string, size: number, endedAt: string, startedAt: string }> };
 
-export type UserCollectionsListQueryVariables = Exact<{
-  name?: InputMaybe<Scalars['String']['input']>;
-}>;
+export type UserCollectionsListQueryVariables = Exact<{ [key: string]: never; }>;
 
 
-export type UserCollectionsListQuery = { userCollectionsList: { cacheId: string, response: Array<{ id: string, name: string, count: number, isDefault: boolean, description?: string | null, creator: { id: string, name: string }, collaborators: Array<{ id: string, name: string }>, informationTemplate?: Array<{ lot: CollectionExtraInformationLot, name: string, required?: boolean | null, description: string, defaultValue?: string | null }> | null }> } };
+export type UserCollectionsListQuery = { userCollectionsList: { cacheId: string, response: Array<{ id: string, name: string, count: number, isDefault: boolean, description?: string | null, creator: { id: string, name: string }, collaborators: Array<{ extraInformation?: { isHidden?: boolean | null } | null, collaborator: { id: string, name: string } }>, informationTemplate?: Array<{ lot: CollectionExtraInformationLot, name: string, required?: boolean | null, description: string, defaultValue?: string | null }> | null }> } };
 
 export type UserIntegrationsQueryVariables = Exact<{ [key: string]: never; }>;
 
@@ -3867,7 +3875,7 @@ export const UserByOidcIssuerIdDocument = {"kind":"Document","definitions":[{"ki
 export const GetOidcTokenDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOidcToken"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"code"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getOidcToken"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"code"},"value":{"kind":"Variable","name":{"kind":"Name","value":"code"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subject"}},{"kind":"Field","name":{"kind":"Name","value":"email"}}]}}]}}]} as unknown as DocumentNode<GetOidcTokenQuery, GetOidcTokenQueryVariables>;
 export const GetPresignedS3UrlDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetPresignedS3Url"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getPresignedS3Url"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}]}]}}]} as unknown as DocumentNode<GetPresignedS3UrlQuery, GetPresignedS3UrlQueryVariables>;
 export const UserExportsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserExports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userExports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"size"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}}]}}]}}]} as unknown as DocumentNode<UserExportsQuery, UserExportsQueryVariables>;
-export const UserCollectionsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserCollectionsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cacheId"}},{"kind":"Field","name":{"kind":"Name","value":"response"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"isDefault"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"creator"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collaborators"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"informationTemplate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"required"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}}]}}]}}]}}]}}]} as unknown as DocumentNode<UserCollectionsListQuery, UserCollectionsListQueryVariables>;
+export const UserCollectionsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserCollectionsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cacheId"}},{"kind":"Field","name":{"kind":"Name","value":"response"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"isDefault"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"creator"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collaborators"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"extraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"isHidden"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collaborator"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"informationTemplate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"required"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}}]}}]}}]}}]}}]} as unknown as DocumentNode<UserCollectionsListQuery, UserCollectionsListQueryVariables>;
 export const UserIntegrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserIntegrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userIntegrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"provider"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"isDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"maximumProgress"}},{"kind":"Field","name":{"kind":"Name","value":"minimumProgress"}},{"kind":"Field","name":{"kind":"Name","value":"lastTriggeredOn"}},{"kind":"Field","name":{"kind":"Name","value":"syncToOwnedCollection"}}]}}]}}]} as unknown as DocumentNode<UserIntegrationsQuery, UserIntegrationsQueryVariables>;
 export const UserNotificationPlatformsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserNotificationPlatforms"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userNotificationPlatforms"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"isDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}}]}}]} as unknown as DocumentNode<UserNotificationPlatformsQuery, UserNotificationPlatformsQueryVariables>;
 export const UsersListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UsersList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"query"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"usersList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"query"},"value":{"kind":"Variable","name":{"kind":"Name","value":"query"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isDisabled"}}]}}]}}]} as unknown as DocumentNode<UsersListQuery, UsersListQueryVariables>;
diff --git a/libs/generated/src/graphql/backend/types.generated.ts b/libs/generated/src/graphql/backend/types.generated.ts
index 788b15e25b..4470749e8a 100644
--- a/libs/generated/src/graphql/backend/types.generated.ts
+++ b/libs/generated/src/graphql/backend/types.generated.ts
@@ -216,7 +216,7 @@ export enum CollectionExtraInformationLot {
 
 export type CollectionItem = {
   __typename?: 'CollectionItem';
-  collaborators: Array<IdAndNamedObject>;
+  collaborators: Array<CollectionItemCollaboratorInformation>;
   count: Scalars['Int']['output'];
   creator: IdAndNamedObject;
   description?: Maybe<Scalars['String']['output']>;
@@ -226,6 +226,12 @@ export type CollectionItem = {
   name: Scalars['String']['output'];
 };
 
+export type CollectionItemCollaboratorInformation = {
+  __typename?: 'CollectionItemCollaboratorInformation';
+  collaborator: IdAndNamedObject;
+  extraInformation?: Maybe<UserToCollectionExtraInformation>;
+};
+
 export type CommitMediaInput = {
   name: Scalars['String']['input'];
   unique: UniqueMediaIdentifier;
@@ -296,6 +302,7 @@ export type CreateCustomMetadataInput = {
 export type CreateOrUpdateCollectionInput = {
   collaborators?: InputMaybe<Array<Scalars['String']['input']>>;
   description?: InputMaybe<Scalars['String']['input']>;
+  extraInformation?: InputMaybe<UserToCollectionExtraInformationInput>;
   informationTemplate?: InputMaybe<Array<CollectionExtraInformationInput>>;
   name: Scalars['String']['input'];
   updateId?: InputMaybe<Scalars['String']['input']>;
@@ -1980,11 +1987,6 @@ export type QueryRootUserCalendarEventsArgs = {
 };
 
 
-export type QueryRootUserCollectionsListArgs = {
-  name?: InputMaybe<Scalars['String']['input']>;
-};
-
-
 export type QueryRootUserExerciseDetailsArgs = {
   exerciseId: Scalars['String']['input'];
 };
@@ -2894,8 +2896,18 @@ export enum UserTemplatesOrWorkoutsListSortBy {
   Time = 'TIME'
 }
 
+export type UserToCollectionExtraInformation = {
+  __typename?: 'UserToCollectionExtraInformation';
+  isHidden?: Maybe<Scalars['Boolean']['output']>;
+};
+
+export type UserToCollectionExtraInformationInput = {
+  isHidden?: InputMaybe<Scalars['Boolean']['input']>;
+};
+
 export type UserToEntity = {
   __typename?: 'UserToEntity';
+  collectionExtraInformation?: Maybe<UserToCollectionExtraInformation>;
   collectionId?: Maybe<Scalars['String']['output']>;
   createdOn: Scalars['DateTime']['output'];
   exerciseExtraInformation?: Maybe<UserToExerciseExtraInformation>;
diff --git a/libs/graphql/src/backend/queries/combined.gql b/libs/graphql/src/backend/queries/combined.gql
index 16ed54b826..f51c34b483 100644
--- a/libs/graphql/src/backend/queries/combined.gql
+++ b/libs/graphql/src/backend/queries/combined.gql
@@ -27,8 +27,8 @@ query UserExports {
   }
 }
 
-query UserCollectionsList($name: String) {
-  userCollectionsList(name: $name) {
+query UserCollectionsList {
+  userCollectionsList {
     cacheId
     response {
       id
@@ -41,8 +41,13 @@ query UserCollectionsList($name: String) {
         name
       }
       collaborators {
-        id
-        name
+        extraInformation {
+          isHidden
+        }
+        collaborator {
+          id
+          name
+        }
       }
       informationTemplate {
         lot


Test patch: