sitepaige-mcp-server 0.7.8 → 0.7.10

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.
@@ -156,14 +156,14 @@ export async function POST(request: Request) {
156
156
 
157
157
  // Delete existing sessions for this user
158
158
  const existingSessions = await db_query(db,
159
- "SELECT ID FROM UserSession WHERE userid = ?",
159
+ "SELECT ID FROM usersession WHERE userid = ?",
160
160
  [user.userid]
161
161
  );
162
162
 
163
163
  if (existingSessions && existingSessions.length > 0) {
164
164
  const sessionIds = existingSessions.map(session => session.ID);
165
165
  const placeholders = sessionIds.map(() => '?').join(',');
166
- await db_query(db, `DELETE FROM UserSession WHERE ID IN (${placeholders})`, sessionIds);
166
+ await db_query(db, `DELETE FROM usersession WHERE ID IN (${placeholders})`, sessionIds);
167
167
  }
168
168
 
169
169
  // Generate secure session token and ID
@@ -172,7 +172,7 @@ export async function POST(request: Request) {
172
172
 
173
173
  // Create new session with secure token
174
174
  await db_query(db,
175
- "INSERT INTO UserSession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
175
+ "INSERT INTO usersession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
176
176
  [sessionId, sessionToken, user.userid, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString()]
177
177
  );
178
178
 
@@ -318,7 +318,7 @@ export async function DELETE(request: Request) {
318
318
 
319
319
  // Delete session from database using the actual session token
320
320
  await db_query(db,
321
- "DELETE FROM UserSession WHERE SessionToken = ?",
321
+ "DELETE FROM usersession WHERE SessionToken = ?",
322
322
  [sessionToken]
323
323
  );
324
324
 
@@ -105,60 +105,7 @@ export async function db_query(
105
105
  * @returns SQL string for creating the table
106
106
  */
107
107
  export function db_migrate(model: Model, dbType: string): string {
108
- // Special handling for auth tables - create them first
109
- if (model.name === '__auth_tables__') {
110
- return `-- Users table (required for authentication)
111
- CREATE TABLE IF NOT EXISTS \`Users\` (
112
- \`userid\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
113
- \`OAuthID\` VARCHAR(255) NOT NULL UNIQUE,
114
- \`Source\` VARCHAR(20) NOT NULL CHECK(\`Source\` IN ('google', 'facebook', 'apple', 'github')),
115
- \`UserName\` VARCHAR(255) NOT NULL,
116
- \`Email\` VARCHAR(255),
117
- \`AvatarURL\` TEXT,
118
- \`UserLevel\` INTEGER NOT NULL DEFAULT 1 CHECK(\`UserLevel\` IN (0, 1, 2)),
119
- \`UserTier\` INTEGER NOT NULL DEFAULT 0,
120
- \`LastLoginDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
121
- \`CreatedDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
122
- \`IsActive\` BOOLEAN NOT NULL DEFAULT true
123
- );
124
-
125
- -- Indexes for Users table
126
- CREATE INDEX idx_users_oauthid ON \`Users\`(\`OAuthID\`);
127
- CREATE INDEX idx_users_email ON \`Users\`(\`Email\`);
128
- CREATE INDEX idx_users_usertier ON \`Users\`(\`UserTier\`);
129
-
130
- -- UserSession table
131
- CREATE TABLE IF NOT EXISTS \`UserSession\` (
132
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
133
- \`SessionToken\` VARCHAR(255) NOT NULL UNIQUE,
134
- \`userid\` VARCHAR(36) NOT NULL,
135
- \`ExpirationDate\` DATETIME NOT NULL,
136
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
137
- );
138
-
139
- -- Indexes for UserSession table
140
- CREATE INDEX idx_session_token ON \`UserSession\`(\`SessionToken\`);
141
- CREATE INDEX idx_session_user ON \`UserSession\`(\`userid\`);
142
- CREATE INDEX idx_session_expiry ON \`UserSession\`(\`ExpirationDate\`);
143
-
144
- -- OAuthTokens table
145
- CREATE TABLE IF NOT EXISTS \`OAuthTokens\` (
146
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
147
- \`userid\` VARCHAR(36) NOT NULL,
148
- \`Provider\` VARCHAR(20) NOT NULL CHECK(\`Provider\` IN ('google', 'facebook', 'apple', 'github')),
149
- \`AccessToken\` TEXT NOT NULL,
150
- \`RefreshToken\` TEXT,
151
- \`ExpiresAt\` DATETIME,
152
- \`CreatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
153
- \`UpdatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
154
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
155
- );
156
-
157
- -- Indexes for OAuthTokens table
158
- CREATE INDEX idx_oauth_user ON \`OAuthTokens\`(\`userid\`);
159
- CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
160
- }
161
-
108
+
162
109
  const sanitizedTableName = model.name;
163
110
 
164
111
  // Start with the model's fields
@@ -233,7 +180,7 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
233
180
  // Add foreign key constraints at the end
234
181
  const foreignKeys: string[] = [];
235
182
  if (model.data_is_user_specific === "true") {
236
- foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`Users\` (\`userid\`)`);
183
+ foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`users\` (\`userid\`)`);
237
184
  }
238
185
 
239
186
  const allConstraints = foreignKeys.length > 0
@@ -245,13 +192,3 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
245
192
 
246
193
  return sql;
247
194
  }
248
-
249
- /**
250
- * Close database connection(s)
251
- */
252
- export async function closeDatabase(): Promise<void> {
253
- if (pool) {
254
- await pool.end();
255
- pool = null;
256
- }
257
- }
@@ -116,59 +116,6 @@ export async function db_query(
116
116
  * @returns SQL string for creating the table
117
117
  */
118
118
  export function db_migrate(model: Model, dbType: string): string {
119
- // Special handling for auth tables - create them first
120
- if (model.name === '__auth_tables__') {
121
- return `-- Users table (required for authentication)
122
- CREATE TABLE IF NOT EXISTS "Users" (
123
- "userid" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
124
- "OAuthID" TEXT NOT NULL UNIQUE,
125
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
126
- "UserName" TEXT NOT NULL,
127
- "Email" TEXT,
128
- "AvatarURL" TEXT,
129
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
130
- "UserTier" INTEGER NOT NULL DEFAULT 0,
131
- "LastLoginDate" TIMESTAMP NOT NULL DEFAULT NOW(),
132
- "CreatedDate" TIMESTAMP NOT NULL DEFAULT NOW(),
133
- "IsActive" BOOLEAN NOT NULL DEFAULT true
134
- );
135
-
136
- -- Indexes for Users table
137
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
138
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
139
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
140
-
141
- -- UserSession table
142
- CREATE TABLE IF NOT EXISTS "UserSession" (
143
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
144
- "SessionToken" VARCHAR(255) NOT NULL UNIQUE,
145
- "userid" UUID NOT NULL,
146
- "ExpirationDate" TIMESTAMP NOT NULL,
147
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
148
- );
149
-
150
- -- Indexes for UserSession table
151
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
152
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
153
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
154
-
155
- -- OAuthTokens table
156
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
157
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
158
- "userid" UUID NOT NULL,
159
- "Provider" VARCHAR(20) NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
160
- "AccessToken" TEXT NOT NULL,
161
- "RefreshToken" TEXT,
162
- "ExpiresAt" TIMESTAMP,
163
- "CreatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
164
- "UpdatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
165
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
166
- );
167
-
168
- -- Indexes for OAuthTokens table
169
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
170
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
171
- }
172
119
 
173
120
  const sanitizedTableName = model.name;
174
121
 
@@ -244,7 +191,7 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
244
191
  // Add foreign key constraints at the end
245
192
  const foreignKeys: string[] = [];
246
193
  if (model.data_is_user_specific === "true") {
247
- foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "Users" ("userid")`);
194
+ foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "users" ("userid")`);
248
195
  }
249
196
 
250
197
  const allConstraints = foreignKeys.length > 0
@@ -256,13 +203,3 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
256
203
 
257
204
  return sql;
258
205
  }
259
-
260
- /**
261
- * Close database connection(s)
262
- */
263
- export async function closeDatabase(): Promise<void> {
264
- if (pool) {
265
- await pool.end();
266
- pool = null;
267
- }
268
- }
@@ -182,58 +182,6 @@ export async function db_query(
182
182
  */
183
183
  export function db_migrate(model: Model, dbType: string): string {
184
184
  // Special handling for auth tables - create them first
185
- if (model.name === '__auth_tables__') {
186
- return `-- Users table (required for authentication)
187
- CREATE TABLE IF NOT EXISTS "Users" (
188
- "userid" TEXT PRIMARY KEY,
189
- "OAuthID" TEXT NOT NULL UNIQUE,
190
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
191
- "UserName" TEXT NOT NULL,
192
- "Email" TEXT,
193
- "AvatarURL" TEXT,
194
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
195
- "UserTier" INTEGER NOT NULL DEFAULT 0,
196
- "LastLoginDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
197
- "CreatedDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
198
- "IsActive" INTEGER NOT NULL DEFAULT 1
199
- );
200
-
201
- -- Indexes for Users table
202
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
203
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
204
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
205
-
206
- -- UserSession table
207
- CREATE TABLE IF NOT EXISTS "UserSession" (
208
- "ID" TEXT PRIMARY KEY,
209
- "SessionToken" TEXT NOT NULL UNIQUE,
210
- "userid" TEXT NOT NULL,
211
- "ExpirationDate" TEXT NOT NULL,
212
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
213
- );
214
-
215
- -- Indexes for UserSession table
216
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
217
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
218
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
219
-
220
- -- OAuthTokens table
221
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
222
- "ID" TEXT PRIMARY KEY,
223
- "userid" TEXT NOT NULL,
224
- "Provider" TEXT NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
225
- "AccessToken" TEXT NOT NULL,
226
- "RefreshToken" TEXT,
227
- "ExpiresAt" TEXT,
228
- "CreatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
229
- "UpdatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
230
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
231
- );
232
-
233
- -- Indexes for OAuthTokens table
234
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
235
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
236
- }
237
185
 
238
186
  const sanitizedTableName = model.name;
239
187
 
@@ -302,28 +250,6 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
302
250
  return sql;
303
251
  }
304
252
 
305
- /**
306
- * Close a specific database connection or all connections
307
- * @param dbPath Optional path to close a specific database connection.
308
- * If not provided, closes all connections.
309
- */
310
- export function closeDatabase(dbPath?: string): void {
311
- if (!dbPath) {
312
- // Close all file-based connections
313
- for (const [path, connection] of dbConnections.entries()) {
314
- connection.close();
315
- }
316
- dbConnections.clear();
317
- } else {
318
- // Close specific database connection
319
- const connection = dbConnections.get(dbPath);
320
- if (connection) {
321
- connection.close();
322
- dbConnections.delete(dbPath);
323
- }
324
- }
325
- }
326
-
327
253
  /**
328
254
  * Get or create a database connection for the specified path
329
255
  * This is a convenience wrapper for working with arbitrary database files
@@ -38,31 +38,6 @@ export interface OAuthToken {
38
38
  UpdatedAt: string;
39
39
  }
40
40
 
41
- /**
42
- * @deprecated Table creation is now handled by db_migrate in the database implementation files
43
- */
44
- export async function ensureUsersTable(): Promise<void> {
45
- // No longer needed - Users table is created by db_migrate
46
- return;
47
- }
48
-
49
- /**
50
- * @deprecated Table creation is now handled by db_migrate in the database implementation files
51
- */
52
- export async function ensureUserSessionTable(): Promise<void> {
53
- // No longer needed - UserSession table is created by db_migrate
54
- return;
55
- }
56
-
57
- /**
58
- * @deprecated Table creation is now handled by db_migrate in the database implementation files
59
- */
60
- export async function ensureOAuthTokensTable(): Promise<void> {
61
- // No longer needed - OAuthTokens table is created by db_migrate
62
- return;
63
- }
64
-
65
-
66
41
  /**
67
42
  * Get all users from the database
68
43
  */
@@ -70,7 +45,7 @@ export async function getAllUsers(): Promise<User[]> {
70
45
  const client = await db_init();
71
46
 
72
47
  const users = await db_query(client,
73
- `SELECT * FROM Users
48
+ `SELECT * FROM users
74
49
  WHERE IsActive = ?
75
50
  ORDER BY UserLevel DESC, UserName ASC`,
76
51
  [true]
@@ -86,7 +61,7 @@ export async function getUserByOAuthID(oauthId: string): Promise<User | null> {
86
61
  const client = await db_init();
87
62
 
88
63
  const users = await db_query(client,
89
- "SELECT * FROM Users WHERE OAuthID = ? AND IsActive = ?",
64
+ "SELECT * FROM users WHERE OAuthID = ? AND IsActive = ?",
90
65
  [oauthId, true]
91
66
  );
92
67
 
@@ -100,7 +75,7 @@ export async function getUserByID(userId: string): Promise<User | null> {
100
75
  const client = await db_init();
101
76
 
102
77
  const users = await db_query(client,
103
- "SELECT * FROM Users WHERE userid = ? AND IsActive = ?",
78
+ "SELECT * FROM users WHERE userid = ? AND IsActive = ?",
104
79
  [userId, true]
105
80
  );
106
81
 
@@ -125,7 +100,7 @@ export async function upsertUser(
125
100
  if (existingUser) {
126
101
  // Update existing user
127
102
  await db_query(client,
128
- `UPDATE Users
103
+ `UPDATE users
129
104
  SET UserName = ?, Email = COALESCE(?, Email), AvatarURL = ?,
130
105
  LastLoginDate = CURRENT_TIMESTAMP, Source = ?
131
106
  WHERE OAuthID = ?`,
@@ -135,7 +110,7 @@ export async function upsertUser(
135
110
  return (await getUserByOAuthID(oauthId))!;
136
111
  } else {
137
112
  // Check if this is the first user (should be admin)
138
- const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM Users");
113
+ const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM users");
139
114
  const isFirstUser = allUsers[0].count === 0;
140
115
 
141
116
  // Create new user
@@ -143,7 +118,7 @@ export async function upsertUser(
143
118
  const permissionLevel = isFirstUser ? 2 : 1; // First user is admin
144
119
 
145
120
  await db_query(client,
146
- `INSERT INTO Users
121
+ `INSERT INTO users
147
122
  (userid, OAuthID, Source, UserName, Email, AvatarURL, UserLevel, UserTier,
148
123
  LastLoginDate, CreatedDate, IsActive)
149
124
  VALUES (?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?)`,
@@ -166,7 +141,7 @@ export async function updateUserPermission(
166
141
  // Ensure there's always at least one admin
167
142
  if (permissionLevel < 2) {
168
143
  const admins = await db_query(client,
169
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
144
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
170
145
  [2, userId, true]
171
146
  );
172
147
 
@@ -176,7 +151,7 @@ export async function updateUserPermission(
176
151
  }
177
152
 
178
153
  const result = await db_query(client,
179
- "UPDATE Users SET UserLevel = ? WHERE userid = ?",
154
+ "UPDATE users SET UserLevel = ? WHERE userid = ?",
180
155
  [permissionLevel, userId]
181
156
  );
182
157
 
@@ -193,7 +168,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
193
168
  const user = await getUserByID(userId);
194
169
  if (user && user.UserLevel === 2) {
195
170
  const admins = await db_query(client,
196
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
171
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
197
172
  [2, userId, true]
198
173
  );
199
174
 
@@ -204,7 +179,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
204
179
 
205
180
  // Soft delete the user
206
181
  const result = await db_query(client,
207
- "UPDATE Users SET IsActive = ? WHERE userid = ?",
182
+ "UPDATE users SET IsActive = ? WHERE userid = ?",
208
183
  [false, userId]
209
184
  );
210
185
 
@@ -228,7 +203,7 @@ export async function getUserStats(): Promise<{
228
203
  SUM(CASE WHEN UserLevel = 2 THEN 1 ELSE 0 END) as admins,
229
204
  SUM(CASE WHEN UserLevel = 1 THEN 1 ELSE 0 END) as registeredUsers,
230
205
  SUM(CASE WHEN UserLevel = 0 THEN 1 ELSE 0 END) as guestUsers
231
- FROM Users
206
+ FROM users
232
207
  WHERE IsActive = ?
233
208
  `, [true]);
234
209
 
@@ -242,7 +217,7 @@ export async function cleanupExpiredSessions(): Promise<number> {
242
217
  const client = await db_init();
243
218
 
244
219
  const result = await db_query(client,
245
- "DELETE FROM UserSession WHERE ExpirationDate < CURRENT_TIMESTAMP"
220
+ "DELETE FROM usersession WHERE ExpirationDate < CURRENT_TIMESTAMP"
246
221
  );
247
222
 
248
223
  return result[0].changes;
@@ -266,13 +241,13 @@ export async function storeOAuthToken(
266
241
 
267
242
  // Delete existing tokens for this user/provider combo
268
243
  await db_query(client,
269
- "DELETE FROM OAuthTokens WHERE userid = ? AND Provider = ?",
244
+ "DELETE FROM oauthtokens WHERE userid = ? AND Provider = ?",
270
245
  [userId, provider]
271
246
  );
272
247
 
273
248
  // Insert new token
274
249
  await db_query(client,
275
- `INSERT INTO OAuthTokens
250
+ `INSERT INTO oauthtokens
276
251
  (ID, userid, Provider, AccessToken, RefreshToken, ExpiresAt, CreatedAt, UpdatedAt)
277
252
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
278
253
  [tokenId, userId, provider, accessToken, refreshToken || null, expiresAt, now, now]
@@ -289,7 +264,7 @@ export async function getOAuthToken(
289
264
  const client = await db_init();
290
265
 
291
266
  const tokens = await db_query(client,
292
- "SELECT * FROM OAuthTokens WHERE userid = ? AND Provider = ?",
267
+ "SELECT * FROM oauthtokens WHERE userid = ? AND Provider = ?",
293
268
  [userId, provider]
294
269
  );
295
270
 
@@ -308,8 +283,8 @@ export async function validateSession(sessionToken: string): Promise<{
308
283
 
309
284
  // Get session details
310
285
  const sessions = await db_query(client,
311
- `SELECT s.*, u.* FROM UserSession s
312
- JOIN Users u ON s.userid = u.userid
286
+ `SELECT s.*, u.* FROM usersession s
287
+ JOIN users u ON s.userid = u.userid
313
288
  WHERE s.SessionToken = ? AND s.ExpirationDate > CURRENT_TIMESTAMP AND u.IsActive = ?`,
314
289
  [sessionToken, true]
315
290
  );
@@ -350,7 +325,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
350
325
 
351
326
  // Get existing session
352
327
  const sessions = await db_query(client,
353
- "SELECT * FROM UserSession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
328
+ "SELECT * FROM usersession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
354
329
  [oldSessionToken]
355
330
  );
356
331
 
@@ -363,7 +338,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
363
338
 
364
339
  // Update session with new token
365
340
  await db_query(client,
366
- "UPDATE UserSession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
341
+ "UPDATE usersession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
367
342
  [newSessionToken, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), session.ID]
368
343
  );
369
344
 
package/defaultapp/db.ts CHANGED
@@ -145,70 +145,5 @@ export function db_migrate(model: Model): string {
145
145
  const dbType = (process.env.DATABASE_TYPE || process.env.DB_TYPE || 'postgres').toLowerCase() as DatabaseType;
146
146
  return dbImplementation.db_migrate(model, dbType);
147
147
  }
148
-
149
- /**
150
- * Initialize the database with models and sample data
151
- * @param models Array of models to create tables for
152
- * @param sampleData Optional array of sample data SQL statements
153
- */
154
- export async function initializeDatabase(
155
- models: Model[],
156
- sampleData?: Array<{tableName: string, sql: string}>
157
- ): Promise<void> {
158
- const client = await db_init();
159
-
160
- try {
161
- // Create auth tables first (Users, UserSession, OAuthTokens)
162
- const authTablesModel: Model = {
163
- id: '__auth_tables__',
164
- name: '__auth_tables__',
165
- fields: []
166
- };
167
- const authTablesSql = db_migrate(authTablesModel);
168
-
169
- // Execute each statement separately for auth tables
170
- const authStatements = authTablesSql.split(';').map(s => s.trim()).filter(s => s.length > 0);
171
- for (const statement of authStatements) {
172
- try {
173
- await db_query(client, statement);
174
- } catch (error) {
175
- // Some databases might not support certain syntax, continue with other statements
176
- if (!statement.includes('CREATE INDEX')) {
177
- console.error('Error creating auth table:', error);
178
- }
179
- }
180
- }
181
-
182
- // Create tables for each model
183
- for (const model of models) {
184
- const createTableSql = db_migrate(model);
185
- await db_query(client, createTableSql);
186
- }
187
-
188
- // Insert sample data if provided
189
- if (sampleData && sampleData.length > 0) {
190
- for (const data of sampleData) {
191
- try {
192
- await db_query(client, data.sql);
193
- } catch (error) {
194
- // Continue with other tables even if one fails
195
- }
196
- }
197
- }
198
- } catch (error) {
199
- throw error;
200
- }
201
- }
202
-
203
- /**
204
- * Close database connection(s)
205
- * @param dbPath Optional path for SQLite databases
206
- */
207
- export async function closeDatabase(dbPath?: string): Promise<void> {
208
- if (dbImplementation && dbImplementation.closeDatabase) {
209
- return dbImplementation.closeDatabase(dbPath);
210
- }
211
- }
212
-
213
148
  // Export types
214
149
  export type { Model, ModelField };
@@ -156,14 +156,14 @@ export async function POST(request: Request) {
156
156
 
157
157
  // Delete existing sessions for this user
158
158
  const existingSessions = await db_query(db,
159
- "SELECT ID FROM UserSession WHERE userid = ?",
159
+ "SELECT ID FROM usersession WHERE userid = ?",
160
160
  [user.userid]
161
161
  );
162
162
 
163
163
  if (existingSessions && existingSessions.length > 0) {
164
164
  const sessionIds = existingSessions.map(session => session.ID);
165
165
  const placeholders = sessionIds.map(() => '?').join(',');
166
- await db_query(db, `DELETE FROM UserSession WHERE ID IN (${placeholders})`, sessionIds);
166
+ await db_query(db, `DELETE FROM usersession WHERE ID IN (${placeholders})`, sessionIds);
167
167
  }
168
168
 
169
169
  // Generate secure session token and ID
@@ -172,7 +172,7 @@ export async function POST(request: Request) {
172
172
 
173
173
  // Create new session with secure token
174
174
  await db_query(db,
175
- "INSERT INTO UserSession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
175
+ "INSERT INTO usersession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
176
176
  [sessionId, sessionToken, user.userid, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString()]
177
177
  );
178
178
 
@@ -318,7 +318,7 @@ export async function DELETE(request: Request) {
318
318
 
319
319
  // Delete session from database using the actual session token
320
320
  await db_query(db,
321
- "DELETE FROM UserSession WHERE SessionToken = ?",
321
+ "DELETE FROM usersession WHERE SessionToken = ?",
322
322
  [sessionToken]
323
323
  );
324
324
 
@@ -105,60 +105,7 @@ export async function db_query(
105
105
  * @returns SQL string for creating the table
106
106
  */
107
107
  export function db_migrate(model: Model, dbType: string): string {
108
- // Special handling for auth tables - create them first
109
- if (model.name === '__auth_tables__') {
110
- return `-- Users table (required for authentication)
111
- CREATE TABLE IF NOT EXISTS \`Users\` (
112
- \`userid\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
113
- \`OAuthID\` VARCHAR(255) NOT NULL UNIQUE,
114
- \`Source\` VARCHAR(20) NOT NULL CHECK(\`Source\` IN ('google', 'facebook', 'apple', 'github')),
115
- \`UserName\` VARCHAR(255) NOT NULL,
116
- \`Email\` VARCHAR(255),
117
- \`AvatarURL\` TEXT,
118
- \`UserLevel\` INTEGER NOT NULL DEFAULT 1 CHECK(\`UserLevel\` IN (0, 1, 2)),
119
- \`UserTier\` INTEGER NOT NULL DEFAULT 0,
120
- \`LastLoginDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
121
- \`CreatedDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
122
- \`IsActive\` BOOLEAN NOT NULL DEFAULT true
123
- );
124
-
125
- -- Indexes for Users table
126
- CREATE INDEX idx_users_oauthid ON \`Users\`(\`OAuthID\`);
127
- CREATE INDEX idx_users_email ON \`Users\`(\`Email\`);
128
- CREATE INDEX idx_users_usertier ON \`Users\`(\`UserTier\`);
129
-
130
- -- UserSession table
131
- CREATE TABLE IF NOT EXISTS \`UserSession\` (
132
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
133
- \`SessionToken\` VARCHAR(255) NOT NULL UNIQUE,
134
- \`userid\` VARCHAR(36) NOT NULL,
135
- \`ExpirationDate\` DATETIME NOT NULL,
136
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
137
- );
138
-
139
- -- Indexes for UserSession table
140
- CREATE INDEX idx_session_token ON \`UserSession\`(\`SessionToken\`);
141
- CREATE INDEX idx_session_user ON \`UserSession\`(\`userid\`);
142
- CREATE INDEX idx_session_expiry ON \`UserSession\`(\`ExpirationDate\`);
143
-
144
- -- OAuthTokens table
145
- CREATE TABLE IF NOT EXISTS \`OAuthTokens\` (
146
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
147
- \`userid\` VARCHAR(36) NOT NULL,
148
- \`Provider\` VARCHAR(20) NOT NULL CHECK(\`Provider\` IN ('google', 'facebook', 'apple', 'github')),
149
- \`AccessToken\` TEXT NOT NULL,
150
- \`RefreshToken\` TEXT,
151
- \`ExpiresAt\` DATETIME,
152
- \`CreatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
153
- \`UpdatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
154
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
155
- );
156
-
157
- -- Indexes for OAuthTokens table
158
- CREATE INDEX idx_oauth_user ON \`OAuthTokens\`(\`userid\`);
159
- CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
160
- }
161
-
108
+
162
109
  const sanitizedTableName = model.name;
163
110
 
164
111
  // Start with the model's fields
@@ -233,7 +180,7 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
233
180
  // Add foreign key constraints at the end
234
181
  const foreignKeys: string[] = [];
235
182
  if (model.data_is_user_specific === "true") {
236
- foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`Users\` (\`userid\`)`);
183
+ foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`users\` (\`userid\`)`);
237
184
  }
238
185
 
239
186
  const allConstraints = foreignKeys.length > 0
@@ -245,13 +192,3 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
245
192
 
246
193
  return sql;
247
194
  }
248
-
249
- /**
250
- * Close database connection(s)
251
- */
252
- export async function closeDatabase(): Promise<void> {
253
- if (pool) {
254
- await pool.end();
255
- pool = null;
256
- }
257
- }
@@ -116,59 +116,6 @@ export async function db_query(
116
116
  * @returns SQL string for creating the table
117
117
  */
118
118
  export function db_migrate(model: Model, dbType: string): string {
119
- // Special handling for auth tables - create them first
120
- if (model.name === '__auth_tables__') {
121
- return `-- Users table (required for authentication)
122
- CREATE TABLE IF NOT EXISTS "Users" (
123
- "userid" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
124
- "OAuthID" TEXT NOT NULL UNIQUE,
125
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
126
- "UserName" TEXT NOT NULL,
127
- "Email" TEXT,
128
- "AvatarURL" TEXT,
129
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
130
- "UserTier" INTEGER NOT NULL DEFAULT 0,
131
- "LastLoginDate" TIMESTAMP NOT NULL DEFAULT NOW(),
132
- "CreatedDate" TIMESTAMP NOT NULL DEFAULT NOW(),
133
- "IsActive" BOOLEAN NOT NULL DEFAULT true
134
- );
135
-
136
- -- Indexes for Users table
137
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
138
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
139
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
140
-
141
- -- UserSession table
142
- CREATE TABLE IF NOT EXISTS "UserSession" (
143
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
144
- "SessionToken" VARCHAR(255) NOT NULL UNIQUE,
145
- "userid" UUID NOT NULL,
146
- "ExpirationDate" TIMESTAMP NOT NULL,
147
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
148
- );
149
-
150
- -- Indexes for UserSession table
151
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
152
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
153
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
154
-
155
- -- OAuthTokens table
156
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
157
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
158
- "userid" UUID NOT NULL,
159
- "Provider" VARCHAR(20) NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
160
- "AccessToken" TEXT NOT NULL,
161
- "RefreshToken" TEXT,
162
- "ExpiresAt" TIMESTAMP,
163
- "CreatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
164
- "UpdatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
165
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
166
- );
167
-
168
- -- Indexes for OAuthTokens table
169
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
170
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
171
- }
172
119
 
173
120
  const sanitizedTableName = model.name;
174
121
 
@@ -244,7 +191,7 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
244
191
  // Add foreign key constraints at the end
245
192
  const foreignKeys: string[] = [];
246
193
  if (model.data_is_user_specific === "true") {
247
- foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "Users" ("userid")`);
194
+ foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "users" ("userid")`);
248
195
  }
249
196
 
250
197
  const allConstraints = foreignKeys.length > 0
@@ -256,13 +203,3 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
256
203
 
257
204
  return sql;
258
205
  }
259
-
260
- /**
261
- * Close database connection(s)
262
- */
263
- export async function closeDatabase(): Promise<void> {
264
- if (pool) {
265
- await pool.end();
266
- pool = null;
267
- }
268
- }
@@ -182,58 +182,6 @@ export async function db_query(
182
182
  */
183
183
  export function db_migrate(model: Model, dbType: string): string {
184
184
  // Special handling for auth tables - create them first
185
- if (model.name === '__auth_tables__') {
186
- return `-- Users table (required for authentication)
187
- CREATE TABLE IF NOT EXISTS "Users" (
188
- "userid" TEXT PRIMARY KEY,
189
- "OAuthID" TEXT NOT NULL UNIQUE,
190
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
191
- "UserName" TEXT NOT NULL,
192
- "Email" TEXT,
193
- "AvatarURL" TEXT,
194
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
195
- "UserTier" INTEGER NOT NULL DEFAULT 0,
196
- "LastLoginDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
197
- "CreatedDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
198
- "IsActive" INTEGER NOT NULL DEFAULT 1
199
- );
200
-
201
- -- Indexes for Users table
202
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
203
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
204
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
205
-
206
- -- UserSession table
207
- CREATE TABLE IF NOT EXISTS "UserSession" (
208
- "ID" TEXT PRIMARY KEY,
209
- "SessionToken" TEXT NOT NULL UNIQUE,
210
- "userid" TEXT NOT NULL,
211
- "ExpirationDate" TEXT NOT NULL,
212
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
213
- );
214
-
215
- -- Indexes for UserSession table
216
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
217
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
218
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
219
-
220
- -- OAuthTokens table
221
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
222
- "ID" TEXT PRIMARY KEY,
223
- "userid" TEXT NOT NULL,
224
- "Provider" TEXT NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
225
- "AccessToken" TEXT NOT NULL,
226
- "RefreshToken" TEXT,
227
- "ExpiresAt" TEXT,
228
- "CreatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
229
- "UpdatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
230
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
231
- );
232
-
233
- -- Indexes for OAuthTokens table
234
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
235
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
236
- }
237
185
 
238
186
  const sanitizedTableName = model.name;
239
187
 
@@ -302,28 +250,6 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
302
250
  return sql;
303
251
  }
304
252
 
305
- /**
306
- * Close a specific database connection or all connections
307
- * @param dbPath Optional path to close a specific database connection.
308
- * If not provided, closes all connections.
309
- */
310
- export function closeDatabase(dbPath?: string): void {
311
- if (!dbPath) {
312
- // Close all file-based connections
313
- for (const [path, connection] of dbConnections.entries()) {
314
- connection.close();
315
- }
316
- dbConnections.clear();
317
- } else {
318
- // Close specific database connection
319
- const connection = dbConnections.get(dbPath);
320
- if (connection) {
321
- connection.close();
322
- dbConnections.delete(dbPath);
323
- }
324
- }
325
- }
326
-
327
253
  /**
328
254
  * Get or create a database connection for the specified path
329
255
  * This is a convenience wrapper for working with arbitrary database files
@@ -38,31 +38,6 @@ export interface OAuthToken {
38
38
  UpdatedAt: string;
39
39
  }
40
40
 
41
- /**
42
- * @deprecated Table creation is now handled by db_migrate in the database implementation files
43
- */
44
- export async function ensureUsersTable(): Promise<void> {
45
- // No longer needed - Users table is created by db_migrate
46
- return;
47
- }
48
-
49
- /**
50
- * @deprecated Table creation is now handled by db_migrate in the database implementation files
51
- */
52
- export async function ensureUserSessionTable(): Promise<void> {
53
- // No longer needed - UserSession table is created by db_migrate
54
- return;
55
- }
56
-
57
- /**
58
- * @deprecated Table creation is now handled by db_migrate in the database implementation files
59
- */
60
- export async function ensureOAuthTokensTable(): Promise<void> {
61
- // No longer needed - OAuthTokens table is created by db_migrate
62
- return;
63
- }
64
-
65
-
66
41
  /**
67
42
  * Get all users from the database
68
43
  */
@@ -70,7 +45,7 @@ export async function getAllUsers(): Promise<User[]> {
70
45
  const client = await db_init();
71
46
 
72
47
  const users = await db_query(client,
73
- `SELECT * FROM Users
48
+ `SELECT * FROM users
74
49
  WHERE IsActive = ?
75
50
  ORDER BY UserLevel DESC, UserName ASC`,
76
51
  [true]
@@ -86,7 +61,7 @@ export async function getUserByOAuthID(oauthId: string): Promise<User | null> {
86
61
  const client = await db_init();
87
62
 
88
63
  const users = await db_query(client,
89
- "SELECT * FROM Users WHERE OAuthID = ? AND IsActive = ?",
64
+ "SELECT * FROM users WHERE OAuthID = ? AND IsActive = ?",
90
65
  [oauthId, true]
91
66
  );
92
67
 
@@ -100,7 +75,7 @@ export async function getUserByID(userId: string): Promise<User | null> {
100
75
  const client = await db_init();
101
76
 
102
77
  const users = await db_query(client,
103
- "SELECT * FROM Users WHERE userid = ? AND IsActive = ?",
78
+ "SELECT * FROM users WHERE userid = ? AND IsActive = ?",
104
79
  [userId, true]
105
80
  );
106
81
 
@@ -125,7 +100,7 @@ export async function upsertUser(
125
100
  if (existingUser) {
126
101
  // Update existing user
127
102
  await db_query(client,
128
- `UPDATE Users
103
+ `UPDATE users
129
104
  SET UserName = ?, Email = COALESCE(?, Email), AvatarURL = ?,
130
105
  LastLoginDate = CURRENT_TIMESTAMP, Source = ?
131
106
  WHERE OAuthID = ?`,
@@ -135,7 +110,7 @@ export async function upsertUser(
135
110
  return (await getUserByOAuthID(oauthId))!;
136
111
  } else {
137
112
  // Check if this is the first user (should be admin)
138
- const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM Users");
113
+ const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM users");
139
114
  const isFirstUser = allUsers[0].count === 0;
140
115
 
141
116
  // Create new user
@@ -143,7 +118,7 @@ export async function upsertUser(
143
118
  const permissionLevel = isFirstUser ? 2 : 1; // First user is admin
144
119
 
145
120
  await db_query(client,
146
- `INSERT INTO Users
121
+ `INSERT INTO users
147
122
  (userid, OAuthID, Source, UserName, Email, AvatarURL, UserLevel, UserTier,
148
123
  LastLoginDate, CreatedDate, IsActive)
149
124
  VALUES (?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?)`,
@@ -166,7 +141,7 @@ export async function updateUserPermission(
166
141
  // Ensure there's always at least one admin
167
142
  if (permissionLevel < 2) {
168
143
  const admins = await db_query(client,
169
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
144
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
170
145
  [2, userId, true]
171
146
  );
172
147
 
@@ -176,7 +151,7 @@ export async function updateUserPermission(
176
151
  }
177
152
 
178
153
  const result = await db_query(client,
179
- "UPDATE Users SET UserLevel = ? WHERE userid = ?",
154
+ "UPDATE users SET UserLevel = ? WHERE userid = ?",
180
155
  [permissionLevel, userId]
181
156
  );
182
157
 
@@ -193,7 +168,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
193
168
  const user = await getUserByID(userId);
194
169
  if (user && user.UserLevel === 2) {
195
170
  const admins = await db_query(client,
196
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
171
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
197
172
  [2, userId, true]
198
173
  );
199
174
 
@@ -204,7 +179,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
204
179
 
205
180
  // Soft delete the user
206
181
  const result = await db_query(client,
207
- "UPDATE Users SET IsActive = ? WHERE userid = ?",
182
+ "UPDATE users SET IsActive = ? WHERE userid = ?",
208
183
  [false, userId]
209
184
  );
210
185
 
@@ -228,7 +203,7 @@ export async function getUserStats(): Promise<{
228
203
  SUM(CASE WHEN UserLevel = 2 THEN 1 ELSE 0 END) as admins,
229
204
  SUM(CASE WHEN UserLevel = 1 THEN 1 ELSE 0 END) as registeredUsers,
230
205
  SUM(CASE WHEN UserLevel = 0 THEN 1 ELSE 0 END) as guestUsers
231
- FROM Users
206
+ FROM users
232
207
  WHERE IsActive = ?
233
208
  `, [true]);
234
209
 
@@ -242,7 +217,7 @@ export async function cleanupExpiredSessions(): Promise<number> {
242
217
  const client = await db_init();
243
218
 
244
219
  const result = await db_query(client,
245
- "DELETE FROM UserSession WHERE ExpirationDate < CURRENT_TIMESTAMP"
220
+ "DELETE FROM usersession WHERE ExpirationDate < CURRENT_TIMESTAMP"
246
221
  );
247
222
 
248
223
  return result[0].changes;
@@ -266,13 +241,13 @@ export async function storeOAuthToken(
266
241
 
267
242
  // Delete existing tokens for this user/provider combo
268
243
  await db_query(client,
269
- "DELETE FROM OAuthTokens WHERE userid = ? AND Provider = ?",
244
+ "DELETE FROM oauthtokens WHERE userid = ? AND Provider = ?",
270
245
  [userId, provider]
271
246
  );
272
247
 
273
248
  // Insert new token
274
249
  await db_query(client,
275
- `INSERT INTO OAuthTokens
250
+ `INSERT INTO oauthtokens
276
251
  (ID, userid, Provider, AccessToken, RefreshToken, ExpiresAt, CreatedAt, UpdatedAt)
277
252
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
278
253
  [tokenId, userId, provider, accessToken, refreshToken || null, expiresAt, now, now]
@@ -289,7 +264,7 @@ export async function getOAuthToken(
289
264
  const client = await db_init();
290
265
 
291
266
  const tokens = await db_query(client,
292
- "SELECT * FROM OAuthTokens WHERE userid = ? AND Provider = ?",
267
+ "SELECT * FROM oauthtokens WHERE userid = ? AND Provider = ?",
293
268
  [userId, provider]
294
269
  );
295
270
 
@@ -308,8 +283,8 @@ export async function validateSession(sessionToken: string): Promise<{
308
283
 
309
284
  // Get session details
310
285
  const sessions = await db_query(client,
311
- `SELECT s.*, u.* FROM UserSession s
312
- JOIN Users u ON s.userid = u.userid
286
+ `SELECT s.*, u.* FROM usersession s
287
+ JOIN users u ON s.userid = u.userid
313
288
  WHERE s.SessionToken = ? AND s.ExpirationDate > CURRENT_TIMESTAMP AND u.IsActive = ?`,
314
289
  [sessionToken, true]
315
290
  );
@@ -350,7 +325,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
350
325
 
351
326
  // Get existing session
352
327
  const sessions = await db_query(client,
353
- "SELECT * FROM UserSession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
328
+ "SELECT * FROM usersession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
354
329
  [oldSessionToken]
355
330
  );
356
331
 
@@ -363,7 +338,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
363
338
 
364
339
  // Update session with new token
365
340
  await db_query(client,
366
- "UPDATE UserSession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
341
+ "UPDATE usersession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
367
342
  [newSessionToken, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), session.ID]
368
343
  );
369
344
 
@@ -145,70 +145,5 @@ export function db_migrate(model: Model): string {
145
145
  const dbType = (process.env.DATABASE_TYPE || process.env.DB_TYPE || 'postgres').toLowerCase() as DatabaseType;
146
146
  return dbImplementation.db_migrate(model, dbType);
147
147
  }
148
-
149
- /**
150
- * Initialize the database with models and sample data
151
- * @param models Array of models to create tables for
152
- * @param sampleData Optional array of sample data SQL statements
153
- */
154
- export async function initializeDatabase(
155
- models: Model[],
156
- sampleData?: Array<{tableName: string, sql: string}>
157
- ): Promise<void> {
158
- const client = await db_init();
159
-
160
- try {
161
- // Create auth tables first (Users, UserSession, OAuthTokens)
162
- const authTablesModel: Model = {
163
- id: '__auth_tables__',
164
- name: '__auth_tables__',
165
- fields: []
166
- };
167
- const authTablesSql = db_migrate(authTablesModel);
168
-
169
- // Execute each statement separately for auth tables
170
- const authStatements = authTablesSql.split(';').map(s => s.trim()).filter(s => s.length > 0);
171
- for (const statement of authStatements) {
172
- try {
173
- await db_query(client, statement);
174
- } catch (error) {
175
- // Some databases might not support certain syntax, continue with other statements
176
- if (!statement.includes('CREATE INDEX')) {
177
- console.error('Error creating auth table:', error);
178
- }
179
- }
180
- }
181
-
182
- // Create tables for each model
183
- for (const model of models) {
184
- const createTableSql = db_migrate(model);
185
- await db_query(client, createTableSql);
186
- }
187
-
188
- // Insert sample data if provided
189
- if (sampleData && sampleData.length > 0) {
190
- for (const data of sampleData) {
191
- try {
192
- await db_query(client, data.sql);
193
- } catch (error) {
194
- // Continue with other tables even if one fails
195
- }
196
- }
197
- }
198
- } catch (error) {
199
- throw error;
200
- }
201
- }
202
-
203
- /**
204
- * Close database connection(s)
205
- * @param dbPath Optional path for SQLite databases
206
- */
207
- export async function closeDatabase(dbPath?: string): Promise<void> {
208
- if (dbImplementation && dbImplementation.closeDatabase) {
209
- return dbImplementation.closeDatabase(dbPath);
210
- }
211
- }
212
-
213
148
  // Export types
214
149
  export type { Model, ModelField };
@@ -129,57 +129,6 @@ export function db_migrate(model: Model): string {
129
129
  return dbImplementation.db_migrate(model, dbType);
130
130
  }
131
131
 
132
- /**
133
- * Initialize the database with models and sample data
134
- * @param models Array of models to create tables for
135
- * @param sampleData Optional array of sample data SQL statements
136
- */
137
- export async function initializeDatabase(
138
- models: Model[],
139
- sampleData?: Array<{tableName: string, sql: string}>
140
- ): Promise<void> {
141
- const client = await db_init();
142
-
143
- try {
144
- console.log('Creating database tables...');
145
-
146
- // Create tables for each model
147
- for (const model of models) {
148
- const createTableSql = db_migrate(model);
149
- await db_query(client, createTableSql);
150
- console.log(`Created table: ${model.name}`);
151
- }
152
-
153
- // Insert sample data if provided
154
- if (sampleData && sampleData.length > 0) {
155
- console.log('Inserting sample data...');
156
- for (const data of sampleData) {
157
- try {
158
- await db_query(client, data.sql);
159
- console.log(`Inserted sample data for: ${data.tableName}`);
160
- } catch (error) {
161
- console.error(`Failed to insert sample data for ${data.tableName}:`, error);
162
- // Continue with other tables even if one fails
163
- }
164
- }
165
- }
166
-
167
- console.log('Database initialization complete');
168
- } catch (error) {
169
- console.error('Error initializing database:', error);
170
- throw error;
171
- }
172
- }
173
-
174
- /**
175
- * Close database connection(s)
176
- * @param dbPath Optional path for SQLite databases
177
- */
178
- export async function closeDatabase(dbPath?: string): Promise<void> {
179
- if (dbImplementation && dbImplementation.closeDatabase) {
180
- return dbImplementation.closeDatabase(dbPath);
181
- }
182
- }
183
132
 
184
133
  // Export types
185
134
  export type { Model, ModelField };
@@ -78,12 +78,12 @@ export async function writeModelsSql(targetDir, blueprint, databaseType = "postg
78
78
  const dbTypeMap = typeMap[databaseType] || typeMap.sqlite;
79
79
  const quoteChar = databaseType === 'mysql' ? '`' : '"';
80
80
  for (const model of models) {
81
- const tableName = model.name || model.id || "table";
81
+ const tableName = (model.name || model.id || "table").toLowerCase();
82
82
  lines.push(`\n-- Model: ${tableName}`);
83
83
  const fieldDefs = [];
84
84
  const fields = model.fields || [];
85
85
  for (const f of fields) {
86
- const name = f.name || "col";
86
+ const name = (f.name || "col").toLowerCase();
87
87
  const dt = f.datatype.toUpperCase() || "TEXT";
88
88
  const size = f.datatypesize || "";
89
89
  const required = f.required.toLowerCase() === "true" ? " NOT NULL" : "";
@@ -98,7 +98,7 @@ export async function writeModelsSql(targetDir, blueprint, databaseType = "postg
98
98
  if (model.data_is_user_specific.toLowerCase() === "true") {
99
99
  const userIdType = databaseType === 'mysql' ? 'VARCHAR(36)' : (databaseType === 'postgres' ? 'UUID' : 'TEXT');
100
100
  fieldDefs.push(` ${quoteChar}userid${quoteChar} ${userIdType} NOT NULL`);
101
- fieldDefs.push(` FOREIGN KEY (${quoteChar}userid${quoteChar}) REFERENCES ${quoteChar}Users${quoteChar} (${quoteChar}userid${quoteChar})`);
101
+ fieldDefs.push(` FOREIGN KEY (${quoteChar}userid${quoteChar}) REFERENCES ${quoteChar}users${quoteChar} (${quoteChar}userid${quoteChar})`);
102
102
  }
103
103
  const createSql = `CREATE TABLE IF NOT EXISTS ${quoteChar}${tableName}${quoteChar} (\n${fieldDefs.join(",\n")}\n);`;
104
104
  lines.push(createSql);
@@ -163,7 +163,7 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
163
163
  const sql = [];
164
164
  for (const m of migrations) {
165
165
  const action = m.action;
166
- const modelName = m.modelName || m.modelId || "";
166
+ const modelName = (m.modelName || m.modelId || "").toLowerCase();
167
167
  if (action === "create") {
168
168
  const modelChange = m.changes.find((c) => c.type === "model" && c.operation === "add");
169
169
  const model = (modelChange?.newValue ?? { name: modelName });
@@ -179,9 +179,9 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
179
179
  }
180
180
  const required = f.required.toLowerCase() === "true" ? " NOT NULL" : "";
181
181
  const pk = (f.key === "primary") ? " PRIMARY KEY" : "";
182
- return ` ${quoteChar}${f.name}${quoteChar} ${mappedType}${required}${pk}`;
182
+ return ` ${quoteChar}${f.name.toLowerCase()}${quoteChar} ${mappedType}${required}${pk}`;
183
183
  });
184
- sql.push(`CREATE TABLE IF NOT EXISTS ${quoteChar}${model.name || modelName}${quoteChar} (\n${fieldDefs.join(",\n")}\n);`);
184
+ sql.push(`CREATE TABLE IF NOT EXISTS ${quoteChar}${(model.name || modelName).toLowerCase()}${quoteChar} (\n${fieldDefs.join(",\n")}\n);`);
185
185
  continue;
186
186
  }
187
187
  if (action === "delete") {
@@ -204,19 +204,19 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
204
204
  const required = f.required.toLowerCase() === "true" ? " NOT NULL" : "";
205
205
  // SQLite doesn't support ALTER COLUMN syntax, needs special handling
206
206
  if (databaseType === 'sqlite') {
207
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name}${quoteChar} ${mappedType}${required};`);
207
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name.toLowerCase()}${quoteChar} ${mappedType}${required};`);
208
208
  }
209
209
  else {
210
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name}${quoteChar} ${mappedType}${required};`);
210
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name.toLowerCase()}${quoteChar} ${mappedType}${required};`);
211
211
  }
212
212
  }
213
213
  else if (c.operation === "remove" && c.field) {
214
214
  // SQLite doesn't support DROP COLUMN before version 3.35.0
215
215
  if (databaseType === 'sqlite') {
216
- sql.push(`-- WARNING: SQLite doesn't support DROP COLUMN. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${c.field}${quoteChar}`);
216
+ sql.push(`-- WARNING: SQLite doesn't support DROP COLUMN. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${c.field.toLowerCase()}${quoteChar}`);
217
217
  }
218
218
  else {
219
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} DROP COLUMN ${quoteChar}${c.field}${quoteChar};`);
219
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} DROP COLUMN ${quoteChar}${c.field.toLowerCase()}${quoteChar};`);
220
220
  }
221
221
  }
222
222
  else if (c.operation === "modify") {
@@ -230,15 +230,15 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
230
230
  }
231
231
  // SQLite doesn't support ALTER COLUMN TYPE
232
232
  if (databaseType === 'sqlite') {
233
- sql.push(`-- WARNING: SQLite doesn't support ALTER COLUMN TYPE. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${f.name || c.field || "col"}${quoteChar}`);
233
+ sql.push(`-- WARNING: SQLite doesn't support ALTER COLUMN TYPE. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${(f.name || c.field || "col").toLowerCase()}${quoteChar}`);
234
234
  }
235
235
  else if (databaseType === 'mysql') {
236
236
  // MySQL uses MODIFY syntax
237
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} MODIFY COLUMN ${quoteChar}${f.name || c.field || "col"}${quoteChar} ${mappedType};`);
237
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} MODIFY COLUMN ${quoteChar}${(f.name || c.field || "col").toLowerCase()}${quoteChar} ${mappedType};`);
238
238
  }
239
239
  else {
240
240
  // PostgreSQL uses ALTER COLUMN TYPE
241
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ALTER COLUMN ${quoteChar}${f.name || c.field || "col"}${quoteChar} TYPE ${mappedType};`);
241
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ALTER COLUMN ${quoteChar}${(f.name || c.field || "col").toLowerCase()}${quoteChar} TYPE ${mappedType};`);
242
242
  }
243
243
  }
244
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/generators/sql.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/generators/sql.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sitepaige-mcp-server",
3
- "version": "0.7.8",
3
+ "version": "0.7.10",
4
4
  "type": "module",
5
5
  "description": "MCP server for generating web applications using SitePaige AI. Generate frontend (FREE/12 credits) then optionally add backend (50 credits)",
6
6
  "keywords": [