@chinjinyu/mcp-knowledge-graph-plus 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +700 -0
- package/dist/application/services/FactService.d.ts +16 -0
- package/dist/application/services/FactService.d.ts.map +1 -0
- package/dist/application/services/FactService.js +50 -0
- package/dist/application/services/FactService.js.map +1 -0
- package/dist/application/services/KnowledgeGraphService.d.ts +33 -0
- package/dist/application/services/KnowledgeGraphService.d.ts.map +1 -0
- package/dist/application/services/KnowledgeGraphService.js +271 -0
- package/dist/application/services/KnowledgeGraphService.js.map +1 -0
- package/dist/application/services/LinkService.d.ts +17 -0
- package/dist/application/services/LinkService.d.ts.map +1 -0
- package/dist/application/services/LinkService.js +53 -0
- package/dist/application/services/LinkService.js.map +1 -0
- package/dist/application/services/NodeService.d.ts +31 -0
- package/dist/application/services/NodeService.d.ts.map +1 -0
- package/dist/application/services/NodeService.js +69 -0
- package/dist/application/services/NodeService.js.map +1 -0
- package/dist/core/config/index.d.ts +34 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +60 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/errors/index.d.ts +70 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +120 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/types/index.d.ts +119 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +5 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/database/DatabaseManager.d.ts +13 -0
- package/dist/infrastructure/database/DatabaseManager.d.ts.map +1 -0
- package/dist/infrastructure/database/DatabaseManager.js +101 -0
- package/dist/infrastructure/database/DatabaseManager.js.map +1 -0
- package/dist/infrastructure/di/Container.d.ts +21 -0
- package/dist/infrastructure/di/Container.d.ts.map +1 -0
- package/dist/infrastructure/di/Container.js +45 -0
- package/dist/infrastructure/di/Container.js.map +1 -0
- package/dist/infrastructure/repositories/BaseRepository.d.ts +23 -0
- package/dist/infrastructure/repositories/BaseRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/BaseRepository.js +84 -0
- package/dist/infrastructure/repositories/BaseRepository.js.map +1 -0
- package/dist/infrastructure/repositories/FactRepository.d.ts +28 -0
- package/dist/infrastructure/repositories/FactRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/FactRepository.js +101 -0
- package/dist/infrastructure/repositories/FactRepository.js.map +1 -0
- package/dist/infrastructure/repositories/LinkRepository.d.ts +28 -0
- package/dist/infrastructure/repositories/LinkRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/LinkRepository.js +107 -0
- package/dist/infrastructure/repositories/LinkRepository.js.map +1 -0
- package/dist/infrastructure/repositories/NodeRepository.d.ts +28 -0
- package/dist/infrastructure/repositories/NodeRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/NodeRepository.js +143 -0
- package/dist/infrastructure/repositories/NodeRepository.js.map +1 -0
- package/dist/interfaces/mcp/commands/BaseCommand.d.ts +55 -0
- package/dist/interfaces/mcp/commands/BaseCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/BaseCommand.js +42 -0
- package/dist/interfaces/mcp/commands/BaseCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/FactAddCommand.d.ts +42 -0
- package/dist/interfaces/mcp/commands/FactAddCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/FactAddCommand.js +73 -0
- package/dist/interfaces/mcp/commands/FactAddCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/FactDelCommand.d.ts +42 -0
- package/dist/interfaces/mcp/commands/FactDelCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/FactDelCommand.js +68 -0
- package/dist/interfaces/mcp/commands/FactDelCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/FactEditCommand.d.ts +43 -0
- package/dist/interfaces/mcp/commands/FactEditCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/FactEditCommand.js +68 -0
- package/dist/interfaces/mcp/commands/FactEditCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/LinkAddCommand.d.ts +43 -0
- package/dist/interfaces/mcp/commands/LinkAddCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/LinkAddCommand.js +63 -0
- package/dist/interfaces/mcp/commands/LinkAddCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/LinkDelCommand.d.ts +43 -0
- package/dist/interfaces/mcp/commands/LinkDelCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/LinkDelCommand.js +65 -0
- package/dist/interfaces/mcp/commands/LinkDelCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/LinkEditCommand.d.ts +47 -0
- package/dist/interfaces/mcp/commands/LinkEditCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/LinkEditCommand.js +75 -0
- package/dist/interfaces/mcp/commands/LinkEditCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/ListCommand.d.ts +33 -0
- package/dist/interfaces/mcp/commands/ListCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/ListCommand.js +57 -0
- package/dist/interfaces/mcp/commands/ListCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/NodeAddCommand.d.ts +46 -0
- package/dist/interfaces/mcp/commands/NodeAddCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/NodeAddCommand.js +67 -0
- package/dist/interfaces/mcp/commands/NodeAddCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/NodeDelCommand.d.ts +32 -0
- package/dist/interfaces/mcp/commands/NodeDelCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/NodeDelCommand.js +63 -0
- package/dist/interfaces/mcp/commands/NodeDelCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/NodeEditCommand.d.ts +43 -0
- package/dist/interfaces/mcp/commands/NodeEditCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/NodeEditCommand.js +63 -0
- package/dist/interfaces/mcp/commands/NodeEditCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/NodeGetCommand.d.ts +40 -0
- package/dist/interfaces/mcp/commands/NodeGetCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/NodeGetCommand.js +72 -0
- package/dist/interfaces/mcp/commands/NodeGetCommand.js.map +1 -0
- package/dist/interfaces/mcp/commands/SearchCommand.d.ts +53 -0
- package/dist/interfaces/mcp/commands/SearchCommand.d.ts.map +1 -0
- package/dist/interfaces/mcp/commands/SearchCommand.js +91 -0
- package/dist/interfaces/mcp/commands/SearchCommand.js.map +1 -0
- package/package.json +10 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Manager
|
|
3
|
+
*/
|
|
4
|
+
import { createRequire } from 'module';
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const sqlite3 = require('sqlite3');
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import { DatabaseConnectionError } from '../../core/errors/index.js';
|
|
10
|
+
const SCHEMA = `
|
|
11
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
12
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
13
|
+
name TEXT UNIQUE NOT NULL,
|
|
14
|
+
entity_type TEXT NOT NULL,
|
|
15
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
16
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
17
|
+
);
|
|
18
|
+
CREATE TABLE IF NOT EXISTS relations (
|
|
19
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
|
+
from_entity_id INTEGER NOT NULL,
|
|
21
|
+
to_entity_id INTEGER NOT NULL,
|
|
22
|
+
relation_type TEXT NOT NULL,
|
|
23
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
24
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
25
|
+
UNIQUE(from_entity_id, to_entity_id, relation_type),
|
|
26
|
+
FOREIGN KEY (from_entity_id) REFERENCES entities(id),
|
|
27
|
+
FOREIGN KEY (to_entity_id) REFERENCES entities(id)
|
|
28
|
+
);
|
|
29
|
+
CREATE TABLE IF NOT EXISTS observations (
|
|
30
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
31
|
+
entity_id INTEGER NOT NULL,
|
|
32
|
+
content TEXT NOT NULL,
|
|
33
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
34
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
35
|
+
FOREIGN KEY (entity_id) REFERENCES entities(id)
|
|
36
|
+
);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_entity_id);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_entity_id);
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_observations_entity ON observations(entity_id);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_observations_content ON observations(content);
|
|
42
|
+
`;
|
|
43
|
+
export class DatabaseManager {
|
|
44
|
+
dbPath;
|
|
45
|
+
db = null;
|
|
46
|
+
constructor(dbPath) {
|
|
47
|
+
this.dbPath = dbPath;
|
|
48
|
+
}
|
|
49
|
+
async initialize() {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
try {
|
|
52
|
+
if (this.dbPath !== ':memory:') {
|
|
53
|
+
const dir = path.dirname(this.dbPath);
|
|
54
|
+
if (!fs.existsSync(dir))
|
|
55
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
56
|
+
}
|
|
57
|
+
this.db = new sqlite3.Database(this.dbPath, (err) => {
|
|
58
|
+
if (err) {
|
|
59
|
+
reject(new DatabaseConnectionError(this.dbPath, err));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.db.exec(SCHEMA, (schemaErr) => {
|
|
63
|
+
if (schemaErr) {
|
|
64
|
+
reject(new DatabaseConnectionError(this.dbPath, schemaErr));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
resolve();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
reject(new DatabaseConnectionError(this.dbPath, error));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
getConnection() {
|
|
77
|
+
if (!this.db)
|
|
78
|
+
throw new DatabaseConnectionError(this.dbPath, new Error('Database not initialized'));
|
|
79
|
+
return this.db;
|
|
80
|
+
}
|
|
81
|
+
async close() {
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
if (!this.db) {
|
|
84
|
+
resolve();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.db.close((err) => {
|
|
88
|
+
if (err)
|
|
89
|
+
reject(err);
|
|
90
|
+
else {
|
|
91
|
+
this.db = null;
|
|
92
|
+
resolve();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
isConnected() {
|
|
98
|
+
return this.db !== null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=DatabaseManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseManager.js","sourceRoot":"","sources":["../../../src/infrastructure/database/DatabaseManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Injection Container
|
|
3
|
+
*/
|
|
4
|
+
export type Factory<T> = (container: Container) => T;
|
|
5
|
+
export declare const Lifetime: {
|
|
6
|
+
readonly SINGLETON: "singleton";
|
|
7
|
+
readonly TRANSIENT: "transient";
|
|
8
|
+
};
|
|
9
|
+
export type Lifetime = typeof Lifetime[keyof typeof Lifetime];
|
|
10
|
+
export declare class Container {
|
|
11
|
+
private readonly registrations;
|
|
12
|
+
private readonly resolved;
|
|
13
|
+
register<T>(token: string, factory: Factory<T>, lifetime?: Lifetime): this;
|
|
14
|
+
singleton<T>(token: string, factory: Factory<T>): this;
|
|
15
|
+
transient<T>(token: string, factory: Factory<T>): this;
|
|
16
|
+
instance<T>(token: string, instance: T): this;
|
|
17
|
+
resolve<T>(token: string): T;
|
|
18
|
+
isRegistered(token: string): boolean;
|
|
19
|
+
clear(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=Container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/di/Container.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AACrD,eAAO,MAAM,QAAQ;;;CAA8D,CAAC;AACpF,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAQ9D,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IACtE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IAEnD,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAE,QAA6B,GAAG,IAAI;IAM9F,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAItD,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAItD,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAI7C,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC;IAiB5B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIpC,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Injection Container
|
|
3
|
+
*/
|
|
4
|
+
export const Lifetime = { SINGLETON: 'singleton', TRANSIENT: 'transient' };
|
|
5
|
+
export class Container {
|
|
6
|
+
registrations = new Map();
|
|
7
|
+
resolved = new Set();
|
|
8
|
+
register(token, factory, lifetime = Lifetime.SINGLETON) {
|
|
9
|
+
if (this.resolved.has(token))
|
|
10
|
+
throw new Error(`Cannot modify registration for already resolved service: ${token}`);
|
|
11
|
+
this.registrations.set(token, { factory, lifetime });
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
singleton(token, factory) {
|
|
15
|
+
return this.register(token, factory, Lifetime.SINGLETON);
|
|
16
|
+
}
|
|
17
|
+
transient(token, factory) {
|
|
18
|
+
return this.register(token, factory, Lifetime.TRANSIENT);
|
|
19
|
+
}
|
|
20
|
+
instance(token, instance) {
|
|
21
|
+
return this.register(token, () => instance, Lifetime.SINGLETON);
|
|
22
|
+
}
|
|
23
|
+
resolve(token) {
|
|
24
|
+
const registration = this.registrations.get(token);
|
|
25
|
+
if (!registration)
|
|
26
|
+
throw new Error(`No registration found for: ${token}`);
|
|
27
|
+
if (registration.lifetime === Lifetime.SINGLETON && registration.instance !== undefined) {
|
|
28
|
+
return registration.instance;
|
|
29
|
+
}
|
|
30
|
+
this.resolved.add(token);
|
|
31
|
+
const instance = registration.factory(this);
|
|
32
|
+
if (registration.lifetime === Lifetime.SINGLETON) {
|
|
33
|
+
registration.instance = instance;
|
|
34
|
+
}
|
|
35
|
+
return instance;
|
|
36
|
+
}
|
|
37
|
+
isRegistered(token) {
|
|
38
|
+
return this.registrations.has(token);
|
|
39
|
+
}
|
|
40
|
+
clear() {
|
|
41
|
+
this.registrations.clear();
|
|
42
|
+
this.resolved.clear();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=Container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../src/infrastructure/di/Container.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAW,CAAC;AASpF,MAAM,OAAO,SAAS;IACH,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;IACrD,QAAQ,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEnD,QAAQ,CAAI,KAAa,EAAE,OAAmB,EAAE,WAAqB,QAAQ,CAAC,SAAS;QACrF,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,KAAK,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAI,KAAa,EAAE,OAAmB;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,SAAS,CAAI,KAAa,EAAE,OAAmB;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ,CAAI,KAAa,EAAE,QAAW;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAI,KAAa;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAE1E,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxF,OAAO,YAAY,CAAC,QAAa,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAM,CAAC;QAEjD,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;YACjD,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACnC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Repository
|
|
3
|
+
*/
|
|
4
|
+
import type Database from 'sqlite3';
|
|
5
|
+
export type Row = {
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
};
|
|
8
|
+
export declare abstract class BaseRepository<T, R extends Row> {
|
|
9
|
+
protected readonly db: Database.Database;
|
|
10
|
+
constructor(db: Database.Database);
|
|
11
|
+
protected abstract getTableName(): string;
|
|
12
|
+
protected abstract rowToEntity(row: R): T;
|
|
13
|
+
protected get<TRow extends Row = Row>(sql: string, params?: readonly unknown[]): Promise<TRow | undefined>;
|
|
14
|
+
protected all<TRow extends Row = Row>(sql: string, params?: readonly unknown[]): Promise<readonly TRow[]>;
|
|
15
|
+
protected run(sql: string, params?: readonly unknown[]): Promise<{
|
|
16
|
+
lastID: number;
|
|
17
|
+
changes: number;
|
|
18
|
+
}>;
|
|
19
|
+
protected transaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
20
|
+
protected isUniqueConstraintError(error: unknown): boolean;
|
|
21
|
+
protected escapeLikeParam(str: string): string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=BaseRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/BaseRepository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AAEpC,MAAM,MAAM,GAAG,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAE7C,8BAAsB,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG;IACvC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ;gBAArB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEpD,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,MAAM;IACzC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;cAEzB,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;cAShG,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;cAS/F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;cAS3F,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA0BhE,SAAS,CAAC,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAiB1D,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAG/C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Repository
|
|
3
|
+
*/
|
|
4
|
+
export class BaseRepository {
|
|
5
|
+
db;
|
|
6
|
+
constructor(db) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
}
|
|
9
|
+
async get(sql, params) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
this.db.get(sql, params, (err, row) => {
|
|
12
|
+
if (err)
|
|
13
|
+
reject(err);
|
|
14
|
+
else
|
|
15
|
+
resolve(row);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async all(sql, params) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
this.db.all(sql, params, (err, rows) => {
|
|
22
|
+
if (err)
|
|
23
|
+
reject(err);
|
|
24
|
+
else
|
|
25
|
+
resolve(rows || []);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async run(sql, params) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
this.db.run(sql, params, function (err) {
|
|
32
|
+
if (err)
|
|
33
|
+
reject(err);
|
|
34
|
+
else
|
|
35
|
+
resolve({ lastID: this.lastID, changes: this.changes });
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async transaction(fn) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.db.serialize(() => {
|
|
42
|
+
this.db.run('BEGIN TRANSACTION', (err) => {
|
|
43
|
+
if (err) {
|
|
44
|
+
reject(err);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
fn()
|
|
48
|
+
.then(result => {
|
|
49
|
+
this.db.run('COMMIT', (commitErr) => {
|
|
50
|
+
if (commitErr)
|
|
51
|
+
reject(commitErr);
|
|
52
|
+
else
|
|
53
|
+
resolve(result);
|
|
54
|
+
});
|
|
55
|
+
})
|
|
56
|
+
.catch(e => {
|
|
57
|
+
this.db.run('ROLLBACK', (rollbackErr) => {
|
|
58
|
+
reject(rollbackErr || e);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
isUniqueConstraintError(error) {
|
|
66
|
+
// Check if error has the properties of a SQLite constraint error
|
|
67
|
+
// Note: SQLite errors may not always be instances of Error
|
|
68
|
+
const err = error;
|
|
69
|
+
if (!err)
|
|
70
|
+
return false;
|
|
71
|
+
const message = (err.message || '').toLowerCase();
|
|
72
|
+
const code = err.code;
|
|
73
|
+
const errno = err.errno;
|
|
74
|
+
// SQLite UNIQUE constraint error indicators
|
|
75
|
+
return message.includes('unique constraint') ||
|
|
76
|
+
message.includes('sqlite_constraint') ||
|
|
77
|
+
code === 'SQLITE_CONSTRAINT' ||
|
|
78
|
+
errno === 19;
|
|
79
|
+
}
|
|
80
|
+
escapeLikeParam(str) {
|
|
81
|
+
return str.replace(/%/g, '\\%').replace(/_/g, '\\_');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=BaseRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/BaseRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fact Repository
|
|
3
|
+
*/
|
|
4
|
+
import type Database from 'sqlite3';
|
|
5
|
+
import type { ID, Fact, ObservationRow } from '../../core/types/index.js';
|
|
6
|
+
import { BaseRepository } from './BaseRepository.js';
|
|
7
|
+
export declare class FactRepository extends BaseRepository<Fact, ObservationRow> {
|
|
8
|
+
constructor(db: Database.Database);
|
|
9
|
+
protected getTableName(): string;
|
|
10
|
+
protected rowToEntity(row: ObservationRow): Fact;
|
|
11
|
+
findById(id: ID): Promise<Fact | null>;
|
|
12
|
+
findByNodeId(nodeId: ID): Promise<readonly Fact[]>;
|
|
13
|
+
findByNodeIds(nodeIds: readonly ID[]): Promise<readonly Fact[]>;
|
|
14
|
+
findAll(): Promise<readonly Fact[]>;
|
|
15
|
+
create(nodeId: ID, content: string): Promise<Fact>;
|
|
16
|
+
createMany(inputs: readonly {
|
|
17
|
+
nodeId: ID;
|
|
18
|
+
content: string;
|
|
19
|
+
}[]): Promise<readonly Fact[]>;
|
|
20
|
+
updateContent(id: ID, newContent: string): Promise<Fact | null>;
|
|
21
|
+
delete(id: ID): Promise<void>;
|
|
22
|
+
deleteByNodeId(nodeId: ID): Promise<number>;
|
|
23
|
+
deleteByNodeIdAndContent(nodeId: ID, contents: readonly string[]): Promise<number>;
|
|
24
|
+
count(): Promise<number>;
|
|
25
|
+
countByNodeId(nodeId: ID): Promise<number>;
|
|
26
|
+
searchByContent(searchText: string): Promise<readonly Fact[]>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=FactRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/FactRepository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,cAAe,SAAQ,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC;gBAC1D,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAU1C,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAKtC,YAAY,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAKlD,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAO/D,OAAO,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAKnC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD,UAAU,CAAC,MAAM,EAAE,SAAS;QAAE,MAAM,EAAE,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAgBxF,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAO/D,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7B,cAAc,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3C,wBAAwB,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAOlF,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAKxB,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1C,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;CAKpE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fact Repository
|
|
3
|
+
*/
|
|
4
|
+
import { DatabaseError } from '../../core/errors/index.js';
|
|
5
|
+
import { BaseRepository } from './BaseRepository.js';
|
|
6
|
+
export class FactRepository extends BaseRepository {
|
|
7
|
+
constructor(db) {
|
|
8
|
+
super(db);
|
|
9
|
+
}
|
|
10
|
+
getTableName() {
|
|
11
|
+
return 'observations';
|
|
12
|
+
}
|
|
13
|
+
rowToEntity(row) {
|
|
14
|
+
return {
|
|
15
|
+
id: row.id,
|
|
16
|
+
nodeId: row.entity_id,
|
|
17
|
+
content: row.content,
|
|
18
|
+
createdAt: row.created_at,
|
|
19
|
+
updatedAt: row.updated_at,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async findById(id) {
|
|
23
|
+
const row = await this.get('SELECT * FROM observations WHERE id = ?', [id]);
|
|
24
|
+
return row ? this.rowToEntity(row) : null;
|
|
25
|
+
}
|
|
26
|
+
async findByNodeId(nodeId) {
|
|
27
|
+
const rows = await this.all('SELECT * FROM observations WHERE entity_id = ? ORDER BY id', [nodeId]);
|
|
28
|
+
return rows.map(row => this.rowToEntity(row));
|
|
29
|
+
}
|
|
30
|
+
async findByNodeIds(nodeIds) {
|
|
31
|
+
if (nodeIds.length === 0)
|
|
32
|
+
return [];
|
|
33
|
+
const placeholders = nodeIds.map(() => '?').join(',');
|
|
34
|
+
const rows = await this.all(`SELECT * FROM observations WHERE entity_id IN (${placeholders}) ORDER BY entity_id, id`, nodeIds);
|
|
35
|
+
return rows.map(row => this.rowToEntity(row));
|
|
36
|
+
}
|
|
37
|
+
async findAll() {
|
|
38
|
+
const rows = await this.all('SELECT * FROM observations ORDER BY id');
|
|
39
|
+
return rows.map(row => this.rowToEntity(row));
|
|
40
|
+
}
|
|
41
|
+
async create(nodeId, content) {
|
|
42
|
+
const now = new Date().toISOString();
|
|
43
|
+
const result = await this.run('INSERT INTO observations (entity_id, content, created_at, updated_at) VALUES (?, ?, ?, ?)', [nodeId, content, now, now]);
|
|
44
|
+
const fact = await this.findById(result.lastID);
|
|
45
|
+
if (!fact)
|
|
46
|
+
throw new DatabaseError('Failed to create fact');
|
|
47
|
+
return fact;
|
|
48
|
+
}
|
|
49
|
+
async createMany(inputs) {
|
|
50
|
+
if (inputs.length === 0)
|
|
51
|
+
return [];
|
|
52
|
+
const facts = [];
|
|
53
|
+
const now = new Date().toISOString();
|
|
54
|
+
await this.transaction(async () => {
|
|
55
|
+
for (const { nodeId, content } of inputs) {
|
|
56
|
+
const result = await this.run('INSERT INTO observations (entity_id, content, created_at, updated_at) VALUES (?, ?, ?, ?)', [nodeId, content, now, now]);
|
|
57
|
+
if (result.changes > 0) {
|
|
58
|
+
const fact = await this.findById(result.lastID);
|
|
59
|
+
if (fact)
|
|
60
|
+
facts.push(fact);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return facts;
|
|
65
|
+
}
|
|
66
|
+
async updateContent(id, newContent) {
|
|
67
|
+
const now = new Date().toISOString();
|
|
68
|
+
const result = await this.run('UPDATE observations SET content = ?, updated_at = ? WHERE id = ?', [newContent, now, id]);
|
|
69
|
+
if (result.changes === 0)
|
|
70
|
+
return null;
|
|
71
|
+
return this.findById(id);
|
|
72
|
+
}
|
|
73
|
+
async delete(id) {
|
|
74
|
+
await this.run('DELETE FROM observations WHERE id = ?', [id]);
|
|
75
|
+
}
|
|
76
|
+
async deleteByNodeId(nodeId) {
|
|
77
|
+
const result = await this.run('DELETE FROM observations WHERE entity_id = ?', [nodeId]);
|
|
78
|
+
return result.changes;
|
|
79
|
+
}
|
|
80
|
+
async deleteByNodeIdAndContent(nodeId, contents) {
|
|
81
|
+
if (contents.length === 0)
|
|
82
|
+
return 0;
|
|
83
|
+
const placeholders = contents.map(() => '?').join(',');
|
|
84
|
+
const result = await this.run(`DELETE FROM observations WHERE entity_id = ? AND content IN (${placeholders})`, [nodeId, ...contents]);
|
|
85
|
+
return result.changes;
|
|
86
|
+
}
|
|
87
|
+
async count() {
|
|
88
|
+
const row = await this.get('SELECT COUNT(*) as count FROM observations');
|
|
89
|
+
return row?.count ?? 0;
|
|
90
|
+
}
|
|
91
|
+
async countByNodeId(nodeId) {
|
|
92
|
+
const row = await this.get('SELECT COUNT(*) as count FROM observations WHERE entity_id = ?', [nodeId]);
|
|
93
|
+
return row?.count ?? 0;
|
|
94
|
+
}
|
|
95
|
+
async searchByContent(searchText) {
|
|
96
|
+
const pattern = `%${this.escapeLikeParam(searchText)}%`;
|
|
97
|
+
const rows = await this.all('SELECT * FROM observations WHERE content LIKE ? ESCAPE \'\\\' ORDER BY id', [pattern]);
|
|
98
|
+
return rows.map(row => this.rowToEntity(row));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=FactRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/FactRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link Repository - handles relations table operations
|
|
3
|
+
*/
|
|
4
|
+
import type Database from 'sqlite3';
|
|
5
|
+
import type { ID, Link, CreateLinkInput, RelationRow } from '../../core/types/index.js';
|
|
6
|
+
import { BaseRepository } from './BaseRepository.js';
|
|
7
|
+
export declare class LinkRepository extends BaseRepository<Link, RelationRow> {
|
|
8
|
+
constructor(db: Database.Database);
|
|
9
|
+
protected getTableName(): string;
|
|
10
|
+
protected rowToEntity(row: RelationRow): Link;
|
|
11
|
+
findById(id: ID): Promise<Link | null>;
|
|
12
|
+
findByNodeIdsAndType(fromNodeId: ID, toNodeId: ID, type: string): Promise<Link | null>;
|
|
13
|
+
findByNodeIds(nodeIds: readonly ID[]): Promise<readonly Link[]>;
|
|
14
|
+
findByNodeId(nodeId: ID): Promise<readonly Link[]>;
|
|
15
|
+
findAll(): Promise<readonly Link[]>;
|
|
16
|
+
create(input: CreateLinkInput, fromNodeId: ID, toNodeId: ID): Promise<Link>;
|
|
17
|
+
createMany(inputs: readonly {
|
|
18
|
+
input: CreateLinkInput;
|
|
19
|
+
fromNodeId: ID;
|
|
20
|
+
toNodeId: ID;
|
|
21
|
+
}[]): Promise<readonly Link[]>;
|
|
22
|
+
updateType(id: ID, newType: string): Promise<Link | null>;
|
|
23
|
+
delete(id: ID): Promise<void>;
|
|
24
|
+
deleteByNodeIdsAndType(fromNodeId: ID, toNodeId: ID, type: string): Promise<number>;
|
|
25
|
+
deleteByNodeId(nodeId: ID): Promise<number>;
|
|
26
|
+
count(): Promise<number>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=LinkRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/LinkRepository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAmB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEzG,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,cAAe,SAAQ,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC;gBACvD,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAWvC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAKtC,oBAAoB,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAQtF,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAU/D,YAAY,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAQlD,OAAO,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAKnC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3E,UAAU,CAAC,MAAM,EAAE,SAAS;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,UAAU,EAAE,EAAE,CAAC;QAAC,QAAQ,EAAE,EAAE,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAuBjH,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAOzD,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7B,sBAAsB,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQnF,cAAc,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3C,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAI/B"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link Repository - handles relations table operations
|
|
3
|
+
*/
|
|
4
|
+
import { LinkAlreadyExistsError, DatabaseError } from '../../core/errors/index.js';
|
|
5
|
+
import { BaseRepository } from './BaseRepository.js';
|
|
6
|
+
export class LinkRepository extends BaseRepository {
|
|
7
|
+
constructor(db) {
|
|
8
|
+
super(db);
|
|
9
|
+
}
|
|
10
|
+
getTableName() {
|
|
11
|
+
return 'relations';
|
|
12
|
+
}
|
|
13
|
+
rowToEntity(row) {
|
|
14
|
+
return {
|
|
15
|
+
id: row.id,
|
|
16
|
+
fromNodeId: row.from_entity_id,
|
|
17
|
+
toNodeId: row.to_entity_id,
|
|
18
|
+
type: row.relation_type,
|
|
19
|
+
createdAt: row.created_at,
|
|
20
|
+
updatedAt: row.updated_at,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async findById(id) {
|
|
24
|
+
const row = await this.get('SELECT * FROM relations WHERE id = ?', [id]);
|
|
25
|
+
return row ? this.rowToEntity(row) : null;
|
|
26
|
+
}
|
|
27
|
+
async findByNodeIdsAndType(fromNodeId, toNodeId, type) {
|
|
28
|
+
const row = await this.get('SELECT * FROM relations WHERE from_entity_id = ? AND to_entity_id = ? AND relation_type = ?', [fromNodeId, toNodeId, type]);
|
|
29
|
+
return row ? this.rowToEntity(row) : null;
|
|
30
|
+
}
|
|
31
|
+
async findByNodeIds(nodeIds) {
|
|
32
|
+
if (nodeIds.length === 0)
|
|
33
|
+
return [];
|
|
34
|
+
const placeholders = nodeIds.map(() => '?').join(',');
|
|
35
|
+
const rows = await this.all(`SELECT * FROM relations WHERE from_entity_id IN (${placeholders}) OR to_entity_id IN (${placeholders}) ORDER BY id`, [...nodeIds, ...nodeIds]);
|
|
36
|
+
return rows.map(row => this.rowToEntity(row));
|
|
37
|
+
}
|
|
38
|
+
async findByNodeId(nodeId) {
|
|
39
|
+
const rows = await this.all('SELECT * FROM relations WHERE from_entity_id = ? OR to_entity_id = ? ORDER BY id', [nodeId, nodeId]);
|
|
40
|
+
return rows.map(row => this.rowToEntity(row));
|
|
41
|
+
}
|
|
42
|
+
async findAll() {
|
|
43
|
+
const rows = await this.all('SELECT * FROM relations ORDER BY id');
|
|
44
|
+
return rows.map(row => this.rowToEntity(row));
|
|
45
|
+
}
|
|
46
|
+
async create(input, fromNodeId, toNodeId) {
|
|
47
|
+
const now = new Date().toISOString();
|
|
48
|
+
try {
|
|
49
|
+
const result = await this.run('INSERT INTO relations (from_entity_id, to_entity_id, relation_type, created_at, updated_at) VALUES (?, ?, ?, ?, ?)', [fromNodeId, toNodeId, input.type, now, now]);
|
|
50
|
+
const link = await this.findById(result.lastID);
|
|
51
|
+
if (!link)
|
|
52
|
+
throw new DatabaseError('Failed to create link');
|
|
53
|
+
return link;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (this.isUniqueConstraintError(error))
|
|
57
|
+
throw new LinkAlreadyExistsError(input.from, input.to, input.type);
|
|
58
|
+
throw new DatabaseError('Failed to create link', error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async createMany(inputs) {
|
|
62
|
+
if (inputs.length === 0)
|
|
63
|
+
return [];
|
|
64
|
+
const links = [];
|
|
65
|
+
const now = new Date().toISOString();
|
|
66
|
+
await this.transaction(async () => {
|
|
67
|
+
for (const { input, fromNodeId, toNodeId } of inputs) {
|
|
68
|
+
try {
|
|
69
|
+
const result = await this.run('INSERT OR IGNORE INTO relations (from_entity_id, to_entity_id, relation_type, created_at, updated_at) VALUES (?, ?, ?, ?, ?)', [fromNodeId, toNodeId, input.type, now, now]);
|
|
70
|
+
if (result.changes > 0) {
|
|
71
|
+
const link = await this.findById(result.lastID);
|
|
72
|
+
if (link)
|
|
73
|
+
links.push(link);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (!this.isUniqueConstraintError(error))
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return links;
|
|
83
|
+
}
|
|
84
|
+
async updateType(id, newType) {
|
|
85
|
+
const now = new Date().toISOString();
|
|
86
|
+
const result = await this.run('UPDATE relations SET relation_type = ?, updated_at = ? WHERE id = ?', [newType, now, id]);
|
|
87
|
+
if (result.changes === 0)
|
|
88
|
+
return null;
|
|
89
|
+
return this.findById(id);
|
|
90
|
+
}
|
|
91
|
+
async delete(id) {
|
|
92
|
+
await this.run('DELETE FROM relations WHERE id = ?', [id]);
|
|
93
|
+
}
|
|
94
|
+
async deleteByNodeIdsAndType(fromNodeId, toNodeId, type) {
|
|
95
|
+
const result = await this.run('DELETE FROM relations WHERE from_entity_id = ? AND to_entity_id = ? AND relation_type = ?', [fromNodeId, toNodeId, type]);
|
|
96
|
+
return result.changes;
|
|
97
|
+
}
|
|
98
|
+
async deleteByNodeId(nodeId) {
|
|
99
|
+
const result = await this.run('DELETE FROM relations WHERE from_entity_id = ? OR to_entity_id = ?', [nodeId, nodeId]);
|
|
100
|
+
return result.changes;
|
|
101
|
+
}
|
|
102
|
+
async count() {
|
|
103
|
+
const row = await this.get('SELECT COUNT(*) as count FROM relations');
|
|
104
|
+
return row?.count ?? 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=LinkRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/LinkRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node Repository - handles entity table operations
|
|
3
|
+
*/
|
|
4
|
+
import type Database from 'sqlite3';
|
|
5
|
+
import type { ID, Node, CreateNodeInput, UpdateNodeInput, EntityRow } from '../../core/types/index.js';
|
|
6
|
+
import { BaseRepository } from './BaseRepository.js';
|
|
7
|
+
export declare class NodeRepository extends BaseRepository<Node, EntityRow> {
|
|
8
|
+
constructor(db: Database.Database);
|
|
9
|
+
protected getTableName(): string;
|
|
10
|
+
protected rowToEntity(row: EntityRow): Node;
|
|
11
|
+
findById(id: ID): Promise<Node | null>;
|
|
12
|
+
findByName(name: string): Promise<Node | null>;
|
|
13
|
+
findManyByNames(names: readonly string[]): Promise<readonly Node[]>;
|
|
14
|
+
findMany(ids: readonly ID[]): Promise<readonly Node[]>;
|
|
15
|
+
findAll(): Promise<readonly Node[]>;
|
|
16
|
+
findAllWithPagination(page: number, pageSize: number): Promise<{
|
|
17
|
+
nodes: readonly Node[];
|
|
18
|
+
total: number;
|
|
19
|
+
}>;
|
|
20
|
+
create(input: CreateNodeInput): Promise<Node>;
|
|
21
|
+
createMany(inputs: readonly CreateNodeInput[]): Promise<readonly Node[]>;
|
|
22
|
+
update(input: UpdateNodeInput): Promise<Node | null>;
|
|
23
|
+
delete(id: ID): Promise<void>;
|
|
24
|
+
deleteByNames(names: readonly string[]): Promise<number>;
|
|
25
|
+
count(): Promise<number>;
|
|
26
|
+
existsByName(name: string): Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=NodeRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/NodeRepository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEvG,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,cAAe,SAAQ,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;gBACrD,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAUrC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAKtC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAK9C,eAAe,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAOnE,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAOtD,OAAO,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAKnC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAQzG,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7C,UAAU,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAuBxE,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA0BpD,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7B,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAKxB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAInD"}
|