db-model-router 1.0.5 → 1.0.7
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 +150 -11
- package/TODO.md +0 -14
- package/db-manager/.dbmanager.sqlite +0 -0
- package/db-manager/README.md +223 -0
- package/db-manager/adapter-proxy.js +361 -0
- package/db-manager/demo/cockroachdb.env +6 -0
- package/db-manager/demo/demo.sqlite +0 -0
- package/db-manager/demo/dynamodb.env +7 -0
- package/db-manager/demo/mongodb.env +4 -0
- package/db-manager/demo/mssql.env +6 -0
- package/db-manager/demo/mysql.env +6 -0
- package/db-manager/demo/oracle.env +6 -0
- package/db-manager/demo/postgres.env +6 -0
- package/db-manager/demo/redis.env +4 -0
- package/db-manager/demo/seeds/cockroachdb.sql +32 -0
- package/db-manager/demo/seeds/mssql.sql +32 -0
- package/db-manager/demo/seeds/mysql.sql +32 -0
- package/db-manager/demo/seeds/oracle.sql +43 -0
- package/db-manager/demo/seeds/postgres.sql +32 -0
- package/db-manager/demo/seeds/sqlite3.sql +32 -0
- package/db-manager/demo/sqlite3.env +2 -0
- package/db-manager/metadata-db.js +170 -0
- package/db-manager/public/.gitkeep +1 -0
- package/db-manager/public/css/style.css +1413 -0
- package/db-manager/public/js/app.js +1370 -0
- package/db-manager/routes/api.js +388 -0
- package/db-manager/routes/views.js +61 -0
- package/db-manager/server.js +39 -0
- package/db-manager/utils/build-filter-config.js +18 -0
- package/db-manager/utils/csv-export.js +59 -0
- package/db-manager/utils/export-filename.js +39 -0
- package/db-manager/utils/filter-tables.js +20 -0
- package/db-manager/utils/parse-filters.js +93 -0
- package/db-manager/utils/sort-state.js +35 -0
- package/db-manager/views/.gitkeep +1 -0
- package/db-manager/views/dashboard.ejs +53 -0
- package/db-manager/views/history.ejs +52 -0
- package/db-manager/views/index.ejs +35 -0
- package/db-manager/views/layout.ejs +31 -0
- package/db-manager/views/partials/data-panel.ejs +74 -0
- package/db-manager/views/partials/header.ejs +36 -0
- package/db-manager/views/partials/sidebar.ejs +30 -0
- package/db-manager/views/query.ejs +58 -0
- package/dbmr.schema.json +23 -45
- package/demo/.env.example +1 -0
- package/demo/app.js +3 -1
- package/demo/commons/db.js +11 -0
- package/demo/commons/migrate.js +3 -0
- package/demo/commons/modules.js +18 -0
- package/demo/commons/password.js +36 -0
- package/demo/commons/webhook.js +81 -0
- package/demo/dbmr.schema.json +22 -46
- package/demo/middleware/authenticate.js +14 -0
- package/demo/middleware/hasPermission.js +30 -0
- package/demo/middleware/tenantIsolation.js +17 -0
- package/demo/migrations/20260509170349_create_saas_tables.sql +69 -0
- package/demo/migrations/{20260430155809_create_tables.sql → 20260509170349_create_tables.sql} +11 -25
- package/demo/models/addresses.js +5 -3
- package/demo/models/cart_items.js +5 -3
- package/demo/models/carts.js +5 -3
- package/demo/models/categories.js +5 -3
- package/demo/models/coupons.js +5 -3
- package/demo/models/index.js +43 -0
- package/demo/models/order_items.js +4 -2
- package/demo/models/orders.js +5 -3
- package/demo/models/payments.js +5 -3
- package/demo/models/product_images.js +4 -2
- package/demo/models/product_reviews.js +5 -3
- package/demo/models/product_variants.js +5 -3
- package/demo/models/products.js +5 -3
- package/demo/models/role_permissions.js +17 -0
- package/demo/models/roles.js +17 -0
- package/demo/models/shipments.js +5 -3
- package/demo/models/tenants.js +18 -0
- package/demo/models/users.js +12 -8
- package/demo/models/webhook_logs.js +22 -0
- package/demo/models/webhooks.js +19 -0
- package/demo/models/wishlists.js +4 -2
- package/demo/openapi.json +1744 -616
- package/demo/package-lock.json +24 -24
- package/demo/package.json +9 -0
- package/demo/routes/{addresses.js → addresses/index.js} +1 -1
- package/demo/routes/auth/index.js +55 -0
- package/demo/routes/carts/{cart_items.js → cart_items/index.js} +1 -1
- package/demo/routes/{carts.js → carts/index.js} +1 -1
- package/demo/routes/{categories.js → categories/index.js} +1 -1
- package/demo/routes/{coupons.js → coupons/index.js} +1 -1
- package/demo/routes/index.js +39 -24
- package/demo/routes/{orders.js → orders/index.js} +1 -1
- package/demo/routes/orders/{order_items.js → order_items/index.js} +1 -1
- package/demo/routes/orders/{payments.js → payments/index.js} +1 -1
- package/demo/routes/orders/{shipments.js → shipments/index.js} +1 -1
- package/demo/routes/{products.js → products/index.js} +1 -1
- package/demo/routes/products/{product_images.js → product_images/index.js} +1 -1
- package/demo/routes/products/{product_reviews.js → product_reviews/index.js} +1 -1
- package/demo/routes/products/{product_variants.js → product_variants/index.js} +1 -1
- package/demo/routes/roles/index.js +75 -0
- package/demo/routes/roles/permissions/index.js +47 -0
- package/demo/routes/tenants/index.js +45 -0
- package/demo/routes/users/index.js +45 -0
- package/demo/routes/{wishlists.js → wishlists/index.js} +1 -1
- package/demo/seeds/saas-seed.js +329 -0
- package/docker-compose.yml +61 -0
- package/package.json +120 -113
- package/scripts/demo-create.js +1 -1
- package/skill/SKILL.md +119 -3
- package/src/cli/commands/db-manager.js +134 -0
- package/src/cli/commands/generate.js +112 -43
- package/src/cli/commands/help.js +0 -1
- package/src/cli/diff-engine.js +2 -1
- package/src/cli/generate-model.js +9 -4
- package/src/cli/generate-openapi.js +40 -13
- package/src/cli/generate-route.js +61 -22
- package/src/cli/generate-saas-structure.js +122 -0
- package/src/cli/init/generators.js +42 -30
- package/src/cli/init.js +8 -0
- package/src/cli/main.js +8 -1
- package/src/cli/saas/generate-saas-middleware.js +108 -0
- package/src/cli/saas/generate-saas-migrations.js +480 -0
- package/src/cli/saas/generate-saas-models.js +211 -0
- package/src/cli/saas/generate-saas-openapi.js +419 -0
- package/src/cli/saas/generate-saas-routes.js +435 -0
- package/src/cli/saas/generate-saas-seeds.js +243 -0
- package/src/cli/saas/generate-saas-utils.js +176 -0
- package/src/commons/kafka.js +139 -0
- package/src/commons/model.js +29 -9
- package/src/index.js +2 -0
- package/src/mssql/db.js +41 -3
- package/src/mysql/db.js +3 -0
- package/src/postgres/db.js +6 -0
- package/src/sqlite3/db.js +11 -0
- package/demo/docs/llm.md +0 -197
- package/demo/llms.txt +0 -70
- package/demo/routes/users.js +0 -6
- package/src/cli/commands/generate-llm-docs.js +0 -418
- /package/demo/migrations/{20260430155808_create_migrations_table.sql → 20260509170349_create_migrations_table.sql} +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const Database = require("better-sqlite3");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates a metadata database manager for tracking connection and query history.
|
|
7
|
+
* @param {string} dbPath - Path to the SQLite database file
|
|
8
|
+
* @returns {object} Metadata DB interface
|
|
9
|
+
*/
|
|
10
|
+
function createMetadataDb(dbPath) {
|
|
11
|
+
let db;
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
db = new Database(dbPath);
|
|
15
|
+
db.pragma("journal_mode = WAL");
|
|
16
|
+
} catch (err) {
|
|
17
|
+
process.stderr.write(
|
|
18
|
+
`[metadata-db] Failed to open database at ${dbPath}: ${err.message}\n`,
|
|
19
|
+
);
|
|
20
|
+
// Return a no-op interface so the app can continue without history
|
|
21
|
+
return {
|
|
22
|
+
init() {},
|
|
23
|
+
recordConnection() {
|
|
24
|
+
return null;
|
|
25
|
+
},
|
|
26
|
+
recordQuery() {
|
|
27
|
+
return null;
|
|
28
|
+
},
|
|
29
|
+
getConnections() {
|
|
30
|
+
return [];
|
|
31
|
+
},
|
|
32
|
+
getQueries() {
|
|
33
|
+
return [];
|
|
34
|
+
},
|
|
35
|
+
close() {},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
/**
|
|
41
|
+
* Creates the connections and queries tables if they don't exist.
|
|
42
|
+
*/
|
|
43
|
+
init() {
|
|
44
|
+
try {
|
|
45
|
+
db.exec(`
|
|
46
|
+
CREATE TABLE IF NOT EXISTS connections (
|
|
47
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
48
|
+
db_type TEXT NOT NULL,
|
|
49
|
+
host TEXT,
|
|
50
|
+
database_name TEXT NOT NULL,
|
|
51
|
+
connected_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
CREATE TABLE IF NOT EXISTS queries (
|
|
55
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
56
|
+
connection_id INTEGER NOT NULL,
|
|
57
|
+
query_text TEXT NOT NULL,
|
|
58
|
+
executed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
59
|
+
row_count INTEGER DEFAULT 0,
|
|
60
|
+
FOREIGN KEY (connection_id) REFERENCES connections(id)
|
|
61
|
+
);
|
|
62
|
+
`);
|
|
63
|
+
} catch (err) {
|
|
64
|
+
process.stderr.write(
|
|
65
|
+
`[metadata-db] Failed to initialize tables: ${err.message}\n`,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Records a new database connection in history.
|
|
72
|
+
* @param {string} dbType - The database type (e.g., 'sqlite3', 'mysql')
|
|
73
|
+
* @param {string|null} host - The database host
|
|
74
|
+
* @param {string} dbName - The database name
|
|
75
|
+
* @returns {number|null} The inserted row id, or null on failure
|
|
76
|
+
*/
|
|
77
|
+
recordConnection(dbType, host, dbName) {
|
|
78
|
+
try {
|
|
79
|
+
const stmt = db.prepare(
|
|
80
|
+
"INSERT INTO connections (db_type, host, database_name) VALUES (?, ?, ?)",
|
|
81
|
+
);
|
|
82
|
+
const result = stmt.run(dbType, host || null, dbName);
|
|
83
|
+
return result.lastInsertRowid;
|
|
84
|
+
} catch (err) {
|
|
85
|
+
process.stderr.write(
|
|
86
|
+
`[metadata-db] Failed to record connection: ${err.message}\n`,
|
|
87
|
+
);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Records a query execution in history.
|
|
94
|
+
* @param {number} connectionId - The connection id this query belongs to
|
|
95
|
+
* @param {string} queryText - The query text or operation description
|
|
96
|
+
* @param {number} rowCount - Number of rows affected/returned
|
|
97
|
+
* @returns {number|null} The inserted row id, or null on failure
|
|
98
|
+
*/
|
|
99
|
+
recordQuery(connectionId, queryText, rowCount) {
|
|
100
|
+
try {
|
|
101
|
+
const stmt = db.prepare(
|
|
102
|
+
"INSERT INTO queries (connection_id, query_text, row_count) VALUES (?, ?, ?)",
|
|
103
|
+
);
|
|
104
|
+
const result = stmt.run(connectionId, queryText, rowCount || 0);
|
|
105
|
+
return result.lastInsertRowid;
|
|
106
|
+
} catch (err) {
|
|
107
|
+
process.stderr.write(
|
|
108
|
+
`[metadata-db] Failed to record query: ${err.message}\n`,
|
|
109
|
+
);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Retrieves recent connections ordered by connected_at DESC.
|
|
116
|
+
* @param {number} [limit=20] - Maximum number of connections to return
|
|
117
|
+
* @returns {Array} Array of connection records
|
|
118
|
+
*/
|
|
119
|
+
getConnections(limit = 20) {
|
|
120
|
+
try {
|
|
121
|
+
const stmt = db.prepare(
|
|
122
|
+
"SELECT * FROM connections ORDER BY connected_at DESC LIMIT ?",
|
|
123
|
+
);
|
|
124
|
+
return stmt.all(limit);
|
|
125
|
+
} catch (err) {
|
|
126
|
+
process.stderr.write(
|
|
127
|
+
`[metadata-db] Failed to get connections: ${err.message}\n`,
|
|
128
|
+
);
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Retrieves recent queries for a specific connection.
|
|
135
|
+
* @param {number} connectionId - The connection id to filter by
|
|
136
|
+
* @param {number} [limit=50] - Maximum number of queries to return
|
|
137
|
+
* @returns {Array} Array of query records
|
|
138
|
+
*/
|
|
139
|
+
getQueries(connectionId, limit = 50) {
|
|
140
|
+
try {
|
|
141
|
+
const stmt = db.prepare(
|
|
142
|
+
"SELECT * FROM queries WHERE connection_id = ? ORDER BY executed_at DESC LIMIT ?",
|
|
143
|
+
);
|
|
144
|
+
return stmt.all(connectionId, limit);
|
|
145
|
+
} catch (err) {
|
|
146
|
+
process.stderr.write(
|
|
147
|
+
`[metadata-db] Failed to get queries: ${err.message}\n`,
|
|
148
|
+
);
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Closes the SQLite database handle.
|
|
155
|
+
*/
|
|
156
|
+
close() {
|
|
157
|
+
try {
|
|
158
|
+
if (db && db.open) {
|
|
159
|
+
db.close();
|
|
160
|
+
}
|
|
161
|
+
} catch (err) {
|
|
162
|
+
process.stderr.write(
|
|
163
|
+
`[metadata-db] Failed to close database: ${err.message}\n`,
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
module.exports = createMetadataDb;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|