diff --git a/web/src/lib/components/library-combobox.svelte b/web/src/lib/components/library-combobox.svelte index 0f050f5..26db8ec 100644 --- a/web/src/lib/components/library-combobox.svelte +++ b/web/src/lib/components/library-combobox.svelte @@ -5,7 +5,6 @@ import { cn } from '$lib/utils.js'; import { tick } from 'svelte'; import { CheckIcon, ChevronsUpDownIcon } from 'lucide-svelte'; - import type { PublicMovie, PublicShow } from '$lib/types.js'; import { onMount } from 'svelte'; import { toast } from 'svelte-sonner'; import client from '$lib/api'; @@ -15,7 +14,7 @@ media, mediaType }: { - media: PublicShow | PublicMovie; + media: components["schemas"]["PublicShow"] | components["schemas"]["PublicMovie"]; mediaType: 'tv' | 'movie'; } = $props(); @@ -31,9 +30,9 @@ const movieLibraries = await client.GET('/api/v1/movies/libraries'); if (mediaType === 'tv') { - libraries = tvLibraries.data; + libraries = tvLibraries.data as components['schemas']['LibraryItem'][]; } else { - libraries = movieLibraries.data; + libraries = movieLibraries.data as components['schemas']['LibraryItem'][]; } if (!value && libraries.length > 0) { @@ -53,14 +52,14 @@ if (mediaType === 'tv') { response = await client.POST('/api/v1/tv/shows/{show_id}/library', { params: { - path: { show_id: media.id }, + path: { show_id: media.id! }, query: { library: selectedLabel } } }); } else { response = await client.POST('/api/v1/movies/{movie_id}/library', { params: { - path: { movie_id: media.id }, + path: { movie_id: media.id! }, query: { library: selectedLabel } } }); diff --git a/web/src/lib/components/login-card.svelte b/web/src/lib/components/login-card.svelte index 00a2c00..6d6d5bd 100644 --- a/web/src/lib/components/login-card.svelte +++ b/web/src/lib/components/login-card.svelte @@ -11,7 +11,6 @@ import LoadingBar from '$lib/components/loading-bar.svelte'; import client from '$lib/api'; import {handleOauth} from "$lib/utils.ts"; - import type {components} from "$lib/api/api"; let { oauthProviderNames diff --git a/web/src/lib/components/request-movie-dialog.svelte b/web/src/lib/components/request-movie-dialog.svelte index 58eddbb..d7fa123 100644 --- a/web/src/lib/components/request-movie-dialog.svelte +++ b/web/src/lib/components/request-movie-dialog.svelte @@ -4,19 +4,19 @@ import { Label } from '$lib/components/ui/label'; import * as Select from '$lib/components/ui/select/index.js'; import LoaderCircle from '@lucide/svelte/icons/loader-circle'; - import type { PublicMovie, Quality } from '$lib/types.js'; import { getFullyQualifiedMediaName, getTorrentQualityString } from '$lib/utils.js'; import { toast } from 'svelte-sonner'; import client from '$lib/api'; + import type {components} from "$lib/api/api"; - let { movie }: { movie: PublicMovie } = $props(); + let { movie }: { movie: components["schemas"]["PublicMovie"] } = $props(); let dialogOpen = $state(false); let minQuality = $state(undefined); let wantedQuality = $state(undefined); let isSubmittingRequest = $state(false); let submitRequestError = $state(null); - const qualityValues: Quality[] = [1, 2, 3, 4]; + const qualityValues: components["schemas"]["Quality"][] = [1, 2, 3, 4]; let qualityOptions = $derived( qualityValues.map((q) => ({ value: q.toString(), label: getTorrentQualityString(q) })) ); @@ -29,9 +29,9 @@ submitRequestError = null; const { response } = await client.POST('/api/v1/movies/requests', { body: { - movie_id: movie.id, - min_quality: parseInt(minQuality!), - wanted_quality: parseInt(wantedQuality!) + movie_id: movie.id!, + min_quality: parseInt(minQuality!) as components["schemas"]["Quality"], + wanted_quality: parseInt(wantedQuality!) as components["schemas"]["Quality"] } }); isSubmittingRequest = false; diff --git a/web/src/lib/components/request-season-dialog.svelte b/web/src/lib/components/request-season-dialog.svelte index 2b75403..6caea08 100644 --- a/web/src/lib/components/request-season-dialog.svelte +++ b/web/src/lib/components/request-season-dialog.svelte @@ -4,12 +4,12 @@ import { Label } from '$lib/components/ui/label'; import * as Select from '$lib/components/ui/select/index.js'; import LoaderCircle from '@lucide/svelte/icons/loader-circle'; - import type { PublicShow, Quality } from '$lib/types.js'; import { getFullyQualifiedMediaName, getTorrentQualityString } from '$lib/utils.js'; import { toast } from 'svelte-sonner'; import client from '$lib/api'; + import type {components} from "$lib/api/api"; - let { show }: { show: PublicShow } = $props(); + let { show }: { show: components["schemas"]["PublicShow"] } = $props(); let dialogOpen = $state(false); let selectedSeasonsIds = $state([]); @@ -18,7 +18,7 @@ let isSubmittingRequest = $state(false); let submitRequestError = $state(null); - const qualityValues: Quality[] = [1, 2, 3, 4]; + const qualityValues: components["schemas"]["Quality"][] = [1, 2, 3, 4]; let qualityOptions = $derived( qualityValues.map((q) => ({ value: q.toString(), label: getTorrentQualityString(q) })) ); @@ -38,8 +38,8 @@ const { response, error } = await client.POST('/api/v1/tv/seasons/requests', { body: { season_id: id, - min_quality: parseInt(minQuality!) as Quality, - wanted_quality: parseInt(wantedQuality!) as Quality + min_quality: parseInt(minQuality!) as components["schemas"]["Quality"], + wanted_quality: parseInt(wantedQuality!) as components["schemas"]["Quality"] } }); diff --git a/web/src/lib/components/season-requests-table.svelte b/web/src/lib/components/season-requests-table.svelte index fdb7651..b7b8f1b 100644 --- a/web/src/lib/components/season-requests-table.svelte +++ b/web/src/lib/components/season-requests-table.svelte @@ -1,202 +1,203 @@ - A list of all requests. - - - {isShow ? 'Show' : 'Movie'} - {#if isShow} - Season - {/if} - Minimum Quality - Wanted Quality - Requested by - Approved - Approved by - Actions - - - - {#each requests as request (request.id)} - {#if filter(request)} - - - {#if isShow} - {getFullyQualifiedMediaName((request as SeasonRequest).show)} - {:else} - {getFullyQualifiedMediaName((request as MovieRequest).movie)} - {/if} - - {#if isShow} - - {(request as SeasonRequest).season.number} - - {/if} - - {getTorrentQualityString(request.min_quality)} - - - {getTorrentQualityString(request.wanted_quality)} - - - {request.requested_by?.email ?? 'N/A'} - - - - - - {request.authorized_by?.email ?? 'N/A'} - - - - {#if user().is_superuser} - - {#if isShow} - - {:else} - - {/if} - {/if} - {#if user().is_superuser || user().id === request.requested_by?.id} - - {/if} - - - {/if} - {:else} - - There are currently no requests. - - {/each} - + A list of all requests. + + + {isShow ? 'Show' : 'Movie'} + {#if isShow} + Season + {/if} + Minimum Quality + Wanted Quality + Requested by + Approved + Approved by + Actions + + + + {#each requests as request (request.id)} + {#if filter(request)} + + + {#if isShow} + {getFullyQualifiedMediaName((request as components["schemas"]["RichSeasonRequest"]).show)} + {:else} + {getFullyQualifiedMediaName((request as components["schemas"]["RichMovieRequest"]).movie)} + {/if} + + {#if isShow} + + {(request as components["schemas"]["RichSeasonRequest"]).season.number} + + {/if} + + {getTorrentQualityString(request.min_quality)} + + + {getTorrentQualityString(request.wanted_quality)} + + + {request.requested_by?.email ?? 'N/A'} + + + + + + {request.authorized_by?.email ?? 'N/A'} + + + + {#if user().is_superuser} + + {#if isShow} + + {:else} + + {/if} + {/if} + {#if user().is_superuser || user().id === request.requested_by?.id} + + {/if} + + + {/if} + {:else} + + There are currently no requests. + + {/each} + diff --git a/web/src/lib/components/user-data-table.svelte b/web/src/lib/components/user-data-table.svelte index 3b49baa..a0cae77 100644 --- a/web/src/lib/components/user-data-table.svelte +++ b/web/src/lib/components/user-data-table.svelte @@ -1,5 +1,4 @@ {user().email} diff --git a/web/src/routes/dashboard/+layout.svelte b/web/src/routes/dashboard/+layout.svelte index 4f59641..a6d7aa7 100644 --- a/web/src/routes/dashboard/+layout.svelte +++ b/web/src/routes/dashboard/+layout.svelte @@ -9,7 +9,7 @@ let { data, children }: LayoutProps = $props(); console.log('Received User Data: ', data.user); - if (!data.user.is_verified) { + if (!data.user?.is_verified) { toast.info('Your account requires verification. Redirecting...'); goto(base + '/login/verify'); } diff --git a/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte b/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte index 3061e08..ba98c13 100644 --- a/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte +++ b/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte @@ -4,7 +4,7 @@ import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js'; import { ImageOff } from 'lucide-svelte'; import { getContext } from 'svelte'; - import type { PublicMovie, User } from '$lib/types.js'; + import type { components } from '$lib/api/api'; import { getFullyQualifiedMediaName } from '$lib/utils'; import { page } from '$app/state'; import TorrentTable from '$lib/components/torrent-table.svelte'; @@ -15,8 +15,8 @@ import { base } from '$app/paths'; import * as Card from '$lib/components/ui/card/index.js'; - let movie: PublicMovie = page.data.movie; - let user: () => User = getContext('user'); + let movie: components["schemas"]["PublicMovie"] = page.data.movie; + let user: () => components["schemas"]["UserRead"] = getContext('user'); diff --git a/web/src/routes/dashboard/settings/+page.svelte b/web/src/routes/dashboard/settings/+page.svelte index 5d2ce07..8a39254 100644 --- a/web/src/routes/dashboard/settings/+page.svelte +++ b/web/src/routes/dashboard/settings/+page.svelte @@ -8,11 +8,11 @@ import * as Sidebar from '$lib/components/ui/sidebar/index.js'; import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js'; import { base } from '$app/paths'; - import type { User } from '$lib/types'; + import type {components} from "$lib/api/api"; - let currentUser: () => User = getContext('user'); - let users: User[] = $derived( - page.data.users.filter((user: User) => user.id !== currentUser().id) + let currentUser: () => components["schemas"]["UserRead"] = getContext('user'); + let users: components["schemas"]["UserRead"][] = $derived( + page.data.users.filter((user: components["schemas"]["UserRead"] ) => user.id !== currentUser().id) ); console.log('Current user:', currentUser()); diff --git a/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte b/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte index da5d9d4..12a0c70 100644 --- a/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte +++ b/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte @@ -6,7 +6,7 @@ import { ImageOff } from 'lucide-svelte'; import * as Table from '$lib/components/ui/table/index.js'; import { getContext } from 'svelte'; - import type { PublicShow, RichShowTorrent, User } from '$lib/types.js'; + import type { components } from '$lib/api/api'; import { getFullyQualifiedMediaName } from '$lib/utils'; import DownloadSeasonDialog from '$lib/components/download-season-dialog.svelte'; import CheckmarkX from '$lib/components/checkmark-x.svelte'; @@ -19,13 +19,14 @@ import { Label } from '$lib/components/ui/label'; import LibraryCombobox from '$lib/components/library-combobox.svelte'; import * as Card from '$lib/components/ui/card/index.js'; - - let show: () => PublicShow = getContext('show'); - let user: () => User = getContext('user'); - let torrents: RichShowTorrent = page.data.torrentsData; import { base } from '$app/paths'; import client from '$lib/api'; + let show: () => components["schemas"]["PublicShow"] = getContext('show'); + let user: () => components["schemas"]["UserRead"] = getContext('user'); + let torrents: components["schemas"]["RichShowTorrent"] = page.data.torrentsData; + + let continuousDownloadEnabled = $state(show().continuous_download); async function toggle_continuous_download() { diff --git a/web/src/routes/dashboard/tv/[showId=uuid]/[SeasonId=uuid]/+page.svelte b/web/src/routes/dashboard/tv/[showId=uuid]/[SeasonId=uuid]/+page.svelte index c7f74ca..2022aa7 100644 --- a/web/src/routes/dashboard/tv/[showId=uuid]/[SeasonId=uuid]/+page.svelte +++ b/web/src/routes/dashboard/tv/[showId=uuid]/[SeasonId=uuid]/+page.svelte @@ -5,16 +5,16 @@ import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js'; import * as Table from '$lib/components/ui/table/index.js'; import { getContext } from 'svelte'; - import type { PublicSeasonFile, Season, Show } from '$lib/types'; + import type { components } from '$lib/api/api'; import CheckmarkX from '$lib/components/checkmark-x.svelte'; import { getFullyQualifiedMediaName, getTorrentQualityString } from '$lib/utils'; import MediaPicture from '$lib/components/media-picture.svelte'; import { base } from '$app/paths'; import * as Card from '$lib/components/ui/card/index.js'; - let seasonFiles: PublicSeasonFile[] = $state(page.data.files); - let season: Season = $state(page.data.season); - let show: () => Show = getContext('show'); + let seasonFiles: components["schemas"]["PublicSeasonFile"][] = $state(page.data.files); + let season: components["schemas"]["Season"] = $state(page.data.season); + let show: () => components["schemas"]["Show"] = getContext('show'); console.log('loaded files', seasonFiles); diff --git a/web/src/routes/dashboard/tv/requests/+page.svelte b/web/src/routes/dashboard/tv/requests/+page.svelte index a2fcb79..bacd1a2 100644 --- a/web/src/routes/dashboard/tv/requests/+page.svelte +++ b/web/src/routes/dashboard/tv/requests/+page.svelte @@ -3,11 +3,11 @@ import { Separator } from '$lib/components/ui/separator/index.js'; import * as Sidebar from '$lib/components/ui/sidebar/index.js'; import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js'; - import type { SeasonRequest } from '$lib/types'; import RequestsTable from '$lib/components/season-requests-table.svelte'; import { base } from '$app/paths'; + import type { components } from '$lib/api/api'; - let requests: SeasonRequest[] = $state(page.data.requestsData); + let requests: components["schemas"]["RichSeasonRequest"][] = $state(page.data.requestsData); diff --git a/web/src/routes/dashboard/tv/torrents/+page.svelte b/web/src/routes/dashboard/tv/torrents/+page.svelte index 98028c5..38b07a7 100644 --- a/web/src/routes/dashboard/tv/torrents/+page.svelte +++ b/web/src/routes/dashboard/tv/torrents/+page.svelte @@ -3,14 +3,13 @@ import { Separator } from '$lib/components/ui/separator/index.js'; import * as Sidebar from '$lib/components/ui/sidebar/index.js'; import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js'; - import type { RichShowTorrent } from '$lib/types'; import { getFullyQualifiedMediaName } from '$lib/utils'; import * as Accordion from '$lib/components/ui/accordion/index.js'; import * as Card from '$lib/components/ui/card/index.js'; import TorrentTable from '$lib/components/torrent-table.svelte'; import { base } from '$app/paths'; - - let showsPromise: Promise = $state(page.data.shows); + import type { components } from '$lib/api/api'; + let showsPromise: Promise = $state(page.data.shows);