Skip to content

Commit 0406bb9

Browse files
committed
多知识库重构
1 parent 7a430ad commit 0406bb9

File tree

9 files changed

+115
-26
lines changed

9 files changed

+115
-26
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
kg-data/
2+
*.db
23

34
# dependencies (bun install)
45
node_modules

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ docker-compose up -d
6868
本项目采用 [GAPLv3](LICENSE) 许可证。如需许可证外其他用途,请联系 Wechat SOVLOOKUP。
6969

7070
<!-- 下一步-->
71+
<!-- 重写 API -->
72+
<!-- 测试功能 -->
73+
<!-- 重写前端 -->
74+
<!-- 建立自动构建 -->
7175
<!-- TODO 知识库 配置 embedder 的 api -->
7276
<!-- TODO 知识库 自动 mcp 服务器 -->
7377

bun.lock

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515
"name": "app",
1616
"dependencies": {
1717
"@hey-api/client-fetch": "^0.8.3",
18-
"@prisma/client": "^6.5.0",
1918
},
2019
"devDependencies": {
2120
"@hey-api/openapi-ts": "^0.64.13",
2221
"@hono/swagger-ui": "^0.5.1",
2322
"@hono/zod-openapi": "^0.19.2",
23+
"@prisma/client": "^6.5.0",
24+
"@types/fs-extra": "^11.0.4",
2425
"consola": "^3.4.2",
2526
"core": "workspace:*",
2627
"es-toolkit": "^1.33.0",
28+
"fs-extra": "^11.3.0",
2729
"hono": "^4.7.5",
2830
"nypm": "^0.6.0",
2931
"prisma": "^6.5.0",

packages/app/.template.env

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@ MEILI_URL = "http://meilisearch:7700"
33
# MeiliSearchAPI密钥
44
MEILI_MASTER_KEY = ""
55

6-
# 知识库路径
7-
INIT_PATH = "/app/data"
6+
DATABASE_URL= "file:C:/Users/SOVLOOKUP/.docbase/data/db.sqlite"

packages/app/package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"scripts": {
55
"dev": "bun run --hot src/main.ts",
66
"gen": "bun ./gen.ts",
7+
"dbpush": "prisma db push",
78
"build": "bun ./build.ts"
89
},
910
"devDependencies": {
@@ -15,10 +16,12 @@
1516
"es-toolkit": "^1.33.0",
1617
"hono": "^4.7.5",
1718
"nypm": "^0.6.0",
18-
"prisma": "^6.5.0"
19+
"prisma": "^6.5.0",
20+
"@prisma/client": "^6.5.0",
21+
"@types/fs-extra": "^11.0.4",
22+
"fs-extra": "^11.3.0"
1923
},
2024
"dependencies": {
21-
"@hey-api/client-fetch": "^0.8.3",
22-
"@prisma/client": "^6.5.0"
25+
"@hey-api/client-fetch": "^0.8.3"
2326
}
2427
}

packages/app/prisma/schema.prisma

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
generator client {
2+
provider = "prisma-client-js"
3+
}
4+
5+
datasource db {
6+
provider = "sqlite"
7+
url = env("DATABASE_URL")
8+
}
9+
10+
model Plugin {
11+
name String @id
12+
config Json
13+
}
14+
15+
model KnowledgeBase {
16+
id String @id @default(uuid())
17+
name String
18+
}

packages/app/src/main.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { version, name } from "~/package.json";
66
import { type DocBase } from "core/src";
77
import { serveStatic } from "hono/bun";
88
import webdav from "./webdav";
9-
import { getPkgManager, PackageManager } from "./pkgManager";
9+
import { getDB, getPkgManager, PackageManager } from "./pkgManager";
1010
import { createDocBase } from "./docbase";
1111

1212
createConsola({
@@ -25,7 +25,7 @@ declare module "hono" {
2525

2626
const app = new OpenAPIHono();
2727

28-
const docbase = await createDocBase();
28+
const docbase = await createDocBase({ db: await getDB() });
2929

3030
// 启动 docbase 实例
3131
app.use(async (c, next) => {

packages/app/src/pkgManager/db.ts

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,85 @@
1-
import { Base, DBLayer, DocBaseConfig, PluginWithConfig } from "core/src";
1+
import { DBLayer } from "core/src";
22
import { PackageManager } from "./pkgManager";
3+
import { join } from "path";
4+
import { readJSON, rm } from "fs-extra";
5+
import { PrismaClient } from "@prisma/client";
6+
import { mkdir } from "fs/promises";
37

4-
class DB implements DBLayer {
5-
#dataPath: string;
8+
export class DB implements DBLayer {
9+
#dataDir: string;
610
#pkgManager: PackageManager;
11+
#configPath: string;
12+
#prisma: PrismaClient;
13+
714
constructor({
8-
dataPath,
15+
dataDir,
916
pkgManager,
1017
}: {
11-
dataPath: string;
18+
dataDir: string;
1219
pkgManager: PackageManager;
1320
}) {
14-
this.#dataPath = dataPath;
21+
this.#dataDir = dataDir;
22+
this.#configPath = join(dataDir, "config.json");
1523
this.#pkgManager = pkgManager;
24+
const dbFile = join(dataDir, "db.sqlite");
25+
this.#prisma = new PrismaClient({
26+
datasources: {
27+
db: {
28+
url: `file:${dbFile}`,
29+
},
30+
},
31+
});
1632
}
1733

1834
plugins = () => {
35+
const self = this;
1936
return (async function* () {
20-
for (const name of Object.keys(await this.#pkgManager.list())) {
21-
const plugin = await this.#pkgManager.import(name);
22-
// TODO: 从配置文件中读取配置
37+
const plugins = await self.#prisma.plugin.findMany();
38+
for (const { name, config } of plugins) {
39+
const plugin = await self.#pkgManager.import(name);
2340
yield {
2441
plugin,
25-
config: {},
42+
config: config as object,
2643
};
2744
}
2845
})();
2946
};
30-
getConfig = async () => {
31-
// TODO: 从配置文件中读取配置
32-
return { meiliSearchConfig: { host: "" } };
33-
};
34-
knowledgeBase: {
35-
add: (name: string) => Promise<Base>;
36-
del: (id: string) => Promise<Base>;
37-
all: () => AsyncIterable<Base>;
47+
48+
getConfig = async () => await readJSON(this.#configPath);
49+
50+
knowledgeBase = {
51+
add: async (name: string) => {
52+
const res = await this.#prisma.knowledgeBase.create({
53+
data: {
54+
name,
55+
},
56+
});
57+
const path = join(this.#dataDir, res.id);
58+
await mkdir(path);
59+
return { path, ...res };
60+
},
61+
del: async (id: string) => {
62+
const res = await this.#prisma.knowledgeBase.delete({
63+
where: {
64+
id,
65+
},
66+
});
67+
const path = join(this.#dataDir, res.id);
68+
await rm(path, { force: true });
69+
return { path, ...res };
70+
},
71+
all: () => {
72+
const self = this;
73+
return (async function* () {
74+
const plugins = await self.#prisma.knowledgeBase.findMany();
75+
for (const { name, id } of plugins) {
76+
yield {
77+
name,
78+
id,
79+
path: join(self.#dataDir, id),
80+
};
81+
}
82+
})();
83+
},
3884
};
3985
}

packages/app/src/pkgManager/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { homedir } from "os";
22
import { join } from "path";
33
import { ensureDir } from "fs-extra";
44
import { PackageManager } from "./pkgManager";
5+
import { DBLayer } from "~/packages/core/src";
6+
import { DB } from "./db";
57
export { PackageManager };
68

79
// 初始化插件目录
@@ -10,6 +12,7 @@ const pluginsDir = join(baseDir, "plugins");
1012
const dataDir = join(baseDir, "data");
1113

1214
let pkgManager: PackageManager | undefined;
15+
let db: DBLayer | undefined;
1316

1417
export const getPkgManager = async () => {
1518
if (pkgManager) {
@@ -20,3 +23,16 @@ export const getPkgManager = async () => {
2023
return pkgManager;
2124
}
2225
};
26+
27+
export const getDB = async () => {
28+
if (db) {
29+
return db;
30+
} else {
31+
await ensureDir(dataDir);
32+
db = new DB({
33+
dataDir,
34+
pkgManager: await getPkgManager(),
35+
});
36+
return db;
37+
}
38+
};

0 commit comments

Comments
 (0)