diff --git a/src/routes.rs b/src/routes.rs index fffb88b..950401a 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -126,7 +126,6 @@ pub async fn get_raw( } } - #[get("/api/thumb/{hash}")] pub async fn get_thumbnail( state: web::Data, @@ -165,19 +164,11 @@ pub async fn get_thumbnail( Err(error::ErrorNotImplemented("Previews not enabled.")) } -#[derive(Deserialize)] -pub struct QueryRequest { - query: String, -} - -#[get("/api/obj")] -pub async fn get_query( - state: web::Data, - web::Query(info): web::Query, -) -> Result { +#[post("/api/query")] +pub async fn get_query(state: web::Data, query: String) -> Result { let connection = state.upend.connection().map_err(ErrorInternalServerError)?; - let in_query: Query = info.query.as_str().parse().map_err(ErrorBadRequest)?; + let in_query: Query = query.parse().map_err(ErrorBadRequest)?; let entries = connection .query(in_query) .map_err(ErrorInternalServerError)?; diff --git a/webui/src/lib/entity.ts b/webui/src/lib/entity.ts index 7d076d6..6569db6 100644 --- a/webui/src/lib/entity.ts +++ b/webui/src/lib/entity.ts @@ -10,7 +10,7 @@ const inFlightRequests: { [key: string]: Promise } = {}; export function useEntity(address: string) { const { data, error, revalidate } = useSWR( - () => `/api/obj/${address}` + `/api/obj/${address}` ); const entity: Readable = derived(data, ($listing) => { @@ -38,7 +38,8 @@ export function query(query: () => string) { const queryString = typeof query === "string" ? query : query(); console.debug(`Querying: ${queryString}`); const { data, error, revalidate } = useSWR( - () => `/api/obj?query=${encodeURIComponent(query())}` + "/api/query", + { method: "POST", body: queryString } ); const result = derived(data, ($values) => { @@ -55,11 +56,10 @@ export function query(query: () => string) { export async function queryOnce(query: string): Promise { const cacheResult = queryOnceLRU.get(query); if (!cacheResult) { - const url = `/api/obj?query=${query}`; - if (!inFlightRequests[url]) { + if (!inFlightRequests[query]) { console.debug(`Querying: ${query}`); - inFlightRequests[url] = new Promise((resolve, reject) => { - fetch(url, { keepalive: true }) + inFlightRequests[query] = new Promise((resolve, reject) => { + fetch("/api/query", { method: "POST", body: query, keepalive: true }) .then(async (response) => { resolve(new UpListing(await response.json())); }) @@ -68,7 +68,7 @@ export async function queryOnce(query: string): Promise { } else { console.debug(`Chaining request for ${query}...`); } - return await inFlightRequests[url]; + return await inFlightRequests[query]; } else { console.debug(`Returning cached: ${query}`); return cacheResult; diff --git a/webui/src/util/fetch.ts b/webui/src/util/fetch.ts index 7b660bc..dca3c08 100644 --- a/webui/src/util/fetch.ts +++ b/webui/src/util/fetch.ts @@ -3,15 +3,15 @@ import { writable } from "svelte/store"; // stale shim until https://github.com/ConsoleTVs/sswr/issues/24 is resolved export type SWRKey = string; export function useSWR( - key: SWRKey | undefined | (() => SWRKey | undefined) + key: SWRKey, + options?: RequestInit ) { const data = writable(); const error = writable(); async function doFetch() { - const keyString = typeof key === "string" ? key : key(); try { - const response = await fetch(keyString); + const response = await fetch(key, options); if (response.ok) { data.set(await response.json()); } else {