T13 of the M5a Lidarr plan. Three new client modules wrap api.get/post/put/del
helpers and the existing TanStack Query qk namespace:
lidarr.ts - searchLidarr() + createLidarrSearchQuery()
requests.ts - createRequest, listMyRequests, getRequest, cancelRequest;
createMyRequestsQuery(); cancel goes through apiFetch
directly because the backend returns the cancelled row body
(api.del's return type is fixed to null).
admin.ts - getLidarrConfig, putLidarrConfig, testLidarrConnection,
listQualityProfiles, listRootFolders, listAdminRequests,
approveRequest, rejectRequest; query factories for each
read; quality profiles + root folders take an enabled prop
so the call site decides when Lidarr is configured.
Shared LidarrRequestStatus / LidarrRequestKind enums and request/config/
search-result shapes added to types.ts. Per-module helpers (CreateRequestParams)
stay in their module files. testLidarrConnection returns a discriminated union
({ok:true,version} | {ok:false,error}) and never throws on ok:false so the
SPA can render either branch.
qk extended with lidarrSearch, myRequests, lidarrConfig,
lidarrQualityProfiles, lidarrRootFolders, adminRequests.
Tests mirror likes.test.ts (vi.mock('./client')) and cover URL construction,
query-param encoding, body shapes, the not-ok testLidarrConnection branch,
and qk additions. 32 new tests, 217 total passing.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
29 lines
1.1 KiB
TypeScript
29 lines
1.1 KiB
TypeScript
import { createQuery } from '@tanstack/svelte-query';
|
|
import { api } from './client';
|
|
import { qk } from './queries';
|
|
import type { LidarrSearchResult, LidarrRequestKind } from './types';
|
|
|
|
// Search-only. Admin-side Lidarr config + connection probing lives in admin.ts.
|
|
|
|
// searchLidarr proxies the user-facing Lidarr search endpoint. URLSearchParams
|
|
// handles encoding (spaces, quotes, ampersands) so callers can pass q raw.
|
|
export async function searchLidarr(
|
|
q: string,
|
|
kind: LidarrRequestKind
|
|
): Promise<LidarrSearchResult[]> {
|
|
const params = new URLSearchParams({ q, kind });
|
|
return api.get<LidarrSearchResult[]>(`/api/lidarr/search?${params.toString()}`);
|
|
}
|
|
|
|
// staleTime mirrors the spec §11 60s server-side LRU cache: re-issuing the
|
|
// same query within a minute hits cache on the server, so there's no point
|
|
// in marking it stale client-side any sooner.
|
|
export function createLidarrSearchQuery(q: string, kind: LidarrRequestKind) {
|
|
return createQuery({
|
|
queryKey: qk.lidarrSearch(q, kind),
|
|
queryFn: () => searchLidarr(q, kind),
|
|
enabled: q.length > 0,
|
|
staleTime: 60_000
|
|
});
|
|
}
|