From 900e6c812994e7691c7fb298127abc89bf0664e3 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 15 Mar 2023 15:59:09 +0000 Subject: [PATCH] Adding search index for user. --- packages/backend-core/src/db/lucene.ts | 1 + .../src/db/searchIndexes/index.ts | 0 .../src/db/searchIndexes/searchIndexes.ts | 52 +++++++++++++++++++ packages/types/src/sdk/db.ts | 1 + 4 files changed, 54 insertions(+) create mode 100644 packages/backend-core/src/db/searchIndexes/index.ts create mode 100644 packages/backend-core/src/db/searchIndexes/searchIndexes.ts diff --git a/packages/backend-core/src/db/lucene.ts b/packages/backend-core/src/db/lucene.ts index 71ce4ba9ac..3e6bdfef9a 100644 --- a/packages/backend-core/src/db/lucene.ts +++ b/packages/backend-core/src/db/lucene.ts @@ -1,6 +1,7 @@ import fetch from "node-fetch" import { getCouchInfo } from "./couch" import { SearchFilters, Row } from "@budibase/types" +import { createUserIndex } from "./searchIndexes/searchIndexes" const QUERY_START_REGEX = /\d[0-9]*:/g diff --git a/packages/backend-core/src/db/searchIndexes/index.ts b/packages/backend-core/src/db/searchIndexes/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/backend-core/src/db/searchIndexes/searchIndexes.ts b/packages/backend-core/src/db/searchIndexes/searchIndexes.ts new file mode 100644 index 0000000000..2a7db95945 --- /dev/null +++ b/packages/backend-core/src/db/searchIndexes/searchIndexes.ts @@ -0,0 +1,52 @@ +import { User, SearchIndex } from "@budibase/types" +import { getGlobalDB } from "../../context" + +export async function createUserIndex() { + const db = getGlobalDB() + let designDoc + try { + designDoc = await db.get("_design/database") + } catch (err: any) { + if (err.status === 404) { + designDoc = { _id: "_design/database" } + } + } + // this is a very specific function given that it is only for audit logs + const fn = function (user: User) { + if (user._id && !user._id.startsWith("us_")) { + return + } + const ignoredFields = ["_id", "_rev", "password"] + function idx(input: Record, prev?: string) { + for (let key of Object.keys(input)) { + if (ignoredFields.includes(key)) { + continue + } + let idxKey = prev != null ? `${prev}.${key}` : key + if (typeof input[key] === "string") { + // eslint-disable-next-line no-undef + // @ts-ignore + index(idxKey, input[key].toLowerCase(), { facet: true }) + } else if (typeof input[key] !== "object") { + // eslint-disable-next-line no-undef + // @ts-ignore + index(idxKey, input[key], { facet: true }) + } else { + idx(input[key], idxKey) + } + } + } + idx(user) + } + + designDoc.indexes = { + [SearchIndex.USER]: { + index: fn.toString(), + analyzer: { + default: "keyword", + name: "perfield", + }, + }, + } + await db.put(designDoc) +} diff --git a/packages/types/src/sdk/db.ts b/packages/types/src/sdk/db.ts index 6e213b5831..00170a1105 100644 --- a/packages/types/src/sdk/db.ts +++ b/packages/types/src/sdk/db.ts @@ -5,6 +5,7 @@ import { Writable } from "stream" export enum SearchIndex { ROWS = "rows", AUDIT = "audit", + USER = "user", } export type PouchOptions = {