db-model-router 1.0.6 → 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.
Files changed (137) hide show
  1. package/README.md +150 -11
  2. package/TODO.md +0 -15
  3. package/db-manager/.dbmanager.sqlite +0 -0
  4. package/db-manager/README.md +223 -0
  5. package/db-manager/adapter-proxy.js +361 -0
  6. package/db-manager/demo/cockroachdb.env +6 -0
  7. package/db-manager/demo/demo.sqlite +0 -0
  8. package/db-manager/demo/dynamodb.env +7 -0
  9. package/db-manager/demo/mongodb.env +4 -0
  10. package/db-manager/demo/mssql.env +6 -0
  11. package/db-manager/demo/mysql.env +6 -0
  12. package/db-manager/demo/oracle.env +6 -0
  13. package/db-manager/demo/postgres.env +6 -0
  14. package/db-manager/demo/redis.env +4 -0
  15. package/db-manager/demo/seeds/cockroachdb.sql +32 -0
  16. package/db-manager/demo/seeds/mssql.sql +32 -0
  17. package/db-manager/demo/seeds/mysql.sql +32 -0
  18. package/db-manager/demo/seeds/oracle.sql +43 -0
  19. package/db-manager/demo/seeds/postgres.sql +32 -0
  20. package/db-manager/demo/seeds/sqlite3.sql +32 -0
  21. package/db-manager/demo/sqlite3.env +2 -0
  22. package/db-manager/metadata-db.js +170 -0
  23. package/db-manager/public/.gitkeep +1 -0
  24. package/db-manager/public/css/style.css +1413 -0
  25. package/db-manager/public/js/app.js +1370 -0
  26. package/db-manager/routes/api.js +388 -0
  27. package/db-manager/routes/views.js +61 -0
  28. package/db-manager/server.js +39 -0
  29. package/db-manager/utils/build-filter-config.js +18 -0
  30. package/db-manager/utils/csv-export.js +59 -0
  31. package/db-manager/utils/export-filename.js +39 -0
  32. package/db-manager/utils/filter-tables.js +20 -0
  33. package/db-manager/utils/parse-filters.js +93 -0
  34. package/db-manager/utils/sort-state.js +35 -0
  35. package/db-manager/views/.gitkeep +1 -0
  36. package/db-manager/views/dashboard.ejs +53 -0
  37. package/db-manager/views/history.ejs +52 -0
  38. package/db-manager/views/index.ejs +35 -0
  39. package/db-manager/views/layout.ejs +31 -0
  40. package/db-manager/views/partials/data-panel.ejs +74 -0
  41. package/db-manager/views/partials/header.ejs +36 -0
  42. package/db-manager/views/partials/sidebar.ejs +30 -0
  43. package/db-manager/views/query.ejs +58 -0
  44. package/dbmr.schema.json +22 -44
  45. package/demo/.dockerignore +7 -0
  46. package/demo/.env.example +14 -0
  47. package/demo/Dockerfile +20 -0
  48. package/demo/app.js +39 -0
  49. package/demo/commons/add_migration.js +43 -0
  50. package/demo/commons/db.js +28 -0
  51. package/demo/commons/migrate.js +68 -0
  52. package/demo/commons/modules.js +18 -0
  53. package/demo/commons/password.js +36 -0
  54. package/demo/commons/security.js +30 -0
  55. package/demo/commons/session.js +13 -0
  56. package/demo/commons/webhook.js +81 -0
  57. package/demo/dbmr.schema.json +338 -0
  58. package/demo/middleware/authenticate.js +14 -0
  59. package/demo/middleware/hasPermission.js +30 -0
  60. package/demo/middleware/logger.js +67 -0
  61. package/demo/middleware/tenantIsolation.js +17 -0
  62. package/demo/migrations/20260509170349_create_migrations_table.sql +6 -0
  63. package/demo/migrations/20260509170349_create_saas_tables.sql +69 -0
  64. package/demo/migrations/20260509170349_create_tables.sql +193 -0
  65. package/demo/models/addresses.js +24 -0
  66. package/demo/models/cart_items.js +20 -0
  67. package/demo/models/carts.js +18 -0
  68. package/demo/models/categories.js +22 -0
  69. package/demo/models/coupons.js +25 -0
  70. package/demo/models/index.js +43 -0
  71. package/demo/models/order_items.js +23 -0
  72. package/demo/models/orders.js +27 -0
  73. package/demo/models/payments.js +23 -0
  74. package/demo/models/product_images.js +20 -0
  75. package/demo/models/product_reviews.js +22 -0
  76. package/demo/models/product_variants.js +22 -0
  77. package/demo/models/products.js +32 -0
  78. package/demo/models/role_permissions.js +17 -0
  79. package/demo/models/roles.js +17 -0
  80. package/demo/models/shipments.js +21 -0
  81. package/demo/models/tenants.js +18 -0
  82. package/demo/models/users.js +23 -0
  83. package/demo/models/webhook_logs.js +22 -0
  84. package/demo/models/webhooks.js +19 -0
  85. package/demo/models/wishlists.js +17 -0
  86. package/demo/openapi.json +7000 -0
  87. package/demo/package-lock.json +2810 -0
  88. package/demo/package.json +43 -0
  89. package/demo/routes/addresses/index.js +6 -0
  90. package/demo/routes/auth/index.js +55 -0
  91. package/demo/routes/carts/cart_items/index.js +7 -0
  92. package/demo/routes/carts/index.js +6 -0
  93. package/demo/routes/categories/index.js +6 -0
  94. package/demo/routes/coupons/index.js +6 -0
  95. package/demo/routes/docs.js +18 -0
  96. package/demo/routes/health.js +35 -0
  97. package/demo/routes/index.js +54 -0
  98. package/demo/routes/orders/index.js +6 -0
  99. package/demo/routes/orders/order_items/index.js +7 -0
  100. package/demo/routes/orders/payments/index.js +7 -0
  101. package/demo/routes/orders/shipments/index.js +7 -0
  102. package/demo/routes/products/index.js +6 -0
  103. package/demo/routes/products/product_images/index.js +7 -0
  104. package/demo/routes/products/product_reviews/index.js +7 -0
  105. package/demo/routes/products/product_variants/index.js +7 -0
  106. package/demo/routes/roles/index.js +75 -0
  107. package/demo/routes/roles/permissions/index.js +47 -0
  108. package/demo/routes/tenants/index.js +45 -0
  109. package/demo/routes/users/index.js +45 -0
  110. package/demo/routes/wishlists/index.js +6 -0
  111. package/demo/seeds/saas-seed.js +329 -0
  112. package/docker-compose.yml +61 -0
  113. package/package.json +120 -113
  114. package/scripts/demo-create.js +1 -1
  115. package/skill/SKILL.md +119 -3
  116. package/src/cli/commands/db-manager.js +134 -0
  117. package/src/cli/commands/generate.js +106 -60
  118. package/src/cli/commands/help.js +0 -1
  119. package/src/cli/generate-route.js +60 -21
  120. package/src/cli/generate-saas-structure.js +122 -0
  121. package/src/cli/init/generators.js +6 -0
  122. package/src/cli/init.js +8 -0
  123. package/src/cli/main.js +8 -1
  124. package/src/cli/saas/generate-saas-middleware.js +108 -0
  125. package/src/cli/saas/generate-saas-migrations.js +480 -0
  126. package/src/cli/saas/generate-saas-models.js +211 -0
  127. package/src/cli/saas/generate-saas-openapi.js +419 -0
  128. package/src/cli/saas/generate-saas-routes.js +435 -0
  129. package/src/cli/saas/generate-saas-seeds.js +243 -0
  130. package/src/cli/saas/generate-saas-utils.js +176 -0
  131. package/src/commons/kafka.js +139 -0
  132. package/src/commons/model.js +29 -9
  133. package/src/index.js +2 -0
  134. package/src/mssql/db.js +41 -3
  135. package/src/mysql/db.js +3 -0
  136. package/src/postgres/db.js +6 -0
  137. package/src/cli/generate-db-manager.js +0 -1573
@@ -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
+