Pinafore-Web-Client-Frontend/src/routes/_api/search.js

43 lines
1.5 KiB
JavaScript

import { get, paramsString, DEFAULT_TIMEOUT } from '../_utils/ajax.js'
import { auth, basename } from './utils.js'
function doSearch (version, instanceName, accessToken, query, resolve, limit, excludeUnreviewed, signal) {
const url = `${basename(instanceName)}/api/${version}/search?` + paramsString({
q: query,
resolve,
limit,
exclude_unreviewed: !!excludeUnreviewed
})
return get(url, auth(accessToken), {
timeout: DEFAULT_TIMEOUT,
signal
})
}
async function doSearchV1 (instanceName, accessToken, query, resolve, limit, excludeUnreviewed, signal) {
const resp = await doSearch('v1', instanceName, accessToken, query, resolve, limit, excludeUnreviewed, signal)
resp.hashtags = resp.hashtags && resp.hashtags.map(tag => ({
name: tag,
url: `${basename(instanceName)}/tags/${tag.toLowerCase()}`,
history: []
}))
return resp
}
async function doSearchV2 (instanceName, accessToken, query, resolve, limit, excludeUnreviewed, signal) {
return doSearch('v2', instanceName, accessToken, query, resolve, limit, excludeUnreviewed, signal)
}
export async function search (instanceName, accessToken, query, resolve = true, limit = 5,
excludeUnreviewed = false, signal = null) {
try {
return (await doSearchV2(instanceName, accessToken, query, resolve, limit, excludeUnreviewed, signal))
} catch (err) {
if (err && err.status === 404) { // fall back to old search API
return doSearchV1(instanceName, accessToken, query, resolve, limit, excludeUnreviewed, signal)
} else {
throw err
}
}
}