diff --git a/Cargo.lock b/Cargo.lock index f4bb7974ab..2491c94eca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -48,7 +48,7 @@ dependencies = [ "getrandom", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -68,9 +68,9 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -89,9 +89,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -104,9 +104,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -138,9 +138,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "apalis" @@ -155,9 +155,9 @@ dependencies = [ "futures", "pin-project-lite", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", - "tower 0.5.1", + "tower", "tracing", "tracing-futures", ] @@ -174,8 +174,8 @@ dependencies = [ "pin-project-lite", "serde", "serde_json", - "thiserror", - "tower 0.5.1", + "thiserror 1.0.69", + "tower", "ulid", ] @@ -190,7 +190,7 @@ dependencies = [ "chrono", "cron", "futures", - "tower 0.5.1", + "tower", ] [[package]] @@ -307,7 +307,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -345,7 +345,7 @@ dependencies = [ "futures-util", "handlebars", "http 1.1.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "mime", "multer", @@ -359,7 +359,7 @@ dependencies = [ "serde_urlencoded", "static_assertions_next", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", "tracing-futures", ] @@ -395,8 +395,8 @@ dependencies = [ "proc-macro2", "quote", "strum", - "syn 2.0.85", - "thiserror", + "syn 2.0.90", + "thiserror 1.0.69", ] [[package]] @@ -418,7 +418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef5ec94176a12a8cbe985cd73f2e54dc9c702c88c766bdef12f1f3a67cedbee1" dependencies = [ "bytes", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_json", ] @@ -451,7 +451,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -462,7 +462,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -526,9 +526,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.58.0" +version = "1.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0656a79cf5e6ab0d4bb2465cd750a7a2fd7ea26c062183ed94225f5782e22365" +checksum = "f43850204a109a5eea1ea93951cf0440268cef98b0d27dfef4534949e23735f7" dependencies = [ "aws-credential-types", "aws-runtime", @@ -689,9 +689,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.7.2" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e086682a53d3aa241192aa110fa8dfce98f2f5ac2ead0de84d41582c7e8fdb96" +checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -706,9 +706,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.8" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c9cdc179e6afbf5d391ab08c85eac817b51c87e1892a5edb5f7bbdc64314b4" +checksum = "4fbd94a32b3a7d55d3806fe27d98d3ad393050439dd05eb53ece36ec5e3d3510" dependencies = [ "base64-simd", "bytes", @@ -755,9 +755,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", @@ -768,7 +768,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", "itoa", "matchit", @@ -783,10 +783,10 @@ dependencies = [ "serde_path_to_error", "serde_urlencoded", "sha1", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tokio", "tokio-tungstenite", - "tower 0.5.1", + "tower", "tower-layer", "tower-service", "tracing", @@ -807,7 +807,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", "tracing", @@ -821,7 +821,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -876,7 +876,7 @@ dependencies = [ "statistics-service", "supporting-service", "tokio", - "tower 0.4.13", + "tower", "tower-http", "tracing", "tracing-subscriber", @@ -1052,9 +1052,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" dependencies = [ "borsh-derive", "cfg_aliases", @@ -1062,16 +1062,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.85", - "syn_derive", + "syn 2.0.90", ] [[package]] @@ -1110,9 +1109,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -1153,9 +1152,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" dependencies = [ "shlex", ] @@ -1195,7 +1194,7 @@ checksum = "cd6dd8046d00723a59a2f8c5f295c515b9bb9a331ee4f8f3d4dd49e428acd3b6" dependencies = [ "chrono", "chrono-tz-build", - "phf 0.11.2", + "phf", ] [[package]] @@ -1205,7 +1204,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e94fea34d77a245229e7746bd2beb786cd2a896f306ff491fb8cecb3074b10a7" dependencies = [ "parse-zoneinfo", - "phf_codegen 0.11.2", + "phf_codegen", ] [[package]] @@ -1220,9 +1219,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -1230,9 +1229,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -1249,14 +1248,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "collection-resolver" @@ -1346,6 +1345,7 @@ dependencies = [ "chrono", "compile-time", "const-str", + "enums", "env-utils", "reqwest 0.12.9", "serde", @@ -1438,9 +1438,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -1549,14 +1549,14 @@ dependencies = [ [[package]] name = "cssparser" -version = "0.31.2" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3df4f93e5fbbe73ec01ec8d3f68bba73107993a5b1e7519273c32db9b0d5be" +checksum = "b7c66d1cd8ed61bf80b38432613a7a2f09401ab8d0501110655f8b341484a3e3" dependencies = [ "cssparser-macros", "dtoa-short", "itoa", - "phf 0.11.2", + "phf", "smallvec", ] @@ -1567,14 +1567,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "csv" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", @@ -1615,7 +1615,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1639,7 +1639,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1650,7 +1650,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1734,6 +1734,7 @@ dependencies = [ "schematic", "serde", "serde_with 3.11.0", + "strum", ] [[package]] @@ -1809,7 +1810,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1829,7 +1830,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1911,7 +1912,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1943,12 +1944,13 @@ dependencies = [ [[package]] name = "duplicate" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" +checksum = "97af9b5f014e228b33e77d75ee0e6e87960124f0f4b16337b586a6bec91867b1" dependencies = [ - "heck 0.4.1", - "proc-macro-error", + "heck 0.5.0", + "proc-macro2", + "proc-macro2-diagnostics", ] [[package]] @@ -2016,14 +2018,14 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "ego-tree" -version = "0.6.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12a0bb14ac04a9fcf170d0bbbef949b44cc492f4452bd20c095636956f653642" +checksum = "7c6ba7d4eec39eaa9ab24d44a0e73a7949a1095a8b3f3abb11eddf27dbb56a53" [[package]] name = "either" @@ -2077,9 +2079,9 @@ dependencies = [ [[package]] name = "email-encoding" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d1d33cdaede7e24091f039632eb5d3c7469fe5b066a985281a34fc70fa317f" +checksum = "ea3d894bbbab314476b265f9b2d46bf24b123a36dd0e96b06a1b49545b9d9dcc" dependencies = [ "base64 0.22.1", "memchr", @@ -2123,7 +2125,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -2160,12 +2162,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2260,9 +2262,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "ff" @@ -2356,7 +2358,6 @@ dependencies = [ "dependent-utils", "enums", "fitness-models", - "itertools 0.13.0", "migrations", "nanoid", "reqwest 0.12.9", @@ -2369,9 +2370,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -2501,9 +2502,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "fastrand", "futures-core", @@ -2520,7 +2521,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -2599,7 +2600,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -2663,7 +2664,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2ebc8013b4426d5b81a4364c419a95ed0b404af2b82e2457de52d9348f0e474" dependencies = [ "combine 3.8.1", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2739,7 +2740,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -2748,9 +2749,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -2758,7 +2759,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -2776,7 +2777,7 @@ dependencies = [ "pest_derive", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2806,9 +2807,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -2836,12 +2837,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.4.0" @@ -2894,16 +2889,16 @@ dependencies = [ [[package]] name = "html5ever" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" +checksum = "2e15626aaf9c351bc696217cbe29cb9b5e86c43f8a46b5e2f5c6c5cf7cb904ce" dependencies = [ "log", "mac", "markup5ever", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3018,14 +3013,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", + "h2 0.4.7", "http 1.1.0", "http-body 1.0.1", "httparse", @@ -3061,9 +3056,9 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", - "rustls 0.23.16", + "rustls 0.23.19", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -3091,7 +3086,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", "native-tls", "tokio", @@ -3110,7 +3105,7 @@ dependencies = [ "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.5.0", + "hyper 1.5.1", "pin-project-lite", "socket2", "tokio", @@ -3256,7 +3251,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3267,24 +3262,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "idna" -version = "1.0.2" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd69211b9b519e98303c015e21a007e293db403b6c85b9b124e133d25e242cdd" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", - "smallvec", - "utf8_iter", ] [[package]] @@ -3334,10 +3328,11 @@ dependencies = [ "fitness-models", "flate2", "importer-models", + "indexmap 2.7.0", "itertools 0.13.0", "media-models", + "nanoid", "providers", - "regex", "reqwest 0.12.9", "rust_decimal", "rust_decimal_macros", @@ -3365,12 +3360,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] @@ -3388,7 +3383,7 @@ checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3441,7 +3436,7 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi", "libc", "windows-sys 0.52.0", ] @@ -3464,7 +3459,7 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe50d48c77760c55188549098b9a7f6e37ae980c586a24693d6b01c3b2010c3c" dependencies = [ - "phf 0.11.2", + "phf", ] [[package]] @@ -3496,15 +3491,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "fb15147158e79fd8b8afd0252522769c4f48725460b37338544d8379d94fc8f9" dependencies = [ "wasm-bindgen", ] @@ -3557,7 +3552,7 @@ dependencies = [ "futures-util", "hostname", "httpdate", - "idna 1.0.2", + "idna", "mime", "native-tls", "nom", @@ -3570,9 +3565,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.161" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libm" @@ -3609,9 +3604,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -3645,7 +3640,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -3665,13 +3660,13 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" +checksum = "82c88c6129bd24319e62a0359cb6b958fa7e8be6e19bb1663bc396b90883aca5" dependencies = [ "log", - "phf 0.11.2", - "phf_codegen 0.11.2", + "phf", + "phf_codegen", "string_cache", "string_cache_codegen", "tendril", @@ -3729,25 +3724,25 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miette" -version = "7.2.0" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" +checksum = "317f146e2eb7021892722af37cf1b971f0a70c8406f487e24952667616192c64" dependencies = [ "cfg-if", "miette-derive", - "thiserror", + "thiserror 1.0.69", "unicode-width", ] [[package]] name = "miette-derive" -version = "7.2.0" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" +checksum = "23c9b935fbe1d6cbd1dac857b54a688145e2d93f48db36010514d0f612d0ad67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3794,11 +3789,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -4020,7 +4014,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "sha2", - "thiserror", + "thiserror 1.0.69", "url", ] @@ -4067,7 +4061,7 @@ dependencies = [ "serde_with 3.11.0", "sha2", "subtle", - "thiserror", + "thiserror 1.0.69", "url", ] @@ -4094,7 +4088,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4161,7 +4155,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4300,7 +4294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.69", "ucd-trie", ] @@ -4324,7 +4318,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4338,15 +4332,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] - [[package]] name = "phf" version = "0.11.2" @@ -4357,16 +4342,6 @@ dependencies = [ "phf_shared 0.11.2", ] -[[package]] -name = "phf_codegen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - [[package]] name = "phf_codegen" version = "0.11.2" @@ -4407,7 +4382,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4445,7 +4420,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4509,7 +4484,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -4550,30 +4525,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -4593,14 +4544,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -4613,7 +4564,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "version_check", "yansi", ] @@ -4642,7 +4593,7 @@ dependencies = [ "itertools 0.13.0", "media-models", "paginate", - "rand 0.9.0-alpha.2", + "rand 0.9.0-beta.0", "reqwest 0.12.9", "rust_decimal", "rust_decimal_macros", @@ -4659,9 +4610,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" dependencies = [ "cc", ] @@ -4735,13 +4686,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0-alpha.2" +version = "0.9.0-beta.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e256ff62cee3e03def855c4d4260106d2bb1696fdc01af03e9935b993720a5" +checksum = "64535f75665ca4111b59c1b2c9eb99358dc57c3775cc3379675c11dca030f81a" dependencies = [ - "rand_chacha 0.9.0-alpha.2", - "rand_core 0.9.0-alpha.2", - "zerocopy", + "rand_chacha 0.9.0-beta.0", + "rand_core 0.9.0-beta.0", + "zerocopy 0.8.11", ] [[package]] @@ -4756,12 +4707,12 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.9.0-alpha.2" +version = "0.9.0-beta.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d299e9db34f6623b2a9e86c015d6e173d5f46d64d4b9b8cc46ae8a982a50b04c" +checksum = "6ae4df114eac4201e5830fbecc6b8f775425e5782ac6741f5ba2c8d5e7861136" dependencies = [ "ppv-lite86", - "rand_core 0.9.0-alpha.2", + "rand_core 0.9.0-beta.0", ] [[package]] @@ -4775,12 +4726,12 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.0-alpha.2" +version = "0.9.0-beta.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e93f5a5e3c528cda9acb0928c31b2ba868c551cc46e67b778075e34aab9906" +checksum = "faff9cb0513c709c88c66ba1c44e7dfb0e6343494c57576614524400ee60d7cb" dependencies = [ "getrandom", - "zerocopy", + "zerocopy 0.8.11", ] [[package]] @@ -4823,7 +4774,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4834,7 +4785,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -4849,9 +4800,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -4942,11 +4893,11 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.6", + "h2 0.4.7", "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-rustls 0.27.3", "hyper-tls 0.6.0", "hyper-util", @@ -4963,7 +4914,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "system-configuration 0.6.1", "tokio", "tokio-native-tls", @@ -5059,9 +5010,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest 0.10.7", @@ -5110,7 +5061,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd3126eab517ef8ca4761a366cb0d55e1bf5ab9c7b7f18301d712a57de000a90" dependencies = [ "js-sys", - "phf 0.11.2", + "phf", "prettytable-rs", "wasm-bindgen", ] @@ -5132,9 +5083,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.38" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -5157,9 +5108,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "once_cell", "ring", @@ -5240,21 +5191,21 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "schematic" -version = "0.17.5" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9803bd9e6cccb1cc9cec6943f34ba93aa6cf7b6f183ee20a43457934dbc2b686" +checksum = "8ef9a634be1649ec5f5516e39eb78d2e84fcf5eef3792acae353d8ade6a7b391" dependencies = [ "garde", - "indexmap 2.6.0", + "indexmap 2.7.0", "miette", "reqwest 0.12.9", "schematic_macros", @@ -5264,32 +5215,32 @@ dependencies = [ "serde_path_to_error", "serde_yaml", "starbase_styles", - "thiserror", + "thiserror 2.0.3", "toml", "tracing", ] [[package]] name = "schematic_macros" -version = "0.17.3" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "641ca4c08e2735689cbc88901b755a806cbdb328a5dbddcd9176ec6de2ce59b0" +checksum = "26d2d4005b3b6482801d60ba093c550d25382401e0c4d1c3fbba80eb07e28626" dependencies = [ "convert_case", "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "schematic_types" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baae6c4555fd2a9cad6b1675fde90c8c3eff3772a1053b251d6ff0d547852e1f" +checksum = "f320deb050277c5bcc79213b01d749f8a847a63713e76d5748fdad654f47ed52" dependencies = [ "chrono", - "indexmap 2.6.0", + "indexmap 2.7.0", "rust_decimal", "serde_json", "serde_yaml", @@ -5304,16 +5255,16 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scraper" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90460b31bfe1fc07be8262e42c665ad97118d4585869de9345a84d501a9eaf0" +checksum = "b0e749d29b2064585327af5038a5a8eb73aeebad4a3472e83531a436563f7208" dependencies = [ "ahash 0.8.11", "cssparser", "ego-tree", "getopts", "html5ever", - "once_cell", + "precomputed-hash", "selectors", "tendril", ] @@ -5338,14 +5289,14 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "sea-orm" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4872675cc5d5d399a2a202c60f3a393ec8d3f3307c36adb166517f348e4db5" +checksum = "d5680a8b686985116607ef5f5af2b1f9e1cc2c228330e93101816a0baa279afa" dependencies = [ "async-stream", "async-trait", @@ -5362,7 +5313,7 @@ dependencies = [ "serde_json", "sqlx", "strum", - "thiserror", + "thiserror 1.0.69", "time", "tracing", "url", @@ -5371,9 +5322,9 @@ dependencies = [ [[package]] name = "sea-orm-cli" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aefbd960c9ed7b2dfbab97b11890f5d8c314ad6e2f68c7b36c73ea0967fcc25" +checksum = "70a157f42d291ccbd6e913b9d9b12dbe2ccbcf0472efc60c8715dd1254083aec" dependencies = [ "chrono", "clap", @@ -5388,23 +5339,23 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85f714906b72e7265c0b2077d0ad8f235dabebda513c92f1326d5d40cef0dd01" +checksum = "3a239e3bb1b566ad4ec2654d0d193d6ceddfd733487edc9c21a64d214c773910" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", "sea-bae", - "syn 2.0.85", + "syn 2.0.90", "unicode-ident", ] [[package]] name = "sea-orm-migration" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa7bbfbe3bec60b5925193acc9c98b9f8ae9853f52c8004df0c1ea5193c01ea0" +checksum = "63ba07e9f2479cc671758fcb1edee42ff2e32c34b3e67ab41d0af1e41f73c74e" dependencies = [ "async-trait", "clap", @@ -5456,8 +5407,8 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.85", - "thiserror", + "syn 2.0.90", + "thiserror 1.0.69", ] [[package]] @@ -5480,7 +5431,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -5532,9 +5483,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -5542,9 +5493,9 @@ dependencies = [ [[package]] name = "selectors" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" +checksum = "fd568a4c9bb598e291a08244a5c1f5a8a6650bee243b5b0f8dbb3d9cc1d87fe8" dependencies = [ "bitflags 2.6.0", "cssparser", @@ -5552,8 +5503,8 @@ dependencies = [ "fxhash", "log", "new_debug_unreachable", - "phf 0.10.1", - "phf_codegen 0.10.0", + "phf", + "phf_codegen", "precomputed-hash", "servo_arc", "smallvec", @@ -5567,9 +5518,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -5592,28 +5543,28 @@ checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" dependencies = [ "log", "serde", - "thiserror", + "thiserror 1.0.69", "xml-rs", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -5686,7 +5637,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -5703,7 +5654,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -5715,7 +5666,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -5724,7 +5675,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -5733,9 +5684,9 @@ dependencies = [ [[package]] name = "servo_arc" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d036d71a959e00c77a63538b90a6c2390969f9772b096ea837205c6bd0491a44" +checksum = "ae65c4249478a2647db249fb43e23cec56a2c8974a427e7bd8cb5a1d0964921a" dependencies = [ "stable_deref_trait", ] @@ -5854,9 +5805,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5959,7 +5910,7 @@ dependencies = [ "hashbrown 0.14.5", "hashlink", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "memchr", "native-tls", @@ -5967,20 +5918,20 @@ dependencies = [ "paste", "percent-encoding", "rust_decimal", - "rustls 0.23.16", + "rustls 0.23.19", "rustls-pemfile 2.2.0", "serde", "serde_json", "sha2", "smallvec", "sqlformat", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", "url", "uuid", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", ] [[package]] @@ -5993,7 +5944,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -6016,7 +5967,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.85", + "syn 2.0.90", "tempfile", "tokio", "url", @@ -6061,7 +6012,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "tracing", "uuid", "whoami", @@ -6102,7 +6053,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "tracing", "uuid", "whoami", @@ -6154,9 +6105,9 @@ dependencies = [ [[package]] name = "starbase_styles" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49d8a8222c97b23595fe393ac35d62b88942bdc7e89c8c88736d9ea2c986dbae" +checksum = "b1664b29d64bf37a14a0f50ae4c1568eb712c7eb28fb489aabac81c36e5558c1" dependencies = [ "dirs", "owo-colors", @@ -6262,19 +6213,19 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "struson" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd1ac2aafe0de8ac5f0daf57eab7d8e986724237e03b3092dbb47b867b9c4a76" +checksum = "18c68ef850864c0fa120c07a17d6369ec4df02a33cad4aa593e0e0566e031bda" dependencies = [ "duplicate", "serde", "strum", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6300,9 +6251,9 @@ dependencies = [ [[package]] name = "supports-color" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8775305acf21c96926c900ad056abeef436701108518cf890020387236ac5a77" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" dependencies = [ "is_ci", ] @@ -6320,27 +6271,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.85", -] - [[package]] name = "sync_wrapper" version = "0.1.2" @@ -6349,9 +6288,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -6364,7 +6303,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -6417,9 +6356,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -6452,22 +6391,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -6538,9 +6497,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -6562,7 +6521,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -6602,7 +6561,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.16", + "rustls 0.23.19", "rustls-pki-types", "tokio", ] @@ -6632,9 +6591,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -6671,28 +6630,13 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", "winnow", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.5.1" @@ -6712,9 +6656,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ "bitflags 2.6.0", "bytes", @@ -6742,9 +6686,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -6754,20 +6698,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -6798,9 +6742,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -6853,7 +6797,7 @@ dependencies = [ "log", "rand 0.8.5", "sha1", - "thiserror", + "thiserror 1.0.69", "utf-8", ] @@ -6900,9 +6844,9 @@ checksum = "10103c57044730945224467c09f71a4db0071c123a0648cc3e818913bde6b561" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -6972,12 +6916,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", "serde", ] @@ -7127,9 +7071,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "21d3b25c3ea1126a2ad5f4f9068483c2af1e64168f847abe863a526b8dbfe00b" dependencies = [ "cfg-if", "once_cell", @@ -7138,36 +7082,37 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "52857d4c32e496dc6537646b5b117081e71fd2ff06de792e3577a150627db283" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "951fe82312ed48443ac78b66fa43eded9999f738f6022e67aead7b708659e49a" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "920b0ffe069571ebbfc9ddc0b36ba305ef65577c94b06262ed793716a1afd981" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7175,22 +7120,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "bf59002391099644be3524e23b781fa43d2be0c5aa0719a18c0731b9d195cab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "e5047c5392700766601942795a436d7d2599af60dcc3cc1248c9120bfb0827b0" [[package]] name = "wasm-streams" @@ -7207,9 +7152,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "476364ff87d0ae6bfb661053a9104ab312542658c3d8f963b7ace80b6f9b26b9" dependencies = [ "js-sys", "wasm-bindgen", @@ -7233,9 +7178,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -7511,9 +7456,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" +checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" [[package]] name = "xmlparser" @@ -7529,9 +7474,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -7541,13 +7486,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "synstructure", ] @@ -7558,7 +7503,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce3b5629d87654b53a49002acc2ce64aa5aa7255f5c718374a37ac7fd98c218" +dependencies = [ + "zerocopy-derive 0.8.11", ] [[package]] @@ -7569,27 +7523,38 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74a82c26c3986af2623ec9eb890ff4aa19c006e30a1133dc9bd1830ec1612e20" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "synstructure", ] @@ -7618,5 +7583,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] diff --git a/Cargo.toml b/Cargo.toml index 17a46b52d0..60dfb076a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,8 @@ members = [ resolver = "2" [workspace.dependencies] -anyhow = "=1.0.91" +askama = "0.12.1" +anyhow = "=1.0.93" apalis = { version = "=0.5.5", features = ["cron", "limit"] } argon2 = "=0.6.0-pre.1" async-graphql = { version = "=7.0.11", features = [ @@ -56,35 +57,56 @@ async-graphql = { version = "=7.0.11", features = [ "log", "tracing", ] } +async-graphql-axum = "=7.0.11" async-trait = "=0.1.83" -aws-sdk-s3 = { version = "=1.58.0", features = ["behavior-version-latest"] } -axum = { version = "=0.7.7", features = ["macros", "multipart"] } +aws-sdk-s3 = { version = "=1.63.0", features = ["behavior-version-latest"] } +axum = { version = "=0.7.9", features = ["macros", "multipart"] } boilermates = "=0.3.0" chrono = "=0.4.38" chrono-tz = "=0.10.0" +compile-time = "=0.2.0" const-str = "=0.5.7" convert_case = "=0.6.0" +csv = "=1.3.1" +data-encoding = "=2.6.0" derive_more = { version = "=1.0.0", features = [ "add", "add_assign", "sum", ], default-features = false } +dotenvy = "=0.15.7" +dotenv-build = "0.1.1" educe = { version = "=0.6.0", features = [ "Debug", "Default", "full", ], default-features = false } enum_meta = "=0.7.0" -itertools = "=0.13.0" +eventsource-stream = "=0.2.3" +flate2 = "=1.0.35" futures = "=0.3.31" +graphql_client = "=0.14.0" hashbag = "=0.1.12" +http = "=1.1.0" +indexmap = "=2.7.0" +indoc = "=2.0.5" +isolang = { version = "=2.4.0", features = ["list_languages"] } +itertools = "=0.13.0" +jsonwebtoken = { version = "=9.3.0", default-features = false } +lettre = "=0.11.10" +logs-wheel = "=0.3.1" markdown = "=1.0.0-alpha.21" +mime_guess = "=2.0.5" nanoid = "=0.4.0" openidconnect = "=3.5.0" +paginate = "=1.1.11" +radarr-api-rs = "=3.0.1" +rand = "=0.9.0-beta.0" regex = "=1.11.1" rust_decimal = "=1.36.0" rust_decimal_macros = "=1.36.0" -schematic = { version = "=0.17.5", features = [ +rust_iso3166 = "=0.1.13" +schematic = { version = "=0.17.7", features = [ "config", "env", "json", @@ -98,7 +120,8 @@ schematic = { version = "=0.17.5", features = [ "validate", "yaml", ], default-features = false } -sea-orm = { version = "=1.1.0", features = [ +scraper = "=0.21.0" +sea-orm = { version = "=1.1.1", features = [ "debug-print", "postgres-array", "macros", @@ -109,16 +132,24 @@ sea-orm = { version = "=1.1.0", features = [ "with-rust_decimal", "with-uuid", ], default-features = false } -sea-orm-migration = "=1.1.0" +sea-orm-migration = "=1.1.1" sea-query = "=0.32.0" -serde = { version = "=1.0.214", features = ["derive"] } -serde_json = "=1.0.132" +serde = { version = "=1.0.215", features = ["derive"] } +serde_json = "=1.0.133" serde_with = { version = "=3.11.0", features = ["chrono_0_4"] } +serde-xml-rs = "=0.6.0" slug = "=0.1.6" +sonarr-api-rs = "=3.0.0" strum = { version = "=0.26.3", features = ["derive"] } +struson = { version = "=0.6.0", features = ["serde"] } reqwest = { version = "=0.12.9", features = ["json", "stream"] } -tokio = { version = "=1.41.0", features = ["full"] } -tracing = { version = "=0.1.40", features = ["attributes"] } +tokio = { version = "=1.41.1", features = ["full"] } +tokio-util = { version = "=0.7.12", features = ["codec"] } +tower = { version = "=0.5.1", features = ["buffer"] } +tower-http = { version = "=0.6.2", features = ["catch-panic", "cors", "trace"] } +tracing = { version = "=0.1.41", features = ["attributes"] } +tracing-subscriber = "=0.3.19" +unkey = "=0.5.0" uuid = { version = "=1.11.0", features = ["v4"], default-features = false } [profile.release] diff --git a/apps/backend/Cargo.toml b/apps/backend/Cargo.toml index 660b3ecc40..8c9074914e 100644 --- a/apps/backend/Cargo.toml +++ b/apps/backend/Cargo.toml @@ -10,7 +10,7 @@ anyhow = { workspace = true } apalis = { workspace = true } application-utils = { path = "../../crates/utils/application" } async-graphql = { workspace = true } -async-graphql-axum = "=7.0.11" +async-graphql-axum = { workspace = true } axum = { workspace = true } aws-sdk-s3 = { workspace = true } background = { path = "../../crates/background" } @@ -23,7 +23,7 @@ common-utils = { path = "../../crates/utils/common" } config = { path = "../../crates/config" } database-models = { path = "../../crates/models/database" } dependent-models = { path = "../../crates/models/dependent" } -dotenvy = "=0.15.7" +dotenvy = { workspace = true } env-utils = { path = "../../crates/utils/env" } exporter-resolver = { path = "../../crates/resolvers/exporter" } exporter-service = { path = "../../crates/services/exporter" } @@ -31,12 +31,12 @@ file-storage-resolver = { path = "../../crates/resolvers/file-storage" } file-storage-service = { path = "../../crates/services/file-storage" } fitness-resolver = { path = "../../crates/resolvers/fitness" } fitness-service = { path = "../../crates/services/fitness" } -http = "=1.1.0" +http = { workspace = true } importer-resolver = { path = "../../crates/resolvers/importer" } importer-service = { path = "../../crates/services/importer" } integration-service = { path = "../../crates/services/integration" } itertools = { workspace = true } -logs-wheel = "=0.3.1" +logs-wheel = { workspace = true } media-models = { path = "../../crates/models/media" } migrations = { path = "../../crates/migrations" } miscellaneous-resolver = { path = "../../crates/resolvers/miscellaneous" } @@ -54,10 +54,10 @@ statistics-resolver = { path = "../../crates/resolvers/statistics" } statistics-service = { path = "../../crates/services/statistics" } supporting-service = { path = "../../crates/services/supporting" } tokio = { workspace = true } -tower = { version = "=0.4.13", features = ["buffer"] } -tower-http = { version = "=0.5.2", features = ["catch-panic", "cors", "trace"] } +tower = { workspace = true } +tower-http = { workspace = true } tracing = { workspace = true } -tracing-subscriber = "=0.3.18" -unkey = "=0.5.0" +tracing-subscriber = { workspace = true } +unkey = { workspace = true } user-resolver = { path = "../../crates/resolvers/user" } user-service = { path = "../../crates/services/user" } diff --git a/apps/frontend/app/components/fitness.tsx b/apps/frontend/app/components/fitness.tsx index b29b152cf6..23a81120d0 100644 --- a/apps/frontend/app/components/fitness.tsx +++ b/apps/frontend/app/components/fitness.tsx @@ -45,7 +45,12 @@ import { $path } from "remix-routes"; import { match } from "ts-pattern"; import { withFragment } from "ufo"; import { BaseMediaDisplayItem } from "~/components/common"; -import { FitnessEntity, dayjsLib, getSetColor } from "~/lib/generals"; +import { + FitnessEntity, + dayjsLib, + getExerciseDetailsPath, + getSetColor, +} from "~/lib/generals"; import { useGetRandomMantineColor, useUserUnitSystem } from "~/lib/hooks"; import { getExerciseDetailsQuery, @@ -271,9 +276,7 @@ export const ExerciseHistory = (props: { }), props.exerciseIdx.toString(), ) - : $path("/fitness/exercises/item/:id", { - id: encodeURIComponent(exercise.name), - }) + : getExerciseDetailsPath(exercise.name) } fw="bold" lineClamp={1} @@ -424,10 +427,8 @@ export const ExerciseDisplayItem = (props: { innerRef={ref} name={exerciseDetails?.id} isLoading={isExerciseDetailsLoading} - onImageClickBehavior={$path("/fitness/exercises/item/:id", { - id: encodeURIComponent(props.exerciseId), - })} imageUrl={exerciseDetails?.attributes.images.at(0)} + onImageClickBehavior={getExerciseDetailsPath(props.exerciseId)} labels={{ left: isNumber(times) ? `${times} time${times > 1 ? "s" : ""}` diff --git a/apps/frontend/app/lib/generals.ts b/apps/frontend/app/lib/generals.ts index 7592debe33..dea2c05a70 100644 --- a/apps/frontend/app/lib/generals.ts +++ b/apps/frontend/app/lib/generals.ts @@ -32,6 +32,7 @@ import timezone from "dayjs/plugin/timezone"; import utc from "dayjs/plugin/utc"; import { GraphQLClient } from "graphql-request"; import Cookies from "js-cookie"; +import { $path } from "remix-routes"; import { match } from "ts-pattern"; import { z } from "zod"; @@ -382,9 +383,6 @@ const fitnessQueryKeys = createQueryKeys("fitness", { workoutDetails: (workoutId: string) => ({ queryKey: ["workoutDetails", workoutId], }), - exerciseParameters: () => ({ - queryKey: ["exerciseParameters"], - }), workoutTemplateDetails: (workoutTemplateId: string) => ({ queryKey: ["workoutTemplateDetails", workoutTemplateId], }), @@ -452,3 +450,8 @@ export const refreshUserMetadataDetails = (metadataId: string) => queryKey: queryFactory.media.userMetadataDetails(metadataId).queryKey, }); }, 1500); + +export const getExerciseDetailsPath = (exerciseId: string) => + $path("/fitness/exercises/item/:id", { + id: encodeURIComponent(exerciseId), + }); diff --git a/apps/frontend/app/lib/state/fitness.ts b/apps/frontend/app/lib/state/fitness.ts index d4f9965ab2..b6a65c1c14 100644 --- a/apps/frontend/app/lib/state/fitness.ts +++ b/apps/frontend/app/lib/state/fitness.ts @@ -261,6 +261,10 @@ const measurementsDrawerOpenAtom = atom(false); export const useMeasurementsDrawerOpen = () => useAtom(measurementsDrawerOpenAtom); +export const mergingExerciseAtom = atom(null); + +export const useMergingExercise = () => useAtom(mergingExerciseAtom); + export const duplicateOldWorkout = async ( name: string, fitnessEntity: FitnessAction, diff --git a/apps/frontend/app/lib/utilities.server.ts b/apps/frontend/app/lib/utilities.server.ts index 2072edc5fe..024ae6bacf 100644 --- a/apps/frontend/app/lib/utilities.server.ts +++ b/apps/frontend/app/lib/utilities.server.ts @@ -9,7 +9,6 @@ import { import { BackendError, CoreDetailsDocument, - ExerciseParametersDocument, GetPresignedS3UrlDocument, PresignedPutS3UrlDocument, UserCollectionsListDocument, @@ -194,16 +193,6 @@ const getCachedUserDetails = async (request: Request) => { }); }; -export const getCachedExerciseParameters = async () => { - return queryClient.ensureQueryData({ - queryKey: queryFactory.fitness.exerciseParameters().queryKey, - queryFn: () => - serverGqlService - .request(ExerciseParametersDocument) - .then((data) => data.exerciseParameters), - }); -}; - export const getCachedUserPreferences = async (request: Request) => { const userDetails = await redirectIfNotAuthenticatedOrUpdated(request); return userDetails.preferences; diff --git a/apps/frontend/app/routes/_dashboard.fitness.$action.tsx b/apps/frontend/app/routes/_dashboard.fitness.$action.tsx index 4b774c9e4b..8d41cfcfa6 100644 --- a/apps/frontend/app/routes/_dashboard.fitness.$action.tsx +++ b/apps/frontend/app/routes/_dashboard.fitness.$action.tsx @@ -110,6 +110,7 @@ import { PRO_REQUIRED_MESSAGE, clientGqlService, dayjsLib, + getExerciseDetailsPath, getSetColor, getSurroundingElements, postMessageToServiceWorker, @@ -1115,12 +1116,10 @@ const ExerciseDisplay = (props: { {exercise.exerciseId} diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx index c46982874c..cc6a47f650 100644 --- a/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx +++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx @@ -44,6 +44,7 @@ import { match } from "ts-pattern"; import { withQuery } from "ufo"; import { z } from "zod"; import { zx } from "zodix"; +import { getExerciseDetailsPath } from "~/lib/generals"; import { useCoreDetails } from "~/lib/hooks"; import { createToastHeaders, @@ -115,11 +116,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { CreateCustomExerciseDocument, { input }, ); - return redirect( - $path("/fitness/exercises/item/:id", { - id: encodeURIComponent(createCustomExercise), - }), - ); + return redirect(getExerciseDetailsPath(createCustomExercise)); }) .with(Action.Update, async () => { invariant(submission.oldName); diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx index 414c0f5461..4c07a78fbc 100644 --- a/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx +++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx @@ -82,6 +82,7 @@ import { } from "~/lib/generals"; import { useComplexJsonUpdate, + useCoreDetails, useIsFitnessActionActive, useUserDetails, useUserPreferences, @@ -91,13 +92,10 @@ import { addExerciseToWorkout, getWorkoutDetailsQuery, useCurrentWorkout, + useMergingExercise, } from "~/lib/state/fitness"; import { useAddEntityToCollection, useReviewEntity } from "~/lib/state/media"; -import { - createToastHeaders, - getCachedExerciseParameters, - serverGqlService, -} from "~/lib/utilities.server"; +import { createToastHeaders, serverGqlService } from "~/lib/utilities.server"; const searchParamsSchema = z.object({ defaultTab: z.string().optional(), @@ -110,23 +108,15 @@ const paramsSchema = { id: z.string() }; export const loader = async ({ params, request }: LoaderFunctionArgs) => { const { id: exerciseId } = zx.parseParams(params, paramsSchema); const query = zx.parseQuery(request, searchParamsSchema); - const [exerciseParameters, { exerciseDetails }, { userExerciseDetails }] = - await Promise.all([ - getCachedExerciseParameters(), - serverGqlService.request(ExerciseDetailsDocument, { exerciseId }), - serverGqlService.authenticatedRequest( - request, - UserExerciseDetailsDocument, - { exerciseId }, - ), - ]); - return { - query, - exerciseId, - exerciseDetails, - exerciseParameters, - userExerciseDetails, - }; + const [{ exerciseDetails }, { userExerciseDetails }] = await Promise.all([ + serverGqlService.request(ExerciseDetailsDocument, { exerciseId }), + serverGqlService.authenticatedRequest( + request, + UserExerciseDetailsDocument, + { exerciseId }, + ), + ]); + return { query, exerciseId, exerciseDetails, userExerciseDetails }; }; export const meta = ({ data }: MetaArgs) => { @@ -161,6 +151,7 @@ export const action = async ({ params, request }: ActionFunctionArgs) => { export default function Page() { const loaderData = useLoaderData(); + const coreDetails = useCoreDetails(); const userPreferences = useUserPreferences(); const unitSystem = useUserUnitSystem(); const userDetails = useUserDetails(); @@ -177,6 +168,7 @@ export default function Page() { "ExerciseChartTimeSpan", TimeSpan.Last90Days, ); + const [_m, setMergingExercise] = useMergingExercise(); const [_r, setEntityToReview] = useReviewEntity(); const [ updatePreferencesModalOpened, @@ -194,7 +186,7 @@ export default function Page() { : workoutEndOn.isAfter(computedDateAfterForCharts); }); const bestMappings = - loaderData.exerciseParameters.lotMapping.find( + coreDetails.exerciseParameters.lotMapping.find( (lm) => lm.lot === loaderData.exerciseDetails.lot, )?.bests || []; @@ -609,6 +601,19 @@ export default function Page() { Edit exercise ) : null} + diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx index 1990cb5ab8..646786d2b4 100644 --- a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx +++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx @@ -21,8 +21,12 @@ import { rem, } from "@mantine/core"; import { useDisclosure, useListState } from "@mantine/hooks"; -import type { LoaderFunctionArgs, MetaArgs } from "@remix-run/node"; -import { Link, useLoaderData, useNavigate } from "@remix-run/react"; +import type { + ActionFunctionArgs, + LoaderFunctionArgs, + MetaArgs, +} from "@remix-run/node"; +import { Link, useLoaderData, useNavigate, useSubmit } from "@remix-run/react"; import { ExerciseEquipment, ExerciseForce, @@ -32,8 +36,15 @@ import { ExerciseMuscle, ExerciseSortBy, ExercisesListDocument, + MergeExerciseDocument, } from "@ryot/generated/graphql/backend/graphql"; -import { isNumber, snakeCase, startCase } from "@ryot/ts-utils"; +import { + getActionIntent, + isNumber, + processSubmission, + snakeCase, + startCase, +} from "@ryot/ts-utils"; import { IconAlertCircle, IconCheck, @@ -42,22 +53,34 @@ import { } from "@tabler/icons-react"; import { produce } from "immer"; import { $path } from "remix-routes"; +import { match } from "ts-pattern"; +import { withQuery } from "ufo"; import { z } from "zod"; import { zx } from "zodix"; import { DebouncedSearchInput, FiltersModal } from "~/components/common"; -import { dayjsLib, pageQueryParam } from "~/lib/generals"; +import { confirmWrapper } from "~/components/confirmation"; +import { + dayjsLib, + getExerciseDetailsPath, + pageQueryParam, +} from "~/lib/generals"; import { useAppSearchParam, + useCoreDetails, useIsFitnessActionActive, useUserCollections, useUserPreferences, } from "~/lib/hooks"; -import { addExerciseToWorkout, useCurrentWorkout } from "~/lib/state/fitness"; import { - getCachedExerciseParameters, + addExerciseToWorkout, + useCurrentWorkout, + useMergingExercise, +} from "~/lib/state/fitness"; +import { getEnhancedCookieName, redirectToFirstPageIfOnInvalidPage, redirectUsingEnhancedCookieSearchParams, + redirectWithToast, serverGqlService, } from "~/lib/utilities.server"; @@ -93,8 +116,7 @@ export const loader = async ({ request }: LoaderFunctionArgs) => { const query = zx.parseQuery(request, searchParamsSchema); query.sortBy = query.sortBy ?? defaultFiltersValue.sortBy; query[pageQueryParam] = query[pageQueryParam] ?? 1; - const [exerciseParameters, { exercisesList }] = await Promise.all([ - getCachedExerciseParameters(), + const [{ exercisesList }] = await Promise.all([ serverGqlService.authenticatedRequest( request.clone(), ExercisesListDocument, @@ -120,25 +142,46 @@ export const loader = async ({ request }: LoaderFunctionArgs) => { exercisesList.details.total, query[pageQueryParam], ); - return { - query, - totalPages, - cookieName, - exercisesList, - exerciseParameters, - }; + return { query, totalPages, cookieName, exercisesList }; }; export const meta = (_args: MetaArgs) => { return [{ title: "Exercises | Ryot" }]; }; +export const action = async ({ request }: ActionFunctionArgs) => { + const formData = await request.clone().formData(); + const intent = getActionIntent(request); + return await match(intent) + .with("mergeExercise", async () => { + const submission = processSubmission(formData, mergeExerciseSchema); + await serverGqlService.authenticatedRequest( + request, + MergeExerciseDocument, + submission, + ); + return redirectWithToast(getExerciseDetailsPath(submission.mergeInto), { + type: "success", + message: "Exercise merged successfully", + }); + }) + .run(); +}; + +const mergeExerciseSchema = z.object({ + mergeFrom: z.string(), + mergeInto: z.string(), +}); + export default function Page() { const loaderData = useLoaderData(); const navigate = useNavigate(); + const submit = useSubmit(); + const coreDetails = useCoreDetails(); const userPreferences = useUserPreferences(); const [currentWorkout, setCurrentWorkout] = useCurrentWorkout(); const isFitnessActionActive = useIsFitnessActionActive(); + const [mergingExercise, setMergingExercise] = useMergingExercise(); const [_, { setP }] = useAppSearchParam(loaderData.cookieName); const [selectedExercises, setSelectedExercises] = useListState<{ name: string; @@ -175,13 +218,13 @@ export default function Page() { - {loaderData.exerciseParameters.downloadRequired ? ( + {coreDetails.exerciseParameters.downloadRequired ? ( } variant="outline" color="violet"> Please deploy a job to download the exercise dataset from the{" "} miscellaneous settings @@ -209,6 +252,20 @@ export default function Page() { + {currentWorkout?.replacingExerciseIdx ? ( + }> + You are replacing exercise:{" "} + { + currentWorkout.exercises[currentWorkout.replacingExerciseIdx] + .exerciseId + } + + ) : null} + {mergingExercise ? ( + }> + You are merging exercise: {mergingExercise} + + ) : null} {loaderData.exercisesList.details.total > 0 ? ( <> @@ -266,8 +323,30 @@ export default function Page() { /> { + style={{ all: "unset", cursor: "pointer" }} + to={getExerciseDetailsPath(exercise.id)} + onClick={async (e) => { if (allowAddingExerciseToWorkout) return; + if (mergingExercise) { + e.preventDefault(); + const conf = await confirmWrapper({ + confirmation: + "Are you sure you want to merge this exercise? This will replace this exercise in all workouts.", + }); + if (conf) { + const formData = new FormData(); + formData.append("mergeFrom", mergingExercise); + formData.append("mergeInto", exercise.id); + setMergingExercise(null); + submit(formData, { + method: "POST", + action: withQuery(".", { + intent: "mergeExercise", + }), + }); + } + return; + } if (currentWorkout) { e.preventDefault(); setCurrentWorkout( @@ -283,12 +362,9 @@ export default function Page() { }), ); navigate(-1); + return; } }} - style={{ all: "unset", cursor: "pointer" }} - to={$path("/fitness/exercises/item/:id", { - id: encodeURIComponent(exercise.id), - })} > {exercise.id} @@ -355,6 +431,7 @@ export default function Page() { const FiltersModalForm = () => { const loaderData = useLoaderData(); + const coreDetails = useCoreDetails(); const collections = useUserCollections(); const [_, { setP }] = useAppSearchParam(loaderData.cookieName); @@ -377,13 +454,13 @@ const FiltersModalForm = () => { onChange={(v) => setP("sortBy", v)} /> {Object.keys(defaultFiltersValue) - .filter((f) => f !== "sortBy" && f !== "order" && f !== "collection") + .filter((f) => !["sortBy", "order", "collection"].includes(f)) .map((f) => ( { + if (v) setDeployImportSource(v as ImportSource); + }} data={Object.values(ImportSource).map((is) => ({ label: changeCase(is), value: is, }))} - onChange={(v) => { - if (v) setDeployImportSource(v as ImportSource); - }} /> {deployImportSource ? ( <> {match(deployImportSource) .with( + ImportSource.Plex, + ImportSource.Mediatracker, ImportSource.Audiobookshelf, - ImportSource.MediaTracker, () => ( <> - ( <> ), ) + .with(ImportSource.StrongApp, () => ( + <> + + + )) .with(ImportSource.Trakt, () => ( <> - )) - .with(ImportSource.Mal, () => ( + .with(ImportSource.Myanimelist, () => ( <> )) - .with(ImportSource.StrongApp, () => ( - <> - - - - )) .with(ImportSource.GenericJson, () => ( <> Import history {loaderData.importReports.length > 0 ? ( - {loaderData.importReports.map((report) => ( - - { + const isInProgress = + typeof report.wasSuccess !== "boolean"; + + return ( + - - {changeCase(report.source)}{" "} - - ({dayjsLib(report.startedOn).fromNow()}) - - - - - {report.details ? ( - <> - - Total imported: {report.details.import.total} + + + {changeCase(report.source)}{" "} + + ({dayjsLib(report.startedOn).fromNow()}) - - Failed: {report.details.failedItems.length} - - {report.details.failedItems.length > 0 ? ( - - {JSON.stringify( - report.details.failedItems, - null, - 4, - )} - - ) : null} - - ) : ( - This import never finished - )} - - - ))} + + {isInProgress && report.progress ? ( + + ) : null} + + + {report.details ? ( + <> + + Total imported: {report.details.import.total} + + + Failed: {report.details.failedItems.length} + + {report.details.failedItems.length > 0 ? ( + + {JSON.stringify( + report.details.failedItems, + null, + 4, + )} + + ) : null} + + ) : ( + This import never finished + )} + + + ); + })} ) : ( You have not performed any imports diff --git a/crates/enums/src/lib.rs b/crates/enums/src/lib.rs index a11021f802..8a0f89ce21 100644 --- a/crates/enums/src/lib.rs +++ b/crates/enums/src/lib.rs @@ -129,7 +129,17 @@ pub enum EntityLot { // The different possible states of a seen item. #[derive( - Debug, Clone, Copy, PartialEq, Eq, EnumIter, DeriveActiveEnum, Deserialize, Serialize, Enum, + Eq, + Enum, + Copy, + Debug, + Clone, + Display, + EnumIter, + PartialEq, + Serialize, + Deserialize, + DeriveActiveEnum, )] #[sea_orm( rs_type = "String", @@ -144,18 +154,18 @@ pub enum SeenState { } #[derive( + Eq, + Enum, + Copy, Debug, Clone, - Copy, - PartialEq, - Eq, + Default, EnumIter, - DeriveActiveEnum, - Deserialize, + PartialEq, Serialize, - Enum, - Default, ConfigEnum, + Deserialize, + DeriveActiveEnum, )] #[sea_orm( rs_type = "String", @@ -169,17 +179,17 @@ pub enum Visibility { } #[derive( + Eq, + Enum, + Copy, Debug, Clone, - Copy, - PartialEq, - Eq, + Display, EnumIter, - DeriveActiveEnum, - Deserialize, + PartialEq, Serialize, - Enum, - Display, + Deserialize, + DeriveActiveEnum, )] #[sea_orm( rs_type = "String", @@ -187,19 +197,20 @@ pub enum Visibility { rename_all = "snake_case" )] pub enum ImportSource { - Audiobookshelf, - GenericJson, - Goodreads, Igdb, Imdb, - Jellyfin, - Mal, + Plex, + Trakt, Movary, - MediaTracker, + Jellyfin, OpenScale, StrongApp, - StoryGraph, - Trakt, + Goodreads, + Storygraph, + Myanimelist, + GenericJson, + Mediatracker, + Audiobookshelf, } #[derive( @@ -302,7 +313,17 @@ pub enum ExerciseLevel { } #[derive( - Debug, Clone, Serialize, Enum, Copy, Deserialize, DeriveActiveEnum, EnumIter, Eq, PartialEq, + Eq, + Hash, + Enum, + Copy, + Debug, + Clone, + EnumIter, + PartialEq, + Serialize, + Deserialize, + DeriveActiveEnum, )] #[sea_orm( rs_type = "String", @@ -388,17 +409,18 @@ pub enum ExerciseLot { } #[derive( - Default, - Clone, - Debug, - Deserialize, - Serialize, - DeriveActiveEnum, Eq, - PartialEq, Enum, Copy, + Hash, + Debug, + Clone, + Default, EnumIter, + Serialize, + PartialEq, + Deserialize, + DeriveActiveEnum, )] #[sea_orm( rs_type = "String", @@ -411,6 +433,31 @@ pub enum ExerciseSource { Custom, } +/// The different types of personal bests that can be achieved on a set. +#[derive( + Clone, + Debug, + Deserialize, + Serialize, + FromJsonQueryResult, + Eq, + PartialEq, + Enum, + Copy, + Default, + ConfigEnum, +)] +#[serde(rename_all = "snake_case")] +pub enum WorkoutSetPersonalBest { + #[default] + Weight, + OneRm, + Volume, + Time, + Pace, + Reps, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", diff --git a/crates/migrations/Cargo.toml b/crates/migrations/Cargo.toml index 377188a8bc..08d9ff16b4 100644 --- a/crates/migrations/Cargo.toml +++ b/crates/migrations/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] enums = { path = "../enums" } -indoc = "=2.0.5" +indoc = { workspace = true } sea-orm = { workspace = true } sea-orm-migration = { workspace = true } tracing = { workspace = true } diff --git a/crates/migrations/src/lib.rs b/crates/migrations/src/lib.rs index 54441e953e..42fc2195ea 100644 --- a/crates/migrations/src/lib.rs +++ b/crates/migrations/src/lib.rs @@ -50,6 +50,7 @@ mod m20241025_changes_for_issue_1084; mod m20241110_changes_for_issue_1103; mod m20241121_changes_for_issue_445; mod m20241124_changes_for_issue_1118; +mod m20241129_changes_for_issue_1114; pub use m20230410_create_metadata::Metadata as AliasedMetadata; pub use m20230413_create_person::Person as AliasedPerson; @@ -121,6 +122,7 @@ impl MigratorTrait for Migrator { Box::new(m20241110_changes_for_issue_1103::Migration), Box::new(m20241121_changes_for_issue_445::Migration), Box::new(m20241124_changes_for_issue_1118::Migration), + Box::new(m20241129_changes_for_issue_1114::Migration), ] } } diff --git a/crates/migrations/src/m20230509_create_import_report.rs b/crates/migrations/src/m20230509_create_import_report.rs index 5c703b08d6..30fe0f4d29 100644 --- a/crates/migrations/src/m20230509_create_import_report.rs +++ b/crates/migrations/src/m20230509_create_import_report.rs @@ -7,14 +7,16 @@ pub struct Migration; #[derive(Iden)] pub enum ImportReport { - Table, Id, + Table, UserId, - StartedOn, - FinishedOn, Source, Details, + Progress, + StartedOn, + FinishedOn, WasSuccess, + SourceResult, } #[async_trait::async_trait] @@ -41,6 +43,8 @@ impl MigrationTrait for Migration { .col(ColumnDef::new(ImportReport::WasSuccess).boolean()) .col(ColumnDef::new(ImportReport::Details).json_binary()) .col(ColumnDef::new(ImportReport::UserId).text().not_null()) + .col(ColumnDef::new(ImportReport::Progress).decimal()) + .col(ColumnDef::new(ImportReport::SourceResult).json_binary()) .foreign_key( ForeignKey::create() .name("media_import_report_to_user_foreign_key") diff --git a/crates/migrations/src/m20241129_changes_for_issue_1114.rs b/crates/migrations/src/m20241129_changes_for_issue_1114.rs new file mode 100644 index 0000000000..d0addaf7a9 --- /dev/null +++ b/crates/migrations/src/m20241129_changes_for_issue_1114.rs @@ -0,0 +1,34 @@ +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(); + if !manager.has_column("import_report", "progress").await? { + db.execute_unprepared(r#"ALTER TABLE "import_report" ADD COLUMN "progress" DECIMAL"#) + .await?; + } + if !manager.has_column("import_report", "source_result").await? { + db.execute_unprepared( + r#"ALTER TABLE "import_report" ADD COLUMN "source_result" JSONB"#, + ) + .await?; + } + db.execute_unprepared( + r#" +UPDATE "import_report" SET "source" = 'myanimelist' WHERE "source" = 'mal'; +UPDATE "import_report" SET "source" = 'mediatracker' WHERE "source" = 'media_tracker'; +UPDATE "import_report" SET "source" = 'storygraph' WHERE "source" = 'story_graph'; + "#, + ) + .await?; + Ok(()) + } + + async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> { + Ok(()) + } +} diff --git a/crates/models/database/src/exercise.rs b/crates/models/database/src/exercise.rs index c05b085c34..73451b0f0f 100644 --- a/crates/models/database/src/exercise.rs +++ b/crates/models/database/src/exercise.rs @@ -13,15 +13,17 @@ use sea_orm::entity::prelude::*; use serde::{Deserialize, Serialize}; #[derive( + Eq, + Hash, Clone, Debug, + Default, PartialEq, - DeriveEntityModel, - Eq, Serialize, + InputObject, Deserialize, SimpleObject, - InputObject, + DeriveEntityModel, )] #[sea_orm(table_name = "exercise")] #[graphql(name = "Exercise", input_name = "ExerciseInput")] diff --git a/crates/models/database/src/import_report.rs b/crates/models/database/src/import_report.rs index 6e4d8413c5..f3883f6547 100644 --- a/crates/models/database/src/import_report.rs +++ b/crates/models/database/src/import_report.rs @@ -17,9 +17,12 @@ pub struct Model { pub user_id: String, pub source: ImportSource, pub started_on: DateTimeUtc, + pub progress: Option, + pub was_success: Option, pub finished_on: Option, pub details: Option, - pub was_success: Option, + #[graphql(skip)] + pub source_result: Option, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] diff --git a/crates/models/dependent/Cargo.toml b/crates/models/dependent/Cargo.toml index 21a3c07004..ae2e1a3944 100644 --- a/crates/models/dependent/Cargo.toml +++ b/crates/models/dependent/Cargo.toml @@ -16,3 +16,4 @@ rust_decimal = { workspace = true } schematic = { workspace = true } serde = { workspace = true } serde_with = { workspace = true } +strum = { workspace = true } diff --git a/crates/models/dependent/src/lib.rs b/crates/models/dependent/src/lib.rs index 0658ceebe1..b524d9840c 100644 --- a/crates/models/dependent/src/lib.rs +++ b/crates/models/dependent/src/lib.rs @@ -5,13 +5,16 @@ use database_models::{ collection, exercise, metadata, metadata_group, person, seen, user, user_measurement, user_to_entity, workout, workout_template, }; -use enums::UserToMediaReason; +use enums::{ + ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic, ExerciseMuscle, + MediaLot, MediaSource, UserToMediaReason, WorkoutSetPersonalBest, +}; use fitness_models::{UserToExerciseHistoryExtraInformation, UserWorkoutInput}; use importer_models::ImportFailedItem; use media_models::{ CreateOrUpdateCollectionInput, DailyUserActivitiesResponseGroupedBy, DailyUserActivityItem, EntityWithLot, GenreListItem, GraphqlMediaAssets, ImportOrExportExerciseItem, - ImportOrExportMediaGroupItem, ImportOrExportMediaItem, ImportOrExportPersonItem, + ImportOrExportMetadataGroupItem, ImportOrExportMetadataItem, ImportOrExportPersonItem, MetadataCreatorGroupedByRole, PersonDetailsGroupedByRole, ReviewItem, UserDetailsError, UserMediaNextEntry, UserMetadataDetailsEpisodeProgress, UserMetadataDetailsShowSeasonProgress, }; @@ -19,6 +22,7 @@ use rust_decimal::Decimal; use schematic::Schematic; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; +use strum::Display; #[derive(Serialize, Deserialize, Debug, SimpleObject, Clone)] #[graphql(concrete(name = "ExerciseListResults", params(fitness_models::ExerciseListItem)))] @@ -67,7 +71,7 @@ pub struct ImportOrExportWorkoutTemplateItem { #[serde(rename_all = "snake_case")] pub struct CompleteExport { /// Data about user's media. - pub media: Option>, + pub media: Option>, /// Data about user's people. pub people: Option>, /// Data about user's measurements. @@ -75,7 +79,7 @@ pub struct CompleteExport { /// Data about user's workouts. pub workouts: Option>, /// Data about user's media groups. - pub media_groups: Option>, + pub media_groups: Option>, /// Data about user's exercises. pub exercises: Option>, /// Data about user's workout templates. @@ -147,6 +151,45 @@ pub struct MetadataBaseData { pub creators: Vec, } +#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)] +pub struct ExerciseParametersLotMapping { + pub lot: ExerciseLot, + pub bests: Vec, +} + +#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)] +pub struct ExerciseFilters { + #[graphql(name = "type")] + pub lot: Vec, + pub level: Vec, + pub force: Vec, + pub mechanic: Vec, + pub equipment: Vec, + pub muscle: Vec, +} + +#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)] +pub struct ExerciseParameters { + /// All filters applicable to an exercises query. + pub filters: ExerciseFilters, + pub download_required: bool, + /// Exercise type mapped to the personal bests possible. + pub lot_mapping: Vec, +} + +#[derive(Debug, SimpleObject, Serialize, Deserialize)] +pub struct ProviderLanguageInformation { + pub source: MediaSource, + pub supported: Vec, + pub default: String, +} + +#[derive(Debug, SimpleObject, Serialize, Deserialize)] +pub struct MetadataLotSourceMappings { + pub lot: MediaLot, + pub sources: Vec, +} + #[derive(Debug, SimpleObject, Serialize, Deserialize)] pub struct CoreDetails { pub is_pro: bool, @@ -164,6 +207,9 @@ pub struct CoreDetails { pub local_auth_disabled: bool, pub file_storage_enabled: bool, pub backend_errors: Vec, + pub exercise_parameters: ExerciseParameters, + pub metadata_lot_source_mappings: Vec, + pub metadata_provider_languages: Vec, } #[derive(SimpleObject)] @@ -206,16 +252,24 @@ pub struct UserMetadataDetails { pub has_interacted: bool, } -#[derive(Debug, Default)] +#[derive(Debug, Default, Display, Clone, Serialize)] +pub enum ImportCompletedItem { + #[default] + Empty, + Workout(UserWorkoutInput), + Exercise(exercise::Model), + Person(ImportOrExportPersonItem), + Metadata(ImportOrExportMetadataItem), + Measurement(user_measurement::Model), + Collection(CreateOrUpdateCollectionInput), + MetadataGroup(ImportOrExportMetadataGroupItem), + ApplicationWorkout(ImportOrExportWorkoutItem), +} + +#[derive(Debug, Default, Clone, Serialize)] pub struct ImportResult { - pub workouts: Vec, - pub failed_items: Vec, - pub metadata: Vec, - pub people: Vec, - pub measurements: Vec, - pub metadata_groups: Vec, - pub collections: Vec, - pub application_workouts: Vec, + pub failed: Vec, + pub completed: Vec, } #[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)] diff --git a/crates/models/fitness/src/lib.rs b/crates/models/fitness/src/lib.rs index 5f3136d69f..c4c640aee9 100644 --- a/crates/models/fitness/src/lib.rs +++ b/crates/models/fitness/src/lib.rs @@ -6,6 +6,7 @@ use derive_more::{Add, AddAssign, Sum}; use educe::Educe; use enums::{ ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic, ExerciseMuscle, + WorkoutSetPersonalBest, }; use rust_decimal::Decimal; use schematic::{ConfigEnum, Schematic}; @@ -13,24 +14,6 @@ use sea_orm::{prelude::DateTimeUtc, FromJsonQueryResult, FromQueryResult}; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; -pub const LOT_MAPPINGS: &[(ExerciseLot, &[WorkoutSetPersonalBest])] = &[ - (ExerciseLot::Duration, &[WorkoutSetPersonalBest::Time]), - ( - ExerciseLot::DistanceAndDuration, - &[WorkoutSetPersonalBest::Pace, WorkoutSetPersonalBest::Time], - ), - ( - ExerciseLot::RepsAndWeight, - &[ - WorkoutSetPersonalBest::Weight, - WorkoutSetPersonalBest::OneRm, - WorkoutSetPersonalBest::Volume, - WorkoutSetPersonalBest::Reps, - ], - ), - (ExerciseLot::Reps, &[WorkoutSetPersonalBest::Reps]), -]; - #[derive(Debug, Clone, Serialize, Enum, Copy, Deserialize, FromJsonQueryResult, Eq, PartialEq)] #[serde(rename_all = "snake_case")] pub enum ExerciseCategory { @@ -45,15 +28,17 @@ pub enum ExerciseCategory { } #[derive( + Eq, + Hash, Debug, Clone, + Default, Serialize, - SimpleObject, - Deserialize, - FromJsonQueryResult, - Eq, PartialEq, InputObject, + Deserialize, + SimpleObject, + FromJsonQueryResult, )] #[serde(rename_all = "camelCase")] #[graphql(input_name = "ExerciseAttributesInput")] @@ -231,31 +216,6 @@ pub enum SetLot { Failure, } -/// The different types of personal bests that can be achieved on a set. -#[derive( - Clone, - Debug, - Deserialize, - Serialize, - FromJsonQueryResult, - Eq, - PartialEq, - Enum, - Copy, - Default, - ConfigEnum, -)] -#[serde(rename_all = "snake_case")] -pub enum WorkoutSetPersonalBest { - #[default] - Weight, - OneRm, - Volume, - Time, - Pace, - Reps, -} - #[skip_serializing_none] #[derive( Clone, @@ -670,32 +630,6 @@ pub struct ExercisesListInput { pub sort_by: Option, } -#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)] -pub struct ExerciseParametersLotMapping { - pub lot: ExerciseLot, - pub bests: Vec, -} - -#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)] -pub struct ExerciseParameters { - /// All filters applicable to an exercises query. - pub filters: ExerciseFilters, - pub download_required: bool, - /// Exercise type mapped to the personal bests possible. - pub lot_mapping: Vec, -} - -#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)] -pub struct ExerciseFilters { - #[graphql(name = "type")] - pub lot: Vec, - pub level: Vec, - pub force: Vec, - pub mechanic: Vec, - pub equipment: Vec, - pub muscle: Vec, -} - #[derive(Debug, InputObject)] pub struct UpdateUserExerciseSettings { pub exercise_id: String, diff --git a/crates/models/media/src/lib.rs b/crates/models/media/src/lib.rs index 58c63904f2..c6242ebc6c 100644 --- a/crates/models/media/src/lib.rs +++ b/crates/models/media/src/lib.rs @@ -35,7 +35,7 @@ pub struct MetadataSearchItemResponse { pub database_id: Option, } -#[derive(Debug, InputObject, Default, Clone)] +#[derive(Debug, InputObject, Default, Clone, Serialize)] pub struct CreateOrUpdateCollectionInput { pub name: String, pub description: Option, @@ -490,7 +490,7 @@ pub struct MetadataDetails { #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, Schematic)] #[serde(rename_all = "snake_case")] -pub struct ImportOrExportMediaItemSeen { +pub struct ImportOrExportMetadataItemSeen { /// The progress of media done. If none, it is considered as done. pub progress: Option, /// The timestamp when started watching. @@ -555,40 +555,40 @@ pub struct ImportOrExportItemRating { #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Schematic, Default)] #[serde(rename_all = "snake_case")] -pub struct ImportOrExportMediaItem { - /// An string to help identify it in the original source. - pub source_id: String, +pub struct ImportOrExportMetadataItem { /// The type of media. pub lot: MediaLot, - /// The source of media. - pub source: MediaSource, + /// An string to help identify it in the original source. + pub source_id: String, /// The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on. pub identifier: String, - /// The seen history for the user. - pub seen_history: Vec, - /// The review history for the user. - pub reviews: Vec, + /// The source of media. + pub source: MediaSource, /// The collections this entity was added to. pub collections: Vec, + /// The review history for the user. + pub reviews: Vec, + /// The seen history for the user. + pub seen_history: Vec, } /// Details about a specific media group item that needs to be imported or exported. #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Schematic)] #[serde(rename_all = "snake_case")] -pub struct ImportOrExportMediaGroupItem { +pub struct ImportOrExportMetadataGroupItem { /// Name of the group. pub title: String, /// The type of media. pub lot: MediaLot, - /// The source of media. - pub source: MediaSource, /// The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on. pub identifier: String, - /// The review history for the user. - pub reviews: Vec, + /// The source of media. + pub source: MediaSource, /// The collections this entity was added to. pub collections: Vec, + /// The review history for the user. + pub reviews: Vec, } /// Details about a specific creator item that needs to be exported. @@ -596,18 +596,18 @@ pub struct ImportOrExportMediaGroupItem { #[derive(Debug, Serialize, Deserialize, Clone, Schematic)] #[serde(rename_all = "snake_case")] pub struct ImportOrExportPersonItem { + /// The name of the creator. + pub name: String, /// The provider identifier. pub identifier: String, /// The source of data. pub source: MediaSource, - /// The source specific data. - pub source_specifics: Option, - /// The name of the creator. - pub name: String, - /// The review history for the user. - pub reviews: Vec, /// The collections this entity was added to. pub collections: Vec, + /// The review history for the user. + pub reviews: Vec, + /// The source specific data. + pub source_specifics: Option, } /// Details about a specific exercise item that needs to be exported. @@ -929,18 +929,10 @@ pub struct DeployMalImportInput { pub manga_path: Option, } -#[derive(Debug, InputObject, Serialize, Deserialize, Clone)] -pub struct StrongAppImportMapping { - pub source_name: String, - pub target_name: String, - pub multiplier: Option, -} - #[derive(Debug, InputObject, Serialize, Deserialize, Clone)] pub struct DeployStrongAppImportInput { - // The path to the CSV file in the local file system. - pub export_path: String, - pub mapping: Vec, + pub data_export_path: Option, + pub measurements_zip_path: Option, } #[derive(Debug, InputObject, Serialize, Deserialize, Clone)] @@ -1046,13 +1038,6 @@ pub enum CreateCustomMediaErrorVariant { LotDoesNotMatchSpecifics, } -#[derive(Debug, SimpleObject)] -pub struct ProviderLanguageInformation { - pub source: MediaSource, - pub supported: Vec, - pub default: String, -} - #[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)] pub enum UserDetailsErrorVariant { AuthTokenInvalid, diff --git a/crates/providers/Cargo.toml b/crates/providers/Cargo.toml index 71a9a3f205..2ff63807f4 100644 --- a/crates/providers/Cargo.toml +++ b/crates/providers/Cargo.toml @@ -18,18 +18,18 @@ database-models = { path = "../models/database" } dependent-models = { path = "../models/dependent" } educe = { workspace = true } enums = { path = "../enums" } -graphql_client = "=0.14.0" +graphql_client = { workspace = true } hashbag = { workspace = true } -isolang = { version = "=2.4.0", features = ["list_languages"] } +isolang = { workspace = true } itertools = { workspace = true } media-models = { path = "../models/media" } -paginate = "=1.1.11" -rand = "=0.9.0-alpha.2" +paginate = { workspace = true } +rand = { workspace = true } reqwest = { workspace = true } rust_decimal = { workspace = true } rust_decimal_macros = { workspace = true } -rust_iso3166 = "=0.1.13" -scraper = "=0.20.0" +rust_iso3166 = { workspace = true } +scraper = { workspace = true } sea-orm = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/providers/src/mal.rs b/crates/providers/src/mal.rs index ecbe4168b2..05cde95045 100644 --- a/crates/providers/src/mal.rs +++ b/crates/providers/src/mal.rs @@ -10,7 +10,7 @@ use media_models::{ AnimeSpecifics, MangaSpecifics, MetadataDetails, MetadataImageForMediaDetails, MetadataSearchItem, PartialMetadataWithoutId, }; -use rand::{seq::SliceRandom, thread_rng}; +use rand::{rng, seq::SliceRandom}; use reqwest::{ header::{HeaderName, HeaderValue}, Client, @@ -254,7 +254,7 @@ async fn details(client: &Client, media_type: &str, id: &str) -> Result) -> Result { - let service = gql_ctx.data_unchecked::>(); - service.exercise_parameters().await - } - /// Get a paginated list of exercises in the database. async fn exercises_list( &self, @@ -214,7 +208,7 @@ impl ExerciseMutation { ) -> Result { let service = gql_ctx.data_unchecked::>(); let user_id = self.user_id_from_ctx(gql_ctx).await?; - service.create_custom_exercise(user_id, input).await + service.create_custom_exercise(&user_id, input).await } /// Update a custom exercise. @@ -238,4 +232,18 @@ impl ExerciseMutation { let user_id = self.user_id_from_ctx(gql_ctx).await?; service.update_user_exercise_settings(user_id, input).await } + + /// Merge an exercise into another. + async fn merge_exercise( + &self, + gql_ctx: &Context<'_>, + merge_from: String, + merge_into: String, + ) -> Result { + let service = gql_ctx.data_unchecked::>(); + let user_id = self.user_id_from_ctx(gql_ctx).await?; + service + .merge_exercise(user_id, merge_from, merge_into) + .await + } } diff --git a/crates/resolvers/miscellaneous/src/lib.rs b/crates/resolvers/miscellaneous/src/lib.rs index 397ea7cca7..014f722188 100644 --- a/crates/resolvers/miscellaneous/src/lib.rs +++ b/crates/resolvers/miscellaneous/src/lib.rs @@ -12,8 +12,8 @@ use media_models::{ GraphqlMetadataDetails, GroupedCalendarEvent, MetadataGroupSearchInput, MetadataGroupSearchItem, MetadataGroupsListInput, MetadataListInput, MetadataPartialDetails, MetadataSearchInput, MetadataSearchItemResponse, PeopleListInput, PeopleSearchInput, - PeopleSearchItem, ProgressUpdateInput, ProviderLanguageInformation, UpdateSeenItemInput, - UserCalendarEventInput, UserUpcomingCalendarEventInput, + PeopleSearchItem, ProgressUpdateInput, UpdateSeenItemInput, UserCalendarEventInput, + UserUpcomingCalendarEventInput, }; use miscellaneous_service::MiscellaneousService; use traits::AuthProvider; @@ -26,7 +26,7 @@ impl AuthProvider for MiscellaneousQuery {} #[Object] impl MiscellaneousQuery { /// Get some primary information about the service. - async fn core_details(&self, gql_ctx: &Context<'_>) -> CoreDetails { + async fn core_details(&self, gql_ctx: &Context<'_>) -> Result { let service = gql_ctx.data_unchecked::>(); service.core_details().await } @@ -124,15 +124,6 @@ impl MiscellaneousQuery { service.metadata_groups_list(user_id, input).await } - /// Get all languages supported by all the providers. - async fn providers_language_information( - &self, - gql_ctx: &Context<'_>, - ) -> Vec { - let service = gql_ctx.data_unchecked::>(); - service.providers_language_information() - } - /// Get details that can be displayed to a user for a metadata group. async fn user_metadata_group_details( &self, diff --git a/crates/services/exporter/Cargo.toml b/crates/services/exporter/Cargo.toml index 1d212e3daa..963e05af9f 100644 --- a/crates/services/exporter/Cargo.toml +++ b/crates/services/exporter/Cargo.toml @@ -15,11 +15,11 @@ dependent-models = { path = "../../models/dependent" } enums = { path = "../../enums" } fitness-models = { path = "../../models/fitness" } media-models = { path = "../../models/media" } -mime_guess = "=2.0.5" +mime_guess = { workspace = true } nanoid = { workspace = true } reqwest = { workspace = true } sea-orm = { workspace = true } -struson = { version = "=0.5.0", features = ["serde"] } +struson = { workspace = true } supporting-service = { path = "../supporting" } tokio = { workspace = true } -tokio-util = { version = "=0.7.11", features = ["codec"] } +tokio-util = { workspace = true } diff --git a/crates/services/exporter/src/lib.rs b/crates/services/exporter/src/lib.rs index 068f4481d4..575f0ffd74 100644 --- a/crates/services/exporter/src/lib.rs +++ b/crates/services/exporter/src/lib.rs @@ -20,7 +20,7 @@ use enums::EntityLot; use fitness_models::UserMeasurementsListInput; use media_models::{ ImportOrExportExerciseItem, ImportOrExportItemRating, ImportOrExportItemReview, - ImportOrExportMediaGroupItem, ImportOrExportMediaItem, ImportOrExportMediaItemSeen, + ImportOrExportMetadataGroupItem, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen, ImportOrExportPersonItem, ReviewItem, }; use nanoid::nanoid; @@ -201,7 +201,7 @@ impl ExporterService { let manga_chapter_number = s.manga_extra_information.clone().and_then(|d| d.chapter); let manga_volume_number = s.manga_extra_information.and_then(|d| d.volume); - ImportOrExportMediaItemSeen { + ImportOrExportMetadataItemSeen { progress: Some(s.progress), started_on: s.started_on, ended_on: s.finished_on, @@ -226,7 +226,7 @@ impl ExporterService { .into_iter() .map(|c| c.name) .collect(); - let exp = ImportOrExportMediaItem { + let exp = ImportOrExportMetadataItem { source_id: m.title, lot: m.lot, source: m.source, @@ -269,7 +269,7 @@ impl ExporterService { .into_iter() .map(|c| c.name) .collect(); - let exp = ImportOrExportMediaGroupItem { + let exp = ImportOrExportMetadataGroupItem { title: m.title, lot: m.lot, source: m.source, diff --git a/crates/services/fitness/Cargo.toml b/crates/services/fitness/Cargo.toml index 7ee7bda38e..a6d75e96ab 100644 --- a/crates/services/fitness/Cargo.toml +++ b/crates/services/fitness/Cargo.toml @@ -16,7 +16,6 @@ dependent-models = { path = "../../models/dependent" } dependent-utils = { path = "../../utils/dependent" } enums = { path = "../../enums" } fitness-models = { path = "../../models/fitness" } -itertools = { workspace = true } migrations = { path = "../../migrations" } nanoid = { workspace = true } reqwest = { workspace = true } diff --git a/crates/services/fitness/src/lib.rs b/crates/services/fitness/src/lib.rs index b3ad129730..fe1c409b3a 100644 --- a/crates/services/fitness/src/lib.rs +++ b/crates/services/fitness/src/lib.rs @@ -3,9 +3,7 @@ use std::sync::Arc; use application_utils::GraphqlRepresentation; use async_graphql::{Error, Result}; use background::ApplicationJob; -use common_models::{ - ChangeCollectionToEntityInput, DefaultCollection, SearchDetails, SearchInput, StoredUrl, -}; +use common_models::{SearchDetails, SearchInput, StoredUrl}; use common_utils::{ryot_log, PAGE_SIZE}; use database_models::{ collection_to_entity, exercise, @@ -15,8 +13,8 @@ use database_models::{ user_measurement, user_to_entity, workout, workout_template, }; use database_utils::{ - add_entity_to_collection, deploy_job_to_re_evaluate_user_workouts, entity_in_collections, - ilike_sql, item_reviews, pro_instance_guard, user_measurements_list, user_workout_details, + deploy_job_to_re_evaluate_user_workouts, entity_in_collections, ilike_sql, item_reviews, + pro_instance_guard, user_measurements_list, user_workout_details, user_workout_template_details, }; use dependent_models::{ @@ -24,27 +22,22 @@ use dependent_models::{ UserWorkoutTemplateDetails, }; use dependent_utils::{ - create_or_update_workout, create_user_measurement, db_workout_to_workout_input, - get_focused_workout_summary, -}; -use enums::{ - EntityLot, ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic, - ExerciseMuscle, ExerciseSource, Visibility, + create_custom_exercise, create_or_update_workout, create_user_measurement, + db_workout_to_workout_input, get_focused_workout_summary, }; +use enums::{EntityLot, ExerciseLot, ExerciseSource, Visibility}; use fitness_models::{ - ExerciseAttributes, ExerciseCategory, ExerciseFilters, ExerciseListItem, ExerciseParameters, - ExerciseParametersLotMapping, ExerciseSortBy, ExercisesListInput, GithubExercise, - GithubExerciseAttributes, ProcessedExercise, UpdateUserExerciseSettings, + ExerciseAttributes, ExerciseCategory, ExerciseListItem, ExerciseSortBy, ExercisesListInput, + GithubExercise, GithubExerciseAttributes, ProcessedExercise, UpdateUserExerciseSettings, UpdateUserWorkoutAttributesInput, UserMeasurementsListInput, UserToExerciseExtraInformation, UserWorkoutInput, WorkoutInformation, WorkoutSetRecord, WorkoutSummary, WorkoutSummaryExercise, - LOT_MAPPINGS, }; -use itertools::Itertools; use migrations::AliasedExercise; use nanoid::nanoid; use sea_orm::{ - prelude::DateTimeUtc, ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait, Iterable, - ModelTrait, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect, QueryTrait, RelationTrait, + prelude::DateTimeUtc, ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait, + ItemsAndPagesNumber, ModelTrait, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect, + QueryTrait, RelationTrait, }; use sea_query::{extension::postgres::PgExpr, Alias, Condition, Expr, Func, JoinType, OnConflict}; use slug::slugify; @@ -63,23 +56,27 @@ impl ExerciseService { input: SearchInput, ) -> Result> { let page = input.page.unwrap_or(1); - let query = WorkoutTemplate::find() + let paginator = WorkoutTemplate::find() .filter(workout_template::Column::UserId.eq(user_id)) .apply_if(input.query, |query, v| { query.filter(Expr::col(workout_template::Column::Name).ilike(ilike_sql(&v))) }) - .order_by_desc(workout_template::Column::CreatedOn); - let total = query.clone().count(&self.0.db).await?; - let total: i32 = total.try_into().unwrap(); - let data = query.paginate(&self.0.db, PAGE_SIZE.try_into().unwrap()); - let items = data.fetch_page((page - 1).try_into().unwrap()).await?; - let next_page = if total - (page * PAGE_SIZE) > 0 { - Some(page + 1) - } else { - None - }; + .order_by_desc(workout_template::Column::CreatedOn) + .paginate(&self.0.db, PAGE_SIZE.try_into().unwrap()); + let ItemsAndPagesNumber { + number_of_items, + number_of_pages, + } = paginator.num_items_and_pages().await?; + let items = paginator.fetch_page((page - 1).try_into().unwrap()).await?; Ok(SearchResults { - details: SearchDetails { total, next_page }, + details: SearchDetails { + total: number_of_items.try_into().unwrap(), + next_page: if page < number_of_pages.try_into().unwrap() { + Some(page + 1) + } else { + None + }, + }, items, }) } @@ -182,28 +179,6 @@ impl ExerciseService { Ok(true) } - pub async fn exercise_parameters(&self) -> Result { - let download_required = Exercise::find().count(&self.0.db).await? == 0; - Ok(ExerciseParameters { - filters: ExerciseFilters { - lot: ExerciseLot::iter().collect_vec(), - level: ExerciseLevel::iter().collect_vec(), - force: ExerciseForce::iter().collect_vec(), - mechanic: ExerciseMechanic::iter().collect_vec(), - equipment: ExerciseEquipment::iter().collect_vec(), - muscle: ExerciseMuscle::iter().collect_vec(), - }, - download_required, - lot_mapping: LOT_MAPPINGS - .iter() - .map(|(lot, pbs)| ExerciseParametersLotMapping { - lot: *lot, - bests: pbs.to_vec(), - }) - .collect(), - }) - } - async fn get_all_exercises_from_dataset(&self) -> Result> { let data = reqwest::get(JSON_URL) .await @@ -283,23 +258,27 @@ impl ExerciseService { input: SearchInput, ) -> Result> { let page = input.page.unwrap_or(1); - let query = Workout::find() + let paginator = Workout::find() .filter(workout::Column::UserId.eq(user_id)) .apply_if(input.query, |query, v| { query.filter(Expr::col(workout::Column::Name).ilike(ilike_sql(&v))) }) - .order_by_desc(workout::Column::EndTime); - let total = query.clone().count(&self.0.db).await?; - let total: i32 = total.try_into().unwrap(); - let data = query.paginate(&self.0.db, PAGE_SIZE.try_into().unwrap()); - let items = data.fetch_page((page - 1).try_into().unwrap()).await?; - let next_page = if total - (page * PAGE_SIZE) > 0 { - Some(page + 1) - } else { - None - }; + .order_by_desc(workout::Column::EndTime) + .paginate(&self.0.db, PAGE_SIZE.try_into().unwrap()); + let ItemsAndPagesNumber { + number_of_items, + number_of_pages, + } = paginator.num_items_and_pages().await?; + let items = paginator.fetch_page((page - 1).try_into().unwrap()).await?; Ok(SearchResults { - details: SearchDetails { total, next_page }, + details: SearchDetails { + total: number_of_items.try_into().unwrap(), + next_page: if page < number_of_pages.try_into().unwrap() { + Some(page + 1) + } else { + None + }, + }, items, }) } @@ -309,6 +288,7 @@ impl ExerciseService { user_id: String, input: ExercisesListInput, ) -> Result> { + let page = input.search.page.unwrap_or(1); let ex = Alias::new("exercise"); let etu = Alias::new("user_to_entity"); let order_by_col = match input.sort_by { @@ -332,7 +312,7 @@ impl ExerciseService { ])), }, }; - let query = Exercise::find() + let paginator = Exercise::find() .column_as( Expr::col(( etu.clone(), @@ -344,6 +324,11 @@ impl ExerciseService { Expr::col((etu, user_to_entity::Column::LastUpdatedOn)), "last_updated_on", ) + .filter( + exercise::Column::Source + .eq(ExerciseSource::Github) + .or(exercise::Column::CreatedByUserId.eq(&user_id)), + ) .apply_if(input.filter, |query, q| { query .apply_if(q.lot, |q, v| q.filter(exercise::Column::Lot.eq(v))) @@ -390,17 +375,15 @@ impl ExerciseService { }), ) .order_by_desc(order_by_col) - .order_by_asc(exercise::Column::Id); - let total = query.clone().count(&self.0.db).await?; - let total: i32 = total.try_into().unwrap(); - let data = query + .order_by_asc(exercise::Column::Id) .into_model::() .paginate(&self.0.db, PAGE_SIZE.try_into().unwrap()); + let ItemsAndPagesNumber { + number_of_items, + number_of_pages, + } = paginator.num_items_and_pages().await?; let mut items = vec![]; - for ex in data - .fetch_page((input.search.page.unwrap() - 1).try_into().unwrap()) - .await? - { + for ex in paginator.fetch_page((page - 1).try_into().unwrap()).await? { let mut converted_exercise = ex.clone(); if let Some(img) = ex.attributes.internal_images.first() { converted_exercise.image = Some( @@ -413,13 +396,15 @@ impl ExerciseService { converted_exercise.muscle = ex.muscles.first().cloned(); items.push(converted_exercise); } - let next_page = if total - ((input.search.page.unwrap()) * PAGE_SIZE) > 0 { - Some(input.search.page.unwrap() + 1) - } else { - None - }; Ok(SearchResults { - details: SearchDetails { total, next_page }, + details: SearchDetails { + total: number_of_items.try_into().unwrap(), + next_page: if page < number_of_pages.try_into().unwrap() { + Some(page + 1) + } else { + None + }, + }, items, }) } @@ -567,46 +552,10 @@ impl ExerciseService { pub async fn create_custom_exercise( &self, - user_id: String, + user_id: &String, input: exercise::Model, ) -> Result { - let exercise_id = input.id.clone(); - let mut input = input; - input.created_by_user_id = Some(user_id.clone()); - input.source = ExerciseSource::Custom; - input.attributes.internal_images = input - .attributes - .images - .clone() - .into_iter() - .map(StoredUrl::S3) - .collect(); - input.attributes.images = vec![]; - let input: exercise::ActiveModel = input.into(); - let exercise = match Exercise::find_by_id(exercise_id) - .filter(exercise::Column::Source.eq(ExerciseSource::Custom)) - .one(&self.0.db) - .await? - { - None => input.insert(&self.0.db).await?, - Some(_) => { - let input = input.reset_all(); - input.update(&self.0.db).await? - } - }; - add_entity_to_collection( - &user_id.clone(), - ChangeCollectionToEntityInput { - creator_user_id: user_id, - collection_name: DefaultCollection::Custom.to_string(), - entity_id: exercise.id.clone(), - entity_lot: EntityLot::Exercise, - ..Default::default() - }, - &self.0, - ) - .await?; - Ok(exercise.id) + create_custom_exercise(user_id, input, &self.0).await } pub async fn delete_user_workout(&self, user_id: String, workout_id: String) -> Result { @@ -642,9 +591,7 @@ impl ExerciseService { association.update(&self.0.db).await?; } wkt.delete(&self.0.db).await?; - self.0 - .perform_application_job(ApplicationJob::ReEvaluateUserWorkouts(user_id)) - .await?; + deploy_job_to_re_evaluate_user_workouts(&user_id, &self.0).await; Ok(true) } @@ -670,32 +617,53 @@ impl ExerciseService { Ok(()) } + async fn change_exercise_name_in_history( + &self, + new_name: String, + old_entity: user_to_entity::Model, + ) -> Result<()> { + for workout in old_entity.exercise_extra_information.unwrap().history { + let db_workout = Workout::find_by_id(workout.workout_id) + .one(&self.0.db) + .await? + .unwrap(); + let mut summary = db_workout.summary.clone(); + let mut information = db_workout.information.clone(); + summary.exercises[workout.idx].name = new_name.clone(); + information.exercises[workout.idx].name = new_name.clone(); + let mut db_workout: workout::ActiveModel = db_workout.into(); + db_workout.summary = ActiveValue::Set(summary); + db_workout.information = ActiveValue::Set(information); + db_workout.update(&self.0.db).await?; + } + Ok(()) + } + pub async fn update_custom_exercise( &self, user_id: String, input: UpdateCustomExerciseInput, ) -> Result { - let entities = UserToEntity::find() + let entity = UserToEntity::find() .filter(user_to_entity::Column::UserId.eq(&user_id)) .filter(user_to_entity::Column::ExerciseId.eq(input.old_name.clone())) - .all(&self.0.db) - .await?; + .one(&self.0.db) + .await? + .ok_or_else(|| Error::new("Exercise does not exist"))?; let old_exercise = Exercise::find_by_id(input.old_name.clone()) .one(&self.0.db) .await? .unwrap(); if input.should_delete.unwrap_or_default() { - for entity in entities { - if !entity - .exercise_extra_information - .unwrap_or_default() - .history - .is_empty() - { - return Err(Error::new( - "Exercise is associated with one or more workouts.", - )); - } + if !entity + .exercise_extra_information + .unwrap_or_default() + .history + .is_empty() + { + return Err(Error::new( + "Exercise is associated with one or more workouts.", + )); } old_exercise.delete(&self.0.db).await?; return Ok(true); @@ -713,30 +681,17 @@ impl ExerciseService { .filter(exercise::Column::Id.eq(input.old_name.clone())) .exec(&self.0.db) .await?; - for entity in entities { - for workout in entity.exercise_extra_information.unwrap().history { - let db_workout = Workout::find_by_id(workout.workout_id) - .one(&self.0.db) - .await? - .unwrap(); - let mut summary = db_workout.summary.clone(); - let mut information = db_workout.information.clone(); - summary.exercises[workout.idx].name = input.update.id.clone(); - information.exercises[workout.idx].name = input.update.id.clone(); - let mut db_workout: workout::ActiveModel = db_workout.into(); - db_workout.summary = ActiveValue::Set(summary); - db_workout.information = ActiveValue::Set(information); - db_workout.update(&self.0.db).await?; - } - } + self.change_exercise_name_in_history(input.update.id.clone(), entity) + .await?; } for image in old_exercise.attributes.internal_images { if let StoredUrl::S3(key) = image { self.0.file_storage_service.delete_object(key).await; } } - self.create_custom_exercise(user_id, input.update.clone()) + self.create_custom_exercise(&user_id, input.update.clone()) .await?; + deploy_job_to_re_evaluate_user_workouts(&user_id, &self.0).await; Ok(true) } @@ -786,4 +741,39 @@ impl ExerciseService { ute.update(&self.0.db).await?; Ok(true) } + + pub async fn merge_exercise( + &self, + user_id: String, + merge_from: String, + merge_into: String, + ) -> Result { + let old_exercise = Exercise::find_by_id(merge_from.clone()) + .one(&self.0.db) + .await? + .ok_or_else(|| Error::new("Exercise does not exist"))?; + let new_exercise = Exercise::find_by_id(merge_into.clone()) + .one(&self.0.db) + .await? + .ok_or_else(|| Error::new("Exercise does not exist"))?; + if old_exercise.id == new_exercise.id { + return Err(Error::new("Cannot merge exercise with itself")); + } + if old_exercise.lot != new_exercise.lot { + return Err(Error::new(format!( + "Exercises must be of the same lot, got from={:#?} and into={:#?}", + old_exercise.lot, new_exercise.lot + ))); + } + let old_entity = UserToEntity::find() + .filter(user_to_entity::Column::UserId.eq(&user_id)) + .filter(user_to_entity::Column::ExerciseId.eq(merge_from.clone())) + .one(&self.0.db) + .await? + .ok_or_else(|| Error::new("Exercise does not exist"))?; + self.change_exercise_name_in_history(merge_into, old_entity) + .await?; + deploy_job_to_re_evaluate_user_workouts(&user_id, &self.0).await; + Ok(true) + } } diff --git a/crates/services/importer/Cargo.toml b/crates/services/importer/Cargo.toml index 8991939e2b..c28a56c420 100644 --- a/crates/services/importer/Cargo.toml +++ b/crates/services/importer/Cargo.toml @@ -11,8 +11,8 @@ background = { path = "../../background" } chrono = { workspace = true } chrono-tz = { workspace = true } convert_case = { workspace = true } -csv = "=1.3.0" -data-encoding = "=2.6.0" +csv = { workspace = true } +data-encoding = { workspace = true } enum_meta = { workspace = true } env-utils = { path = "../../utils/env" } external-utils = { path = "../../utils/external" } @@ -23,12 +23,13 @@ dependent-models = { path = "../../models/dependent" } dependent-utils = { path = "../../utils/dependent" } enums = { path = "../../enums" } fitness-models = { path = "../../models/fitness" } -flate2 = "=1.0.34" +flate2 = { workspace = true } importer-models = { path = "../../models/importer" } +indexmap = { workspace = true } itertools = { workspace = true } media-models = { path = "../../models/media" } +nanoid = { workspace = true } providers = { path = "../../providers" } -regex = { workspace = true } reqwest = { workspace = true } rust_decimal = { workspace = true } rust_decimal_macros = { workspace = true } @@ -36,7 +37,7 @@ sea-orm = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } serde_with = { workspace = true } -serde-xml-rs = "=0.6.0" +serde-xml-rs = { workspace = true } specific-models = { path = "../../models/specific" } supporting-service = { path = "../supporting" } tracing = { workspace = true } diff --git a/crates/services/importer/src/audiobookshelf.rs b/crates/services/importer/src/audiobookshelf.rs index a673bc754d..e604c1411a 100644 --- a/crates/services/importer/src/audiobookshelf.rs +++ b/crates/services/importer/src/audiobookshelf.rs @@ -6,11 +6,11 @@ use async_graphql::Result; use common_utils::ryot_log; use data_encoding::BASE64; use database_models::metadata; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ImportSource, MediaLot, MediaSource}; use media_models::{ - CommitMediaInput, DeployUrlAndKeyImportInput, ImportOrExportMediaItem, - ImportOrExportMediaItemSeen, + CommitMediaInput, DeployUrlAndKeyImportInput, ImportOrExportMetadataItem, + ImportOrExportMetadataItemSeen, }; use providers::{google_books::GoogleBooksService, openlibrary::OpenlibraryService}; use reqwest::{ @@ -33,8 +33,8 @@ pub async fn import( where F: Future>, { - let mut media = vec![]; - let mut failed_items = vec![]; + let mut completed = vec![]; + let mut failed = vec![]; let url = format!("{}/api", input.api_url); let client = get_base_http_client(Some(vec![( AUTHORIZATION, @@ -81,7 +81,7 @@ where { Some((identifier, source)) => (identifier, MediaLot::Book, source, None), _ => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { error: Some("No Google Books ID found".to_string()), identifier: title, lot: None, @@ -91,7 +91,7 @@ where } }, _ => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { error: Some("No ISBN found".to_string()), identifier: title, lot: None, @@ -138,7 +138,7 @@ where (itunes_id, lot, source, Some(to_return)) } _ => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { error: Some("No episodes found for podcast".to_string()), identifier: title, lot: Some(MediaLot::Podcast), @@ -158,33 +158,29 @@ where let mut seen_history = vec![]; if let Some(podcasts) = episodes { for episode in podcasts { - seen_history.push(ImportOrExportMediaItemSeen { + seen_history.push(ImportOrExportMetadataItemSeen { provider_watched_on: Some(ImportSource::Audiobookshelf.to_string()), podcast_episode_number: Some(episode), ..Default::default() }); } } else { - seen_history.push(ImportOrExportMediaItemSeen { + seen_history.push(ImportOrExportMetadataItemSeen { provider_watched_on: Some(ImportSource::Audiobookshelf.to_string()), ..Default::default() }); }; - media.push(ImportOrExportMediaItem { + completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot, source, identifier, seen_history, source_id: metadata.title, ..Default::default() - }) + })) } } - Ok(ImportResult { - metadata: media, - failed_items, - ..Default::default() - }) + Ok(ImportResult { completed, failed }) } async fn get_item_details( diff --git a/crates/services/importer/src/generic_json.rs b/crates/services/importer/src/generic_json.rs index 31420cc2da..80967dccef 100644 --- a/crates/services/importer/src/generic_json.rs +++ b/crates/services/importer/src/generic_json.rs @@ -1,7 +1,7 @@ use std::fs; use async_graphql::Result; -use dependent_models::{CompleteExport, ImportResult}; +use dependent_models::{CompleteExport, ImportCompletedItem, ImportResult}; use enums::ImportSource; use itertools::Itertools; use media_models::DeployJsonImportInput; @@ -22,12 +22,24 @@ pub async fn import(input: DeployJsonImportInput) -> Result { }) .collect_vec(); + let mut completed = vec![]; + for media in media { + completed.push(ImportCompletedItem::Metadata(media)); + } + for people in complete_data.people.unwrap_or_default() { + completed.push(ImportCompletedItem::Person(people)); + } + for measurement in complete_data.measurements.unwrap_or_default() { + completed.push(ImportCompletedItem::Measurement(measurement)); + } + for workout in complete_data.workouts.unwrap_or_default() { + completed.push(ImportCompletedItem::ApplicationWorkout(workout)); + } + for media_group in complete_data.media_groups.unwrap_or_default() { + completed.push(ImportCompletedItem::MetadataGroup(media_group)); + } Ok(ImportResult { - metadata: media, - people: complete_data.people.unwrap_or_default(), - metadata_groups: complete_data.media_groups.unwrap_or_default(), - measurements: complete_data.measurements.unwrap_or_default(), - application_workouts: complete_data.workouts.unwrap_or_default(), + completed, ..Default::default() }) } diff --git a/crates/services/importer/src/goodreads.rs b/crates/services/importer/src/goodreads.rs index 233e3343c5..f497399a35 100644 --- a/crates/services/importer/src/goodreads.rs +++ b/crates/services/importer/src/goodreads.rs @@ -3,12 +3,12 @@ use chrono::NaiveDate; use common_utils::ryot_log; use convert_case::{Case, Casing}; use csv::Reader; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ImportSource, MediaLot}; use itertools::Itertools; use media_models::{ DeployGenericCsvImportInput, ImportOrExportItemRating, ImportOrExportItemReview, - ImportOrExportMediaItem, ImportOrExportMediaItemSeen, + ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen, }; use providers::{google_books::GoogleBooksService, openlibrary::OpenlibraryService}; use rust_decimal::Decimal; @@ -43,8 +43,8 @@ pub async fn import( open_library_service: &OpenlibraryService, ) -> Result { let lot = MediaLot::Book; - let mut media = vec![]; - let mut failed_items = vec![]; + let mut completed = vec![]; + let mut failed = vec![]; let ratings_reader = Reader::from_path(input.csv_path) .unwrap() .deserialize() @@ -54,7 +54,7 @@ pub async fn import( let record: Book = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -70,7 +70,7 @@ pub async fn import( ); let isbn = record.isbn13[2..record.isbn13.len() - 1].to_owned(); if isbn.is_empty() { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: record.title, @@ -82,7 +82,7 @@ pub async fn import( utils::get_identifier_from_book_isbn(&isbn, google_books_service, open_library_service) .await else { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: record.title, @@ -94,7 +94,7 @@ pub async fn import( continue; }; let mut seen_history = vec![ - ImportOrExportMediaItemSeen { + ImportOrExportMetadataItemSeen { started_on: None, ended_on: None, provider_watched_on: Some(ImportSource::Goodreads.to_string()), @@ -132,7 +132,7 @@ pub async fn import( visibility: None, }); } - media.push(ImportOrExportMediaItem { + completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot, source, identifier, @@ -144,11 +144,7 @@ pub async fn import( rating, ..Default::default() }], - }); + })); } - Ok(ImportResult { - metadata: media, - failed_items, - ..Default::default() - }) + Ok(ImportResult { completed, failed }) } diff --git a/crates/services/importer/src/igdb.rs b/crates/services/importer/src/igdb.rs index a1d9c44755..ace062a5f8 100644 --- a/crates/services/importer/src/igdb.rs +++ b/crates/services/importer/src/igdb.rs @@ -1,10 +1,12 @@ use async_graphql::Result; use common_models::DefaultCollection; use csv::Reader; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; use itertools::Itertools; -use media_models::{DeployIgdbImportInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen}; +use media_models::{ + DeployIgdbImportInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen, +}; use rust_decimal_macros::dec; use serde::Deserialize; @@ -20,18 +22,18 @@ pub async fn import(input: DeployIgdbImportInput) -> Result { let lot = MediaLot::VideoGame; let source = MediaSource::Igdb; let collection = input.collection; - let mut media = vec![]; - let mut failed_items = vec![]; + let mut completed = vec![]; + let mut failed = vec![]; let items = Reader::from_path(input.csv_path) .unwrap() .deserialize() .collect_vec(); let seen_history = if collection == DefaultCollection::Completed.to_string() { - vec![ImportOrExportMediaItemSeen { + vec![ImportOrExportMetadataItemSeen { ..Default::default() }] } else if collection == DefaultCollection::InProgress.to_string() { - vec![ImportOrExportMediaItemSeen { + vec![ImportOrExportMetadataItemSeen { progress: Some(dec!(5)), ..Default::default() }] @@ -42,7 +44,7 @@ pub async fn import(input: DeployIgdbImportInput) -> Result { let record: Item = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -51,19 +53,15 @@ pub async fn import(input: DeployIgdbImportInput) -> Result { continue; } }; - media.push(ImportOrExportMediaItem { + completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot, source, - source_id: record.game, identifier: record.id, + source_id: record.game, seen_history: seen_history.clone(), collections: vec![collection.clone()], ..Default::default() - }); + })); } - Ok(ImportResult { - metadata: media, - failed_items, - ..Default::default() - }) + Ok(ImportResult { failed, completed }) } diff --git a/crates/services/importer/src/imdb.rs b/crates/services/importer/src/imdb.rs index 43d0e21b75..cd5bf7e7d1 100644 --- a/crates/services/importer/src/imdb.rs +++ b/crates/services/importer/src/imdb.rs @@ -2,10 +2,10 @@ use async_graphql::Result; use common_models::DefaultCollection; use common_utils::ryot_log; use csv::Reader; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; use itertools::Itertools; -use media_models::{DeployGenericCsvImportInput, ImportOrExportMediaItem}; +use media_models::{DeployGenericCsvImportInput, ImportOrExportMetadataItem}; pub use providers::tmdb::NonMediaTmdbService; use serde::Deserialize; @@ -25,8 +25,8 @@ pub async fn import( tmdb_service: &NonMediaTmdbService, ) -> Result { let source = MediaSource::Tmdb; - let mut media = vec![]; - let mut failed_items = vec![]; + let mut completed = vec![]; + let mut failed = vec![]; let ratings_reader = Reader::from_path(input.csv_path) .unwrap() .deserialize() @@ -36,7 +36,7 @@ pub async fn import( let record: Item = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: None, step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -49,7 +49,7 @@ pub async fn import( "Movie" | "Video" | "movie" | "video" => MediaLot::Movie, "TV Series" | "TV Mini Series" | "tvSeries" | "tvMiniSeries" => MediaLot::Show, tt => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: None, step: ImportFailStep::InputTransformation, identifier: record.id.clone(), @@ -64,7 +64,7 @@ pub async fn import( { Ok(i) => i, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::MediaDetailsFromProvider, identifier: record.id.clone(), @@ -80,18 +80,14 @@ pub async fn import( idx + 1, total ); - media.push(ImportOrExportMediaItem { - identifier, + completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot, source, + identifier, source_id: record.id, collections: vec![DefaultCollection::Watchlist.to_string()], ..Default::default() - }); + })); } - Ok(ImportResult { - metadata: media, - failed_items, - ..Default::default() - }) + Ok(ImportResult { failed, completed }) } diff --git a/crates/services/importer/src/jellyfin.rs b/crates/services/importer/src/jellyfin.rs index 3a7abeb227..751256f205 100644 --- a/crates/services/importer/src/jellyfin.rs +++ b/crates/services/importer/src/jellyfin.rs @@ -1,11 +1,12 @@ use async_graphql::Result; use common_utils::ryot_log; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enum_meta::HashMap; use enums::{MediaLot, MediaSource}; use external_utils::jellyfin::{get_authenticated_client, ItemResponse, ItemsResponse, MediaType}; use media_models::{ - DeployUrlAndKeyAndUsernameImportInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen, + DeployUrlAndKeyAndUsernameImportInput, ImportOrExportMetadataItem, + ImportOrExportMetadataItemSeen, }; use serde_json::json; @@ -13,7 +14,7 @@ use super::{ImportFailStep, ImportFailedItem}; pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result { let mut to_handle_media = vec![]; - let mut failed_items = vec![]; + let mut failed = vec![]; let base_url = input.api_url; let (client, user_id) = @@ -64,7 +65,7 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { step: ImportFailStep::ItemDetailsFromSource, identifier: item.name, error: Some(format!("Unknown media type: {:?}", type_)), @@ -75,7 +76,7 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result Result Result Result = vec![]; + let mut media: Vec = vec![]; for item in to_handle_media { let mut found = false; @@ -122,8 +123,10 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result, ) -> Result<()> { - let db_import_job = self.start_import_job(&user_id, input.source).await?; - let import = match input.source { - ImportSource::StrongApp => { - strong_app::import(input.strong_app.unwrap(), &self.0.timezone) - .await - .unwrap() + let model = import_report::ActiveModel { + source: ActiveValue::Set(input.source), + progress: ActiveValue::Set(Some(dec!(0))), + user_id: ActiveValue::Set(user_id.to_owned()), + ..Default::default() + }; + let db_import_job = model.insert(&self.0.db).await.unwrap(); + let import_id = db_import_job.id.clone(); + ryot_log!(debug, "Started import job with id {import_id}"); + let maybe_import = match input.source { + ImportSource::StrongApp => strong_app::import(input.strong_app.unwrap(), &self.0).await, + ImportSource::Mediatracker => mediatracker::import(input.url_and_key.unwrap()).await, + ImportSource::Myanimelist => myanimelist::import(input.mal.unwrap()).await, + ImportSource::Goodreads => { + goodreads::import( + input.generic_csv.unwrap(), + &get_google_books_service(&self.0.config).await.unwrap(), + &get_openlibrary_service(&self.0.config).await.unwrap(), + ) + .await } - ImportSource::MediaTracker => media_tracker::import(input.url_and_key.unwrap()) + ImportSource::Trakt => trakt::import(input.trakt.unwrap()).await, + ImportSource::Movary => movary::import(input.movary.unwrap()).await, + ImportSource::Storygraph => { + storygraph::import( + input.generic_csv.unwrap(), + &get_google_books_service(&self.0.config).await.unwrap(), + &get_openlibrary_service(&self.0.config).await.unwrap(), + ) .await - .unwrap(), - ImportSource::Mal => mal::import(input.mal.unwrap()).await.unwrap(), - ImportSource::Goodreads => goodreads::import( - input.generic_csv.unwrap(), - &get_google_books_service(&self.0.config).await.unwrap(), - &get_openlibrary_service(&self.0.config).await.unwrap(), - ) - .await - .unwrap(), - ImportSource::Trakt => trakt::import(input.trakt.unwrap()).await.unwrap(), - ImportSource::Movary => movary::import(input.movary.unwrap()).await.unwrap(), - ImportSource::StoryGraph => story_graph::import( - input.generic_csv.unwrap(), - &get_google_books_service(&self.0.config).await.unwrap(), - &get_openlibrary_service(&self.0.config).await.unwrap(), - ) - .await - .unwrap(), - ImportSource::Audiobookshelf => audiobookshelf::import( - input.url_and_key.unwrap(), - &get_google_books_service(&self.0.config).await.unwrap(), - &get_openlibrary_service(&self.0.config).await.unwrap(), - |input| commit_metadata(input, &self.0), - ) - .await - .unwrap(), - ImportSource::Igdb => igdb::import(input.igdb.unwrap()).await.unwrap(), - ImportSource::Imdb => imdb::import( - input.generic_csv.unwrap(), - &get_tmdb_non_media_service(&self.0).await.unwrap(), - ) - .await - .unwrap(), - ImportSource::GenericJson => generic_json::import(input.generic_json.unwrap()) + } + ImportSource::Audiobookshelf => { + audiobookshelf::import( + input.url_and_key.unwrap(), + &get_google_books_service(&self.0.config).await.unwrap(), + &get_openlibrary_service(&self.0.config).await.unwrap(), + |input| commit_metadata(input, &self.0), + ) .await - .unwrap(), + } + ImportSource::Igdb => igdb::import(input.igdb.unwrap()).await, + ImportSource::Imdb => { + imdb::import( + input.generic_csv.unwrap(), + &get_tmdb_non_media_service(&self.0).await.unwrap(), + ) + .await + } + ImportSource::GenericJson => generic_json::import(input.generic_json.unwrap()).await, ImportSource::OpenScale => { - open_scale::import(input.generic_csv.unwrap(), &self.0.timezone) - .await - .unwrap() + open_scale::import(input.generic_csv.unwrap(), &self.0.timezone).await } - ImportSource::Jellyfin => jellyfin::import(input.jellyfin.unwrap()).await.unwrap(), - }; - let details = process_import(&user_id, false, import, &self.0).await?; - self.finish_import_job(db_import_job, details).await?; - deploy_background_job( - &user_id, - BackgroundJob::CalculateUserActivitiesAndSummary, - &self.0, - ) - .await - .trace_ok(); - Ok(()) - } - - async fn start_import_job( - &self, - user_id: &String, - source: ImportSource, - ) -> Result { - let model = import_report::ActiveModel { - user_id: ActiveValue::Set(user_id.to_owned()), - source: ActiveValue::Set(source), - ..Default::default() + ImportSource::Jellyfin => jellyfin::import(input.jellyfin.unwrap()).await, + ImportSource::Plex => plex::import(input.url_and_key.unwrap()).await, }; - let model = model.insert(&self.0.db).await.unwrap(); - ryot_log!(debug, "Started import job with id = {id}", id = model.id); - Ok(model) - } - - async fn finish_import_job( - &self, - job: import_report::Model, - details: ImportResultResponse, - ) -> Result { - let mut model: import_report::ActiveModel = job.into(); + let mut model: import_report::ActiveModel = db_import_job.into(); + match maybe_import { + Ok(import) => { + match process_import(&user_id, false, import, &self.0, |progress| { + let id = import_id.clone(); + async move { + ImportReport::update_many() + .filter(import_report::Column::Id.eq(id.clone())) + .col_expr(import_report::Column::Progress, Expr::value(progress)) + .exec(&self.0.db) + .await?; + Ok(()) + } + }) + .await + { + Ok((source_result, details)) => { + model.source_result = + ActiveValue::Set(Some(serde_json::to_value(&source_result)?)); + model.details = ActiveValue::Set(Some(details)); + model.was_success = ActiveValue::Set(Some(true)); + deploy_background_job( + &user_id, + BackgroundJob::CalculateUserActivitiesAndSummary, + &self.0, + ) + .await + .trace_ok(); + } + Err(e) => { + ryot_log!(debug, "Error while importing: {:?}", e); + model.was_success = ActiveValue::Set(Some(false)); + } + } + } + Err(e) => { + ryot_log!(debug, "Error while importing: {:?}", e); + model.was_success = ActiveValue::Set(Some(false)); + } + } model.finished_on = ActiveValue::Set(Some(Utc::now())); - model.details = ActiveValue::Set(Some(details)); - model.was_success = ActiveValue::Set(Some(true)); - let model = model.update(&self.0.db).await.unwrap(); - Ok(model) + model.update(&self.0.db).await.trace_ok(); + Ok(()) } } diff --git a/crates/services/importer/src/media_tracker.rs b/crates/services/importer/src/mediatracker.rs similarity index 92% rename from crates/services/importer/src/media_tracker.rs rename to crates/services/importer/src/mediatracker.rs index cace5c2cca..1ab4684f43 100644 --- a/crates/services/importer/src/media_tracker.rs +++ b/crates/services/importer/src/mediatracker.rs @@ -1,11 +1,11 @@ use async_graphql::Result; use common_models::IdObject; use common_utils::{ryot_log, USER_AGENT_STR}; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ImportSource, MediaLot, MediaSource}; use media_models::{ CreateOrUpdateCollectionInput, DeployUrlAndKeyImportInput, ImportOrExportItemRating, - ImportOrExportItemReview, ImportOrExportMediaItemSeen, + ImportOrExportItemReview, ImportOrExportMetadataItemSeen, }; use providers::openlibrary::get_key; use reqwest::{ @@ -18,7 +18,7 @@ use sea_orm::prelude::DateTimeUtc; use serde::{Deserialize, Serialize}; use serde_with::{formats::Flexible, serde_as, TimestampMilliSeconds}; -use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem}; +use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem}; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "snake_case")] @@ -146,17 +146,6 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { .unwrap(); let mut lists: Vec = rsp.json().await.unwrap(); - let collections = lists - .iter() - .map(|l| CreateOrUpdateCollectionInput { - name: l.name.clone(), - description: l.description.as_ref().and_then(|s| match s.as_str() { - "" => None, - x => Some(x.to_owned()), - }), - ..Default::default() - }) - .collect(); for list in lists.iter_mut() { let rsp = client .get(format!("{}/list/items", url)) @@ -168,7 +157,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { list.items = items; } - let mut failed_items = vec![]; + let mut failed = vec![]; // all items returned here are seen at least once let rsp = client.get(format!("{}/items", url)).send().await.unwrap(); @@ -193,10 +182,10 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { let data_len = data.len(); - let mut final_data = vec![]; + let mut completed = vec![]; for (idx, d) in data.into_iter().enumerate() { let Some(media_type) = d.media_type else { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: None, step: ImportFailStep::ItemDetailsFromSource, identifier: d.id.to_string(), @@ -214,7 +203,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { Ok(s) => s, Err(e) => { ryot_log!(error, "Encountered error for id = {id:?}: {e:?}", id = d.id); - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::ItemDetailsFromSource, identifier: d.id.to_string(), @@ -226,7 +215,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { let (identifier, source) = match media_type { MediaType::Book => { if let Some(_g_id) = details.goodreads_id { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::ItemDetailsFromSource, identifier: d.id.to_string(), @@ -264,7 +253,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { } } - let item = ImportOrExportMediaItem { + let item = ImportOrExportMetadataItem { source_id: d.id.to_string(), source, lot, @@ -302,22 +291,27 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { } else { (None, None) }; - ImportOrExportMediaItemSeen { + ImportOrExportMetadataItemSeen { ended_on: s.date.map(|d| d.date_naive()), show_season_number: season_number, show_episode_number: episode_number, - provider_watched_on: Some(ImportSource::MediaTracker.to_string()), + provider_watched_on: Some(ImportSource::Mediatracker.to_string()), ..Default::default() } }) .collect(), }; - final_data.push(item); + completed.push(ImportCompletedItem::Metadata(item)); } - Ok(ImportResult { - metadata: final_data, - failed_items, - collections, - ..Default::default() - }) + completed.extend(lists.iter().map(|l| { + ImportCompletedItem::Collection(CreateOrUpdateCollectionInput { + name: l.name.clone(), + description: l.description.as_ref().and_then(|s| match s.as_str() { + "" => None, + x => Some(x.to_owned()), + }), + ..Default::default() + }) + })); + Ok(ImportResult { completed, failed }) } diff --git a/crates/services/importer/src/movary.rs b/crates/services/importer/src/movary.rs index 82f213e1bb..08b2a90305 100644 --- a/crates/services/importer/src/movary.rs +++ b/crates/services/importer/src/movary.rs @@ -3,17 +3,17 @@ use chrono::NaiveDate; use common_models::DefaultCollection; use common_utils::convert_naive_to_utc; use csv::Reader; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ImportSource, MediaLot, MediaSource}; use media_models::{ DeployMovaryImportInput, ImportOrExportItemRating, ImportOrExportItemReview, - ImportOrExportMediaItemSeen, + ImportOrExportMetadataItemSeen, }; use rust_decimal::Decimal; use rust_decimal_macros::dec; use serde::{Deserialize, Serialize}; -use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem}; +use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem}; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -43,13 +43,13 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { let lot = MediaLot::Movie; let source = MediaSource::Tmdb; let mut media = vec![]; - let mut failed_items = vec![]; + let mut failed = vec![]; let mut ratings_reader = Reader::from_path(input.ratings).unwrap(); for (idx, result) in ratings_reader.deserialize().enumerate() { let record: Rating = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -58,7 +58,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { continue; } }; - media.push(ImportOrExportMediaItem { + media.push(ImportOrExportMetadataItem { source_id: record.common.title.clone(), lot, source, @@ -76,7 +76,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { let record: Common = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -85,7 +85,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { continue; } }; - media.push(ImportOrExportMediaItem { + media.push(ImportOrExportMetadataItem { source_id: record.title.clone(), lot, source, @@ -99,7 +99,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { let record: History = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -109,7 +109,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { } }; let watched_at = Some(convert_naive_to_utc(record.watched_at)); - let seen_item = ImportOrExportMediaItemSeen { + let seen_item = ImportOrExportMetadataItemSeen { started_on: None, ended_on: watched_at.map(|d| d.date_naive()), provider_watched_on: Some(ImportSource::Movary.to_string()), @@ -144,7 +144,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { ..Default::default() }) } - media.push(ImportOrExportMediaItem { + media.push(ImportOrExportMetadataItem { source_id: record.common.title.clone(), lot, source, @@ -156,8 +156,10 @@ pub async fn import(input: DeployMovaryImportInput) -> Result { } } Ok(ImportResult { - metadata: media, - failed_items, - ..Default::default() + failed, + completed: media + .into_iter() + .map(ImportCompletedItem::Metadata) + .collect(), }) } diff --git a/crates/services/importer/src/mal.rs b/crates/services/importer/src/myanimelist.rs similarity index 85% rename from crates/services/importer/src/mal.rs rename to crates/services/importer/src/myanimelist.rs index fd8f7ef96f..6db8b11573 100644 --- a/crates/services/importer/src/mal.rs +++ b/crates/services/importer/src/myanimelist.rs @@ -6,13 +6,13 @@ use std::{ use async_graphql::Result; use chrono::NaiveDate; use common_utils::convert_string_to_date; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ImportSource, MediaLot, MediaSource}; use flate2::bufread::GzDecoder; use itertools::Itertools; use media_models::{ - DeployMalImportInput, ImportOrExportItemRating, ImportOrExportMediaItem, - ImportOrExportMediaItemSeen, + DeployMalImportInput, ImportOrExportItemRating, ImportOrExportMetadataItem, + ImportOrExportMetadataItemSeen, }; use rust_decimal::{prelude::FromPrimitive, Decimal}; use rust_decimal_macros::dec; @@ -27,15 +27,18 @@ pub async fn import(input: DeployMalImportInput) -> Result { .manga_path .map(|p| decode_data::(&p).unwrap()) .unwrap_or_default(); - let mut media = vec![]; + let mut metadata = vec![]; for item in anime_data.items.into_iter() { - media.push(convert_to_format(item, MediaLot::Anime)); + metadata.push(convert_to_format(item, MediaLot::Anime)); } for item in manga_data.items.into_iter() { - media.push(convert_to_format(item, MediaLot::Manga)); + metadata.push(convert_to_format(item, MediaLot::Manga)); } Ok(ImportResult { - metadata: media, + completed: metadata + .into_iter() + .map(ImportCompletedItem::Metadata) + .collect(), ..Default::default() }) } @@ -60,7 +63,7 @@ fn get_date(date: String) -> Option { } } -fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMediaItem { +fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMetadataItem { let seen_history = (1..item.done + 1) .map(|i| { let (anime_episode, manga_chapter) = match lot { @@ -68,12 +71,12 @@ fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMediaItem { MediaLot::Manga => (None, Some(Decimal::new(i as i64, 0))), _ => unreachable!(), }; - ImportOrExportMediaItemSeen { + ImportOrExportMetadataItemSeen { started_on: get_date(item.my_start_date.clone()), ended_on: get_date(item.my_finish_date.clone()), anime_episode_number: anime_episode, manga_chapter_number: manga_chapter, - provider_watched_on: Some(ImportSource::Mal.to_string()), + provider_watched_on: Some(ImportSource::Myanimelist.to_string()), ..Default::default() } }) @@ -87,7 +90,7 @@ fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMediaItem { }, ..Default::default() }; - ImportOrExportMediaItem { + ImportOrExportMetadataItem { lot, source: MediaSource::Mal, identifier: item.identifier.to_string(), diff --git a/crates/services/importer/src/open_scale.rs b/crates/services/importer/src/open_scale.rs index 521c561a45..8b8a6e939b 100644 --- a/crates/services/importer/src/open_scale.rs +++ b/crates/services/importer/src/open_scale.rs @@ -2,7 +2,7 @@ use async_graphql::Result; use chrono::NaiveDateTime; use csv::ReaderBuilder; use database_models::user_measurement; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use fitness_models::UserMeasurementStats; use itertools::Itertools; use media_models::DeployGenericCsvImportInput; @@ -40,8 +40,8 @@ pub async fn import( input: DeployGenericCsvImportInput, timezone: &chrono_tz::Tz, ) -> Result { - let mut measurements = vec![]; - let mut failed_items = vec![]; + let mut completed = vec![]; + let mut failed = vec![]; let ratings_reader = ReaderBuilder::new() .from_path(input.csv_path) .unwrap() @@ -51,7 +51,7 @@ pub async fn import( let record: Record = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: None, step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -63,7 +63,7 @@ pub async fn import( let ndt = NaiveDateTime::parse_from_str(&record.date_time, "%Y-%m-%d %H:%M") .expect("Failed to parse input string"); let timestamp = utils::get_date_time_with_offset(ndt, timezone); - measurements.push(user_measurement::Model { + completed.push(ImportCompletedItem::Measurement(user_measurement::Model { timestamp, user_id: "".to_string(), name: None, @@ -88,11 +88,7 @@ pub async fn import( total_body_water: record.water, ..Default::default() }, - }); + })); } - Ok(ImportResult { - measurements, - failed_items, - ..Default::default() - }) + Ok(ImportResult { failed, completed }) } diff --git a/crates/services/importer/src/plex.rs b/crates/services/importer/src/plex.rs new file mode 100644 index 0000000000..54edf87b5b --- /dev/null +++ b/crates/services/importer/src/plex.rs @@ -0,0 +1,171 @@ +use application_utils::get_base_http_client; +use async_graphql::Result; +use common_models::StringIdObject; +use common_utils::ryot_log; +use dependent_models::{ImportCompletedItem, ImportResult}; +use enums::{ImportSource, MediaLot, MediaSource}; +use importer_models::{ImportFailStep, ImportFailedItem}; +use media_models::{ + DeployUrlAndKeyImportInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen, +}; +use reqwest::header::{HeaderName, HeaderValue, ACCEPT}; +use sea_orm::prelude::DateTimeUtc; +use serde::Deserialize; +use serde_with::{formats::Flexible, serde_as, TimestampSeconds}; + +#[serde_as] +#[derive(Debug, Deserialize)] +struct PlexMetadataItem { + title: String, + #[serde(rename = "type")] + item_type: String, + #[serde(rename = "ratingKey")] + rating_key: Option, + key: String, + #[serde(rename = "Guid")] + guid: Option>, + #[serde_as(as = "Option>")] + #[serde(rename = "lastViewedAt")] + last_viewed_at: Option, + index: Option, + #[serde(rename = "parentIndex")] + parent_index: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +struct PlexLibrary { + pub directory: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +struct PlexMetadata { + pub metadata: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +struct PlexMediaResponse { + pub media_container: T, +} + +pub async fn import(input: DeployUrlAndKeyImportInput) -> Result { + let client = get_base_http_client(Some(vec![ + ( + HeaderName::from_static("x-plex-token"), + HeaderValue::from_str(&input.api_key).unwrap(), + ), + (ACCEPT, HeaderValue::from_static("application/json")), + ])); + let libraries = client + .get(format!("{}/library/sections", input.api_url)) + .send() + .await? + .json::>() + .await?; + + let mut success_items = vec![]; + let mut failed_items = vec![]; + for dir in libraries.media_container.directory { + ryot_log!(debug, "Processing directory {:?}", dir.title); + let item_type = dir.item_type.as_str(); + if !["movie", "show"].contains(&item_type) { + ryot_log!(debug, "Skipping directory {:?}", dir.title); + continue; + } + let lot = match item_type { + "movie" => MediaLot::Movie, + "show" => MediaLot::Show, + _ => unreachable!(), + }; + let items = client + .get(format!( + "{}/library/sections/{}/all", + input.api_url, dir.key + )) + .query(&serde_json::json!({ "includeGuids": "1" })) + .send() + .await? + .json::>() + .await?; + for item in items.media_container.metadata { + if item.last_viewed_at.is_some() { + let gu_ids = item.guid.unwrap_or_default(); + let Some(tmdb_id) = gu_ids + .iter() + .find(|g| g.id.starts_with("tmdb://")) + .map(|g| &g.id[7..]) + else { + failed_items.push(ImportFailedItem { + lot: Some(lot), + identifier: item.key.clone(), + step: ImportFailStep::ItemDetailsFromSource, + error: Some("No TMDb ID associated with this media".to_string()), + }); + continue; + }; + match lot { + MediaLot::Movie => { + success_items.push(ImportCompletedItem::Metadata( + ImportOrExportMetadataItem { + lot, + reviews: vec![], + source_id: item.key, + collections: vec![], + source: MediaSource::Tmdb, + identifier: tmdb_id.to_string(), + seen_history: vec![ImportOrExportMetadataItemSeen { + ended_on: item.last_viewed_at.map(|d| d.date_naive()), + provider_watched_on: Some(ImportSource::Plex.to_string()), + ..Default::default() + }], + }, + )); + } + MediaLot::Show => { + let leaves = client + .get(format!( + "{}/library/metadata/{}/allLeaves", + input.api_url, + item.rating_key.unwrap() + )) + .send() + .await? + .json::>() + .await?; + let mut item = ImportOrExportMetadataItem { + lot, + reviews: vec![], + collections: vec![], + seen_history: vec![], + source: MediaSource::Tmdb, + source_id: item.key.clone(), + identifier: tmdb_id.to_string(), + }; + for leaf in leaves.media_container.metadata { + if leaf.last_viewed_at.is_some() { + item.seen_history.push(ImportOrExportMetadataItemSeen { + show_episode_number: leaf.index, + show_season_number: leaf.parent_index, + ended_on: leaf.last_viewed_at.map(|d| d.date_naive()), + provider_watched_on: Some(ImportSource::Plex.to_string()), + ..Default::default() + }); + } + } + if !item.seen_history.is_empty() { + success_items.push(ImportCompletedItem::Metadata(item)); + } + } + _ => unreachable!(), + } + } + } + } + + Ok(ImportResult { + completed: success_items, + failed: failed_items, + }) +} diff --git a/crates/services/importer/src/story_graph.rs b/crates/services/importer/src/storygraph.rs similarity index 88% rename from crates/services/importer/src/story_graph.rs rename to crates/services/importer/src/storygraph.rs index 48d8628c18..0800b0dd21 100644 --- a/crates/services/importer/src/story_graph.rs +++ b/crates/services/importer/src/storygraph.rs @@ -3,12 +3,12 @@ use chrono::NaiveDate; use common_utils::ryot_log; use convert_case::{Case, Casing}; use csv::Reader; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ImportSource, MediaLot}; use itertools::Itertools; use media_models::{ DeployGenericCsvImportInput, ImportOrExportItemRating, ImportOrExportItemReview, - ImportOrExportMediaItemSeen, + ImportOrExportMetadataItemSeen, }; use providers::{google_books::GoogleBooksService, openlibrary::OpenlibraryService}; use rust_decimal::Decimal; @@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize}; use crate::utils; -use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem}; +use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem}; #[derive(Debug, Serialize, Deserialize)] #[serde(untagged)] @@ -56,7 +56,7 @@ pub async fn import( ) -> Result { let lot = MediaLot::Book; let mut media = vec![]; - let mut failed_items = vec![]; + let mut failed = vec![]; let ratings_reader = Reader::from_path(input.csv_path) .unwrap() .deserialize() @@ -66,7 +66,7 @@ pub async fn import( let record: History = match result { Ok(r) => r, Err(e) => { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: idx.to_string(), @@ -81,7 +81,7 @@ pub async fn import( title = record.title ); let Some(isbn) = record.isbn else { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: record.title, @@ -93,7 +93,7 @@ pub async fn import( utils::get_identifier_from_book_isbn(&isbn, google_books_service, open_library_service) .await else { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(lot), step: ImportFailStep::InputTransformation, identifier: record.title, @@ -109,10 +109,10 @@ pub async fn import( "Got identifier = {identifier:?} from source = {source:?}" ); let mut seen_history = vec![ - ImportOrExportMediaItemSeen { + ImportOrExportMetadataItemSeen { started_on: None, ended_on: None, - provider_watched_on: Some(ImportSource::StoryGraph.to_string()), + provider_watched_on: Some(ImportSource::Storygraph.to_string()), ..Default::default() }; record.read_count @@ -130,7 +130,7 @@ pub async fn import( if let Some(t) = record.tags { collections.extend(t.split(", ").map(|d| d.to_case(Case::Title))) } - media.push(ImportOrExportMediaItem { + media.push(ImportOrExportMetadataItem { source_id: record.title.clone(), lot, source, @@ -153,8 +153,10 @@ pub async fn import( }) } Ok(ImportResult { - metadata: media, - failed_items, - ..Default::default() + failed, + completed: media + .into_iter() + .map(ImportCompletedItem::Metadata) + .collect(), }) } diff --git a/crates/services/importer/src/strong_app.rs b/crates/services/importer/src/strong_app.rs index 07d6cccd0b..af2d1b984a 100644 --- a/crates/services/importer/src/strong_app.rs +++ b/crates/services/importer/src/strong_app.rs @@ -1,47 +1,76 @@ -use std::fs; +use std::{collections::HashMap, fs, sync::Arc}; use async_graphql::Result; use chrono::{Duration, NaiveDateTime}; +use common_utils::ryot_log; use csv::ReaderBuilder; -use dependent_models::ImportResult; +use database_models::{exercise, prelude::Exercise}; +use dependent_models::{ImportCompletedItem, ImportResult}; +use enums::ExerciseLot; use fitness_models::{ SetLot, UserExerciseInput, UserWorkoutInput, UserWorkoutSetRecord, WorkoutSetStatistic, }; +use importer_models::{ImportFailStep, ImportFailedItem}; +use indexmap::IndexMap; use itertools::Itertools; use media_models::DeployStrongAppImportInput; -use regex::Regex; +use nanoid::nanoid; use rust_decimal::Decimal; use rust_decimal_macros::dec; +use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; use serde::{Deserialize, Serialize}; +use supporting_service::SupportingService; use super::utils; #[derive(Debug, Serialize, Deserialize, Clone, Default)] #[serde(rename_all = "PascalCase")] struct Entry { + #[serde(alias = "Workout #")] + workout_number: String, date: String, + #[serde(alias = "Workout Name")] + workout_name: String, + #[serde(alias = "Duration (sec)", alias = "Duration")] + workout_duration: String, + #[serde(alias = "Exercise Name")] + exercise_name: String, + #[serde(alias = "Set Order")] + set_order: String, + #[serde(alias = "Weight (kg)")] weight: Option, reps: Option, + #[serde(alias = "Distance (m)")] distance: Option, seconds: Option, notes: Option, - #[serde(alias = "Set Order")] - set_order: u8, - #[serde(alias = "Workout Duration", alias = "Duration")] - workout_duration: String, - #[serde(alias = "Workout Name")] - workout_name: String, #[serde(alias = "Workout Notes")] workout_notes: Option, - #[serde(alias = "Exercise Name")] - exercise_name: String, } pub async fn import( input: DeployStrongAppImportInput, - timezone: &chrono_tz::Tz, + ss: &Arc, ) -> Result { - let file_string = fs::read_to_string(&input.export_path)?; + let mut completed = vec![]; + let mut failed = vec![]; + if let Some(csv_path) = input.data_export_path { + import_exercises(csv_path, ss, &mut failed, &mut completed).await?; + } + Ok(ImportResult { + failed, + completed, + ..Default::default() + }) +} + +async fn import_exercises( + csv_path: String, + ss: &Arc, + failed: &mut Vec, + completed: &mut Vec, +) -> Result<()> { + let file_string = fs::read_to_string(&csv_path)?; // DEV: Delimiter is `;` on android and `,` on iOS, so we determine it by reading the first line let data = file_string.clone(); let first_line = data.lines().next().unwrap(); @@ -52,93 +81,139 @@ pub async fn import( } else { return Err("Could not determine delimiter".into()); }; - let mut workouts = vec![]; - let mut entries_reader = ReaderBuilder::new() + + let mut unique_exercises: HashMap = HashMap::new(); + let entries_reader = ReaderBuilder::new() .delimiter(delimiter) .from_reader(file_string.as_bytes()) .deserialize::() .map(|r| r.unwrap()) .collect_vec(); - // DEV: Without this, the last workout does not get appended - entries_reader.push(Entry { - date: "invalid".to_string(), - set_order: 0, - ..Default::default() - }); - let mut exercises = vec![]; - let mut sets = vec![]; - let mut notes = vec![]; - for (entry, next_entry) in entries_reader.into_iter().tuple_windows() { - let target_exercise = input - .mapping - .iter() - .find(|m| m.source_name == entry.exercise_name.trim()) - .ok_or_else(|| format!("No mapping found for '{}'", entry.exercise_name))?; - let mut weight = entry.weight.map(|d| if d == dec!(0) { dec!(1) } else { d }); - if let Some(mul) = target_exercise.multiplier { - weight = weight.map(|w| w.saturating_mul(mul)); - } - sets.push(UserWorkoutSetRecord { - statistic: WorkoutSetStatistic { - weight, - reps: entry.reps, - distance: entry.distance, - duration: entry.seconds.and_then(|r| r.checked_div(dec!(60))), - ..Default::default() - }, - note: None, - rest_time: None, - confirmed_at: None, - lot: SetLot::Normal, - }); - if let Some(n) = entry.notes { - notes.push(n); - } - if next_entry.set_order <= entry.set_order { - exercises.push(UserExerciseInput { - sets, - notes, - assets: None, - exercise_id: target_exercise.target_name.clone(), - }); - sets = vec![]; - notes = vec![]; + + let mut workouts_to_entries = IndexMap::new(); + for entry in entries_reader.clone() { + workouts_to_entries + .entry(entry.workout_number.clone()) + .or_insert(vec![]) + .push(entry); + } + + let mut exercises_to_workouts = IndexMap::new(); + + for (workout_number, entries) in workouts_to_entries { + let mut exercises = IndexMap::new(); + for entry in entries { + exercises + .entry(entry.exercise_name.clone()) + .or_insert(vec![]) + .push(entry); } - if next_entry.date != entry.date { - let ndt = NaiveDateTime::parse_from_str(&entry.date, "%Y-%m-%d %H:%M:%S") - .expect("Failed to parse input string"); - let ndt = utils::get_date_time_with_offset(ndt, timezone); - let re = Regex::new(r"^(\d+h)?\s?(\d+m)?$").unwrap(); - let workout_duration = if let Some(captures) = re.captures(&entry.workout_duration) { - let hours = captures.get(1).map_or(0, |m| { - m.as_str().trim_end_matches('h').parse::().unwrap_or(0) - }); - let minutes = captures.get(2).map_or(0, |m| { - m.as_str().trim_end_matches('m').parse::().unwrap_or(0) + exercises_to_workouts.insert(workout_number, exercises); + } + + for (_workout_number, workout) in exercises_to_workouts { + let first_exercise = workout.first().unwrap().1.first().unwrap(); + let ndt = NaiveDateTime::parse_from_str(&first_exercise.date, "%Y-%m-%d %H:%M:%S") + .expect("Failed to parse input string"); + let ndt = utils::get_date_time_with_offset(ndt, &ss.timezone); + let workout_duration = + Duration::try_seconds(first_exercise.workout_duration.parse().unwrap()).unwrap(); + let mut collected_exercises = vec![]; + for (exercise_name, exercises) in workout.clone() { + let mut collected_sets = vec![]; + let mut notes = vec![]; + let valid_ex = exercises.iter().find(|e| e.set_order != "Note").unwrap(); + let exercise_lot = if valid_ex.seconds.is_some() && valid_ex.distance.is_some() { + ExerciseLot::DistanceAndDuration + } else if valid_ex.seconds.is_some() { + ExerciseLot::Duration + } else if valid_ex.reps.is_some() && valid_ex.weight.is_some() { + ExerciseLot::RepsAndWeight + } else if valid_ex.reps.is_some() { + ExerciseLot::Reps + } else { + failed.push(ImportFailedItem { + lot: None, + step: ImportFailStep::InputTransformation, + identifier: format!( + "Workout #{}, Set #{}", + valid_ex.workout_number, valid_ex.set_order + ), + error: Some(format!( + "Could not determine exercise lot: {}", + serde_json::to_string(&valid_ex).unwrap() + )), }); - Duration::try_hours(hours).unwrap() + Duration::try_minutes(minutes).unwrap() + continue; + }; + let existing_exercise = Exercise::find() + .filter(exercise::Column::Id.eq(&exercise_name)) + .filter(exercise::Column::Lot.eq(exercise_lot)) + .one(&ss.db) + .await?; + let exercise_id = if let Some(db_ex) = existing_exercise { + db_ex.id + } else if let Some(mem_ex) = unique_exercises.get(&exercise_name) { + mem_ex.id.clone() } else { - Duration::try_seconds(0).unwrap() + let id = format!("{} [{}]", exercise_name, nanoid!(5)); + unique_exercises.insert( + exercise_name.clone(), + exercise::Model { + id: id.clone(), + lot: exercise_lot, + ..Default::default() + }, + ); + id }; - workouts.push(UserWorkoutInput { - exercises, + ryot_log!(debug, "Importing exercise with id = {}", exercise_id); + for sets in exercises { + if let Some(note) = sets.notes { + notes.push(note); + } + let weight = sets.weight.map(|d| if d == dec!(0) { dec!(1) } else { d }); + collected_sets.push(UserWorkoutSetRecord { + statistic: WorkoutSetStatistic { + weight, + reps: sets.reps, + duration: sets.seconds.and_then(|r| r.checked_div(dec!(60))), + distance: sets.distance.and_then(|d| d.checked_div(dec!(1000))), + ..Default::default() + }, + note: None, + rest_time: None, + confirmed_at: None, + lot: SetLot::Normal, + }); + } + collected_exercises.push(UserExerciseInput { + notes, + exercise_id, assets: None, - start_time: ndt, - supersets: vec![], - template_id: None, - repeated_from: None, - create_workout_id: None, - update_workout_id: None, - name: entry.workout_name, - comment: entry.workout_notes, - end_time: ndt + workout_duration, - update_workout_template_id: None, + sets: collected_sets, }); - exercises = vec![]; } + completed.push(ImportCompletedItem::Workout(UserWorkoutInput { + assets: None, + start_time: ndt, + supersets: vec![], + template_id: None, + repeated_from: None, + create_workout_id: None, + update_workout_id: None, + exercises: collected_exercises, + end_time: ndt + workout_duration, + update_workout_template_id: None, + name: first_exercise.workout_name.clone(), + comment: first_exercise.workout_notes.clone(), + })); } - Ok(ImportResult { - workouts, - ..Default::default() - }) + completed.extend( + unique_exercises + .values() + .cloned() + .map(ImportCompletedItem::Exercise), + ); + Ok(()) } diff --git a/crates/services/importer/src/trakt.rs b/crates/services/importer/src/trakt.rs index b33f4e2279..5cb3ce4dc7 100644 --- a/crates/services/importer/src/trakt.rs +++ b/crates/services/importer/src/trakt.rs @@ -2,13 +2,13 @@ use application_utils::get_base_http_client; use async_graphql::Result; use common_utils::{ryot_log, APPLICATION_JSON_HEADER}; use convert_case::{Case, Casing}; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ImportSource, MediaLot, MediaSource}; use env_utils::TRAKT_CLIENT_ID; use itertools::Itertools; use media_models::{ CreateOrUpdateCollectionInput, DeployTraktImportInput, ImportOrExportItemRating, - ImportOrExportItemReview, ImportOrExportMediaItemSeen, + ImportOrExportItemReview, ImportOrExportMetadataItemSeen, }; use reqwest::header::{HeaderName, HeaderValue, CONTENT_TYPE}; use rust_decimal::Decimal; @@ -16,7 +16,7 @@ use rust_decimal_macros::dec; use sea_orm::prelude::DateTimeUtc; use serde::{Deserialize, Serialize}; -use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem}; +use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem}; const API_URL: &str = "https://api.trakt.tv"; const API_VERSION: &str = "2"; @@ -55,8 +55,8 @@ struct ListResponse { } pub async fn import(input: DeployTraktImportInput) -> Result { - let mut media = vec![]; - let mut failed_items = vec![]; + let mut completed = vec![]; + let mut failed = vec![]; let url = format!("{}/users/{}", API_URL, input.username); let client = get_base_http_client(Some(vec![ @@ -105,28 +105,13 @@ pub async fn import(input: DeployTraktImportInput) -> Result { match process_item(i) { Ok(mut d) => { d.collections.push(l.name.to_case(Case::Title)); - media.push(d) + completed.push(d) } - Err(d) => failed_items.push(d), + Err(d) => failed.push(d), } } } - let collections = lists - .iter() - .map(|l| CreateOrUpdateCollectionInput { - name: l.name.to_case(Case::Title), - description: l.description.as_ref().and_then(|s| { - if s.is_empty() { - None - } else { - Some(s.to_owned()) - } - }), - ..Default::default() - }) - .collect_vec(); - for type_ in ["movies", "shows"] { let rsp = client .get(format!("{}/ratings/{}", url, type_)) @@ -150,13 +135,13 @@ pub async fn import(input: DeployTraktImportInput) -> Result { }), ..Default::default() }); - if let Some(a) = media.iter_mut().find(|i| i.source_id == d.source_id) { + if let Some(a) = completed.iter_mut().find(|i| i.source_id == d.source_id) { a.reviews = d.reviews; } else { - media.push(d) + completed.push(d) } } - Err(d) => failed_items.push(d), + Err(d) => failed.push(d), } } } @@ -200,7 +185,7 @@ pub async fn import(input: DeployTraktImportInput) -> Result { if d.lot == MediaLot::Show && (show_season_number.is_none() || show_episode_number.is_none()) { - failed_items.push(ImportFailedItem { + failed.push(ImportFailedItem { lot: Some(d.lot), step: ImportFailStep::ItemDetailsFromSource, identifier: "".to_owned(), @@ -211,34 +196,47 @@ pub async fn import(input: DeployTraktImportInput) -> Result { }); continue; } - d.seen_history.push(ImportOrExportMediaItemSeen { + d.seen_history.push(ImportOrExportMetadataItemSeen { ended_on: item.watched_at.map(|d| d.date_naive()), show_season_number, provider_watched_on: Some(ImportSource::Trakt.to_string()), show_episode_number, ..Default::default() }); - if let Some(a) = media + if let Some(a) = completed .iter_mut() .find(|i| i.identifier == d.identifier && i.lot == d.lot) { a.seen_history.extend(d.seen_history); } else { - media.push(d) + completed.push(d) } } - Err(d) => failed_items.push(d), + Err(d) => failed.push(d), } } - Ok(ImportResult { - collections, - metadata: media, - failed_items, - ..Default::default() - }) + + let mut completed = completed + .into_iter() + .map(ImportCompletedItem::Metadata) + .collect_vec(); + completed.extend(lists.iter().map(|l| { + ImportCompletedItem::Collection(CreateOrUpdateCollectionInput { + name: l.name.to_case(Case::Title), + description: l.description.as_ref().and_then(|s| { + if s.is_empty() { + None + } else { + Some(s.to_owned()) + } + }), + ..Default::default() + }) + })); + Ok(ImportResult { completed, failed }) } -fn process_item(i: &ListItemResponse) -> Result { +fn process_item(i: &ListItemResponse) -> Result { let (source_id, identifier, lot) = if let Some(d) = i.movie.as_ref() { (d.ids.trakt, d.ids.tmdb, MediaLot::Movie) } else if let Some(d) = i.show.as_ref() { @@ -252,7 +250,7 @@ fn process_item(i: &ListItemResponse) -> Result Ok(ImportOrExportMediaItem { + Some(identifier) => Ok(ImportOrExportMetadataItem { lot, source: MediaSource::Tmdb, source_id: source_id.to_string(), diff --git a/crates/services/integration/Cargo.toml b/crates/services/integration/Cargo.toml index 664d0a35ea..996a58f121 100644 --- a/crates/services/integration/Cargo.toml +++ b/crates/services/integration/Cargo.toml @@ -15,12 +15,12 @@ database-utils = { path = "../../utils/database" } dependent-models = { path = "../../models/dependent" } dependent-utils = { path = "../../utils/dependent" } enums = { path = "../../enums" } -eventsource-stream = "=0.2.3" +eventsource-stream = { workspace = true } external-utils = { path = "../../utils/external" } itertools = { workspace = true } media-models = { path = "../../models/media" } providers = { path = "../../providers" } -radarr-api-rs = "=3.0.1" +radarr-api-rs = { workspace = true } regex = { workspace = true } reqwest = { workspace = true } rust_decimal = { workspace = true } @@ -29,7 +29,7 @@ sea-orm = { workspace = true } sea-query = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -sonarr-api-rs = "=3.0.0" +sonarr-api-rs = { workspace = true } specific-models = { path = "../../models/specific" } supporting-service = { path = "../supporting" } tokio = { workspace = true } diff --git a/crates/services/integration/src/lib.rs b/crates/services/integration/src/lib.rs index b486c9a7a7..cf10e1ddbd 100644 --- a/crates/services/integration/src/lib.rs +++ b/crates/services/integration/src/lib.rs @@ -9,7 +9,7 @@ use database_models::{ seen, user_to_entity, }; use database_utils::user_by_id; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use dependent_utils::{commit_metadata, process_import}; use enums::{EntityLot, IntegrationLot, IntegrationProvider, MediaLot}; use media_models::SeenShowExtraInformation; @@ -45,34 +45,42 @@ impl IntegrationService { updates: ImportResult, ) -> GqlResult<()> { let mut import = updates; - import.metadata.iter_mut().for_each(|media| { - media.seen_history.retain(|update| match update.progress { - Some(progress) if progress < integration.minimum_progress.unwrap() => { - ryot_log!( - debug, - "Progress update for integration {} is below minimum threshold", - integration.id - ); - false - } - Some(_) => true, - None => false, - }); - media.seen_history.iter_mut().for_each(|update| { - update.ended_on = Some(Utc::now().date_naive()); - if let Some(progress) = update.progress { - if progress > integration.maximum_progress.unwrap() { - ryot_log!( - debug, - "Changing progress to 100 for integration {}", - integration.id - ); - update.progress = Some(dec!(100)); + import.completed.iter_mut().for_each(|item| { + if let ImportCompletedItem::Metadata(metadata) = item { + metadata + .seen_history + .retain(|update| match update.progress { + Some(progress) if progress < integration.minimum_progress.unwrap() => { + ryot_log!( + debug, + "Progress update for integration {} is below minimum threshold", + integration.id + ); + false + } + Some(_) => true, + None => false, + }); + metadata.seen_history.iter_mut().for_each(|update| { + update.ended_on = Some(Utc::now().date_naive()); + if let Some(progress) = update.progress { + if progress > integration.maximum_progress.unwrap() { + ryot_log!( + debug, + "Changing progress to 100 for integration {}", + integration.id + ); + update.progress = Some(dec!(100)); + } } - } - }); + }); + } }); - match process_import(&integration.user_id, true, import, &self.0).await { + match process_import(&integration.user_id, true, import, &self.0, |_| async { + Ok(()) + }) + .await + { Ok(_) => { let mut to_update: integration::ActiveModel = integration.into(); to_update.last_triggered_on = ActiveValue::Set(Some(Utc::now())); diff --git a/crates/services/integration/src/push/jellyfin.rs b/crates/services/integration/src/push/jellyfin.rs index 6eb0a31c5a..14b800b9c6 100644 --- a/crates/services/integration/src/push/jellyfin.rs +++ b/crates/services/integration/src/push/jellyfin.rs @@ -1,3 +1,4 @@ +use anyhow::Result; use common_utils::ryot_log; use enums::MediaLot; use external_utils::jellyfin::{get_authenticated_client, ItemsResponse}; @@ -33,7 +34,7 @@ impl<'a> JellyfinPushIntegration<'a> { } } - pub async fn push_progress(&self) -> anyhow::Result<()> { + pub async fn push_progress(&self) -> Result<()> { match *self.metadata_lot { MediaLot::Movie | MediaLot::Show => {} _ => { diff --git a/crates/services/integration/src/push/radarr.rs b/crates/services/integration/src/push/radarr.rs index 58b5907050..f6d30982b3 100644 --- a/crates/services/integration/src/push/radarr.rs +++ b/crates/services/integration/src/push/radarr.rs @@ -1,3 +1,4 @@ +use anyhow::Result; use common_utils::ryot_log; use enums::MediaLot; use radarr_api_rs::{ @@ -40,7 +41,7 @@ impl RadarrPushIntegration { } } - pub async fn push_progress(&self) -> anyhow::Result<()> { + pub async fn push_progress(&self) -> Result<()> { if self.metadata_lot != MediaLot::Movie { ryot_log!(debug, "Not a movie, skipping {:#?}", self.metadata_title); return Ok(()); diff --git a/crates/services/integration/src/push/sonarr.rs b/crates/services/integration/src/push/sonarr.rs index 72db381d8f..626cbad63d 100644 --- a/crates/services/integration/src/push/sonarr.rs +++ b/crates/services/integration/src/push/sonarr.rs @@ -1,3 +1,4 @@ +use anyhow::Result; use common_utils::ryot_log; use enums::MediaLot; use sonarr_api_rs::{ @@ -40,7 +41,7 @@ impl SonarrPushIntegration { } } - pub async fn push_progress(&self) -> anyhow::Result<()> { + pub async fn push_progress(&self) -> Result<()> { if self.metadata_lot != MediaLot::Show { ryot_log!(debug, "Not a show, skipping {:#?}", self.metadata_title); return Ok(()); diff --git a/crates/services/integration/src/sink/emby.rs b/crates/services/integration/src/sink/emby.rs index 93c266549f..006c78bd35 100644 --- a/crates/services/integration/src/sink/emby.rs +++ b/crates/services/integration/src/sink/emby.rs @@ -1,7 +1,7 @@ use anyhow::{bail, Result}; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; -use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen}; +use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen}; use rust_decimal::Decimal; use rust_decimal_macros::dec; use sea_orm::DatabaseConnection; @@ -90,11 +90,11 @@ impl EmbySinkIntegration { _ => bail!("Only movies and shows supported"), }; Ok(ImportResult { - metadata: vec![ImportOrExportMediaItem { + completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot, identifier, source: MediaSource::Tmdb, - seen_history: vec![ImportOrExportMediaItemSeen { + seen_history: vec![ImportOrExportMetadataItemSeen { provider_watched_on: Some("Emby".to_string()), progress: Some(position / runtime * dec!(100)), show_season_number: payload.item.season_number, @@ -102,7 +102,7 @@ impl EmbySinkIntegration { ..Default::default() }], ..Default::default() - }], + })], ..Default::default() }) } diff --git a/crates/services/integration/src/sink/generic_json.rs b/crates/services/integration/src/sink/generic_json.rs index ffb9fa3179..f73274e3fd 100644 --- a/crates/services/integration/src/sink/generic_json.rs +++ b/crates/services/integration/src/sink/generic_json.rs @@ -1,5 +1,5 @@ use anyhow::{bail, Result}; -use dependent_models::{CompleteExport, ImportResult}; +use dependent_models::{CompleteExport, ImportCompletedItem, ImportResult}; pub(crate) struct GenericJsonSinkIntegration { payload: String, @@ -14,12 +14,24 @@ impl GenericJsonSinkIntegration { Ok(val) => val, Err(err) => bail!(err), }; + let mut completed = vec![]; + for media in payload.media.unwrap_or_default() { + completed.push(ImportCompletedItem::Metadata(media)); + } + for people in payload.people.unwrap_or_default() { + completed.push(ImportCompletedItem::Person(people)); + } + for measurement in payload.measurements.unwrap_or_default() { + completed.push(ImportCompletedItem::Measurement(measurement)); + } + for workout in payload.workouts.unwrap_or_default() { + completed.push(ImportCompletedItem::ApplicationWorkout(workout)); + } + for media_group in payload.media_groups.unwrap_or_default() { + completed.push(ImportCompletedItem::MetadataGroup(media_group)); + } Ok(ImportResult { - metadata: payload.media.unwrap_or_default(), - people: payload.people.unwrap_or_default(), - measurements: payload.measurements.unwrap_or_default(), - metadata_groups: payload.media_groups.unwrap_or_default(), - application_workouts: payload.workouts.unwrap_or_default(), + completed, ..Default::default() }) } diff --git a/crates/services/integration/src/sink/jellyfin.rs b/crates/services/integration/src/sink/jellyfin.rs index 5e76411bfb..fef7743c7f 100644 --- a/crates/services/integration/src/sink/jellyfin.rs +++ b/crates/services/integration/src/sink/jellyfin.rs @@ -1,7 +1,7 @@ use anyhow::{bail, Result}; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; -use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen}; +use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen}; use rust_decimal::Decimal; use rust_decimal_macros::dec; use serde::{Deserialize, Serialize}; @@ -89,11 +89,11 @@ impl JellyfinSinkIntegration { }; Ok(ImportResult { - metadata: vec![ImportOrExportMediaItem { + completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot, identifier, source: MediaSource::Tmdb, - seen_history: vec![ImportOrExportMediaItemSeen { + seen_history: vec![ImportOrExportMetadataItemSeen { progress: Some(position / runtime * dec!(100)), show_season_number: payload.item.season_number, show_episode_number: payload.item.episode_number, @@ -101,7 +101,7 @@ impl JellyfinSinkIntegration { ..Default::default() }], ..Default::default() - }], + })], ..Default::default() }) } diff --git a/crates/services/integration/src/sink/kodi.rs b/crates/services/integration/src/sink/kodi.rs index 73001ce310..ffc3afb33f 100644 --- a/crates/services/integration/src/sink/kodi.rs +++ b/crates/services/integration/src/sink/kodi.rs @@ -1,7 +1,7 @@ use anyhow::{bail, Result}; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; -use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen}; +use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen}; use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; @@ -29,11 +29,11 @@ impl KodiSinkIntegration { }; Ok(ImportResult { - metadata: vec![ImportOrExportMediaItem { + completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot: payload.lot, source: MediaSource::Tmdb, identifier: payload.identifier, - seen_history: vec![ImportOrExportMediaItemSeen { + seen_history: vec![ImportOrExportMetadataItemSeen { progress: Some(payload.progress), provider_watched_on: Some("Kodi".to_string()), show_season_number: payload.show_season_number, @@ -41,7 +41,7 @@ impl KodiSinkIntegration { ..Default::default() }], ..Default::default() - }], + })], ..Default::default() }) } diff --git a/crates/services/integration/src/sink/plex.rs b/crates/services/integration/src/sink/plex.rs index a638e60853..1eba48b6af 100644 --- a/crates/services/integration/src/sink/plex.rs +++ b/crates/services/integration/src/sink/plex.rs @@ -1,7 +1,8 @@ use anyhow::{bail, Context, Result}; -use dependent_models::ImportResult; +use common_models::StringIdObject; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; -use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen}; +use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen}; use regex::Regex; use rust_decimal::Decimal; use rust_decimal_macros::dec; @@ -13,10 +14,6 @@ use crate::utils::get_show_by_episode_identifier; mod models { use super::*; - #[derive(Serialize, Deserialize, Debug, Clone)] - pub struct PlexWebhookMetadataGuid { - pub id: String, - } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct PlexWebhookMetadataPayload { #[serde(rename = "type")] @@ -31,7 +28,7 @@ mod models { #[serde(rename = "index")] pub episode_number: Option, #[serde(rename = "Guid")] - pub guids: Vec, + pub guids: Vec, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct PlexWebhookAccount { @@ -75,10 +72,7 @@ impl PlexSinkIntegration { serde_json::from_str(json_payload).context("Error during JSON payload deserialization") } - fn get_tmdb_identifier<'a>( - &self, - guids: &'a [models::PlexWebhookMetadataGuid], - ) -> Result<&'a str> { + fn get_tmdb_identifier<'a>(&self, guids: &'a [StringIdObject]) -> Result<&'a str> { guids .iter() .find(|g| g.id.starts_with("tmdb://")) @@ -133,11 +127,11 @@ impl PlexSinkIntegration { let progress = self.calculate_progress(&payload)?; Ok(ImportResult { - metadata: vec![ImportOrExportMediaItem { + completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem { lot, identifier, source: MediaSource::Tmdb, - seen_history: vec![ImportOrExportMediaItemSeen { + seen_history: vec![ImportOrExportMetadataItemSeen { progress: Some(progress), provider_watched_on: Some("Plex".to_string()), show_season_number: payload.metadata.season_number, @@ -145,7 +139,7 @@ impl PlexSinkIntegration { ..Default::default() }], ..Default::default() - }], + })], ..Default::default() }) } diff --git a/crates/services/integration/src/yank/audiobookshelf.rs b/crates/services/integration/src/yank/audiobookshelf.rs index 7d17c4a602..fa82f0ae9b 100644 --- a/crates/services/integration/src/yank/audiobookshelf.rs +++ b/crates/services/integration/src/yank/audiobookshelf.rs @@ -6,9 +6,9 @@ use async_graphql::Result as GqlResult; use common_models::DefaultCollection; use common_utils::ryot_log; use database_models::metadata; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; -use media_models::{CommitMediaInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen}; +use media_models::{CommitMediaInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen}; use providers::google_books::GoogleBooksService; use reqwest::header::{HeaderValue, AUTHORIZATION}; use rust_decimal_macros::dec; @@ -161,18 +161,20 @@ impl AudiobookshelfYankIntegration { } else { resp.progress }; - result.metadata.push(ImportOrExportMediaItem { - lot, - source, - identifier, - seen_history: vec![ImportOrExportMediaItemSeen { - podcast_episode_number, - progress: Some(progress * dec!(100)), - provider_watched_on: Some("Audiobookshelf".to_string()), + result.completed.push(ImportCompletedItem::Metadata( + ImportOrExportMetadataItem { + lot, + source, + identifier, + seen_history: vec![ImportOrExportMetadataItemSeen { + podcast_episode_number, + progress: Some(progress * dec!(100)), + provider_watched_on: Some("Audiobookshelf".to_string()), + ..Default::default() + }], ..Default::default() - }], - ..Default::default() - }); + }, + )); } Err(e) => { ryot_log!(debug, "Error getting progress for item {:?}: {:?}", item, e); @@ -216,13 +218,15 @@ impl AudiobookshelfYankIntegration { } else { continue; }; - result.metadata.push(ImportOrExportMediaItem { - identifier, - lot, - source, - collections: vec![DefaultCollection::Owned.to_string()], - ..Default::default() - }); + result.completed.push(ImportCompletedItem::Metadata( + ImportOrExportMetadataItem { + lot, + source, + identifier, + collections: vec![DefaultCollection::Owned.to_string()], + ..Default::default() + }, + )); } } } diff --git a/crates/services/integration/src/yank/komga.rs b/crates/services/integration/src/yank/komga.rs index 32cefd4562..43442266d3 100644 --- a/crates/services/integration/src/yank/komga.rs +++ b/crates/services/integration/src/yank/komga.rs @@ -9,11 +9,11 @@ use async_graphql::futures_util::{stream, StreamExt}; use common_models::DefaultCollection; use common_utils::ryot_log; use database_models::{metadata, prelude::Metadata}; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{MediaLot, MediaSource}; use eventsource_stream::Eventsource; use itertools::Itertools; -use media_models::{CommitMediaInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen}; +use media_models::{CommitMediaInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen}; use reqwest::Url; use rust_decimal::{prelude::FromPrimitive, Decimal}; use rust_decimal_macros::dec; @@ -189,7 +189,7 @@ pub(crate) struct KomgaYankIntegration { sync_to_owned_collection: Option, } -type ProcessEventReturn = (CommitMediaInput, ImportOrExportMediaItemSeen); +type ProcessEventReturn = (CommitMediaInput, ImportOrExportMetadataItemSeen); impl KomgaYankIntegration { pub fn new( @@ -372,7 +372,7 @@ impl KomgaYankIntegration { lot: MediaLot::Manga, force_update: None, }, - ImportOrExportMediaItemSeen { + ImportOrExportMetadataItemSeen { progress: Some( self.calculate_percentage(book.read_progress.page, book.media.pages_count), ), @@ -403,13 +403,13 @@ impl KomgaYankIntegration { match self.find_provider_and_id(&book).await { Ok((source, Some(id))) => Some(( id.clone(), - ImportOrExportMediaItem { + ImportCompletedItem::Metadata(ImportOrExportMetadataItem { identifier: id, lot: MediaLot::Manga, source, collections: vec![DefaultCollection::Owned.to_string()], ..Default::default() - }, + }), )), _ => { tracing::debug!("No URL or database entry found for manga: {}", book.name); @@ -420,7 +420,7 @@ impl KomgaYankIntegration { .collect() .await; result - .metadata + .completed .extend(unique_collection_updates.into_values()); Ok(()) } @@ -496,13 +496,15 @@ impl KomgaYankIntegration { let media_items = unique_media_items.into_values().collect_vec(); ryot_log!(debug, "Media Items: {:?}", media_items); media_items.into_iter().for_each(|(commit, hist)| { - result.metadata.push(ImportOrExportMediaItem { - lot: commit.lot, - source: commit.source, - seen_history: vec![hist], - identifier: commit.identifier, - ..Default::default() - }); + result + .completed + .push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem { + lot: commit.lot, + source: commit.source, + seen_history: vec![hist], + identifier: commit.identifier, + ..Default::default() + })); }); if let Some(true) = self.sync_to_owned_collection { diff --git a/crates/services/jwt/Cargo.toml b/crates/services/jwt/Cargo.toml index 3b2508e7c4..b26d719609 100644 --- a/crates/services/jwt/Cargo.toml +++ b/crates/services/jwt/Cargo.toml @@ -8,5 +8,5 @@ anyhow = { workspace = true } chrono = { workspace = true } serde = { workspace = true } serde_with = { workspace = true } -jsonwebtoken = { version = "=9.3.0", default-features = false } +jsonwebtoken = { workspace = true } uuid = { workspace = true } diff --git a/crates/services/miscellaneous/src/lib.rs b/crates/services/miscellaneous/src/lib.rs index 21749f1609..036d9e9646 100644 --- a/crates/services/miscellaneous/src/lib.rs +++ b/crates/services/miscellaneous/src/lib.rs @@ -17,8 +17,8 @@ use common_models::{ StringIdObject, }; use common_utils::{ - get_first_and_last_day_of_month, ryot_log, IsFeatureEnabled, PAGE_SIZE, - SHOW_SPECIAL_SEASON_NAMES, + get_first_and_last_day_of_month, ryot_log, IsFeatureEnabled, EXERCISE_LOT_MAPPINGS, + MEDIA_LOT_MAPPINGS, PAGE_SIZE, SHOW_SPECIAL_SEASON_NAMES, }; use database_models::{ access_link, application_cache, calendar_event, collection, collection_to_entity, @@ -27,8 +27,8 @@ use database_models::{ metadata_to_metadata_group, metadata_to_person, monitored_entity, notification_platform, person, prelude::{ - AccessLink, ApplicationCache, CalendarEvent, Collection, CollectionToEntity, Genre, - ImportReport, Metadata, MetadataGroup, MetadataToGenre, MetadataToMetadata, + AccessLink, ApplicationCache, CalendarEvent, Collection, CollectionToEntity, Exercise, + Genre, ImportReport, Metadata, MetadataGroup, MetadataToGenre, MetadataToMetadata, MetadataToMetadataGroup, MetadataToPerson, MonitoredEntity, NotificationPlatform, Person, QueuedNotification, Review, Seen, User, UserToEntity, }, @@ -40,8 +40,10 @@ use database_utils::{ item_reviews, remove_entity_from_collection, revoke_access_link, user_by_id, }; use dependent_models::{ - CoreDetails, GenreDetails, MetadataBaseData, MetadataGroupDetails, PersonDetails, - SearchResults, UserMetadataDetails, UserMetadataGroupDetails, UserPersonDetails, + CoreDetails, ExerciseFilters, ExerciseParameters, ExerciseParametersLotMapping, GenreDetails, + MetadataBaseData, MetadataGroupDetails, MetadataLotSourceMappings, PersonDetails, + ProviderLanguageInformation, SearchResults, UserMetadataDetails, UserMetadataGroupDetails, + UserPersonDetails, }; use dependent_utils::{ commit_metadata, commit_metadata_group_internal, commit_metadata_internal, commit_person, @@ -54,7 +56,9 @@ use dependent_utils::{ refresh_collection_to_entity_association, update_metadata_and_notify_users, }; use enums::{ - EntityLot, MediaLot, MediaSource, MetadataToMetadataRelation, SeenState, UserToMediaReason, + EntityLot, ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic, + ExerciseMuscle, MediaLot, MediaSource, MetadataToMetadataRelation, SeenState, + UserToMediaReason, }; use env_utils::APP_VERSION; use futures::TryStreamExt; @@ -71,11 +75,11 @@ use media_models::{ MetadataPartialDetails, MetadataSearchInput, MetadataSearchItemResponse, MetadataVideo, MetadataVideoSource, PartialMetadata, PartialMetadataWithoutId, PeopleListInput, PeopleSearchInput, PeopleSearchItem, PersonAndMetadataGroupsSortBy, PersonDetailsGroupedByRole, - PersonDetailsItemWithCharacter, PodcastSpecifics, ProgressUpdateInput, - ProviderLanguageInformation, ReviewPostedEvent, SeenAnimeExtraInformation, - SeenPodcastExtraInformation, SeenShowExtraInformation, ShowSpecifics, UpdateSeenItemInput, - UserCalendarEventInput, UserMediaNextEntry, UserMetadataDetailsEpisodeProgress, - UserMetadataDetailsShowSeasonProgress, UserUpcomingCalendarEventInput, + PersonDetailsItemWithCharacter, PodcastSpecifics, ProgressUpdateInput, ReviewPostedEvent, + SeenAnimeExtraInformation, SeenPodcastExtraInformation, SeenShowExtraInformation, + ShowSpecifics, UpdateSeenItemInput, UserCalendarEventInput, UserMediaNextEntry, + UserMetadataDetailsEpisodeProgress, UserMetadataDetailsShowSeasonProgress, + UserUpcomingCalendarEventInput, }; use migrations::{ AliasedCalendarEvent, AliasedMetadata, AliasedMetadataToGenre, AliasedReview, AliasedSeen, @@ -241,12 +245,13 @@ ORDER BY RANDOM() LIMIT 10; Ok(()) } - pub async fn core_details(&self) -> CoreDetails { + pub async fn core_details(&self) -> Result { let mut files_enabled = self.0.config.file_storage.is_enabled(); if files_enabled && !self.0.file_storage_service.is_enabled().await { files_enabled = false; } - CoreDetails { + let download_required = Exercise::find().count(&self.0.db).await? == 0; + Ok(CoreDetails { page_size: PAGE_SIZE, is_pro: self.0.is_pro, version: APP_VERSION.to_owned(), @@ -262,7 +267,91 @@ ORDER BY RANDOM() LIMIT 10; local_auth_disabled: self.0.config.users.disable_local_auth, repository_link: "https://github.com/ignisda/ryot".to_owned(), token_valid_for_days: self.0.config.users.token_valid_for_days, - } + metadata_lot_source_mappings: MEDIA_LOT_MAPPINGS + .iter() + .map(|(lot, sources)| MetadataLotSourceMappings { + lot: *lot, + sources: sources.to_vec(), + }) + .collect(), + exercise_parameters: ExerciseParameters { + filters: ExerciseFilters { + lot: ExerciseLot::iter().collect_vec(), + level: ExerciseLevel::iter().collect_vec(), + force: ExerciseForce::iter().collect_vec(), + mechanic: ExerciseMechanic::iter().collect_vec(), + equipment: ExerciseEquipment::iter().collect_vec(), + muscle: ExerciseMuscle::iter().collect_vec(), + }, + download_required, + lot_mapping: EXERCISE_LOT_MAPPINGS + .iter() + .map(|(lot, pbs)| ExerciseParametersLotMapping { + lot: *lot, + bests: pbs.to_vec(), + }) + .collect(), + }, + metadata_provider_languages: MediaSource::iter() + .map(|source| { + let (supported, default) = match source { + MediaSource::Itunes => ( + ITunesService::supported_languages(), + ITunesService::default_language(), + ), + MediaSource::Audible => ( + AudibleService::supported_languages(), + AudibleService::default_language(), + ), + MediaSource::Openlibrary => ( + OpenlibraryService::supported_languages(), + OpenlibraryService::default_language(), + ), + MediaSource::Tmdb => ( + TmdbService::supported_languages(), + TmdbService::default_language(), + ), + MediaSource::Listennotes => ( + ListennotesService::supported_languages(), + ListennotesService::default_language(), + ), + MediaSource::GoogleBooks => ( + GoogleBooksService::supported_languages(), + GoogleBooksService::default_language(), + ), + MediaSource::Igdb => ( + IgdbService::supported_languages(), + IgdbService::default_language(), + ), + MediaSource::MangaUpdates => ( + MangaUpdatesService::supported_languages(), + MangaUpdatesService::default_language(), + ), + MediaSource::Anilist => ( + AnilistService::supported_languages(), + AnilistService::default_language(), + ), + MediaSource::Mal => ( + MalService::supported_languages(), + MalService::default_language(), + ), + MediaSource::Custom => ( + CustomService::supported_languages(), + CustomService::default_language(), + ), + MediaSource::Vndb => ( + VndbService::supported_languages(), + VndbService::default_language(), + ), + }; + ProviderLanguageInformation { + source, + default, + supported, + } + }) + .collect(), + }) } async fn metadata_assets(&self, meta: &metadata::Model) -> Result { @@ -1910,68 +1999,6 @@ ORDER BY RANDOM() LIMIT 10; Statement::from_sql_and_values(DatabaseBackend::Postgres, sql, values) } - pub fn providers_language_information(&self) -> Vec { - MediaSource::iter() - .map(|source| { - let (supported, default) = match source { - MediaSource::Itunes => ( - ITunesService::supported_languages(), - ITunesService::default_language(), - ), - MediaSource::Audible => ( - AudibleService::supported_languages(), - AudibleService::default_language(), - ), - MediaSource::Openlibrary => ( - OpenlibraryService::supported_languages(), - OpenlibraryService::default_language(), - ), - MediaSource::Tmdb => ( - TmdbService::supported_languages(), - TmdbService::default_language(), - ), - MediaSource::Listennotes => ( - ListennotesService::supported_languages(), - ListennotesService::default_language(), - ), - MediaSource::GoogleBooks => ( - GoogleBooksService::supported_languages(), - GoogleBooksService::default_language(), - ), - MediaSource::Igdb => ( - IgdbService::supported_languages(), - IgdbService::default_language(), - ), - MediaSource::MangaUpdates => ( - MangaUpdatesService::supported_languages(), - MangaUpdatesService::default_language(), - ), - MediaSource::Anilist => ( - AnilistService::supported_languages(), - AnilistService::default_language(), - ), - MediaSource::Mal => ( - MalService::supported_languages(), - MalService::default_language(), - ), - MediaSource::Custom => ( - CustomService::supported_languages(), - CustomService::default_language(), - ), - MediaSource::Vndb => ( - VndbService::supported_languages(), - VndbService::default_language(), - ), - }; - ProviderLanguageInformation { - supported, - default, - source, - } - }) - .collect() - } - async fn get_monitored_entities( &self, entity_lot: EntityLot, diff --git a/crates/services/notification/Cargo.toml b/crates/services/notification/Cargo.toml index 88a86a63c1..55dff6c95f 100644 --- a/crates/services/notification/Cargo.toml +++ b/crates/services/notification/Cargo.toml @@ -5,11 +5,11 @@ edition = "2021" [dependencies] anyhow = { workspace = true } -askama = "0.12.1" +askama = { workspace = true } common-utils = { path = "../../utils/common" } config = { path = "../../config" } convert_case = { workspace = true } -lettre = "=0.11.10" +lettre = { workspace = true } reqwest = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/utils/common/Cargo.toml b/crates/utils/common/Cargo.toml index 610aa84607..91a75e98dd 100644 --- a/crates/utils/common/Cargo.toml +++ b/crates/utils/common/Cargo.toml @@ -5,8 +5,9 @@ edition = "2021" [dependencies] chrono = { workspace = true } -compile-time = "=0.2.0" +compile-time = { workspace = true } const-str = { workspace = true } +enums = { path = "../../enums" } env-utils = { path = "../env" } reqwest = { workspace = true } serde = { workspace = true } diff --git a/crates/utils/common/src/lib.rs b/crates/utils/common/src/lib.rs index 36658e9bde..95f7d0dd52 100644 --- a/crates/utils/common/src/lib.rs +++ b/crates/utils/common/src/lib.rs @@ -1,6 +1,7 @@ use std::{convert::TryInto, fmt}; use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc}; +use enums::{ExerciseLot, MediaLot, MediaSource, WorkoutSetPersonalBest}; use env_utils::APP_VERSION; use reqwest::header::HeaderValue; use serde::de; @@ -26,6 +27,47 @@ pub const SHOW_SPECIAL_SEASON_NAMES: [&str; 2] = ["Specials", "Extras"]; pub static APPLICATION_JSON_HEADER: HeaderValue = HeaderValue::from_static("application/json"); pub const FRONTEND_OAUTH_ENDPOINT: &str = "/api/auth"; pub const PAGE_SIZE: i32 = 20; +pub const EXERCISE_LOT_MAPPINGS: &[(ExerciseLot, &[WorkoutSetPersonalBest])] = &[ + (ExerciseLot::Duration, &[WorkoutSetPersonalBest::Time]), + ( + ExerciseLot::DistanceAndDuration, + &[WorkoutSetPersonalBest::Pace, WorkoutSetPersonalBest::Time], + ), + ( + ExerciseLot::RepsAndWeight, + &[ + WorkoutSetPersonalBest::Weight, + WorkoutSetPersonalBest::OneRm, + WorkoutSetPersonalBest::Volume, + WorkoutSetPersonalBest::Reps, + ], + ), + (ExerciseLot::Reps, &[WorkoutSetPersonalBest::Reps]), +]; +pub const MEDIA_LOT_MAPPINGS: &[(MediaLot, &[MediaSource])] = &[ + (MediaLot::AudioBook, &[MediaSource::Audible]), + ( + MediaLot::Book, + &[MediaSource::Openlibrary, MediaSource::GoogleBooks], + ), + ( + MediaLot::Podcast, + &[MediaSource::Itunes, MediaSource::Listennotes], + ), + (MediaLot::VideoGame, &[MediaSource::Igdb]), + (MediaLot::Anime, &[MediaSource::Anilist, MediaSource::Mal]), + ( + MediaLot::Manga, + &[ + MediaSource::Anilist, + MediaSource::MangaUpdates, + MediaSource::Mal, + ], + ), + (MediaLot::Movie, &[MediaSource::Tmdb]), + (MediaLot::Show, &[MediaSource::Tmdb]), + (MediaLot::VisualNovel, &[MediaSource::Vndb]), +]; #[macro_export] macro_rules! ryot_log { diff --git a/crates/utils/dependent/src/lib.rs b/crates/utils/dependent/src/lib.rs index d1721c0c8d..a7a8e3b08a 100644 --- a/crates/utils/dependent/src/lib.rs +++ b/crates/utils/dependent/src/lib.rs @@ -1,4 +1,4 @@ -use std::{cmp::Reverse, collections::HashMap, iter::zip, sync::Arc}; +use std::{cmp::Reverse, collections::HashMap, future::Future, iter::zip, sync::Arc}; use anyhow::{bail, Result as AnyhowResult}; use application_utils::get_current_date; @@ -9,7 +9,7 @@ use common_models::{ ApplicationCacheKey, BackgroundJob, ChangeCollectionToEntityInput, DefaultCollection, MediaStateChanged, StoredUrl, StringIdObject, }; -use common_utils::{ryot_log, SHOW_SPECIAL_SEASON_NAMES}; +use common_utils::{ryot_log, EXERCISE_LOT_MAPPINGS, SHOW_SPECIAL_SEASON_NAMES}; use database_models::{ collection_to_entity, exercise, genre, metadata, metadata_group, metadata_to_genre, metadata_to_metadata, metadata_to_person, monitored_entity, person, @@ -23,10 +23,10 @@ use database_utils::{ add_entity_to_collection, admin_account_guard, create_or_update_collection, deploy_job_to_re_evaluate_user_workouts, remove_entity_from_collection, user_by_id, }; -use dependent_models::ImportResult; +use dependent_models::{ImportCompletedItem, ImportResult}; use enums::{ - EntityLot, ExerciseLot, MediaLot, MediaSource, MetadataToMetadataRelation, SeenState, - Visibility, + EntityLot, ExerciseLot, ExerciseSource, MediaLot, MediaSource, MetadataToMetadataRelation, + SeenState, Visibility, WorkoutSetPersonalBest, }; use file_storage_service::FileStorageService; use fitness_models::{ @@ -35,8 +35,8 @@ use fitness_models::{ UserToExerciseHistoryExtraInformation, UserWorkoutInput, UserWorkoutSetRecord, WorkoutEquipmentFocusedSummary, WorkoutFocusedSummary, WorkoutForceFocusedSummary, WorkoutInformation, WorkoutLevelFocusedSummary, WorkoutLotFocusedSummary, - WorkoutMuscleFocusedSummary, WorkoutOrExerciseTotals, WorkoutSetPersonalBest, WorkoutSetRecord, - WorkoutSetStatistic, WorkoutSetTotals, WorkoutSummary, WorkoutSummaryExercise, LOT_MAPPINGS, + WorkoutMuscleFocusedSummary, WorkoutOrExerciseTotals, WorkoutSetRecord, WorkoutSetStatistic, + WorkoutSetTotals, WorkoutSummary, WorkoutSummaryExercise, }; use importer_models::{ImportDetails, ImportFailStep, ImportFailedItem, ImportResultResponse}; use itertools::Itertools; @@ -64,7 +64,7 @@ use providers::{ vndb::VndbService, }; use rust_decimal::{ - prelude::{One, ToPrimitive}, + prelude::{FromPrimitive, One, ToPrimitive}, Decimal, }; use rust_decimal_macros::dec; @@ -1827,7 +1827,7 @@ pub async fn create_or_update_workout( .clone() .unwrap_or_default() .personal_bests; - let types_of_prs = LOT_MAPPINGS + let types_of_prs = EXERCISE_LOT_MAPPINGS .iter() .find(|lm| lm.0 == db_ex.lot) .map(|lm| lm.1) @@ -1999,296 +1999,328 @@ async fn create_collection_and_add_entity_to_it( Ok(()) } -pub async fn process_import( +pub async fn create_custom_exercise( + user_id: &String, + input: exercise::Model, + ss: &Arc, +) -> Result { + let exercise_id = input.id.clone(); + let mut input = input; + input.created_by_user_id = Some(user_id.clone()); + input.source = ExerciseSource::Custom; + input.attributes.internal_images = input + .attributes + .images + .clone() + .into_iter() + .map(StoredUrl::S3) + .collect(); + input.attributes.images = vec![]; + let input: exercise::ActiveModel = input.into(); + let exercise = match Exercise::find_by_id(exercise_id) + .filter(exercise::Column::Source.eq(ExerciseSource::Custom)) + .one(&ss.db) + .await? + { + None => input.insert(&ss.db).await?, + Some(_) => { + let input = input.reset_all(); + input.update(&ss.db).await? + } + }; + ryot_log!(debug, "Created custom exercise with id = {}", exercise.id); + add_entity_to_collection( + &user_id.clone(), + ChangeCollectionToEntityInput { + entity_id: exercise.id.clone(), + entity_lot: EntityLot::Exercise, + creator_user_id: user_id.to_owned(), + collection_name: DefaultCollection::Custom.to_string(), + ..Default::default() + }, + ss, + ) + .await?; + Ok(exercise.id) +} + +pub async fn process_import( user_id: &String, respect_cache: bool, import: ImportResult, ss: &Arc, -) -> Result { - let mut import = import; + on_item_processed: impl Fn(Decimal) -> F, +) -> Result<(ImportResult, ImportResultResponse)> +where + F: Future>, +{ let preferences = user_by_id(user_id, ss).await?.preferences; - for m in import.metadata.iter_mut() { - m.seen_history.sort_by(|a, b| { - a.ended_on - .unwrap_or_default() - .cmp(&b.ended_on.unwrap_or_default()) - }); - } - - let total = import.collections.len() - + import.metadata.len() - + import.metadata_groups.len() - + import.people.len() - + import.workouts.len() - + import.measurements.len(); - - for (idx, col_details) in import.collections.into_iter().enumerate() { - create_or_update_collection(&ss.db, user_id, col_details).await?; - ryot_log!(debug, "Collection {} created", idx); - } + let mut import = import; + // DEV: We need to sort the exercises to make sure they are created before the workouts + // DEV: because the workouts depend on the exercises. + import.completed.sort_by_key(|i| match i { + ImportCompletedItem::Exercise(_) => 0, + _ => 1, + }); + let source_result = import.clone(); + let total = import.completed.len(); - for (idx, item) in import.metadata.into_iter().enumerate() { - let source_id = if item.source_id.is_empty() { - item.identifier.clone() - } else { - item.source_id.clone() - }; - ryot_log!(debug, "Importing media with identifier = {:#?}", source_id); - let rev_length = item.reviews.len(); - let identifier = item.identifier.clone(); - let data = commit_metadata( - CommitMediaInput { - identifier, - lot: item.lot, - source: item.source, - force_update: None, - }, - ss, - ) - .await; - let metadata = match data { - Ok(r) => r, - Err(e) => { - ryot_log!(error, "{e:?}"); - import.failed_items.push(ImportFailedItem { - lot: Some(item.lot), - step: ImportFailStep::MediaDetailsFromProvider, - identifier: item.source_id.to_owned(), - error: Some(e.message), - }); - continue; - } - }; - for seen in item.seen_history.iter() { - let progress = if seen.progress.is_some() { - seen.progress - } else { - Some(dec!(100)) - }; - if let Err(e) = progress_update( - user_id, - respect_cache, - ProgressUpdateInput { - progress, - change_state: None, - date: seen.ended_on, - start_date: seen.started_on, - metadata_id: metadata.id.clone(), - show_season_number: seen.show_season_number, - show_episode_number: seen.show_episode_number, - manga_volume_number: seen.manga_volume_number, - anime_episode_number: seen.anime_episode_number, - manga_chapter_number: seen.manga_chapter_number, - podcast_episode_number: seen.podcast_episode_number, - provider_watched_on: seen.provider_watched_on.clone(), - }, - ss, - ) - .await - { - import.failed_items.push(ImportFailedItem { - lot: Some(item.lot), - step: ImportFailStep::SeenHistoryConversion, - identifier: item.source_id.to_owned(), - error: Some(e.message), - }); - }; - } - for review in item.reviews.iter() { - if let Some(input) = convert_review_into_input( - review, - &preferences, - metadata.id.clone(), - EntityLot::Metadata, - ) { - if let Err(e) = post_review(user_id, input, ss).await { - import.failed_items.push(ImportFailedItem { - lot: Some(item.lot), - step: ImportFailStep::ReviewConversion, - identifier: item.source_id.to_owned(), - error: Some(e.message), - }); - }; - } - } - for col in item.collections.into_iter() { - create_collection_and_add_entity_to_it( - ss, - user_id, - col, - metadata.id.clone(), - EntityLot::Metadata, - ) - .await?; - } - ryot_log!( - debug, - "Imported item: {idx}, lot: {lot}, history count: {hist}, review count: {rev}", - idx = idx + 1, - lot = item.lot, - hist = item.seen_history.len(), - rev = rev_length, - ); - } - for (idx, item) in import.metadata_groups.into_iter().enumerate() { + for (idx, item) in import.completed.into_iter().enumerate() { ryot_log!( debug, - "Importing media group with identifier = {identifier}", - identifier = &item.title + "Processing item ({}) {}/{}", + item.to_string(), + idx + 1, + total, ); - let rev_length = item.reviews.len(); - let data = - commit_metadata_group_internal(&item.identifier, item.lot, item.source, ss).await; - let metadata_group_id = match data { - Ok(r) => r.0, - Err(e) => { - ryot_log!(error, "{e:?}"); - import.failed_items.push(ImportFailedItem { - lot: Some(item.lot), - step: ImportFailStep::MediaDetailsFromProvider, - identifier: item.title.to_owned(), - error: Some(e.message), - }); - continue; + match item { + ImportCompletedItem::Empty => {} + ImportCompletedItem::Exercise(exercise) => { + create_custom_exercise(user_id, exercise, ss).await?; } - }; - for review in item.reviews.iter() { - if let Some(input) = convert_review_into_input( - review, - &preferences, - metadata_group_id.clone(), - EntityLot::MetadataGroup, - ) { - if let Err(e) = post_review(user_id, input, ss).await { - import.failed_items.push(ImportFailedItem { - lot: Some(item.lot), - step: ImportFailStep::ReviewConversion, - identifier: item.title.to_owned(), - error: Some(e.message), - }); - }; + ImportCompletedItem::Collection(col_details) => { + create_or_update_collection(&ss.db, user_id, col_details).await?; } - } - for col in item.collections.into_iter() { - create_collection_and_add_entity_to_it( - ss, - user_id, - col, - metadata_group_id.clone(), - EntityLot::MetadataGroup, - ) - .await?; - } - ryot_log!( - debug, - "Imported item: {idx}, lot: {lot}, review count: {rev}", - idx = idx + 1, - lot = item.lot, - rev = rev_length, - ); - } - for (idx, item) in import.people.into_iter().enumerate() { - let person = commit_person( - CommitPersonInput { - identifier: item.identifier.clone(), - name: item.name.clone(), - source: item.source, - source_specifics: item.source_specifics.clone(), - }, - &ss.db, - ) - .await?; - for review in item.reviews.iter() { - if let Some(input) = convert_review_into_input( - review, - &preferences, - person.id.clone(), - EntityLot::Person, - ) { - if let Err(e) = post_review(user_id, input, ss).await { - import.failed_items.push(ImportFailedItem { - lot: None, - step: ImportFailStep::ReviewConversion, - identifier: item.name.to_owned(), - error: Some(e.message), - }); + ImportCompletedItem::Metadata(metadata) => { + let source_id = if metadata.source_id.is_empty() { + metadata.identifier.clone() + } else { + metadata.source_id.clone() + }; + ryot_log!(debug, "Importing media with identifier = {:#?}", source_id); + let identifier = metadata.identifier.clone(); + let db_metadata = match commit_metadata( + CommitMediaInput { + identifier, + lot: metadata.lot, + force_update: None, + source: metadata.source, + }, + ss, + ) + .await + { + Ok(r) => r, + Err(e) => { + ryot_log!(error, "{e:?}"); + import.failed.push(ImportFailedItem { + lot: Some(metadata.lot), + step: ImportFailStep::MediaDetailsFromProvider, + identifier: metadata.source_id.to_owned(), + error: Some(e.message), + }); + continue; + } }; + for seen in metadata.seen_history.iter() { + let progress = if seen.progress.is_some() { + seen.progress + } else { + Some(dec!(100)) + }; + if let Err(e) = progress_update( + user_id, + respect_cache, + ProgressUpdateInput { + progress, + change_state: None, + date: seen.ended_on, + start_date: seen.started_on, + metadata_id: db_metadata.id.clone(), + show_season_number: seen.show_season_number, + show_episode_number: seen.show_episode_number, + manga_volume_number: seen.manga_volume_number, + anime_episode_number: seen.anime_episode_number, + manga_chapter_number: seen.manga_chapter_number, + podcast_episode_number: seen.podcast_episode_number, + provider_watched_on: seen.provider_watched_on.clone(), + }, + ss, + ) + .await + { + import.failed.push(ImportFailedItem { + lot: Some(metadata.lot), + step: ImportFailStep::SeenHistoryConversion, + identifier: metadata.source_id.to_owned(), + error: Some(e.message), + }); + }; + } + for review in metadata.reviews.iter() { + if let Some(input) = convert_review_into_input( + review, + &preferences, + db_metadata.id.clone(), + EntityLot::Metadata, + ) { + if let Err(e) = post_review(user_id, input, ss).await { + import.failed.push(ImportFailedItem { + lot: Some(metadata.lot), + step: ImportFailStep::ReviewConversion, + identifier: metadata.source_id.to_owned(), + error: Some(e.message), + }); + }; + } + } + for col in metadata.collections.into_iter() { + create_collection_and_add_entity_to_it( + ss, + user_id, + col, + db_metadata.id.clone(), + EntityLot::Metadata, + ) + .await?; + } } - } - for col in item.collections.into_iter() { - create_collection_and_add_entity_to_it( - ss, - user_id, - col, - person.id.clone(), - EntityLot::Person, - ) - .await?; - } - ryot_log!( - debug, - "Imported person: {idx}, name: {name}", - idx = idx + 1, - name = item.name, - ); - } - for (idx, workout) in import.workouts.into_iter().enumerate() { - if let Err(err) = create_or_update_workout(workout, user_id, ss).await { - import.failed_items.push(ImportFailedItem { - lot: None, - step: ImportFailStep::InputTransformation, - identifier: "Exercise".to_string(), - error: Some(err.to_string()), - }); - } - ryot_log!(debug, "Workout {} created", idx); - } - for (idx, workout) in import.application_workouts.into_iter().enumerate() { - let workout_input = db_workout_to_workout_input(workout.details); - match create_or_update_workout(workout_input, user_id, ss).await { - Err(err) => { - import.failed_items.push(ImportFailedItem { - lot: None, - step: ImportFailStep::InputTransformation, - identifier: "Exercise".to_string(), - error: Some(err.to_string()), - }); + ImportCompletedItem::MetadataGroup(metadata_group) => { + let metadata_group_id = match commit_metadata_group_internal( + &metadata_group.identifier, + metadata_group.lot, + metadata_group.source, + ss, + ) + .await + { + Ok(r) => r.0, + Err(e) => { + ryot_log!(error, "{e:?}"); + import.failed.push(ImportFailedItem { + lot: Some(metadata_group.lot), + step: ImportFailStep::MediaDetailsFromProvider, + identifier: metadata_group.title.to_owned(), + error: Some(e.message), + }); + continue; + } + }; + for review in metadata_group.reviews.iter() { + if let Some(input) = convert_review_into_input( + review, + &preferences, + metadata_group_id.clone(), + EntityLot::MetadataGroup, + ) { + if let Err(e) = post_review(user_id, input, ss).await { + import.failed.push(ImportFailedItem { + lot: Some(metadata_group.lot), + step: ImportFailStep::ReviewConversion, + identifier: metadata_group.title.to_owned(), + error: Some(e.message), + }); + }; + } + } + for col in metadata_group.collections.into_iter() { + create_collection_and_add_entity_to_it( + ss, + user_id, + col, + metadata_group_id.clone(), + EntityLot::MetadataGroup, + ) + .await?; + } } - Ok(workout_id) => { - for col in workout.collections.into_iter() { + ImportCompletedItem::Person(person) => { + let db_person = commit_person( + CommitPersonInput { + identifier: person.identifier.clone(), + name: person.name.clone(), + source: person.source, + source_specifics: person.source_specifics.clone(), + }, + &ss.db, + ) + .await?; + for review in person.reviews.iter() { + if let Some(input) = convert_review_into_input( + review, + &preferences, + db_person.id.clone(), + EntityLot::Person, + ) { + if let Err(e) = post_review(user_id, input, ss).await { + import.failed.push(ImportFailedItem { + lot: None, + step: ImportFailStep::ReviewConversion, + identifier: person.name.to_owned(), + error: Some(e.message), + }); + }; + } + } + for col in person.collections.into_iter() { create_collection_and_add_entity_to_it( ss, user_id, col, - workout_id.clone(), - EntityLot::Workout, + db_person.id.clone(), + EntityLot::Person, ) .await?; } } + ImportCompletedItem::Workout(workout) => { + if let Err(err) = create_or_update_workout(workout, user_id, ss).await { + import.failed.push(ImportFailedItem { + lot: None, + step: ImportFailStep::InputTransformation, + identifier: "Exercise".to_string(), + error: Some(err.to_string()), + }); + } + } + ImportCompletedItem::ApplicationWorkout(workout) => { + let workout_input = db_workout_to_workout_input(workout.details); + match create_or_update_workout(workout_input, user_id, ss).await { + Err(err) => { + import.failed.push(ImportFailedItem { + lot: None, + step: ImportFailStep::InputTransformation, + identifier: "Exercise".to_string(), + error: Some(err.to_string()), + }); + } + Ok(workout_id) => { + for col in workout.collections.into_iter() { + create_collection_and_add_entity_to_it( + ss, + user_id, + col, + workout_id.clone(), + EntityLot::Workout, + ) + .await?; + } + } + } + } + ImportCompletedItem::Measurement(measurement) => { + if let Err(err) = create_user_measurement(user_id, measurement, &ss.db).await { + import.failed.push(ImportFailedItem { + lot: None, + error: Some(err.message), + identifier: "Measurement".to_string(), + step: ImportFailStep::InputTransformation, + }); + } + } } - ryot_log!(debug, "Workout {} created", idx); - } - for (idx, measurement) in import.measurements.into_iter().enumerate() { - if let Err(err) = create_user_measurement(user_id, measurement, &ss.db).await { - import.failed_items.push(ImportFailedItem { - lot: None, - step: ImportFailStep::InputTransformation, - identifier: "Measurement".to_string(), - error: Some(err.message), - }); - } - ryot_log!(debug, "Measurement {} created", idx); + on_item_processed( + Decimal::from_usize(idx + 1).unwrap() / Decimal::from_usize(total).unwrap() * dec!(100), + ) + .await?; } - // TODO: Allow importing exercises - let details = ImportResultResponse { + failed_items: import.failed, import: ImportDetails { total }, - failed_items: import.failed_items, }; - Ok(details) + Ok((source_result, details)) } pub fn db_workout_to_workout_input(user_workout: workout::Model) -> UserWorkoutInput { diff --git a/crates/utils/env/Cargo.toml b/crates/utils/env/Cargo.toml index 63cac6e8d6..c2ec07bcbe 100644 --- a/crates/utils/env/Cargo.toml +++ b/crates/utils/env/Cargo.toml @@ -4,4 +4,7 @@ version = "0.1.0" edition = "2021" [build-dependencies] -dotenv-build = "0.1.1" +dotenv-build = { workspace = true } + +[package.metadata.cargo-machete] +ignored = ["dotenv-build"] diff --git a/docs/content/importing.md b/docs/content/importing.md index ab92f78de6..e85193134c 100644 --- a/docs/content/importing.md +++ b/docs/content/importing.md @@ -15,6 +15,71 @@ You can see the reports under "Import History" of the imports page. `RUST_LOG=ryot=debug` environment variable. This will help you help you see import progress in the docker logs. +## Jellyfin + +You can import your watched movies and shows from [Jellyfin](https://jellyfin.org). + +!!! warning + + This will only import media that are already finished. Setup an + [integration](./integrations.md#jellyfin) if you want to import media in progress. + +Enter the correct details in the input. The username you enter should be of the account +whose data you want to import. + +## Plex + +You can import your watched movies and shows from [Plex](https://plex.tv). + +!!! warning + + This will only import media that are already finished. Setup an + [integration](./integrations.md#plex) if you want to import media in progress. + +### Steps + +- Obtain a `Plex-Token` as described [here](https://www.plexopedia.com/plex-media-server/general/plex-token/#getcurrentusertoken). +- Enter the correct details in the inputs. + +## Trakt + +All movies and shows can be imported from [Trakt](https://trakt.tv) along with +their ratings, history, comments and lists. A few points to note. + +- It is necessary to set your account's privacy to public during the + duration of the import. The Trakt authentication flow is pretty complicated + and I don't think it would be worth implementing. +- Items that have been "check(ed) in" will not be imported. + +### Steps + +- Login to your Trakt account and go to the settings page. +- If your account is set to private, uncheck the box next to it. You can revert + this change once the import is complete. +- If you have any lists that are private, you need to change them to public. + Otherwise they will not be imported. +- Find your profile slug. This is usually your username. You can find it by + going to your profile page, and checking the URL. +- Enter this username in the input. + +## Audiobookshelf + +The Audiobookshelf importer supports importing all media that have a valid Audible ID or +ITunes ID or ISBN. + +!!! warning + + - This will only import media that are already finished. Setup an + [integration](./integrations.md#audiobookshelf) if you want to import media in progress. + - If you have enabled the option to auto delete podcast episodes, you'll have to + manually mark them as completed. + +### Steps + +- Obtain an API token as described in the Audiobookshelf + [authentication](https://api.audiobookshelf.org/#authentication) docs. +- Enter the correct details in the input. + ## Goodreads Ryot translates [Goodreads](https://www.goodreads.com/) shelves in the @@ -46,6 +111,15 @@ the following caveats: - Copy the token that was just generated. - Enter the details in the inputs. +## Generic Json + +The "Generic Json" can be used to import all possible data from a generic JSON file. The +format of the JSON file should be `CompleteExport` as described in the +[exporting](guides/exporting.md#type-definitions) documentation. + +You can use this to export all your data from one Ryot instance and import it into another, +or from a source that is not supported by Ryot. + ## Movary The Watchlist and all movies can be imported from [Movary](https://movary.org) @@ -91,44 +165,16 @@ translates "Read Status" in the following manner: ## Strong App -You can import your completed workouts from [Strong](https://www.strong.app/) app. Make sure -you do the import process on a desktop/laptop since the process needs to have multiple tabs -open at once. - -There is also an automated script that will be able to migrate most of your data. Please -follow [this](https://gist.github.com/IgnisDa/c21c28dd83571ca07f1a7a824b5e8139?permalink_comment_id=4725066#gistcomment-4725066) -guide. +You can import your completed workouts from [Strong](https://www.strong.app/) app. If an +exercise does not exist in your instance, it will be created with a unique identifier. You +can later use the "Edit Exercise" or "Merge Exercise" actions to map the exercise to an +existing one. ### Steps - Login to your Strong account on the app and go to the "Settings" page. - Scroll down to the "General" section and click on "Export data". -- Send the file to your desktop/laptop and upload it in the input. -- The mapping section is used to map exercises from Strong to Ryot. Each exercise must be - mapped, otherwise the import will fail. -- If an exercise does not exist in your instance, you need to create it before mapping it. -- Once you have mapped all the exercises, click on "Import". - -## Trakt - -All movies and shows can be imported from [Trakt](https://trakt.tv) along with -their ratings, history, comments and lists. A few points to note. - -- It is necessary to set your account's privacy to public during the - duration of the import. The Trakt authentication flow is pretty complicated - and I don't think it would be worth implementing. -- Items that have been "check(ed) in" will not be imported. - -### Steps - -- Login to your Trakt account and go to the settings page. -- If your account is set to private, uncheck the box next to it. You can revert - this change once the import is complete. -- If you have any lists that are private, you need to change them to public. - Otherwise they will not be imported. -- Find your profile slug. This is usually your username. You can find it by - going to your profile page, and checking the URL. -- Enter this username in the input. +- Upload the csv file in the input. ## IMDb @@ -157,24 +203,6 @@ separately. A few points to note: - For your custom lists, please visit the "My Lists" page. - Upload the CSV file and choose the collection you want to import into. -## Audiobookshelf - -The Audiobookshelf importer supports importing all media that have a valid Audible ID or -ITunes ID or ISBN. - -!!! warning - - - This will only import media that are already finished. Setup an - [integration](./integrations.md#audiobookshelf) if you want to import media in progress. - - If you have enabled the option to auto delete podcast episodes, you'll have to - manually mark them as completed. - -### Steps - -- Obtain an API token as described in the Audiobookshelf - [authentication](https://api.audiobookshelf.org/#authentication) docs. -- Enter the correct details in the input. - ## TV Time !!! warning @@ -192,24 +220,3 @@ app. This can be done by clicking on the three dots on the top right corner of the app, and then clicking on "Export". This will save a CSV file to your file system. Upload this file in the input. - -## Jellyfin - -You can import your watched movies and shows from [Jellyfin](https://jellyfin.org). - -!!! warning - - This will only import media that are already finished. Setup an - [integration](./integrations.md#jellyfin) if you want to import media in progress. - -Enter the correct details in the input. The username you enter should be of the account -whose data you want to import. - -## Generic Json - -The "Generic Json" can be used to import all possible data from a generic JSON file. The -format of the JSON file should be `CompleteExport` as described in the -[exporting](guides/exporting.md#type-definitions) documentation. - -You can use this to export all your data from one Ryot instance and import it into another, -or from a source that is not supported by Ryot. diff --git a/docs/includes/export-schema.ts b/docs/includes/export-schema.ts index fdec4bc277..4eb11449e0 100644 --- a/docs/includes/export-schema.ts +++ b/docs/includes/export-schema.ts @@ -109,7 +109,7 @@ export interface UserMeasurement { export type MediaLot = 'audio_book' | 'anime' | 'book' | 'podcast' | 'manga' | 'movie' | 'show' | 'video_game' | 'visual_novel'; /** A specific instance when an entity was seen. */ -export interface ImportOrExportMediaItemSeen { +export interface ImportOrExportMetadataItemSeen { /** If for an anime, the episode which was seen. */ anime_episode_number: number | null; /** The timestamp when finished watching. */ @@ -136,7 +136,7 @@ export interface ImportOrExportMediaItemSeen { export type MediaSource = 'anilist' | 'audible' | 'custom' | 'google_books' | 'igdb' | 'itunes' | 'listennotes' | 'manga_updates' | 'mal' | 'openlibrary' | 'tmdb' | 'vndb'; /** Details about a specific media item that needs to be imported or exported. */ -export interface ImportOrExportMediaItem { +export interface ImportOrExportMetadataItem { /** The collections this entity was added to. */ collections: string[]; /** The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on. */ @@ -151,7 +151,7 @@ export interface ImportOrExportMediaItem { /** The review history for the user. */ reviews: ImportOrExportItemRating[]; /** The seen history for the user. */ - seen_history: ImportOrExportMediaItemSeen[]; + seen_history: ImportOrExportMetadataItemSeen[]; /** * The source of media. * @@ -164,7 +164,7 @@ export interface ImportOrExportMediaItem { } /** Details about a specific media group item that needs to be imported or exported. */ -export interface ImportOrExportMediaGroupItem { +export interface ImportOrExportMetadataGroupItem { /** The collections this entity was added to. */ collections: string[]; /** The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on. */ @@ -422,9 +422,9 @@ export interface CompleteExport { /** Data about user's measurements. */ measurements: UserMeasurement[] | null; /** Data about user's media. */ - media: ImportOrExportMediaItem[] | null; + media: ImportOrExportMetadataItem[] | null; /** Data about user's media groups. */ - media_groups: ImportOrExportMediaGroupItem[] | null; + media_groups: ImportOrExportMetadataGroupItem[] | null; /** Data about user's people. */ people: ImportOrExportPersonItem[] | null; /** Data about user's workout templates. */ diff --git a/libs/generated/src/graphql/backend/gql.ts b/libs/generated/src/graphql/backend/gql.ts index 72c0761b3f..e9ccbc693b 100644 --- a/libs/generated/src/graphql/backend/gql.ts +++ b/libs/generated/src/graphql/backend/gql.ts @@ -14,34 +14,15 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/ * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size */ const documents = { - "mutation RegisterUser($input: RegisterUserInput!) {\n registerUser(input: $input) {\n __typename\n ... on RegisterError {\n error\n }\n ... on StringIdObject {\n id\n }\n }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n loginUser(input: $input) {\n __typename\n ... on LoginError {\n error\n }\n ... on LoginResponse {\n apiKey\n }\n }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n commitMetadata(input: $input) {\n id\n }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n commitMetadataGroup(input: $input) {\n id\n }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n commitPerson(input: $input) {\n id\n }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n createCustomMetadata(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n createOrUpdateCollection(input: $input) {\n id\n }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n createUserIntegration(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n deleteSeenItem(seenId: $seenId) {\n id\n }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n createOrUpdateReview(input: $input) {\n id\n }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n presignedPutS3Url(input: $input) {\n key\n uploadUrl\n }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n removeEntityFromCollection(input: $input) {\n id\n }\n}\n\nmutation TestUserNotificationPlatforms {\n testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n updateUser(input: $input) {\n id\n }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n createAccessLink(input: $input) {\n id\n }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n processAccessLink(input: $input) {\n __typename\n ... on ProcessAccessLinkError {\n error\n }\n ... on ProcessAccessLinkResponse {\n apiKey\n redirectTo\n tokenValidForDays\n }\n }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n updateUserExerciseSettings(input: $input)\n}": types.RegisterUserDocument, - "query CollectionContents($input: CollectionContentsInput!) {\n collectionContents(input: $input) {\n user {\n id\n name\n }\n reviews {\n ...ReviewItemPart\n }\n results {\n details {\n total\n nextPage\n }\n items {\n entityId\n entityLot\n }\n }\n details {\n name\n description\n createdOn\n }\n }\n}": types.CollectionContentsDocument, - "query CoreDetails {\n coreDetails {\n isPro\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 frontend {\n url\n oidcButtonLabel\n dashboardMessage\n umami {\n domains\n scriptUrl\n websiteId\n }\n }\n }\n}": types.CoreDetailsDocument, - "query ExerciseDetails($exerciseId: String!) {\n exerciseDetails(exerciseId: $exerciseId) {\n id\n lot\n source\n level\n force\n mechanic\n equipment\n muscles\n createdByUserId\n attributes {\n instructions\n images\n }\n }\n}": types.ExerciseDetailsDocument, - "query ExerciseParameters {\n exerciseParameters {\n downloadRequired\n filters {\n type\n level\n force\n mechanic\n equipment\n muscle\n }\n lotMapping {\n lot\n bests\n }\n }\n}": types.ExerciseParametersDocument, - "query ExercisesList($input: ExercisesListInput!) {\n exercisesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n lot\n image\n muscle\n numTimesInteracted\n lastUpdatedOn\n }\n }\n}": types.ExercisesListDocument, - "query 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}": types.GenreDetailsDocument, - "query GenresList($input: SearchInput!) {\n genresList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n numItems\n }\n }\n}": types.GenresListDocument, - "query ImportReports {\n importReports {\n id\n source\n startedOn\n finishedOn\n wasSuccess\n details {\n import {\n total\n }\n failedItems {\n lot\n step\n identifier\n error\n }\n }\n }\n}": types.ImportReportsDocument, + "mutation RegisterUser($input: RegisterUserInput!) {\n registerUser(input: $input) {\n __typename\n ... on RegisterError {\n error\n }\n ... on StringIdObject {\n id\n }\n }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n loginUser(input: $input) {\n __typename\n ... on LoginError {\n error\n }\n ... on LoginResponse {\n apiKey\n }\n }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n commitMetadata(input: $input) {\n id\n }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n commitMetadataGroup(input: $input) {\n id\n }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n commitPerson(input: $input) {\n id\n }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n createCustomMetadata(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n createOrUpdateCollection(input: $input) {\n id\n }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n createUserIntegration(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n deleteSeenItem(seenId: $seenId) {\n id\n }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n createOrUpdateReview(input: $input) {\n id\n }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n presignedPutS3Url(input: $input) {\n key\n uploadUrl\n }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n removeEntityFromCollection(input: $input) {\n id\n }\n}\n\nmutation TestUserNotificationPlatforms {\n testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n updateUser(input: $input) {\n id\n }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n createAccessLink(input: $input) {\n id\n }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n processAccessLink(input: $input) {\n __typename\n ... on ProcessAccessLinkError {\n error\n }\n ... on ProcessAccessLinkResponse {\n apiKey\n redirectTo\n tokenValidForDays\n }\n }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n updateUserExerciseSettings(input: $input)\n}\n\nmutation MergeExercise($mergeFrom: String!, $mergeInto: String!) {\n mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}": types.RegisterUserDocument, "query LatestUserSummary {\n latestUserSummary {\n totalMetadataReviewCount\n totalCollectionReviewCount\n totalMetadataGroupReviewCount\n totalPersonReviewCount\n measurementCount\n workoutCount\n totalWorkoutDuration\n audioBookCount\n totalAudioBookDuration\n animeCount\n bookCount\n totalBookPages\n podcastCount\n totalPodcastDuration\n mangaCount\n movieCount\n totalMovieDuration\n showCount\n totalShowDuration\n videoGameCount\n totalVideoGameDuration\n visualNovelCount\n totalVisualNovelDuration\n totalWorkoutPersonalBests\n totalWorkoutWeight\n totalWorkoutReps\n totalWorkoutDistance\n totalWorkoutRestTime\n totalMetadataCount\n totalReviewCount\n totalCount\n totalDuration\n }\n}": types.LatestUserSummaryDocument, "query MetadataDetails($metadataId: String!) {\n metadataDetails(metadataId: $metadataId) {\n id\n lot\n title\n source\n isNsfw\n isPartial\n sourceUrl\n identifier\n description\n suggestions\n publishYear\n publishDate\n providerRating\n productionStatus\n originalLanguage\n genres {\n id\n name\n }\n group {\n id\n name\n part\n }\n assets {\n images\n videos {\n videoId\n source\n }\n }\n creators {\n name\n items {\n id\n name\n image\n character\n }\n }\n watchProviders {\n name\n image\n languages\n }\n animeSpecifics {\n episodes\n }\n audioBookSpecifics {\n runtime\n }\n bookSpecifics {\n pages\n }\n movieSpecifics {\n runtime\n }\n mangaSpecifics {\n volumes\n chapters\n }\n podcastSpecifics {\n episodes {\n id\n title\n overview\n thumbnail\n number\n runtime\n publishDate\n }\n totalEpisodes\n }\n showSpecifics {\n totalSeasons\n totalEpisodes\n runtime\n seasons {\n id\n seasonNumber\n name\n overview\n backdropImages\n posterImages\n episodes {\n id\n name\n posterImages\n episodeNumber\n publishDate\n name\n overview\n runtime\n }\n }\n }\n visualNovelSpecifics {\n length\n }\n videoGameSpecifics {\n platforms\n }\n }\n}": types.MetadataDetailsDocument, - "query MetadataGroupDetails($metadataGroupId: String!) {\n metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n contents\n sourceUrl\n details {\n id\n title\n lot\n source\n displayImages\n identifier\n parts\n isPartial\n }\n }\n}": types.MetadataGroupDetailsDocument, - "query 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}": types.MetadataGroupSearchDocument, - "query MetadataList($input: MetadataListInput!) {\n metadataList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}": types.MetadataListDocument, - "query MetadataSearch($input: MetadataSearchInput!) {\n metadataSearch(input: $input) {\n details {\n total\n nextPage\n }\n items {\n databaseId\n hasInteracted\n item {\n identifier\n title\n image\n publishYear\n }\n }\n }\n}": types.MetadataSearchDocument, - "query 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}": types.PeopleSearchDocument, "query PersonDetails($personId: String!) {\n personDetails(personId: $personId) {\n sourceUrl\n details {\n id\n name\n source\n identifier\n isPartial\n description\n birthDate\n deathDate\n place\n website\n gender\n displayImages\n }\n contents {\n name\n count\n items {\n character\n metadataId\n }\n }\n }\n}": types.PersonDetailsDocument, "query UserDetails {\n userDetails {\n __typename\n ... on User {\n id\n lot\n name\n isDisabled\n oidcIssuerId\n preferences {\n general {\n reviewScale\n gridPacking\n displayNsfw\n disableVideos\n persistQueries\n disableReviews\n disableIntegrations\n disableWatchProviders\n disableNavigationAnimation\n dashboard {\n hidden\n section\n numElements\n deduplicateMedia\n }\n watchProviders {\n lot\n values\n }\n }\n fitness {\n logging {\n muteSounds\n showDetailsWhileEditing\n }\n exercises {\n unitSystem\n setRestTimers {\n ...SetRestTimersPart\n }\n }\n measurements {\n custom {\n name\n dataType\n }\n inbuilt {\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 }\n }\n }\n notifications {\n toSend\n enabled\n }\n featuresEnabled {\n others {\n calendar\n collections\n }\n fitness {\n enabled\n workouts\n templates\n measurements\n }\n media {\n enabled\n anime\n audioBook\n book\n manga\n movie\n podcast\n show\n videoGame\n visualNovel\n people\n groups\n genres\n }\n }\n }\n }\n }\n}": types.UserDetailsDocument, "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 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 workoutId\n exerciseIdx\n setIdx\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 collections {\n ...CollectionPart\n }\n inProgress {\n ...SeenPart\n }\n history {\n ...SeenPart\n }\n averageRating\n reviews {\n ...ReviewItemPart\n }\n seenByAllCount\n seenByUserCount\n nextEntry {\n season\n volume\n episode\n chapter\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 UserMetadataGroupDetails($metadataGroupId: String!) {\n userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n reviews {\n ...ReviewItemPart\n }\n collections {\n ...CollectionPart\n }\n }\n}": types.UserMetadataGroupDetailsDocument, - "query UserPersonDetails($personId: String!) {\n userPersonDetails(personId: $personId) {\n collections {\n ...CollectionPart\n }\n reviews {\n ...ReviewItemPart\n }\n }\n}": types.UserPersonDetailsDocument, - "query 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 summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}": types.UserWorkoutDetailsDocument, - "query UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n collections {\n ...CollectionPart\n }\n details {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}": types.UserWorkoutTemplateDetailsDocument, - "query UserWorkoutTemplatesList($input: SearchInput!) {\n userWorkoutTemplatesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n }\n }\n}": types.UserWorkoutTemplatesListDocument, - "query UserWorkoutsList($input: SearchInput!) {\n userWorkoutsList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n endTime\n duration\n startTime\n summary {\n ...WorkoutSummaryPart\n }\n }\n }\n}": types.UserWorkoutsListDocument, - "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 ProvidersLanguageInformation {\n providersLanguageInformation {\n supported\n default\n source\n }\n}\n\nquery UserExports {\n userExports {\n url\n size\n endedAt\n startedAt\n }\n}\n\nquery UserCollectionsList($name: String) {\n userCollectionsList(name: $name) {\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\nquery UserIntegrations {\n userIntegrations {\n id\n lot\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 UserRecommendations {\n userRecommendations\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 MetadataGroupsList($input: MetadataGroupsListInput!) {\n metadataGroupsList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n peopleList(input: $input) {\n details {\n total\n nextPage\n }\n items\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 DailyUserActivities($input: DailyUserActivitiesInput!) {\n dailyUserActivities(input: $input) {\n groupedBy\n totalCount\n totalDuration\n items {\n day\n totalReviewCount\n workoutCount\n measurementCount\n audioBookCount\n animeCount\n bookCount\n podcastCount\n mangaCount\n showCount\n movieCount\n videoGameCount\n visualNovelCount\n }\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 size\n endedAt\n startedAt\n }\n}\n\nquery UserCollectionsList($name: String) {\n userCollectionsList(name: $name) {\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\nquery UserIntegrations {\n userIntegrations {\n id\n lot\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 UserRecommendations {\n userRecommendations\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 MetadataGroupsList($input: MetadataGroupsListInput!) {\n metadataGroupsList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n peopleList(input: $input) {\n details {\n total\n nextPage\n }\n items\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 DailyUserActivities($input: DailyUserActivitiesInput!) {\n dailyUserActivities(input: $input) {\n groupedBy\n totalCount\n totalDuration\n items {\n day\n totalReviewCount\n workoutCount\n measurementCount\n audioBookCount\n animeCount\n bookCount\n podcastCount\n mangaCount\n showCount\n movieCount\n videoGameCount\n visualNovelCount\n }\n }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n exerciseDetails(exerciseId: $exerciseId) {\n id\n lot\n source\n level\n force\n mechanic\n equipment\n muscles\n createdByUserId\n attributes {\n instructions\n images\n }\n }\n}\n\nquery ExercisesList($input: ExercisesListInput!) {\n exercisesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n lot\n image\n muscle\n numTimesInteracted\n lastUpdatedOn\n }\n }\n}\n\nquery ImportReports {\n importReports {\n id\n source\n progress\n startedOn\n finishedOn\n wasSuccess\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 details {\n total\n nextPage\n }\n items {\n id\n name\n numItems\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 user {\n id\n name\n }\n reviews {\n ...ReviewItemPart\n }\n results {\n details {\n total\n nextPage\n }\n items {\n entityId\n entityLot\n }\n }\n details {\n name\n description\n createdOn\n }\n }\n}\n\nquery CoreDetails {\n coreDetails {\n isPro\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 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 downloadRequired\n filters {\n type\n level\n force\n mechanic\n equipment\n muscle\n }\n lotMapping {\n lot\n bests\n }\n }\n }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n contents\n sourceUrl\n details {\n id\n title\n lot\n source\n displayImages\n identifier\n parts\n isPartial\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 MetadataList($input: MetadataListInput!) {\n metadataList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n metadataSearch(input: $input) {\n details {\n total\n nextPage\n }\n items {\n databaseId\n hasInteracted\n item {\n identifier\n title\n image\n publishYear\n }\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 reviews {\n ...ReviewItemPart\n }\n collections {\n ...CollectionPart\n }\n }\n}\n\nquery UserPersonDetails($personId: String!) {\n userPersonDetails(personId: $personId) {\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 summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}\n\nquery UserWorkoutsList($input: SearchInput!) {\n userWorkoutsList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n endTime\n duration\n startTime\n summary {\n ...WorkoutSummaryPart\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 visibility\n summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}\n\nquery UserWorkoutTemplatesList($input: SearchInput!) {\n userWorkoutTemplatesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n }\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 episodeName\n metadataTitle\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 lot\n name\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 lot\n name\n notes\n total {\n ...WorkoutOrExerciseTotalsPart\n }\n assets {\n ...EntityAssetsPart\n }\n sets {\n lot\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}": types.SeenPodcastExtraInformationPartFragmentDoc, }; @@ -62,39 +43,7 @@ export function graphql(source: string): unknown; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "mutation RegisterUser($input: RegisterUserInput!) {\n registerUser(input: $input) {\n __typename\n ... on RegisterError {\n error\n }\n ... on StringIdObject {\n id\n }\n }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n loginUser(input: $input) {\n __typename\n ... on LoginError {\n error\n }\n ... on LoginResponse {\n apiKey\n }\n }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n commitMetadata(input: $input) {\n id\n }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n commitMetadataGroup(input: $input) {\n id\n }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n commitPerson(input: $input) {\n id\n }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n createCustomMetadata(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n createOrUpdateCollection(input: $input) {\n id\n }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n createUserIntegration(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n deleteSeenItem(seenId: $seenId) {\n id\n }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n createOrUpdateReview(input: $input) {\n id\n }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n presignedPutS3Url(input: $input) {\n key\n uploadUrl\n }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n removeEntityFromCollection(input: $input) {\n id\n }\n}\n\nmutation TestUserNotificationPlatforms {\n testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n updateUser(input: $input) {\n id\n }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n createAccessLink(input: $input) {\n id\n }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n processAccessLink(input: $input) {\n __typename\n ... on ProcessAccessLinkError {\n error\n }\n ... on ProcessAccessLinkResponse {\n apiKey\n redirectTo\n tokenValidForDays\n }\n }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n updateUserExerciseSettings(input: $input)\n}"): (typeof documents)["mutation RegisterUser($input: RegisterUserInput!) {\n registerUser(input: $input) {\n __typename\n ... on RegisterError {\n error\n }\n ... on StringIdObject {\n id\n }\n }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n loginUser(input: $input) {\n __typename\n ... on LoginError {\n error\n }\n ... on LoginResponse {\n apiKey\n }\n }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n commitMetadata(input: $input) {\n id\n }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n commitMetadataGroup(input: $input) {\n id\n }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n commitPerson(input: $input) {\n id\n }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n createCustomMetadata(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n createOrUpdateCollection(input: $input) {\n id\n }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n createUserIntegration(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n deleteSeenItem(seenId: $seenId) {\n id\n }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n createOrUpdateReview(input: $input) {\n id\n }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n presignedPutS3Url(input: $input) {\n key\n uploadUrl\n }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n removeEntityFromCollection(input: $input) {\n id\n }\n}\n\nmutation TestUserNotificationPlatforms {\n testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n updateUser(input: $input) {\n id\n }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n createAccessLink(input: $input) {\n id\n }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n processAccessLink(input: $input) {\n __typename\n ... on ProcessAccessLinkError {\n error\n }\n ... on ProcessAccessLinkResponse {\n apiKey\n redirectTo\n tokenValidForDays\n }\n }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n updateUserExerciseSettings(input: $input)\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query CollectionContents($input: CollectionContentsInput!) {\n collectionContents(input: $input) {\n user {\n id\n name\n }\n reviews {\n ...ReviewItemPart\n }\n results {\n details {\n total\n nextPage\n }\n items {\n entityId\n entityLot\n }\n }\n details {\n name\n description\n createdOn\n }\n }\n}"): (typeof documents)["query CollectionContents($input: CollectionContentsInput!) {\n collectionContents(input: $input) {\n user {\n id\n name\n }\n reviews {\n ...ReviewItemPart\n }\n results {\n details {\n total\n nextPage\n }\n items {\n entityId\n entityLot\n }\n }\n details {\n name\n description\n createdOn\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query CoreDetails {\n coreDetails {\n isPro\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 frontend {\n url\n oidcButtonLabel\n dashboardMessage\n umami {\n domains\n scriptUrl\n websiteId\n }\n }\n }\n}"): (typeof documents)["query CoreDetails {\n coreDetails {\n isPro\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 frontend {\n url\n oidcButtonLabel\n dashboardMessage\n umami {\n domains\n scriptUrl\n websiteId\n }\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query ExerciseDetails($exerciseId: String!) {\n exerciseDetails(exerciseId: $exerciseId) {\n id\n lot\n source\n level\n force\n mechanic\n equipment\n muscles\n createdByUserId\n attributes {\n instructions\n images\n }\n }\n}"): (typeof documents)["query ExerciseDetails($exerciseId: String!) {\n exerciseDetails(exerciseId: $exerciseId) {\n id\n lot\n source\n level\n force\n mechanic\n equipment\n muscles\n createdByUserId\n attributes {\n instructions\n images\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query ExerciseParameters {\n exerciseParameters {\n downloadRequired\n filters {\n type\n level\n force\n mechanic\n equipment\n muscle\n }\n lotMapping {\n lot\n bests\n }\n }\n}"): (typeof documents)["query ExerciseParameters {\n exerciseParameters {\n downloadRequired\n filters {\n type\n level\n force\n mechanic\n equipment\n muscle\n }\n lotMapping {\n lot\n bests\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query ExercisesList($input: ExercisesListInput!) {\n exercisesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n lot\n image\n muscle\n numTimesInteracted\n lastUpdatedOn\n }\n }\n}"): (typeof documents)["query ExercisesList($input: ExercisesListInput!) {\n exercisesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n lot\n image\n muscle\n numTimesInteracted\n lastUpdatedOn\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query 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}"): (typeof documents)["query 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}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query GenresList($input: SearchInput!) {\n genresList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n numItems\n }\n }\n}"): (typeof documents)["query GenresList($input: SearchInput!) {\n genresList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n numItems\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query ImportReports {\n importReports {\n id\n source\n startedOn\n finishedOn\n wasSuccess\n details {\n import {\n total\n }\n failedItems {\n lot\n step\n identifier\n error\n }\n }\n }\n}"): (typeof documents)["query ImportReports {\n importReports {\n id\n source\n startedOn\n finishedOn\n wasSuccess\n details {\n import {\n total\n }\n failedItems {\n lot\n step\n identifier\n error\n }\n }\n }\n}"]; +export function graphql(source: "mutation RegisterUser($input: RegisterUserInput!) {\n registerUser(input: $input) {\n __typename\n ... on RegisterError {\n error\n }\n ... on StringIdObject {\n id\n }\n }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n loginUser(input: $input) {\n __typename\n ... on LoginError {\n error\n }\n ... on LoginResponse {\n apiKey\n }\n }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n commitMetadata(input: $input) {\n id\n }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n commitMetadataGroup(input: $input) {\n id\n }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n commitPerson(input: $input) {\n id\n }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n createCustomMetadata(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n createOrUpdateCollection(input: $input) {\n id\n }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n createUserIntegration(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n deleteSeenItem(seenId: $seenId) {\n id\n }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n createOrUpdateReview(input: $input) {\n id\n }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n presignedPutS3Url(input: $input) {\n key\n uploadUrl\n }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n removeEntityFromCollection(input: $input) {\n id\n }\n}\n\nmutation TestUserNotificationPlatforms {\n testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n updateUser(input: $input) {\n id\n }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n createAccessLink(input: $input) {\n id\n }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n processAccessLink(input: $input) {\n __typename\n ... on ProcessAccessLinkError {\n error\n }\n ... on ProcessAccessLinkResponse {\n apiKey\n redirectTo\n tokenValidForDays\n }\n }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n updateUserExerciseSettings(input: $input)\n}\n\nmutation MergeExercise($mergeFrom: String!, $mergeInto: String!) {\n mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}"): (typeof documents)["mutation RegisterUser($input: RegisterUserInput!) {\n registerUser(input: $input) {\n __typename\n ... on RegisterError {\n error\n }\n ... on StringIdObject {\n id\n }\n }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n loginUser(input: $input) {\n __typename\n ... on LoginError {\n error\n }\n ... on LoginResponse {\n apiKey\n }\n }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n commitMetadata(input: $input) {\n id\n }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n commitMetadataGroup(input: $input) {\n id\n }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n commitPerson(input: $input) {\n id\n }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n createCustomMetadata(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n createOrUpdateCollection(input: $input) {\n id\n }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n createUserIntegration(input: $input) {\n id\n }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n deleteSeenItem(seenId: $seenId) {\n id\n }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n createOrUpdateReview(input: $input) {\n id\n }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n presignedPutS3Url(input: $input) {\n key\n uploadUrl\n }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n removeEntityFromCollection(input: $input) {\n id\n }\n}\n\nmutation TestUserNotificationPlatforms {\n testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n updateUser(input: $input) {\n id\n }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n createAccessLink(input: $input) {\n id\n }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n processAccessLink(input: $input) {\n __typename\n ... on ProcessAccessLinkError {\n error\n }\n ... on ProcessAccessLinkResponse {\n apiKey\n redirectTo\n tokenValidForDays\n }\n }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n updateUserExerciseSettings(input: $input)\n}\n\nmutation MergeExercise($mergeFrom: String!, $mergeInto: String!) {\n mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ @@ -103,26 +52,6 @@ export function graphql(source: "query LatestUserSummary {\n latestUserSummary * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ export function graphql(source: "query MetadataDetails($metadataId: String!) {\n metadataDetails(metadataId: $metadataId) {\n id\n lot\n title\n source\n isNsfw\n isPartial\n sourceUrl\n identifier\n description\n suggestions\n publishYear\n publishDate\n providerRating\n productionStatus\n originalLanguage\n genres {\n id\n name\n }\n group {\n id\n name\n part\n }\n assets {\n images\n videos {\n videoId\n source\n }\n }\n creators {\n name\n items {\n id\n name\n image\n character\n }\n }\n watchProviders {\n name\n image\n languages\n }\n animeSpecifics {\n episodes\n }\n audioBookSpecifics {\n runtime\n }\n bookSpecifics {\n pages\n }\n movieSpecifics {\n runtime\n }\n mangaSpecifics {\n volumes\n chapters\n }\n podcastSpecifics {\n episodes {\n id\n title\n overview\n thumbnail\n number\n runtime\n publishDate\n }\n totalEpisodes\n }\n showSpecifics {\n totalSeasons\n totalEpisodes\n runtime\n seasons {\n id\n seasonNumber\n name\n overview\n backdropImages\n posterImages\n episodes {\n id\n name\n posterImages\n episodeNumber\n publishDate\n name\n overview\n runtime\n }\n }\n }\n visualNovelSpecifics {\n length\n }\n videoGameSpecifics {\n platforms\n }\n }\n}"): (typeof documents)["query MetadataDetails($metadataId: String!) {\n metadataDetails(metadataId: $metadataId) {\n id\n lot\n title\n source\n isNsfw\n isPartial\n sourceUrl\n identifier\n description\n suggestions\n publishYear\n publishDate\n providerRating\n productionStatus\n originalLanguage\n genres {\n id\n name\n }\n group {\n id\n name\n part\n }\n assets {\n images\n videos {\n videoId\n source\n }\n }\n creators {\n name\n items {\n id\n name\n image\n character\n }\n }\n watchProviders {\n name\n image\n languages\n }\n animeSpecifics {\n episodes\n }\n audioBookSpecifics {\n runtime\n }\n bookSpecifics {\n pages\n }\n movieSpecifics {\n runtime\n }\n mangaSpecifics {\n volumes\n chapters\n }\n podcastSpecifics {\n episodes {\n id\n title\n overview\n thumbnail\n number\n runtime\n publishDate\n }\n totalEpisodes\n }\n showSpecifics {\n totalSeasons\n totalEpisodes\n runtime\n seasons {\n id\n seasonNumber\n name\n overview\n backdropImages\n posterImages\n episodes {\n id\n name\n posterImages\n episodeNumber\n publishDate\n name\n overview\n runtime\n }\n }\n }\n visualNovelSpecifics {\n length\n }\n videoGameSpecifics {\n platforms\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query MetadataGroupDetails($metadataGroupId: String!) {\n metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n contents\n sourceUrl\n details {\n id\n title\n lot\n source\n displayImages\n identifier\n parts\n isPartial\n }\n }\n}"): (typeof documents)["query MetadataGroupDetails($metadataGroupId: String!) {\n metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n contents\n sourceUrl\n details {\n id\n title\n lot\n source\n displayImages\n identifier\n parts\n isPartial\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query 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}"): (typeof documents)["query 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}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query MetadataList($input: MetadataListInput!) {\n metadataList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}"): (typeof documents)["query MetadataList($input: MetadataListInput!) {\n metadataList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query MetadataSearch($input: MetadataSearchInput!) {\n metadataSearch(input: $input) {\n details {\n total\n nextPage\n }\n items {\n databaseId\n hasInteracted\n item {\n identifier\n title\n image\n publishYear\n }\n }\n }\n}"): (typeof documents)["query MetadataSearch($input: MetadataSearchInput!) {\n metadataSearch(input: $input) {\n details {\n total\n nextPage\n }\n items {\n databaseId\n hasInteracted\n item {\n identifier\n title\n image\n publishYear\n }\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query 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}"): (typeof documents)["query 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}"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ @@ -146,31 +75,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 UserMetadataGroupDetails($metadataGroupId: String!) {\n userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n reviews {\n ...ReviewItemPart\n }\n collections {\n ...CollectionPart\n }\n }\n}"): (typeof documents)["query UserMetadataGroupDetails($metadataGroupId: String!) {\n userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n reviews {\n ...ReviewItemPart\n }\n collections {\n ...CollectionPart\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query UserPersonDetails($personId: String!) {\n userPersonDetails(personId: $personId) {\n collections {\n ...CollectionPart\n }\n reviews {\n ...ReviewItemPart\n }\n }\n}"): (typeof documents)["query UserPersonDetails($personId: String!) {\n userPersonDetails(personId: $personId) {\n collections {\n ...CollectionPart\n }\n reviews {\n ...ReviewItemPart\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query 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 summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}"): (typeof documents)["query 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 summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n collections {\n ...CollectionPart\n }\n details {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}"): (typeof documents)["query UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n collections {\n ...CollectionPart\n }\n details {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query UserWorkoutTemplatesList($input: SearchInput!) {\n userWorkoutTemplatesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n }\n }\n}"): (typeof documents)["query UserWorkoutTemplatesList($input: SearchInput!) {\n userWorkoutTemplatesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n }\n }\n}"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "query UserWorkoutsList($input: SearchInput!) {\n userWorkoutsList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n endTime\n duration\n startTime\n summary {\n ...WorkoutSummaryPart\n }\n }\n }\n}"): (typeof documents)["query UserWorkoutsList($input: SearchInput!) {\n userWorkoutsList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n endTime\n duration\n startTime\n summary {\n ...WorkoutSummaryPart\n }\n }\n }\n}"]; -/** - * 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 ProvidersLanguageInformation {\n providersLanguageInformation {\n supported\n default\n source\n }\n}\n\nquery UserExports {\n userExports {\n url\n size\n endedAt\n startedAt\n }\n}\n\nquery UserCollectionsList($name: String) {\n userCollectionsList(name: $name) {\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\nquery UserIntegrations {\n userIntegrations {\n id\n lot\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 UserRecommendations {\n userRecommendations\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 MetadataGroupsList($input: MetadataGroupsListInput!) {\n metadataGroupsList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n peopleList(input: $input) {\n details {\n total\n nextPage\n }\n items\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 DailyUserActivities($input: DailyUserActivitiesInput!) {\n dailyUserActivities(input: $input) {\n groupedBy\n totalCount\n totalDuration\n items {\n day\n totalReviewCount\n workoutCount\n measurementCount\n audioBookCount\n animeCount\n bookCount\n podcastCount\n mangaCount\n showCount\n movieCount\n videoGameCount\n visualNovelCount\n }\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 ProvidersLanguageInformation {\n providersLanguageInformation {\n supported\n default\n source\n }\n}\n\nquery UserExports {\n userExports {\n url\n size\n endedAt\n startedAt\n }\n}\n\nquery UserCollectionsList($name: String) {\n userCollectionsList(name: $name) {\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\nquery UserIntegrations {\n userIntegrations {\n id\n lot\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 UserRecommendations {\n userRecommendations\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 MetadataGroupsList($input: MetadataGroupsListInput!) {\n metadataGroupsList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n peopleList(input: $input) {\n details {\n total\n nextPage\n }\n items\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 DailyUserActivities($input: DailyUserActivitiesInput!) {\n dailyUserActivities(input: $input) {\n groupedBy\n totalCount\n totalDuration\n items {\n day\n totalReviewCount\n workoutCount\n measurementCount\n audioBookCount\n animeCount\n bookCount\n podcastCount\n mangaCount\n showCount\n movieCount\n videoGameCount\n visualNovelCount\n }\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 size\n endedAt\n startedAt\n }\n}\n\nquery UserCollectionsList($name: String) {\n userCollectionsList(name: $name) {\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\nquery UserIntegrations {\n userIntegrations {\n id\n lot\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 UserRecommendations {\n userRecommendations\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 MetadataGroupsList($input: MetadataGroupsListInput!) {\n metadataGroupsList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n peopleList(input: $input) {\n details {\n total\n nextPage\n }\n items\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 DailyUserActivities($input: DailyUserActivitiesInput!) {\n dailyUserActivities(input: $input) {\n groupedBy\n totalCount\n totalDuration\n items {\n day\n totalReviewCount\n workoutCount\n measurementCount\n audioBookCount\n animeCount\n bookCount\n podcastCount\n mangaCount\n showCount\n movieCount\n videoGameCount\n visualNovelCount\n }\n }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n exerciseDetails(exerciseId: $exerciseId) {\n id\n lot\n source\n level\n force\n mechanic\n equipment\n muscles\n createdByUserId\n attributes {\n instructions\n images\n }\n }\n}\n\nquery ExercisesList($input: ExercisesListInput!) {\n exercisesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n lot\n image\n muscle\n numTimesInteracted\n lastUpdatedOn\n }\n }\n}\n\nquery ImportReports {\n importReports {\n id\n source\n progress\n startedOn\n finishedOn\n wasSuccess\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 details {\n total\n nextPage\n }\n items {\n id\n name\n numItems\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 user {\n id\n name\n }\n reviews {\n ...ReviewItemPart\n }\n results {\n details {\n total\n nextPage\n }\n items {\n entityId\n entityLot\n }\n }\n details {\n name\n description\n createdOn\n }\n }\n}\n\nquery CoreDetails {\n coreDetails {\n isPro\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 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 downloadRequired\n filters {\n type\n level\n force\n mechanic\n equipment\n muscle\n }\n lotMapping {\n lot\n bests\n }\n }\n }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n contents\n sourceUrl\n details {\n id\n title\n lot\n source\n displayImages\n identifier\n parts\n isPartial\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 MetadataList($input: MetadataListInput!) {\n metadataList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n metadataSearch(input: $input) {\n details {\n total\n nextPage\n }\n items {\n databaseId\n hasInteracted\n item {\n identifier\n title\n image\n publishYear\n }\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 reviews {\n ...ReviewItemPart\n }\n collections {\n ...CollectionPart\n }\n }\n}\n\nquery UserPersonDetails($personId: String!) {\n userPersonDetails(personId: $personId) {\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 summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}\n\nquery UserWorkoutsList($input: SearchInput!) {\n userWorkoutsList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n endTime\n duration\n startTime\n summary {\n ...WorkoutSummaryPart\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 visibility\n summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}\n\nquery UserWorkoutTemplatesList($input: SearchInput!) {\n userWorkoutTemplatesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n }\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 size\n endedAt\n startedAt\n }\n}\n\nquery UserCollectionsList($name: String) {\n userCollectionsList(name: $name) {\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\nquery UserIntegrations {\n userIntegrations {\n id\n lot\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 UserRecommendations {\n userRecommendations\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 MetadataGroupsList($input: MetadataGroupsListInput!) {\n metadataGroupsList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n peopleList(input: $input) {\n details {\n total\n nextPage\n }\n items\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 DailyUserActivities($input: DailyUserActivitiesInput!) {\n dailyUserActivities(input: $input) {\n groupedBy\n totalCount\n totalDuration\n items {\n day\n totalReviewCount\n workoutCount\n measurementCount\n audioBookCount\n animeCount\n bookCount\n podcastCount\n mangaCount\n showCount\n movieCount\n videoGameCount\n visualNovelCount\n }\n }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n exerciseDetails(exerciseId: $exerciseId) {\n id\n lot\n source\n level\n force\n mechanic\n equipment\n muscles\n createdByUserId\n attributes {\n instructions\n images\n }\n }\n}\n\nquery ExercisesList($input: ExercisesListInput!) {\n exercisesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n lot\n image\n muscle\n numTimesInteracted\n lastUpdatedOn\n }\n }\n}\n\nquery ImportReports {\n importReports {\n id\n source\n progress\n startedOn\n finishedOn\n wasSuccess\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 details {\n total\n nextPage\n }\n items {\n id\n name\n numItems\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 user {\n id\n name\n }\n reviews {\n ...ReviewItemPart\n }\n results {\n details {\n total\n nextPage\n }\n items {\n entityId\n entityLot\n }\n }\n details {\n name\n description\n createdOn\n }\n }\n}\n\nquery CoreDetails {\n coreDetails {\n isPro\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 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 downloadRequired\n filters {\n type\n level\n force\n mechanic\n equipment\n muscle\n }\n lotMapping {\n lot\n bests\n }\n }\n }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n contents\n sourceUrl\n details {\n id\n title\n lot\n source\n displayImages\n identifier\n parts\n isPartial\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 MetadataList($input: MetadataListInput!) {\n metadataList(input: $input) {\n details {\n total\n nextPage\n }\n items\n }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n metadataSearch(input: $input) {\n details {\n total\n nextPage\n }\n items {\n databaseId\n hasInteracted\n item {\n identifier\n title\n image\n publishYear\n }\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 reviews {\n ...ReviewItemPart\n }\n collections {\n ...CollectionPart\n }\n }\n}\n\nquery UserPersonDetails($personId: String!) {\n userPersonDetails(personId: $personId) {\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 summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}\n\nquery UserWorkoutsList($input: SearchInput!) {\n userWorkoutsList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n endTime\n duration\n startTime\n summary {\n ...WorkoutSummaryPart\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 visibility\n summary {\n ...WorkoutSummaryPart\n }\n information {\n ...WorkoutInformationPart\n }\n }\n }\n}\n\nquery UserWorkoutTemplatesList($input: SearchInput!) {\n userWorkoutTemplatesList(input: $input) {\n details {\n total\n nextPage\n }\n items {\n id\n name\n createdOn\n visibility\n summary {\n ...WorkoutSummaryPart\n }\n }\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 2fc9182ff1..d91a1ec5c1 100644 --- a/libs/generated/src/graphql/backend/graphql.ts +++ b/libs/generated/src/graphql/backend/graphql.ts @@ -220,10 +220,13 @@ export type CoreDetails = { backendErrors: Array; disableTelemetry: Scalars['Boolean']['output']; docsLink: Scalars['String']['output']; + exerciseParameters: ExerciseParameters; fileStorageEnabled: Scalars['Boolean']['output']; frontend: FrontendConfig; isPro: Scalars['Boolean']['output']; localAuthDisabled: Scalars['Boolean']['output']; + metadataLotSourceMappings: Array; + metadataProviderLanguages: Array; oidcEnabled: Scalars['Boolean']['output']; pageSize: Scalars['Int']['output']; repositoryLink: Scalars['String']['output']; @@ -422,8 +425,8 @@ export type DeployMovaryImportInput = { }; export type DeployStrongAppImportInput = { - exportPath: Scalars['String']['input']; - mapping: Array; + dataExportPath?: InputMaybe; + measurementsZipPath?: InputMaybe; }; export type DeployTraktImportInput = { @@ -817,6 +820,7 @@ export type ImportReport = { details?: Maybe; finishedOn?: Maybe; id: Scalars['String']['output']; + progress?: Maybe; source: ImportSource; startedOn: Scalars['DateTime']['output']; userId: Scalars['String']['output']; @@ -835,11 +839,12 @@ export enum ImportSource { Igdb = 'IGDB', Imdb = 'IMDB', Jellyfin = 'JELLYFIN', - Mal = 'MAL', - MediaTracker = 'MEDIA_TRACKER', + Mediatracker = 'MEDIATRACKER', Movary = 'MOVARY', + Myanimelist = 'MYANIMELIST', OpenScale = 'OPEN_SCALE', - StoryGraph = 'STORY_GRAPH', + Plex = 'PLEX', + Storygraph = 'STORYGRAPH', StrongApp = 'STRONG_APP', Trakt = 'TRAKT' } @@ -1067,6 +1072,11 @@ export type MetadataListInput = { take?: InputMaybe; }; +export type MetadataLotSourceMappings = { + lot: MediaLot; + sources: Array; +}; + export type MetadataPartialDetails = { id: Scalars['String']['output']; image?: Maybe; @@ -1196,6 +1206,8 @@ export type MutationRoot = { generateAuthToken: Scalars['String']['output']; /** Login a user using their username and password and return an auth token. */ loginUser: LoginResult; + /** Merge an exercise into another. */ + mergeExercise: Scalars['Boolean']['output']; /** * Merge a media item into another. This will move all `seen`, `collection` * and `review` associations with to the metadata. @@ -1400,6 +1412,12 @@ export type MutationRootLoginUserArgs = { }; +export type MutationRootMergeExerciseArgs = { + mergeFrom: Scalars['String']['input']; + mergeInto: Scalars['String']['input']; +}; + + export type MutationRootMergeMetadataArgs = { mergeFrom: Scalars['String']['input']; mergeInto: Scalars['String']['input']; @@ -1686,8 +1704,6 @@ export type QueryRoot = { dailyUserActivities: DailyUserActivitiesResponse; /** Get details about an exercise. */ exerciseDetails: Exercise; - /** Get all the parameters related to exercises. */ - exerciseParameters: ExerciseParameters; /** Get a paginated list of exercises in the database. */ exercisesList: ExerciseListResults; /** Get details about a genre present in the database. */ @@ -1724,8 +1740,6 @@ export type QueryRoot = { peopleSearch: PeopleSearchResults; /** Get details about a creator present in the database. */ personDetails: PersonDetails; - /** Get all languages supported by all the providers. */ - providersLanguageInformation: Array; /** Get all access links generated by the currently logged in user. */ userAccessLinks: Array; /** Get user by OIDC issuer ID. */ @@ -2111,12 +2125,6 @@ export type StringIdObject = { id: Scalars['String']['output']; }; -export type StrongAppImportMapping = { - multiplier?: InputMaybe; - sourceName: Scalars['String']['input']; - targetName: Scalars['String']['input']; -}; - export type UpdateComplexJsonInput = { /** Dot delimited path to the property that needs to be changed. */ property: Scalars['String']['input']; @@ -3110,55 +3118,13 @@ export type UpdateUserExerciseSettingsMutationVariables = Exact<{ export type UpdateUserExerciseSettingsMutation = { updateUserExerciseSettings: boolean }; -export type CollectionContentsQueryVariables = Exact<{ - input: CollectionContentsInput; -}>; - - -export type CollectionContentsQuery = { collectionContents: { user: { id: string, name: string }, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, results: { details: { total: number, nextPage?: number | null }, items: Array<{ entityId: string, entityLot: EntityLot }> }, details: { name: string, description?: string | null, createdOn: string } } }; - -export type CoreDetailsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type CoreDetailsQuery = { coreDetails: { isPro: boolean, version: string, docsLink: string, pageSize: number, websiteUrl: string, smtpEnabled: boolean, oidcEnabled: boolean, signupAllowed: boolean, repositoryLink: string, disableTelemetry: boolean, tokenValidForDays: number, localAuthDisabled: boolean, fileStorageEnabled: boolean, frontend: { url: string, oidcButtonLabel: string, dashboardMessage: string, umami: { domains: string, scriptUrl: string, websiteId: string } } } }; - -export type ExerciseDetailsQueryVariables = Exact<{ - exerciseId: Scalars['String']['input']; -}>; - - -export type ExerciseDetailsQuery = { exerciseDetails: { id: string, lot: ExerciseLot, source: ExerciseSource, level: ExerciseLevel, force?: ExerciseForce | null, mechanic?: ExerciseMechanic | null, equipment?: ExerciseEquipment | null, muscles: Array, createdByUserId?: string | null, attributes: { instructions: Array, images: Array } } }; - -export type ExerciseParametersQueryVariables = Exact<{ [key: string]: never; }>; - - -export type ExerciseParametersQuery = { exerciseParameters: { downloadRequired: boolean, filters: { type: Array, level: Array, force: Array, mechanic: Array, equipment: Array, muscle: Array }, lotMapping: Array<{ lot: ExerciseLot, bests: Array }> } }; - -export type ExercisesListQueryVariables = Exact<{ - input: ExercisesListInput; -}>; - - -export type ExercisesListQuery = { exercisesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, lot: ExerciseLot, image?: string | null, muscle?: ExerciseMuscle | null, numTimesInteracted?: number | null, lastUpdatedOn?: string | null }> } }; - -export type GenreDetailsQueryVariables = Exact<{ - input: GenreDetailsInput; -}>; - - -export type GenreDetailsQuery = { genreDetails: { details: { id: string, name: string, numItems?: number | null }, contents: { items: Array, details: { total: number, nextPage?: number | null } } } }; - -export type GenresListQueryVariables = Exact<{ - input: SearchInput; +export type MergeExerciseMutationVariables = Exact<{ + mergeFrom: Scalars['String']['input']; + mergeInto: Scalars['String']['input']; }>; -export type GenresListQuery = { genresList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, numItems?: number | null }> } }; - -export type ImportReportsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type ImportReportsQuery = { importReports: Array<{ id: string, source: ImportSource, startedOn: string, finishedOn?: string | null, wasSuccess?: boolean | null, details?: { import: { total: number }, failedItems: Array<{ lot?: MediaLot | null, step: ImportFailStep, identifier: string, error?: string | null }> } | null }> }; +export type MergeExerciseMutation = { mergeExercise: boolean }; export type LatestUserSummaryQueryVariables = Exact<{ [key: string]: never; }>; @@ -3172,41 +3138,6 @@ export type MetadataDetailsQueryVariables = Exact<{ export type MetadataDetailsQuery = { metadataDetails: { id: string, lot: MediaLot, title: string, source: MediaSource, isNsfw?: boolean | null, isPartial?: boolean | null, sourceUrl?: string | null, identifier: string, description?: string | null, suggestions: Array, publishYear?: number | null, publishDate?: string | null, providerRating?: string | null, productionStatus?: string | null, originalLanguage?: string | null, genres: Array<{ id: string, name: string }>, group?: { id: string, name: string, part: number } | null, assets: { images: Array, videos: Array<{ videoId: string, source: MetadataVideoSource }> }, creators: Array<{ name: string, items: Array<{ id?: string | null, name: string, image?: string | null, character?: string | null }> }>, watchProviders: Array<{ name: string, image?: string | null, languages: Array }>, animeSpecifics?: { episodes?: number | null } | null, audioBookSpecifics?: { runtime?: number | null } | null, bookSpecifics?: { pages?: number | null } | null, movieSpecifics?: { runtime?: number | null } | null, mangaSpecifics?: { volumes?: number | null, chapters?: string | null } | null, podcastSpecifics?: { totalEpisodes: number, episodes: Array<{ id: string, title: string, overview?: string | null, thumbnail?: string | null, number: number, runtime?: number | null, publishDate: string }> } | null, showSpecifics?: { totalSeasons?: number | null, totalEpisodes?: number | null, runtime?: number | null, seasons: Array<{ id: number, seasonNumber: number, name: string, overview?: string | null, backdropImages: Array, posterImages: Array, episodes: Array<{ id: number, name: string, posterImages: Array, episodeNumber: number, publishDate?: string | null, overview?: string | null, runtime?: number | null }> }> } | null, visualNovelSpecifics?: { length?: number | null } | null, videoGameSpecifics?: { platforms: Array } | null } }; -export type MetadataGroupDetailsQueryVariables = Exact<{ - metadataGroupId: Scalars['String']['input']; -}>; - - -export type MetadataGroupDetailsQuery = { metadataGroupDetails: { contents: Array, sourceUrl?: string | null, details: { id: string, title: string, lot: MediaLot, source: MediaSource, displayImages: Array, identifier: string, parts: number, isPartial?: boolean | null } } }; - -export type MetadataGroupSearchQueryVariables = Exact<{ - input: MetadataGroupSearchInput; -}>; - - -export type MetadataGroupSearchQuery = { metadataGroupSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, parts?: number | null }> } }; - -export type MetadataListQueryVariables = Exact<{ - input: MetadataListInput; -}>; - - -export type MetadataListQuery = { metadataList: { items: Array, details: { total: number, nextPage?: number | null } } }; - -export type MetadataSearchQueryVariables = Exact<{ - input: MetadataSearchInput; -}>; - - -export type MetadataSearchQuery = { metadataSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ databaseId?: string | null, hasInteracted: boolean, item: { identifier: string, title: string, image?: string | null, publishYear?: number | null } }> } }; - -export type PeopleSearchQueryVariables = Exact<{ - input: PeopleSearchInput; -}>; - - -export type PeopleSearchQuery = { peopleSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, birthYear?: number | null }> } }; - export type PersonDetailsQueryVariables = Exact<{ personId: Scalars['String']['input']; }>; @@ -3240,48 +3171,6 @@ export type UserMetadataDetailsQueryVariables = Exact<{ export type UserMetadataDetailsQuery = { userMetadataDetails: { mediaReason?: Array | null, hasInteracted: boolean, averageRating?: string | null, seenByAllCount: number, seenByUserCount: number, collections: Array<{ id: string, name: string, userId: string }>, inProgress?: { id: string, state: SeenState, progress: string, reviewId?: string | null, startedOn?: string | null, finishedOn?: string | null, lastUpdatedOn: string, manualTimeSpent?: string | null, numTimesUpdated: number, providerWatchedOn?: string | null, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null } | null, history: Array<{ id: string, state: SeenState, progress: string, reviewId?: string | null, startedOn?: string | null, finishedOn?: string | null, lastUpdatedOn: string, manualTimeSpent?: string | null, numTimesUpdated: number, providerWatchedOn?: string | null, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, nextEntry?: { season?: number | null, volume?: number | null, episode?: number | null, chapter?: string | null } | null, showProgress?: Array<{ timesSeen: number, seasonNumber: number, episodes: Array<{ episodeNumber: number, timesSeen: number }> }> | null, podcastProgress?: Array<{ episodeNumber: number, timesSeen: number }> | null } }; -export type UserMetadataGroupDetailsQueryVariables = Exact<{ - metadataGroupId: Scalars['String']['input']; -}>; - - -export type UserMetadataGroupDetailsQuery = { userMetadataGroupDetails: { reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, collections: Array<{ id: string, name: string, userId: string }> } }; - -export type UserPersonDetailsQueryVariables = Exact<{ - personId: Scalars['String']['input']; -}>; - - -export type UserPersonDetailsQuery = { userPersonDetails: { collections: Array<{ id: string, name: string, userId: string }>, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }> } }; - -export type UserWorkoutDetailsQueryVariables = Exact<{ - workoutId: Scalars['String']['input']; -}>; - - -export type UserWorkoutDetailsQuery = { userWorkoutDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, endTime: string, duration: number, startTime: string, templateId?: string | null, repeatedFrom?: string | null, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } }, information: { comment?: string | null, assets?: { images: Array, videos: Array } | null, supersets: Array<{ color: string, exercises: Array }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array, videos: Array } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } }; - -export type UserWorkoutTemplateDetailsQueryVariables = Exact<{ - workoutTemplateId: Scalars['String']['input']; -}>; - - -export type UserWorkoutTemplateDetailsQuery = { userWorkoutTemplateDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } }, information: { comment?: string | null, assets?: { images: Array, videos: Array } | null, supersets: Array<{ color: string, exercises: Array }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array, videos: Array } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } }; - -export type UserWorkoutTemplatesListQueryVariables = Exact<{ - input: SearchInput; -}>; - - -export type UserWorkoutTemplatesListQuery = { userWorkoutTemplatesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } } }> } }; - -export type UserWorkoutsListQueryVariables = Exact<{ - input: SearchInput; -}>; - - -export type UserWorkoutsListQuery = { userWorkoutsList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, endTime: string, duration: number, startTime: string, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } } }> } }; - export type GetOidcRedirectUrlQueryVariables = Exact<{ [key: string]: never; }>; @@ -3308,11 +3197,6 @@ export type GetPresignedS3UrlQueryVariables = Exact<{ export type GetPresignedS3UrlQuery = { getPresignedS3Url: string }; -export type ProvidersLanguageInformationQueryVariables = Exact<{ [key: string]: never; }>; - - -export type ProvidersLanguageInformationQuery = { providersLanguageInformation: Array<{ supported: Array, default: string, source: MediaSource }> }; - export type UserExportsQueryVariables = Exact<{ [key: string]: never; }>; @@ -3394,6 +3278,128 @@ export type DailyUserActivitiesQueryVariables = Exact<{ export type DailyUserActivitiesQuery = { dailyUserActivities: { groupedBy: DailyUserActivitiesResponseGroupedBy, totalCount: number, totalDuration: number, items: Array<{ day: string, totalReviewCount: number, workoutCount: number, measurementCount: number, audioBookCount: number, animeCount: number, bookCount: number, podcastCount: number, mangaCount: number, showCount: number, movieCount: number, videoGameCount: number, visualNovelCount: number }> } }; +export type ExerciseDetailsQueryVariables = Exact<{ + exerciseId: Scalars['String']['input']; +}>; + + +export type ExerciseDetailsQuery = { exerciseDetails: { id: string, lot: ExerciseLot, source: ExerciseSource, level: ExerciseLevel, force?: ExerciseForce | null, mechanic?: ExerciseMechanic | null, equipment?: ExerciseEquipment | null, muscles: Array, createdByUserId?: string | null, attributes: { instructions: Array, images: Array } } }; + +export type ExercisesListQueryVariables = Exact<{ + input: ExercisesListInput; +}>; + + +export type ExercisesListQuery = { exercisesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, lot: ExerciseLot, image?: string | null, muscle?: ExerciseMuscle | null, numTimesInteracted?: number | null, lastUpdatedOn?: string | null }> } }; + +export type ImportReportsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type ImportReportsQuery = { importReports: Array<{ id: string, source: ImportSource, progress?: string | null, startedOn: string, finishedOn?: string | null, wasSuccess?: boolean | null, details?: { import: { total: number }, failedItems: Array<{ lot?: MediaLot | null, step: ImportFailStep, error?: string | null, identifier: string }> } | null }> }; + +export type GenresListQueryVariables = Exact<{ + input: SearchInput; +}>; + + +export type GenresListQuery = { genresList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, numItems?: number | null }> } }; + +export type GenreDetailsQueryVariables = Exact<{ + input: GenreDetailsInput; +}>; + + +export type GenreDetailsQuery = { genreDetails: { details: { id: string, name: string, numItems?: number | null }, contents: { items: Array, details: { total: number, nextPage?: number | null } } } }; + +export type CollectionContentsQueryVariables = Exact<{ + input: CollectionContentsInput; +}>; + + +export type CollectionContentsQuery = { collectionContents: { user: { id: string, name: string }, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, results: { details: { total: number, nextPage?: number | null }, items: Array<{ entityId: string, entityLot: EntityLot }> }, details: { name: string, description?: string | null, createdOn: string } } }; + +export type CoreDetailsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type CoreDetailsQuery = { coreDetails: { isPro: boolean, version: string, docsLink: string, pageSize: number, websiteUrl: string, smtpEnabled: boolean, oidcEnabled: boolean, signupAllowed: boolean, repositoryLink: string, disableTelemetry: boolean, tokenValidForDays: number, localAuthDisabled: boolean, fileStorageEnabled: boolean, metadataLotSourceMappings: Array<{ lot: MediaLot, sources: Array }>, metadataProviderLanguages: Array<{ source: MediaSource, default: string, supported: Array }>, frontend: { url: string, oidcButtonLabel: string, dashboardMessage: string, umami: { domains: string, scriptUrl: string, websiteId: string } }, exerciseParameters: { downloadRequired: boolean, filters: { type: Array, level: Array, force: Array, mechanic: Array, equipment: Array, muscle: Array }, lotMapping: Array<{ lot: ExerciseLot, bests: Array }> } } }; + +export type MetadataGroupDetailsQueryVariables = Exact<{ + metadataGroupId: Scalars['String']['input']; +}>; + + +export type MetadataGroupDetailsQuery = { metadataGroupDetails: { contents: Array, sourceUrl?: string | null, details: { id: string, title: string, lot: MediaLot, source: MediaSource, displayImages: Array, identifier: string, parts: number, isPartial?: boolean | null } } }; + +export type MetadataGroupSearchQueryVariables = Exact<{ + input: MetadataGroupSearchInput; +}>; + + +export type MetadataGroupSearchQuery = { metadataGroupSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, parts?: number | null }> } }; + +export type MetadataListQueryVariables = Exact<{ + input: MetadataListInput; +}>; + + +export type MetadataListQuery = { metadataList: { items: Array, details: { total: number, nextPage?: number | null } } }; + +export type MetadataSearchQueryVariables = Exact<{ + input: MetadataSearchInput; +}>; + + +export type MetadataSearchQuery = { metadataSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ databaseId?: string | null, hasInteracted: boolean, item: { identifier: string, title: string, image?: string | null, publishYear?: number | null } }> } }; + +export type PeopleSearchQueryVariables = Exact<{ + input: PeopleSearchInput; +}>; + + +export type PeopleSearchQuery = { peopleSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, birthYear?: number | null }> } }; + +export type UserMetadataGroupDetailsQueryVariables = Exact<{ + metadataGroupId: Scalars['String']['input']; +}>; + + +export type UserMetadataGroupDetailsQuery = { userMetadataGroupDetails: { reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, collections: Array<{ id: string, name: string, userId: string }> } }; + +export type UserPersonDetailsQueryVariables = Exact<{ + personId: Scalars['String']['input']; +}>; + + +export type UserPersonDetailsQuery = { userPersonDetails: { collections: Array<{ id: string, name: string, userId: string }>, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }> } }; + +export type UserWorkoutDetailsQueryVariables = Exact<{ + workoutId: Scalars['String']['input']; +}>; + + +export type UserWorkoutDetailsQuery = { userWorkoutDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, endTime: string, duration: number, startTime: string, templateId?: string | null, repeatedFrom?: string | null, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } }, information: { comment?: string | null, assets?: { images: Array, videos: Array } | null, supersets: Array<{ color: string, exercises: Array }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array, videos: Array } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } }; + +export type UserWorkoutsListQueryVariables = Exact<{ + input: SearchInput; +}>; + + +export type UserWorkoutsListQuery = { userWorkoutsList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, endTime: string, duration: number, startTime: string, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } } }> } }; + +export type UserWorkoutTemplateDetailsQueryVariables = Exact<{ + workoutTemplateId: Scalars['String']['input']; +}>; + + +export type UserWorkoutTemplateDetailsQuery = { userWorkoutTemplateDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } }, information: { comment?: string | null, assets?: { images: Array, videos: Array } | null, supersets: Array<{ color: string, exercises: Array }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array, videos: Array } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } }; + +export type UserWorkoutTemplatesListQueryVariables = Exact<{ + input: SearchInput; +}>; + + +export type UserWorkoutTemplatesListQuery = { userWorkoutTemplatesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array }>, levels: Array<{ level: ExerciseLevel, exercises: Array }>, forces: Array<{ force: ExerciseForce, exercises: Array }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array }> } } }> } }; + export type SeenPodcastExtraInformationPartFragment = { episode: number }; export type SeenShowExtraInformationPartFragment = { episode: number, season: number }; @@ -3492,37 +3498,18 @@ export const CreateAccessLinkDocument = {"kind":"Document","definitions":[{"kind export const ProcessAccessLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ProcessAccessLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ProcessAccessLinkInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"processAccessLink"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ProcessAccessLinkError"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"error"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ProcessAccessLinkResponse"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"apiKey"}},{"kind":"Field","name":{"kind":"Name","value":"redirectTo"}},{"kind":"Field","name":{"kind":"Name","value":"tokenValidForDays"}}]}}]}}]}}]} as unknown as DocumentNode; export const RevokeAccessLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RevokeAccessLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"accessLinkId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"revokeAccessLink"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"accessLinkId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"accessLinkId"}}}]}]}}]} as unknown as DocumentNode; export const UpdateUserExerciseSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserExerciseSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateUserExerciseSettings"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserExerciseSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode; -export const CollectionContentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CollectionContents"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CollectionContentsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collectionContents"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"results"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"entityId"}},{"kind":"Field","name":{"kind":"Name","value":"entityLot"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode; -export const CoreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CoreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"coreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"isPro"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"docsLink"}},{"kind":"Field","name":{"kind":"Name","value":"pageSize"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"smtpEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"oidcEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"signupAllowed"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryLink"}},{"kind":"Field","name":{"kind":"Name","value":"disableTelemetry"}},{"kind":"Field","name":{"kind":"Name","value":"tokenValidForDays"}},{"kind":"Field","name":{"kind":"Name","value":"localAuthDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"fileStorageEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"frontend"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"oidcButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"dashboardMessage"}},{"kind":"Field","name":{"kind":"Name","value":"umami"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"scriptUrl"}},{"kind":"Field","name":{"kind":"Name","value":"websiteId"}}]}}]}}]}}]}}]} as unknown as DocumentNode; -export const ExerciseDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExerciseDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"exerciseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscles"}},{"kind":"Field","name":{"kind":"Name","value":"createdByUserId"}},{"kind":"Field","name":{"kind":"Name","value":"attributes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"instructions"}},{"kind":"Field","name":{"kind":"Name","value":"images"}}]}}]}}]}}]} as unknown as DocumentNode; -export const ExerciseParametersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExerciseParameters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseParameters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"downloadRequired"}},{"kind":"Field","name":{"kind":"Name","value":"filters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lotMapping"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bests"}}]}}]}}]}}]} as unknown as DocumentNode; -export const ExercisesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExercisesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ExercisesListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exercisesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"numTimesInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}}]}}]}}]}}]} as unknown as DocumentNode; -export const GenreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenreDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GenreDetailsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genreDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}},{"kind":"Field","name":{"kind":"Name","value":"contents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]}}]} as unknown as DocumentNode; -export const GenresListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenresList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genresList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}}]}}]}}]} as unknown as DocumentNode; -export const ImportReportsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ImportReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"importReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"startedOn"}},{"kind":"Field","name":{"kind":"Name","value":"finishedOn"}},{"kind":"Field","name":{"kind":"Name","value":"wasSuccess"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"import"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}}]}},{"kind":"Field","name":{"kind":"Name","value":"failedItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"step"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const MergeExerciseDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MergeExercise"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"mergeFrom"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"mergeInto"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"mergeExercise"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"mergeFrom"},"value":{"kind":"Variable","name":{"kind":"Name","value":"mergeFrom"}}},{"kind":"Argument","name":{"kind":"Name","value":"mergeInto"},"value":{"kind":"Variable","name":{"kind":"Name","value":"mergeInto"}}}]}]}}]} as unknown as DocumentNode; export const LatestUserSummaryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"LatestUserSummary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"latestUserSummary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalMetadataReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalCollectionReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalMetadataGroupReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalPersonReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"measurementCount"}},{"kind":"Field","name":{"kind":"Name","value":"workoutCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutDuration"}},{"kind":"Field","name":{"kind":"Name","value":"audioBookCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalAudioBookDuration"}},{"kind":"Field","name":{"kind":"Name","value":"animeCount"}},{"kind":"Field","name":{"kind":"Name","value":"bookCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalBookPages"}},{"kind":"Field","name":{"kind":"Name","value":"podcastCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalPodcastDuration"}},{"kind":"Field","name":{"kind":"Name","value":"mangaCount"}},{"kind":"Field","name":{"kind":"Name","value":"movieCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalMovieDuration"}},{"kind":"Field","name":{"kind":"Name","value":"showCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalShowDuration"}},{"kind":"Field","name":{"kind":"Name","value":"videoGameCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalVideoGameDuration"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalVisualNovelDuration"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutPersonalBests"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutWeight"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutReps"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutDistance"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutRestTime"}},{"kind":"Field","name":{"kind":"Name","value":"totalMetadataCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalDuration"}}]}}]}}]} as unknown as DocumentNode; export const MetadataDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"isNsfw"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"suggestions"}},{"kind":"Field","name":{"kind":"Name","value":"publishYear"}},{"kind":"Field","name":{"kind":"Name","value":"publishDate"}},{"kind":"Field","name":{"kind":"Name","value":"providerRating"}},{"kind":"Field","name":{"kind":"Name","value":"productionStatus"}},{"kind":"Field","name":{"kind":"Name","value":"originalLanguage"}},{"kind":"Field","name":{"kind":"Name","value":"genres"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"group"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"part"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"videoId"}},{"kind":"Field","name":{"kind":"Name","value":"source"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"creators"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"character"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"watchProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"languages"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodes"}}]}},{"kind":"Field","name":{"kind":"Name","value":"audioBookSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"runtime"}}]}},{"kind":"Field","name":{"kind":"Name","value":"bookSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"pages"}}]}},{"kind":"Field","name":{"kind":"Name","value":"movieSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"runtime"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volumes"}},{"kind":"Field","name":{"kind":"Name","value":"chapters"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"overview"}},{"kind":"Field","name":{"kind":"Name","value":"thumbnail"}},{"kind":"Field","name":{"kind":"Name","value":"number"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"publishDate"}}]}},{"kind":"Field","name":{"kind":"Name","value":"totalEpisodes"}}]}},{"kind":"Field","name":{"kind":"Name","value":"showSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalSeasons"}},{"kind":"Field","name":{"kind":"Name","value":"totalEpisodes"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"seasons"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"seasonNumber"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"overview"}},{"kind":"Field","name":{"kind":"Name","value":"backdropImages"}},{"kind":"Field","name":{"kind":"Name","value":"posterImages"}},{"kind":"Field","name":{"kind":"Name","value":"episodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"posterImages"}},{"kind":"Field","name":{"kind":"Name","value":"episodeNumber"}},{"kind":"Field","name":{"kind":"Name","value":"publishDate"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"overview"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"length"}}]}},{"kind":"Field","name":{"kind":"Name","value":"videoGameSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"platforms"}}]}}]}}]}}]} as unknown as DocumentNode; -export const MetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contents"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"displayImages"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}}]}}]}}]}}]} as unknown as DocumentNode; -export const MetadataGroupSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataGroupSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}}]}}]}}]}}]} as unknown as DocumentNode; -export const MetadataListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode; -export const MetadataSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"databaseId"}},{"kind":"Field","name":{"kind":"Name","value":"hasInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"item"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"publishYear"}}]}}]}}]}}]}}]} as unknown as DocumentNode; -export const PeopleSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PeopleSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PeopleSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"peopleSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"birthYear"}}]}}]}}]}}]} as unknown as DocumentNode; export const PersonDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PersonDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"personId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"personDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"personId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"personId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"birthDate"}},{"kind":"Field","name":{"kind":"Name","value":"deathDate"}},{"kind":"Field","name":{"kind":"Name","value":"place"}},{"kind":"Field","name":{"kind":"Name","value":"website"}},{"kind":"Field","name":{"kind":"Name","value":"gender"}},{"kind":"Field","name":{"kind":"Name","value":"displayImages"}}]}},{"kind":"Field","name":{"kind":"Name","value":"contents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"character"}},{"kind":"Field","name":{"kind":"Name","value":"metadataId"}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const UserDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"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"}},{"kind":"Field","name":{"kind":"Name","value":"oidcIssuerId"}},{"kind":"Field","name":{"kind":"Name","value":"preferences"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"general"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reviewScale"}},{"kind":"Field","name":{"kind":"Name","value":"gridPacking"}},{"kind":"Field","name":{"kind":"Name","value":"displayNsfw"}},{"kind":"Field","name":{"kind":"Name","value":"disableVideos"}},{"kind":"Field","name":{"kind":"Name","value":"persistQueries"}},{"kind":"Field","name":{"kind":"Name","value":"disableReviews"}},{"kind":"Field","name":{"kind":"Name","value":"disableIntegrations"}},{"kind":"Field","name":{"kind":"Name","value":"disableWatchProviders"}},{"kind":"Field","name":{"kind":"Name","value":"disableNavigationAnimation"}},{"kind":"Field","name":{"kind":"Name","value":"dashboard"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hidden"}},{"kind":"Field","name":{"kind":"Name","value":"section"}},{"kind":"Field","name":{"kind":"Name","value":"numElements"}},{"kind":"Field","name":{"kind":"Name","value":"deduplicateMedia"}}]}},{"kind":"Field","name":{"kind":"Name","value":"watchProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"values"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fitness"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"logging"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muteSounds"}},{"kind":"Field","name":{"kind":"Name","value":"showDetailsWhileEditing"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unitSystem"}},{"kind":"Field","name":{"kind":"Name","value":"setRestTimers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SetRestTimersPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"measurements"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"custom"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"dataType"}}]}},{"kind":"Field","name":{"kind":"Name","value":"inbuilt"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"bodyMassIndex"}},{"kind":"Field","name":{"kind":"Name","value":"totalBodyWater"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"leanBodyMass"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFat"}},{"kind":"Field","name":{"kind":"Name","value":"boneMass"}},{"kind":"Field","name":{"kind":"Name","value":"visceralFat"}},{"kind":"Field","name":{"kind":"Name","value":"waistCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHeightRatio"}},{"kind":"Field","name":{"kind":"Name","value":"hipCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHipRatio"}},{"kind":"Field","name":{"kind":"Name","value":"chestCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"thighCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bicepsCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"neckCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFatCaliper"}},{"kind":"Field","name":{"kind":"Name","value":"chestSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"abdominalSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"thighSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"basalMetabolicRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalDailyEnergyExpenditure"}},{"kind":"Field","name":{"kind":"Name","value":"calories"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"notifications"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"toSend"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}}]}},{"kind":"Field","name":{"kind":"Name","value":"featuresEnabled"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"others"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"calendar"}},{"kind":"Field","name":{"kind":"Name","value":"collections"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fitness"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"workouts"}},{"kind":"Field","name":{"kind":"Name","value":"templates"}},{"kind":"Field","name":{"kind":"Name","value":"measurements"}}]}},{"kind":"Field","name":{"kind":"Name","value":"media"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"anime"}},{"kind":"Field","name":{"kind":"Name","value":"audioBook"}},{"kind":"Field","name":{"kind":"Name","value":"book"}},{"kind":"Field","name":{"kind":"Name","value":"manga"}},{"kind":"Field","name":{"kind":"Name","value":"movie"}},{"kind":"Field","name":{"kind":"Name","value":"podcast"}},{"kind":"Field","name":{"kind":"Name","value":"show"}},{"kind":"Field","name":{"kind":"Name","value":"videoGame"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovel"}},{"kind":"Field","name":{"kind":"Name","value":"people"}},{"kind":"Field","name":{"kind":"Name","value":"groups"}},{"kind":"Field","name":{"kind":"Name","value":"genres"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SetRestTimersPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SetRestTimersSettings"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"drop"}},{"kind":"Field","name":{"kind":"Name","value":"warmup"}},{"kind":"Field","name":{"kind":"Name","value":"normal"}},{"kind":"Field","name":{"kind":"Name","value":"failure"}}]}}]} as unknown as DocumentNode; export const UserExerciseDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserExerciseDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userExerciseDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"exerciseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"history"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"idx"}},{"kind":"Field","name":{"kind":"Name","value":"workoutId"}},{"kind":"Field","name":{"kind":"Name","value":"workoutEndOn"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseId"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}},{"kind":"Field","name":{"kind":"Name","value":"exerciseNumTimesInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"exerciseExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"setRestTimers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SetRestTimersPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"lifetimeStats"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"workoutId"}},{"kind":"Field","name":{"kind":"Name","value":"exerciseIdx"}},{"kind":"Field","name":{"kind":"Name","value":"setIdx"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SetRestTimersPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SetRestTimersSettings"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"drop"}},{"kind":"Field","name":{"kind":"Name","value":"warmup"}},{"kind":"Field","name":{"kind":"Name","value":"normal"}},{"kind":"Field","name":{"kind":"Name","value":"failure"}}]}}]} as unknown as DocumentNode; export const UserMeasurementsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMeasurementsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UserMeasurementsListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMeasurementsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"stats"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"bodyMassIndex"}},{"kind":"Field","name":{"kind":"Name","value":"totalBodyWater"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"leanBodyMass"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFat"}},{"kind":"Field","name":{"kind":"Name","value":"boneMass"}},{"kind":"Field","name":{"kind":"Name","value":"visceralFat"}},{"kind":"Field","name":{"kind":"Name","value":"waistCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHeightRatio"}},{"kind":"Field","name":{"kind":"Name","value":"hipCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHipRatio"}},{"kind":"Field","name":{"kind":"Name","value":"chestCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"thighCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bicepsCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"neckCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFatCaliper"}},{"kind":"Field","name":{"kind":"Name","value":"chestSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"abdominalSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"thighSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"basalMetabolicRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalDailyEnergyExpenditure"}},{"kind":"Field","name":{"kind":"Name","value":"calories"}},{"kind":"Field","name":{"kind":"Name","value":"custom"}}]}}]}}]}}]} as unknown as DocumentNode; export const UserMetadataDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMetadataDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMetadataDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"mediaReason"}},{"kind":"Field","name":{"kind":"Name","value":"hasInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"inProgress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"history"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"averageRating"}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"seenByAllCount"}},{"kind":"Field","name":{"kind":"Name","value":"seenByUserCount"}},{"kind":"Field","name":{"kind":"Name","value":"nextEntry"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"Field","name":{"kind":"Name","value":"showProgress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"timesSeen"}},{"kind":"Field","name":{"kind":"Name","value":"seasonNumber"}},{"kind":"Field","name":{"kind":"Name","value":"episodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodeNumber"}},{"kind":"Field","name":{"kind":"Name","value":"timesSeen"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastProgress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodeNumber"}},{"kind":"Field","name":{"kind":"Name","value":"timesSeen"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenShowExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenShowExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}},{"kind":"Field","name":{"kind":"Name","value":"season"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenPodcastExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenPodcastExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Seen"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"progress"}},{"kind":"Field","name":{"kind":"Name","value":"reviewId"}},{"kind":"Field","name":{"kind":"Name","value":"startedOn"}},{"kind":"Field","name":{"kind":"Name","value":"finishedOn"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}},{"kind":"Field","name":{"kind":"Name","value":"manualTimeSpent"}},{"kind":"Field","name":{"kind":"Name","value":"numTimesUpdated"}},{"kind":"Field","name":{"kind":"Name","value":"providerWatchedOn"}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenShowExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenPodcastExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode; -export const UserMetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMetadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}}]} as unknown as DocumentNode; -export const UserPersonDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserPersonDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"personId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userPersonDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"personId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"personId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode; -export const UserWorkoutDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"templateId"}},{"kind":"Field","name":{"kind":"Name","value":"repeatedFrom"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode; -export const UserWorkoutTemplateDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplateDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplateDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutTemplateId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode; -export const UserWorkoutTemplatesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplatesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplatesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode; -export const UserWorkoutsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetOidcRedirectUrlDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOidcRedirectUrl"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getOidcRedirectUrl"}}]}}]} as unknown as DocumentNode; export const UserByOidcIssuerIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserByOidcIssuerId"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"oidcIssuerId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userByOidcIssuerId"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"oidcIssuerId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"oidcIssuerId"}}}]}]}}]} as unknown as DocumentNode; 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; 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; -export const ProvidersLanguageInformationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProvidersLanguageInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"providersLanguageInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"supported"}},{"kind":"Field","name":{"kind":"Name","value":"default"}},{"kind":"Field","name":{"kind":"Name","value":"source"}}]}}]}}]} as unknown as DocumentNode; 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":"size"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}}]}}]}}]} as unknown as DocumentNode; 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":"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; 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":"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; @@ -3535,4 +3522,22 @@ export const MetadataPartialDetailsDocument = {"kind":"Document","definitions":[ export const MetadataGroupsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataGroupsListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode; export const PeopleListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PeopleList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PeopleListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"peopleList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode; export const UserAccessLinksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserAccessLinks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userAccessLinks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isDemo"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"expiresOn"}},{"kind":"Field","name":{"kind":"Name","value":"timesUsed"}},{"kind":"Field","name":{"kind":"Name","value":"isRevoked"}},{"kind":"Field","name":{"kind":"Name","value":"maximumUses"}},{"kind":"Field","name":{"kind":"Name","value":"isAccountDefault"}},{"kind":"Field","name":{"kind":"Name","value":"isMutationAllowed"}}]}}]}}]} as unknown as DocumentNode; -export const DailyUserActivitiesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DailyUserActivities"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"DailyUserActivitiesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"dailyUserActivities"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"groupedBy"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalDuration"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"day"}},{"kind":"Field","name":{"kind":"Name","value":"totalReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"workoutCount"}},{"kind":"Field","name":{"kind":"Name","value":"measurementCount"}},{"kind":"Field","name":{"kind":"Name","value":"audioBookCount"}},{"kind":"Field","name":{"kind":"Name","value":"animeCount"}},{"kind":"Field","name":{"kind":"Name","value":"bookCount"}},{"kind":"Field","name":{"kind":"Name","value":"podcastCount"}},{"kind":"Field","name":{"kind":"Name","value":"mangaCount"}},{"kind":"Field","name":{"kind":"Name","value":"showCount"}},{"kind":"Field","name":{"kind":"Name","value":"movieCount"}},{"kind":"Field","name":{"kind":"Name","value":"videoGameCount"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelCount"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file +export const DailyUserActivitiesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DailyUserActivities"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"DailyUserActivitiesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"dailyUserActivities"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"groupedBy"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalDuration"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"day"}},{"kind":"Field","name":{"kind":"Name","value":"totalReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"workoutCount"}},{"kind":"Field","name":{"kind":"Name","value":"measurementCount"}},{"kind":"Field","name":{"kind":"Name","value":"audioBookCount"}},{"kind":"Field","name":{"kind":"Name","value":"animeCount"}},{"kind":"Field","name":{"kind":"Name","value":"bookCount"}},{"kind":"Field","name":{"kind":"Name","value":"podcastCount"}},{"kind":"Field","name":{"kind":"Name","value":"mangaCount"}},{"kind":"Field","name":{"kind":"Name","value":"showCount"}},{"kind":"Field","name":{"kind":"Name","value":"movieCount"}},{"kind":"Field","name":{"kind":"Name","value":"videoGameCount"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelCount"}}]}}]}}]}}]} as unknown as DocumentNode; +export const ExerciseDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExerciseDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"exerciseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscles"}},{"kind":"Field","name":{"kind":"Name","value":"createdByUserId"}},{"kind":"Field","name":{"kind":"Name","value":"attributes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"instructions"}},{"kind":"Field","name":{"kind":"Name","value":"images"}}]}}]}}]}}]} as unknown as DocumentNode; +export const ExercisesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExercisesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ExercisesListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exercisesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"numTimesInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}}]}}]}}]}}]} as unknown as DocumentNode; +export const ImportReportsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ImportReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"importReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"progress"}},{"kind":"Field","name":{"kind":"Name","value":"startedOn"}},{"kind":"Field","name":{"kind":"Name","value":"finishedOn"}},{"kind":"Field","name":{"kind":"Name","value":"wasSuccess"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"import"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}}]}},{"kind":"Field","name":{"kind":"Name","value":"failedItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"step"}},{"kind":"Field","name":{"kind":"Name","value":"error"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const GenresListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenresList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genresList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GenreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenreDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GenreDetailsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genreDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}},{"kind":"Field","name":{"kind":"Name","value":"contents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]}}]} as unknown as DocumentNode; +export const CollectionContentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CollectionContents"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CollectionContentsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collectionContents"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"results"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"entityId"}},{"kind":"Field","name":{"kind":"Name","value":"entityLot"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode; +export const CoreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CoreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"coreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"isPro"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"docsLink"}},{"kind":"Field","name":{"kind":"Name","value":"pageSize"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"smtpEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"oidcEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"signupAllowed"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryLink"}},{"kind":"Field","name":{"kind":"Name","value":"disableTelemetry"}},{"kind":"Field","name":{"kind":"Name","value":"tokenValidForDays"}},{"kind":"Field","name":{"kind":"Name","value":"localAuthDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"fileStorageEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"metadataLotSourceMappings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"sources"}}]}},{"kind":"Field","name":{"kind":"Name","value":"metadataProviderLanguages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"default"}},{"kind":"Field","name":{"kind":"Name","value":"supported"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontend"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"oidcButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"dashboardMessage"}},{"kind":"Field","name":{"kind":"Name","value":"umami"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"scriptUrl"}},{"kind":"Field","name":{"kind":"Name","value":"websiteId"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"exerciseParameters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"downloadRequired"}},{"kind":"Field","name":{"kind":"Name","value":"filters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lotMapping"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bests"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const MetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contents"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"displayImages"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}}]}}]}}]}}]} as unknown as DocumentNode; +export const MetadataGroupSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataGroupSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}}]}}]}}]}}]} as unknown as DocumentNode; +export const MetadataListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode; +export const MetadataSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"databaseId"}},{"kind":"Field","name":{"kind":"Name","value":"hasInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"item"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"publishYear"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const PeopleSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PeopleSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PeopleSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"peopleSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"birthYear"}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserMetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMetadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}}]} as unknown as DocumentNode; +export const UserPersonDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserPersonDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"personId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userPersonDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"personId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"personId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode; +export const UserWorkoutDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"templateId"}},{"kind":"Field","name":{"kind":"Name","value":"repeatedFrom"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserWorkoutsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserWorkoutTemplateDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplateDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplateDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutTemplateId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserWorkoutTemplatesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplatesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplatesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/libs/generated/src/graphql/backend/types.generated.ts b/libs/generated/src/graphql/backend/types.generated.ts index f2754d2128..0e241c8917 100644 --- a/libs/generated/src/graphql/backend/types.generated.ts +++ b/libs/generated/src/graphql/backend/types.generated.ts @@ -205,10 +205,13 @@ export type CoreDetails = { backendErrors: Array; disableTelemetry: Scalars['Boolean']['output']; docsLink: Scalars['String']['output']; + exerciseParameters: ExerciseParameters; fileStorageEnabled: Scalars['Boolean']['output']; frontend: FrontendConfig; isPro: Scalars['Boolean']['output']; localAuthDisabled: Scalars['Boolean']['output']; + metadataLotSourceMappings: Array; + metadataProviderLanguages: Array; oidcEnabled: Scalars['Boolean']['output']; pageSize: Scalars['Int']['output']; repositoryLink: Scalars['String']['output']; @@ -409,8 +412,8 @@ export type DeployMovaryImportInput = { }; export type DeployStrongAppImportInput = { - exportPath: Scalars['String']['input']; - mapping: Array; + dataExportPath?: InputMaybe; + measurementsZipPath?: InputMaybe; }; export type DeployTraktImportInput = { @@ -833,6 +836,7 @@ export type ImportReport = { details?: Maybe; finishedOn?: Maybe; id: Scalars['String']['output']; + progress?: Maybe; source: ImportSource; startedOn: Scalars['DateTime']['output']; userId: Scalars['String']['output']; @@ -852,11 +856,12 @@ export enum ImportSource { Igdb = 'IGDB', Imdb = 'IMDB', Jellyfin = 'JELLYFIN', - Mal = 'MAL', - MediaTracker = 'MEDIA_TRACKER', + Mediatracker = 'MEDIATRACKER', Movary = 'MOVARY', + Myanimelist = 'MYANIMELIST', OpenScale = 'OPEN_SCALE', - StoryGraph = 'STORY_GRAPH', + Plex = 'PLEX', + Storygraph = 'STORYGRAPH', StrongApp = 'STRONG_APP', Trakt = 'TRAKT' } @@ -1095,6 +1100,12 @@ export type MetadataListInput = { take?: InputMaybe; }; +export type MetadataLotSourceMappings = { + __typename?: 'MetadataLotSourceMappings'; + lot: MediaLot; + sources: Array; +}; + export type MetadataPartialDetails = { __typename?: 'MetadataPartialDetails'; id: Scalars['String']['output']; @@ -1230,6 +1241,8 @@ export type MutationRoot = { generateAuthToken: Scalars['String']['output']; /** Login a user using their username and password and return an auth token. */ loginUser: LoginResult; + /** Merge an exercise into another. */ + mergeExercise: Scalars['Boolean']['output']; /** * Merge a media item into another. This will move all `seen`, `collection` * and `review` associations with to the metadata. @@ -1434,6 +1447,12 @@ export type MutationRootLoginUserArgs = { }; +export type MutationRootMergeExerciseArgs = { + mergeFrom: Scalars['String']['input']; + mergeInto: Scalars['String']['input']; +}; + + export type MutationRootMergeMetadataArgs = { mergeFrom: Scalars['String']['input']; mergeInto: Scalars['String']['input']; @@ -1736,8 +1755,6 @@ export type QueryRoot = { dailyUserActivities: DailyUserActivitiesResponse; /** Get details about an exercise. */ exerciseDetails: Exercise; - /** Get all the parameters related to exercises. */ - exerciseParameters: ExerciseParameters; /** Get a paginated list of exercises in the database. */ exercisesList: ExerciseListResults; /** Get details about a genre present in the database. */ @@ -1774,8 +1791,6 @@ export type QueryRoot = { peopleSearch: PeopleSearchResults; /** Get details about a creator present in the database. */ personDetails: PersonDetails; - /** Get all languages supported by all the providers. */ - providersLanguageInformation: Array; /** Get all access links generated by the currently logged in user. */ userAccessLinks: Array; /** Get user by OIDC issuer ID. */ @@ -2176,12 +2191,6 @@ export type StringIdObject = { id: Scalars['String']['output']; }; -export type StrongAppImportMapping = { - multiplier?: InputMaybe; - sourceName: Scalars['String']['input']; - targetName: Scalars['String']['input']; -}; - export type UpdateComplexJsonInput = { /** Dot delimited path to the property that needs to be changed. */ property: Scalars['String']['input']; diff --git a/libs/graphql/src/backend/mutations/combined.gql b/libs/graphql/src/backend/mutations/combined.gql index 50545a0d3e..1d7672d6be 100644 --- a/libs/graphql/src/backend/mutations/combined.gql +++ b/libs/graphql/src/backend/mutations/combined.gql @@ -254,3 +254,7 @@ mutation RevokeAccessLink($accessLinkId: String!) { mutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) { updateUserExerciseSettings(input: $input) } + +mutation MergeExercise($mergeFrom: String!, $mergeInto: String!) { + mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto) +} diff --git a/libs/graphql/src/backend/queries/CollectionContents.gql b/libs/graphql/src/backend/queries/CollectionContents.gql deleted file mode 100644 index 8d3da84d59..0000000000 --- a/libs/graphql/src/backend/queries/CollectionContents.gql +++ /dev/null @@ -1,26 +0,0 @@ -query CollectionContents($input: CollectionContentsInput!) { - collectionContents(input: $input) { - user { - id - name - } - reviews { - ...ReviewItemPart - } - results { - details { - total - nextPage - } - items { - entityId - entityLot - } - } - details { - name - description - createdOn - } - } -} diff --git a/libs/graphql/src/backend/queries/CoreDetails.gql b/libs/graphql/src/backend/queries/CoreDetails.gql deleted file mode 100644 index a7d2a7dc39..0000000000 --- a/libs/graphql/src/backend/queries/CoreDetails.gql +++ /dev/null @@ -1,27 +0,0 @@ -query CoreDetails { - coreDetails { - isPro - version - docsLink - pageSize - websiteUrl - smtpEnabled - oidcEnabled - signupAllowed - repositoryLink - disableTelemetry - tokenValidForDays - localAuthDisabled - fileStorageEnabled - frontend { - url - oidcButtonLabel - dashboardMessage - umami { - domains - scriptUrl - websiteId - } - } - } -} diff --git a/libs/graphql/src/backend/queries/ExerciseDetails.gql b/libs/graphql/src/backend/queries/ExerciseDetails.gql deleted file mode 100644 index b0aed0111b..0000000000 --- a/libs/graphql/src/backend/queries/ExerciseDetails.gql +++ /dev/null @@ -1,17 +0,0 @@ -query ExerciseDetails($exerciseId: String!) { - exerciseDetails(exerciseId: $exerciseId) { - id - lot - source - level - force - mechanic - equipment - muscles - createdByUserId - attributes { - instructions - images - } - } -} diff --git a/libs/graphql/src/backend/queries/ExerciseParameters.gql b/libs/graphql/src/backend/queries/ExerciseParameters.gql deleted file mode 100644 index ff18e7a0a5..0000000000 --- a/libs/graphql/src/backend/queries/ExerciseParameters.gql +++ /dev/null @@ -1,17 +0,0 @@ -query ExerciseParameters { - exerciseParameters { - downloadRequired - filters { - type - level - force - mechanic - equipment - muscle - } - lotMapping { - lot - bests - } - } -} diff --git a/libs/graphql/src/backend/queries/ExercisesList.gql b/libs/graphql/src/backend/queries/ExercisesList.gql deleted file mode 100644 index 071cb233df..0000000000 --- a/libs/graphql/src/backend/queries/ExercisesList.gql +++ /dev/null @@ -1,16 +0,0 @@ -query ExercisesList($input: ExercisesListInput!) { - exercisesList(input: $input) { - details { - total - nextPage - } - items { - id - lot - image - muscle - numTimesInteracted - lastUpdatedOn - } - } -} diff --git a/libs/graphql/src/backend/queries/GenreDetails.gql b/libs/graphql/src/backend/queries/GenreDetails.gql deleted file mode 100644 index 2cf2db54be..0000000000 --- a/libs/graphql/src/backend/queries/GenreDetails.gql +++ /dev/null @@ -1,16 +0,0 @@ -query GenreDetails($input: GenreDetailsInput!) { - genreDetails(input: $input) { - details { - id - name - numItems - } - contents { - details { - total - nextPage - } - items - } - } -} diff --git a/libs/graphql/src/backend/queries/GenresList.gql b/libs/graphql/src/backend/queries/GenresList.gql deleted file mode 100644 index 26192b446c..0000000000 --- a/libs/graphql/src/backend/queries/GenresList.gql +++ /dev/null @@ -1,13 +0,0 @@ -query GenresList($input: SearchInput!) { - genresList(input: $input) { - details { - total - nextPage - } - items { - id - name - numItems - } - } -} diff --git a/libs/graphql/src/backend/queries/ImportReports.gql b/libs/graphql/src/backend/queries/ImportReports.gql deleted file mode 100644 index 8b20a9581a..0000000000 --- a/libs/graphql/src/backend/queries/ImportReports.gql +++ /dev/null @@ -1,20 +0,0 @@ -query ImportReports { - importReports { - id - source - startedOn - finishedOn - wasSuccess - details { - import { - total - } - failedItems { - lot - step - identifier - error - } - } - } -} diff --git a/libs/graphql/src/backend/queries/MetadataGroupDetails.gql b/libs/graphql/src/backend/queries/MetadataGroupDetails.gql deleted file mode 100644 index e88e1f388c..0000000000 --- a/libs/graphql/src/backend/queries/MetadataGroupDetails.gql +++ /dev/null @@ -1,16 +0,0 @@ -query MetadataGroupDetails($metadataGroupId: String!) { - metadataGroupDetails(metadataGroupId: $metadataGroupId) { - contents - sourceUrl - details { - id - title - lot - source - displayImages - identifier - parts - isPartial - } - } -} diff --git a/libs/graphql/src/backend/queries/MetadataGroupSearch.gql b/libs/graphql/src/backend/queries/MetadataGroupSearch.gql deleted file mode 100644 index 8f9b48fe4c..0000000000 --- a/libs/graphql/src/backend/queries/MetadataGroupSearch.gql +++ /dev/null @@ -1,14 +0,0 @@ -query MetadataGroupSearch($input: MetadataGroupSearchInput!) { - metadataGroupSearch(input: $input) { - details { - total - nextPage - } - items { - identifier - name - image - parts - } - } -} diff --git a/libs/graphql/src/backend/queries/MetadataList.gql b/libs/graphql/src/backend/queries/MetadataList.gql deleted file mode 100644 index ef571424dd..0000000000 --- a/libs/graphql/src/backend/queries/MetadataList.gql +++ /dev/null @@ -1,9 +0,0 @@ -query MetadataList($input: MetadataListInput!) { - metadataList(input: $input) { - details { - total - nextPage - } - items - } -} diff --git a/libs/graphql/src/backend/queries/MetadataSearch.gql b/libs/graphql/src/backend/queries/MetadataSearch.gql deleted file mode 100644 index cc777ab81f..0000000000 --- a/libs/graphql/src/backend/queries/MetadataSearch.gql +++ /dev/null @@ -1,18 +0,0 @@ -query MetadataSearch($input: MetadataSearchInput!) { - metadataSearch(input: $input) { - details { - total - nextPage - } - items { - databaseId - hasInteracted - item { - identifier - title - image - publishYear - } - } - } -} diff --git a/libs/graphql/src/backend/queries/PeopleSearch.gql b/libs/graphql/src/backend/queries/PeopleSearch.gql deleted file mode 100644 index 06180cadbb..0000000000 --- a/libs/graphql/src/backend/queries/PeopleSearch.gql +++ /dev/null @@ -1,14 +0,0 @@ -query PeopleSearch($input: PeopleSearchInput!) { - peopleSearch(input: $input) { - details { - total - nextPage - } - items { - identifier - name - image - birthYear - } - } -} diff --git a/libs/graphql/src/backend/queries/UserMetadataGroupDetails.gql b/libs/graphql/src/backend/queries/UserMetadataGroupDetails.gql deleted file mode 100644 index fcf020378f..0000000000 --- a/libs/graphql/src/backend/queries/UserMetadataGroupDetails.gql +++ /dev/null @@ -1,10 +0,0 @@ -query UserMetadataGroupDetails($metadataGroupId: String!) { - userMetadataGroupDetails(metadataGroupId: $metadataGroupId) { - reviews { - ...ReviewItemPart - } - collections { - ...CollectionPart - } - } -} diff --git a/libs/graphql/src/backend/queries/UserPersonDetails.gql b/libs/graphql/src/backend/queries/UserPersonDetails.gql deleted file mode 100644 index 4461438471..0000000000 --- a/libs/graphql/src/backend/queries/UserPersonDetails.gql +++ /dev/null @@ -1,10 +0,0 @@ -query UserPersonDetails($personId: String!) { - userPersonDetails(personId: $personId) { - collections { - ...CollectionPart - } - reviews { - ...ReviewItemPart - } - } -} diff --git a/libs/graphql/src/backend/queries/UserWorkoutDetails.gql b/libs/graphql/src/backend/queries/UserWorkoutDetails.gql deleted file mode 100644 index bbd2a383aa..0000000000 --- a/libs/graphql/src/backend/queries/UserWorkoutDetails.gql +++ /dev/null @@ -1,22 +0,0 @@ -query UserWorkoutDetails($workoutId: String!) { - userWorkoutDetails(workoutId: $workoutId) { - collections { - ...CollectionPart - } - details { - id - name - endTime - duration - startTime - templateId - repeatedFrom - summary { - ...WorkoutSummaryPart - } - information { - ...WorkoutInformationPart - } - } - } -} diff --git a/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql b/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql deleted file mode 100644 index 7b51652335..0000000000 --- a/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql +++ /dev/null @@ -1,19 +0,0 @@ -query UserWorkoutTemplateDetails($workoutTemplateId: String!) { - userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) { - collections { - ...CollectionPart - } - details { - id - name - createdOn - visibility - summary { - ...WorkoutSummaryPart - } - information { - ...WorkoutInformationPart - } - } - } -} diff --git a/libs/graphql/src/backend/queries/UserWorkoutTemplatesList.gql b/libs/graphql/src/backend/queries/UserWorkoutTemplatesList.gql deleted file mode 100644 index 8185202772..0000000000 --- a/libs/graphql/src/backend/queries/UserWorkoutTemplatesList.gql +++ /dev/null @@ -1,17 +0,0 @@ -query UserWorkoutTemplatesList($input: SearchInput!) { - userWorkoutTemplatesList(input: $input) { - details { - total - nextPage - } - items { - id - name - createdOn - visibility - summary { - ...WorkoutSummaryPart - } - } - } -} diff --git a/libs/graphql/src/backend/queries/UserWorkoutsList.gql b/libs/graphql/src/backend/queries/UserWorkoutsList.gql deleted file mode 100644 index ccb4e1b1d3..0000000000 --- a/libs/graphql/src/backend/queries/UserWorkoutsList.gql +++ /dev/null @@ -1,18 +0,0 @@ -query UserWorkoutsList($input: SearchInput!) { - userWorkoutsList(input: $input) { - details { - total - nextPage - } - items { - id - name - endTime - duration - startTime - summary { - ...WorkoutSummaryPart - } - } - } -} diff --git a/libs/graphql/src/backend/queries/combined.gql b/libs/graphql/src/backend/queries/combined.gql index 79b55d6e35..d4a988d9f1 100644 --- a/libs/graphql/src/backend/queries/combined.gql +++ b/libs/graphql/src/backend/queries/combined.gql @@ -17,14 +17,6 @@ query GetPresignedS3Url($key: String!) { getPresignedS3Url(key: $key) } -query ProvidersLanguageInformation { - providersLanguageInformation { - supported - default - source - } -} - query UserExports { userExports { url @@ -178,3 +170,348 @@ query DailyUserActivities($input: DailyUserActivitiesInput!) { } } } + +query ExerciseDetails($exerciseId: String!) { + exerciseDetails(exerciseId: $exerciseId) { + id + lot + source + level + force + mechanic + equipment + muscles + createdByUserId + attributes { + instructions + images + } + } +} + +query ExercisesList($input: ExercisesListInput!) { + exercisesList(input: $input) { + details { + total + nextPage + } + items { + id + lot + image + muscle + numTimesInteracted + lastUpdatedOn + } + } +} + +query ImportReports { + importReports { + id + source + progress + startedOn + finishedOn + wasSuccess + details { + import { + total + } + failedItems { + lot + step + error + identifier + } + } + } +} + +query GenresList($input: SearchInput!) { + genresList(input: $input) { + details { + total + nextPage + } + items { + id + name + numItems + } + } +} + +query GenreDetails($input: GenreDetailsInput!) { + genreDetails(input: $input) { + details { + id + name + numItems + } + contents { + details { + total + nextPage + } + items + } + } +} + +query CollectionContents($input: CollectionContentsInput!) { + collectionContents(input: $input) { + user { + id + name + } + reviews { + ...ReviewItemPart + } + results { + details { + total + nextPage + } + items { + entityId + entityLot + } + } + details { + name + description + createdOn + } + } +} + +query CoreDetails { + coreDetails { + isPro + version + docsLink + pageSize + websiteUrl + smtpEnabled + oidcEnabled + signupAllowed + repositoryLink + disableTelemetry + tokenValidForDays + localAuthDisabled + fileStorageEnabled + metadataLotSourceMappings { + lot + sources + } + metadataProviderLanguages { + source + default + supported + } + frontend { + url + oidcButtonLabel + dashboardMessage + umami { + domains + scriptUrl + websiteId + } + } + exerciseParameters { + downloadRequired + filters { + type + level + force + mechanic + equipment + muscle + } + lotMapping { + lot + bests + } + } + } +} + +query MetadataGroupDetails($metadataGroupId: String!) { + metadataGroupDetails(metadataGroupId: $metadataGroupId) { + contents + sourceUrl + details { + id + title + lot + source + displayImages + identifier + parts + isPartial + } + } +} + +query MetadataGroupSearch($input: MetadataGroupSearchInput!) { + metadataGroupSearch(input: $input) { + details { + total + nextPage + } + items { + identifier + name + image + parts + } + } +} + +query MetadataList($input: MetadataListInput!) { + metadataList(input: $input) { + details { + total + nextPage + } + items + } +} + +query MetadataSearch($input: MetadataSearchInput!) { + metadataSearch(input: $input) { + details { + total + nextPage + } + items { + databaseId + hasInteracted + item { + identifier + title + image + publishYear + } + } + } +} + +query PeopleSearch($input: PeopleSearchInput!) { + peopleSearch(input: $input) { + details { + total + nextPage + } + items { + identifier + name + image + birthYear + } + } +} + +query UserMetadataGroupDetails($metadataGroupId: String!) { + userMetadataGroupDetails(metadataGroupId: $metadataGroupId) { + reviews { + ...ReviewItemPart + } + collections { + ...CollectionPart + } + } +} + +query UserPersonDetails($personId: String!) { + userPersonDetails(personId: $personId) { + collections { + ...CollectionPart + } + reviews { + ...ReviewItemPart + } + } +} + +query UserWorkoutDetails($workoutId: String!) { + userWorkoutDetails(workoutId: $workoutId) { + collections { + ...CollectionPart + } + details { + id + name + endTime + duration + startTime + templateId + repeatedFrom + summary { + ...WorkoutSummaryPart + } + information { + ...WorkoutInformationPart + } + } + } +} + +query UserWorkoutsList($input: SearchInput!) { + userWorkoutsList(input: $input) { + details { + total + nextPage + } + items { + id + name + endTime + duration + startTime + summary { + ...WorkoutSummaryPart + } + } + } +} + +query UserWorkoutTemplateDetails($workoutTemplateId: String!) { + userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) { + collections { + ...CollectionPart + } + details { + id + name + createdOn + visibility + summary { + ...WorkoutSummaryPart + } + information { + ...WorkoutInformationPart + } + } + } +} + +query UserWorkoutTemplatesList($input: SearchInput!) { + userWorkoutTemplatesList(input: $input) { + details { + total + nextPage + } + items { + id + name + createdOn + visibility + summary { + ...WorkoutSummaryPart + } + } + } +} diff --git a/libs/ts-utils/src/index.ts b/libs/ts-utils/src/index.ts index d0d0dc8a46..1109bb4406 100644 --- a/libs/ts-utils/src/index.ts +++ b/libs/ts-utils/src/index.ts @@ -16,6 +16,7 @@ import isEqual from "lodash/isEqual"; import isInteger from "lodash/isInteger"; import isNumber from "lodash/isNumber"; import isString from "lodash/isString"; +import kebabCase from "lodash/kebabCase"; import mapValues from "lodash/mapValues"; import mergeWith from "lodash/mergeWith"; import omitBy from "lodash/omitBy"; @@ -100,6 +101,7 @@ export { isInteger, isNumber, isString, + kebabCase, mapValues, mergeWith, omitBy,