mirror of
https://github.com/wahyd4/heygo.git
synced 2026-08-08 21:05:48 +10:00
Add link search
This commit is contained in:
@@ -50,12 +50,22 @@ const LINK_COLUMNS = `id, alias, scope, link_type, target_url, content_markdown,
|
||||
const PRIVATE_LINK_LIST_QUERY = `SELECT ${LINK_COLUMNS}
|
||||
FROM links
|
||||
WHERE scope='private' AND status='active' AND owner_user_id=?
|
||||
ORDER BY updated_at DESC`;
|
||||
ORDER BY click_count DESC, updated_at DESC`;
|
||||
|
||||
const PRIVATE_LINK_SEARCH_QUERY = `SELECT ${LINK_COLUMNS}
|
||||
FROM links
|
||||
WHERE scope='private' AND status='active' AND owner_user_id=? AND alias LIKE ? ESCAPE '\\'
|
||||
ORDER BY CASE WHEN alias = ? COLLATE NOCASE THEN 0 ELSE 1 END, click_count DESC, updated_at DESC`;
|
||||
|
||||
const PUBLIC_LINK_LIST_QUERY = `SELECT ${LINK_COLUMNS}
|
||||
FROM links
|
||||
WHERE scope='public' AND status='active'
|
||||
ORDER BY updated_at DESC`;
|
||||
ORDER BY click_count DESC, updated_at DESC`;
|
||||
|
||||
const PUBLIC_LINK_SEARCH_QUERY = `SELECT ${LINK_COLUMNS}
|
||||
FROM links
|
||||
WHERE scope='public' AND status='active' AND alias LIKE ? ESCAPE '\\'
|
||||
ORDER BY CASE WHEN alias = ? COLLATE NOCASE THEN 0 ELSE 1 END, click_count DESC, updated_at DESC`;
|
||||
|
||||
const LINK_BY_ID_PRIVATE_QUERY = `SELECT ${LINK_COLUMNS}
|
||||
FROM links
|
||||
@@ -177,7 +187,7 @@ export async function handleLinksApi(request: Request, env: Env): Promise<Respon
|
||||
|
||||
if (pathname === '/api/links/public') {
|
||||
if (request.method === 'GET') {
|
||||
return await listPublicLinks(env);
|
||||
return await listPublicLinks(request, env);
|
||||
}
|
||||
return methodNotAllowed();
|
||||
}
|
||||
@@ -260,6 +270,16 @@ export async function handleLinksApi(request: Request, env: Env): Promise<Respon
|
||||
|
||||
async function listPrivateLinks(request: Request, env: Env): Promise<Response> {
|
||||
const user = await requireUser(request, env);
|
||||
const url = new URL(request.url);
|
||||
const query = url.searchParams.get('q') ?? '';
|
||||
const trimmed = query.trim();
|
||||
if (trimmed) {
|
||||
const escaped = escapeLikePattern(trimmed.toLowerCase());
|
||||
const result = await env.DB.prepare(PRIVATE_LINK_SEARCH_QUERY)
|
||||
.bind(user.id, `%${escaped}%`, trimmed.toLowerCase())
|
||||
.all<LinkRow>();
|
||||
return json({ links: (result.results ?? []).map(toLinkJson) });
|
||||
}
|
||||
const result = await env.DB.prepare(PRIVATE_LINK_LIST_QUERY).bind(user.id).all<LinkRow>();
|
||||
return json({ links: (result.results ?? []).map(toLinkJson) });
|
||||
}
|
||||
@@ -273,7 +293,17 @@ async function getPrivateLink(request: Request, env: Env, id: string): Promise<R
|
||||
return json({ link: toLinkJson(link) });
|
||||
}
|
||||
|
||||
async function listPublicLinks(env: Env): Promise<Response> {
|
||||
async function listPublicLinks(request: Request, env: Env): Promise<Response> {
|
||||
const url = new URL(request.url);
|
||||
const query = url.searchParams.get('q') ?? '';
|
||||
const trimmed = query.trim();
|
||||
if (trimmed) {
|
||||
const escaped = escapeLikePattern(trimmed.toLowerCase());
|
||||
const result = await env.DB.prepare(PUBLIC_LINK_SEARCH_QUERY)
|
||||
.bind(`%${escaped}%`, trimmed.toLowerCase())
|
||||
.all<LinkRow>();
|
||||
return json({ links: (result.results ?? []).map(toLinkJson) });
|
||||
}
|
||||
const result = await env.DB.prepare(PUBLIC_LINK_LIST_QUERY).all<LinkRow>();
|
||||
return json({ links: (result.results ?? []).map(toLinkJson) });
|
||||
}
|
||||
@@ -555,6 +585,10 @@ function isHttpUrl(value: string): boolean {
|
||||
}
|
||||
}
|
||||
|
||||
function escapeLikePattern(pattern: string): string {
|
||||
return pattern.replace(/\\/g, '\\\\').replace(/%/g, '\\%').replace(/_/g, '\\_');
|
||||
}
|
||||
|
||||
class RequestValidationError extends Error {}
|
||||
|
||||
function toLinkJson(row: LinkRow) {
|
||||
|
||||
Reference in New Issue
Block a user