implement bookmark search
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import type { Bookmark, Tag, TaggedBookmark } from "@markone/core"
|
||||
import type { Bookmark, Tag, TagId, TaggedBookmark } from "@markone/core"
|
||||
import { DEMO_USER } from "@markone/core/user"
|
||||
import { type } from "arktype"
|
||||
import { ulid } from "ulid"
|
||||
@@ -14,11 +14,13 @@ import {
|
||||
findBookmark,
|
||||
findBookmarkCachedContent,
|
||||
findBookmarkTags,
|
||||
findBookmarks,
|
||||
insertBookmark,
|
||||
updateBookmarkTags,
|
||||
updateBookmarkTitle,
|
||||
} from "./bookmark.ts"
|
||||
|
||||
import { fuzzySearchBookmarks } from "~/bookmark/search.js"
|
||||
import { insertTags } from "~/tag/tag.js"
|
||||
|
||||
const BOOKMARK_PAGINATION_LIMIT = 100
|
||||
@@ -27,6 +29,7 @@ const ListUserBookmarksParams = type({
|
||||
limit: ["number", "=", BOOKMARK_PAGINATION_LIMIT],
|
||||
skip: ["number", "=", 0],
|
||||
"tags?": "string",
|
||||
"q?": "string",
|
||||
})
|
||||
|
||||
const AddBookmarkRequestBody = type({
|
||||
@@ -53,38 +56,23 @@ async function listUserBookmarks(request: Bun.BunRequest<"/api/bookmarks">, user
|
||||
}
|
||||
|
||||
let results: Bookmark[]
|
||||
if (queryParams.tags) {
|
||||
const tagNames = queryParams.tags.split(",")
|
||||
|
||||
const tagIdsQuery = db.query<{ id: string }, string[]>(
|
||||
`SELECT id FROM tags WHERE name IN (${Array(tagNames.length).fill("?").join(",")})`,
|
||||
)
|
||||
|
||||
const tagIds = tagIdsQuery.all(...tagNames).map(({ id }) => id)
|
||||
|
||||
const query = db.query(`
|
||||
SELECT bookmarks.id, bookmarks.title, bookmarks.url FROM bookmarks
|
||||
INNER JOIN bookmark_tags
|
||||
ON bookmark_tags.bookmark_id = bookmarks.id
|
||||
WHERE bookmarks.user_id = ? AND bookmark_tags.tag_id IN (${Array(tagIds.length).fill("?").join(",")})
|
||||
ORDER BY bookmarks.id DESC
|
||||
LIMIT ? OFFSET ?
|
||||
`)
|
||||
|
||||
results = query.all(...[user.id, ...tagIds, queryParams.limit, queryParams.skip]) as Bookmark[]
|
||||
if (queryParams.q || queryParams.tags) {
|
||||
let tagIds: TagId[] = []
|
||||
if (queryParams.tags) {
|
||||
const tagNames = queryParams.tags.split(",")
|
||||
const tagIdsQuery = db.query<{ id: string }, string[]>(
|
||||
`SELECT id FROM tags WHERE name IN (${Array(tagNames.length).fill("?").join(",")})`,
|
||||
)
|
||||
tagIds = tagIdsQuery.all(...tagNames).map(({ id }) => id)
|
||||
}
|
||||
if (queryParams.q) {
|
||||
results = fuzzySearchBookmarks({ searchTerm: queryParams.q, tagIds }, user)
|
||||
} else {
|
||||
results = findBookmarks({ ids: [], tagIds }, user)
|
||||
}
|
||||
} else {
|
||||
const query = db.query(`
|
||||
SELECT bookmarks.id, bookmarks.title, bookmarks.url FROM bookmarks
|
||||
WHERE bookmarks.user_id = $userId
|
||||
ORDER BY bookmarks.id DESC
|
||||
LIMIT $limit OFFSET $skip
|
||||
`)
|
||||
|
||||
results = query.all({
|
||||
userId: user.id,
|
||||
limit: queryParams.limit,
|
||||
skip: queryParams.skip,
|
||||
}) as Bookmark[]
|
||||
results = findBookmarks({ ids: [], tagIds: [], limit: queryParams.limit, skip: queryParams.skip }, user)
|
||||
}
|
||||
|
||||
return Response.json(results, { status: 200 })
|
||||
|
Reference in New Issue
Block a user