sitepaige-mcp-server 0.7.9 → 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.
- package/defaultapp/api/Auth/route.ts +4 -4
- package/defaultapp/db-mysql.ts +2 -65
- package/defaultapp/db-postgres.ts +1 -64
- package/defaultapp/db-sqlite.ts +0 -74
- package/defaultapp/db-users.ts +19 -19
- package/defaultapp/db.ts +0 -65
- package/dist/defaultapp/api/Auth/route.ts +4 -4
- package/dist/defaultapp/db-mysql.ts +2 -65
- package/dist/defaultapp/db-postgres.ts +1 -64
- package/dist/defaultapp/db-sqlite.ts +0 -74
- package/dist/defaultapp/db-users.ts +19 -19
- package/dist/defaultapp/db.ts +0 -65
- package/dist/generators/db-template.txt +0 -51
- package/dist/generators/sql.js +13 -13
- package/dist/generators/sql.js.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
321
|
+
"DELETE FROM usersession WHERE SessionToken = ?",
|
|
322
322
|
[sessionToken]
|
|
323
323
|
);
|
|
324
324
|
|
package/defaultapp/db-mysql.ts
CHANGED
|
@@ -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
|
-
|
|
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 \`
|
|
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 "
|
|
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
|
-
}
|
package/defaultapp/db-sqlite.ts
CHANGED
|
@@ -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
|
package/defaultapp/db-users.ts
CHANGED
|
@@ -45,7 +45,7 @@ export async function getAllUsers(): Promise<User[]> {
|
|
|
45
45
|
const client = await db_init();
|
|
46
46
|
|
|
47
47
|
const users = await db_query(client,
|
|
48
|
-
`SELECT * FROM
|
|
48
|
+
`SELECT * FROM users
|
|
49
49
|
WHERE IsActive = ?
|
|
50
50
|
ORDER BY UserLevel DESC, UserName ASC`,
|
|
51
51
|
[true]
|
|
@@ -61,7 +61,7 @@ export async function getUserByOAuthID(oauthId: string): Promise<User | null> {
|
|
|
61
61
|
const client = await db_init();
|
|
62
62
|
|
|
63
63
|
const users = await db_query(client,
|
|
64
|
-
"SELECT * FROM
|
|
64
|
+
"SELECT * FROM users WHERE OAuthID = ? AND IsActive = ?",
|
|
65
65
|
[oauthId, true]
|
|
66
66
|
);
|
|
67
67
|
|
|
@@ -75,7 +75,7 @@ export async function getUserByID(userId: string): Promise<User | null> {
|
|
|
75
75
|
const client = await db_init();
|
|
76
76
|
|
|
77
77
|
const users = await db_query(client,
|
|
78
|
-
"SELECT * FROM
|
|
78
|
+
"SELECT * FROM users WHERE userid = ? AND IsActive = ?",
|
|
79
79
|
[userId, true]
|
|
80
80
|
);
|
|
81
81
|
|
|
@@ -100,7 +100,7 @@ export async function upsertUser(
|
|
|
100
100
|
if (existingUser) {
|
|
101
101
|
// Update existing user
|
|
102
102
|
await db_query(client,
|
|
103
|
-
`UPDATE
|
|
103
|
+
`UPDATE users
|
|
104
104
|
SET UserName = ?, Email = COALESCE(?, Email), AvatarURL = ?,
|
|
105
105
|
LastLoginDate = CURRENT_TIMESTAMP, Source = ?
|
|
106
106
|
WHERE OAuthID = ?`,
|
|
@@ -110,7 +110,7 @@ export async function upsertUser(
|
|
|
110
110
|
return (await getUserByOAuthID(oauthId))!;
|
|
111
111
|
} else {
|
|
112
112
|
// Check if this is the first user (should be admin)
|
|
113
|
-
const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM
|
|
113
|
+
const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM users");
|
|
114
114
|
const isFirstUser = allUsers[0].count === 0;
|
|
115
115
|
|
|
116
116
|
// Create new user
|
|
@@ -118,7 +118,7 @@ export async function upsertUser(
|
|
|
118
118
|
const permissionLevel = isFirstUser ? 2 : 1; // First user is admin
|
|
119
119
|
|
|
120
120
|
await db_query(client,
|
|
121
|
-
`INSERT INTO
|
|
121
|
+
`INSERT INTO users
|
|
122
122
|
(userid, OAuthID, Source, UserName, Email, AvatarURL, UserLevel, UserTier,
|
|
123
123
|
LastLoginDate, CreatedDate, IsActive)
|
|
124
124
|
VALUES (?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?)`,
|
|
@@ -141,7 +141,7 @@ export async function updateUserPermission(
|
|
|
141
141
|
// Ensure there's always at least one admin
|
|
142
142
|
if (permissionLevel < 2) {
|
|
143
143
|
const admins = await db_query(client,
|
|
144
|
-
"SELECT COUNT(*) as count FROM
|
|
144
|
+
"SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
|
|
145
145
|
[2, userId, true]
|
|
146
146
|
);
|
|
147
147
|
|
|
@@ -151,7 +151,7 @@ export async function updateUserPermission(
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
const result = await db_query(client,
|
|
154
|
-
"UPDATE
|
|
154
|
+
"UPDATE users SET UserLevel = ? WHERE userid = ?",
|
|
155
155
|
[permissionLevel, userId]
|
|
156
156
|
);
|
|
157
157
|
|
|
@@ -168,7 +168,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
|
|
|
168
168
|
const user = await getUserByID(userId);
|
|
169
169
|
if (user && user.UserLevel === 2) {
|
|
170
170
|
const admins = await db_query(client,
|
|
171
|
-
"SELECT COUNT(*) as count FROM
|
|
171
|
+
"SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
|
|
172
172
|
[2, userId, true]
|
|
173
173
|
);
|
|
174
174
|
|
|
@@ -179,7 +179,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
|
|
|
179
179
|
|
|
180
180
|
// Soft delete the user
|
|
181
181
|
const result = await db_query(client,
|
|
182
|
-
"UPDATE
|
|
182
|
+
"UPDATE users SET IsActive = ? WHERE userid = ?",
|
|
183
183
|
[false, userId]
|
|
184
184
|
);
|
|
185
185
|
|
|
@@ -203,7 +203,7 @@ export async function getUserStats(): Promise<{
|
|
|
203
203
|
SUM(CASE WHEN UserLevel = 2 THEN 1 ELSE 0 END) as admins,
|
|
204
204
|
SUM(CASE WHEN UserLevel = 1 THEN 1 ELSE 0 END) as registeredUsers,
|
|
205
205
|
SUM(CASE WHEN UserLevel = 0 THEN 1 ELSE 0 END) as guestUsers
|
|
206
|
-
FROM
|
|
206
|
+
FROM users
|
|
207
207
|
WHERE IsActive = ?
|
|
208
208
|
`, [true]);
|
|
209
209
|
|
|
@@ -217,7 +217,7 @@ export async function cleanupExpiredSessions(): Promise<number> {
|
|
|
217
217
|
const client = await db_init();
|
|
218
218
|
|
|
219
219
|
const result = await db_query(client,
|
|
220
|
-
"DELETE FROM
|
|
220
|
+
"DELETE FROM usersession WHERE ExpirationDate < CURRENT_TIMESTAMP"
|
|
221
221
|
);
|
|
222
222
|
|
|
223
223
|
return result[0].changes;
|
|
@@ -241,13 +241,13 @@ export async function storeOAuthToken(
|
|
|
241
241
|
|
|
242
242
|
// Delete existing tokens for this user/provider combo
|
|
243
243
|
await db_query(client,
|
|
244
|
-
"DELETE FROM
|
|
244
|
+
"DELETE FROM oauthtokens WHERE userid = ? AND Provider = ?",
|
|
245
245
|
[userId, provider]
|
|
246
246
|
);
|
|
247
247
|
|
|
248
248
|
// Insert new token
|
|
249
249
|
await db_query(client,
|
|
250
|
-
`INSERT INTO
|
|
250
|
+
`INSERT INTO oauthtokens
|
|
251
251
|
(ID, userid, Provider, AccessToken, RefreshToken, ExpiresAt, CreatedAt, UpdatedAt)
|
|
252
252
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
253
253
|
[tokenId, userId, provider, accessToken, refreshToken || null, expiresAt, now, now]
|
|
@@ -264,7 +264,7 @@ export async function getOAuthToken(
|
|
|
264
264
|
const client = await db_init();
|
|
265
265
|
|
|
266
266
|
const tokens = await db_query(client,
|
|
267
|
-
"SELECT * FROM
|
|
267
|
+
"SELECT * FROM oauthtokens WHERE userid = ? AND Provider = ?",
|
|
268
268
|
[userId, provider]
|
|
269
269
|
);
|
|
270
270
|
|
|
@@ -283,8 +283,8 @@ export async function validateSession(sessionToken: string): Promise<{
|
|
|
283
283
|
|
|
284
284
|
// Get session details
|
|
285
285
|
const sessions = await db_query(client,
|
|
286
|
-
`SELECT s.*, u.* FROM
|
|
287
|
-
JOIN
|
|
286
|
+
`SELECT s.*, u.* FROM usersession s
|
|
287
|
+
JOIN users u ON s.userid = u.userid
|
|
288
288
|
WHERE s.SessionToken = ? AND s.ExpirationDate > CURRENT_TIMESTAMP AND u.IsActive = ?`,
|
|
289
289
|
[sessionToken, true]
|
|
290
290
|
);
|
|
@@ -325,7 +325,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
|
|
|
325
325
|
|
|
326
326
|
// Get existing session
|
|
327
327
|
const sessions = await db_query(client,
|
|
328
|
-
"SELECT * FROM
|
|
328
|
+
"SELECT * FROM usersession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
|
|
329
329
|
[oldSessionToken]
|
|
330
330
|
);
|
|
331
331
|
|
|
@@ -338,7 +338,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
|
|
|
338
338
|
|
|
339
339
|
// Update session with new token
|
|
340
340
|
await db_query(client,
|
|
341
|
-
"UPDATE
|
|
341
|
+
"UPDATE usersession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
|
|
342
342
|
[newSessionToken, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), session.ID]
|
|
343
343
|
);
|
|
344
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 \`
|
|
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 "
|
|
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
|
|
@@ -45,7 +45,7 @@ export async function getAllUsers(): Promise<User[]> {
|
|
|
45
45
|
const client = await db_init();
|
|
46
46
|
|
|
47
47
|
const users = await db_query(client,
|
|
48
|
-
`SELECT * FROM
|
|
48
|
+
`SELECT * FROM users
|
|
49
49
|
WHERE IsActive = ?
|
|
50
50
|
ORDER BY UserLevel DESC, UserName ASC`,
|
|
51
51
|
[true]
|
|
@@ -61,7 +61,7 @@ export async function getUserByOAuthID(oauthId: string): Promise<User | null> {
|
|
|
61
61
|
const client = await db_init();
|
|
62
62
|
|
|
63
63
|
const users = await db_query(client,
|
|
64
|
-
"SELECT * FROM
|
|
64
|
+
"SELECT * FROM users WHERE OAuthID = ? AND IsActive = ?",
|
|
65
65
|
[oauthId, true]
|
|
66
66
|
);
|
|
67
67
|
|
|
@@ -75,7 +75,7 @@ export async function getUserByID(userId: string): Promise<User | null> {
|
|
|
75
75
|
const client = await db_init();
|
|
76
76
|
|
|
77
77
|
const users = await db_query(client,
|
|
78
|
-
"SELECT * FROM
|
|
78
|
+
"SELECT * FROM users WHERE userid = ? AND IsActive = ?",
|
|
79
79
|
[userId, true]
|
|
80
80
|
);
|
|
81
81
|
|
|
@@ -100,7 +100,7 @@ export async function upsertUser(
|
|
|
100
100
|
if (existingUser) {
|
|
101
101
|
// Update existing user
|
|
102
102
|
await db_query(client,
|
|
103
|
-
`UPDATE
|
|
103
|
+
`UPDATE users
|
|
104
104
|
SET UserName = ?, Email = COALESCE(?, Email), AvatarURL = ?,
|
|
105
105
|
LastLoginDate = CURRENT_TIMESTAMP, Source = ?
|
|
106
106
|
WHERE OAuthID = ?`,
|
|
@@ -110,7 +110,7 @@ export async function upsertUser(
|
|
|
110
110
|
return (await getUserByOAuthID(oauthId))!;
|
|
111
111
|
} else {
|
|
112
112
|
// Check if this is the first user (should be admin)
|
|
113
|
-
const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM
|
|
113
|
+
const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM users");
|
|
114
114
|
const isFirstUser = allUsers[0].count === 0;
|
|
115
115
|
|
|
116
116
|
// Create new user
|
|
@@ -118,7 +118,7 @@ export async function upsertUser(
|
|
|
118
118
|
const permissionLevel = isFirstUser ? 2 : 1; // First user is admin
|
|
119
119
|
|
|
120
120
|
await db_query(client,
|
|
121
|
-
`INSERT INTO
|
|
121
|
+
`INSERT INTO users
|
|
122
122
|
(userid, OAuthID, Source, UserName, Email, AvatarURL, UserLevel, UserTier,
|
|
123
123
|
LastLoginDate, CreatedDate, IsActive)
|
|
124
124
|
VALUES (?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?)`,
|
|
@@ -141,7 +141,7 @@ export async function updateUserPermission(
|
|
|
141
141
|
// Ensure there's always at least one admin
|
|
142
142
|
if (permissionLevel < 2) {
|
|
143
143
|
const admins = await db_query(client,
|
|
144
|
-
"SELECT COUNT(*) as count FROM
|
|
144
|
+
"SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
|
|
145
145
|
[2, userId, true]
|
|
146
146
|
);
|
|
147
147
|
|
|
@@ -151,7 +151,7 @@ export async function updateUserPermission(
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
const result = await db_query(client,
|
|
154
|
-
"UPDATE
|
|
154
|
+
"UPDATE users SET UserLevel = ? WHERE userid = ?",
|
|
155
155
|
[permissionLevel, userId]
|
|
156
156
|
);
|
|
157
157
|
|
|
@@ -168,7 +168,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
|
|
|
168
168
|
const user = await getUserByID(userId);
|
|
169
169
|
if (user && user.UserLevel === 2) {
|
|
170
170
|
const admins = await db_query(client,
|
|
171
|
-
"SELECT COUNT(*) as count FROM
|
|
171
|
+
"SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
|
|
172
172
|
[2, userId, true]
|
|
173
173
|
);
|
|
174
174
|
|
|
@@ -179,7 +179,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
|
|
|
179
179
|
|
|
180
180
|
// Soft delete the user
|
|
181
181
|
const result = await db_query(client,
|
|
182
|
-
"UPDATE
|
|
182
|
+
"UPDATE users SET IsActive = ? WHERE userid = ?",
|
|
183
183
|
[false, userId]
|
|
184
184
|
);
|
|
185
185
|
|
|
@@ -203,7 +203,7 @@ export async function getUserStats(): Promise<{
|
|
|
203
203
|
SUM(CASE WHEN UserLevel = 2 THEN 1 ELSE 0 END) as admins,
|
|
204
204
|
SUM(CASE WHEN UserLevel = 1 THEN 1 ELSE 0 END) as registeredUsers,
|
|
205
205
|
SUM(CASE WHEN UserLevel = 0 THEN 1 ELSE 0 END) as guestUsers
|
|
206
|
-
FROM
|
|
206
|
+
FROM users
|
|
207
207
|
WHERE IsActive = ?
|
|
208
208
|
`, [true]);
|
|
209
209
|
|
|
@@ -217,7 +217,7 @@ export async function cleanupExpiredSessions(): Promise<number> {
|
|
|
217
217
|
const client = await db_init();
|
|
218
218
|
|
|
219
219
|
const result = await db_query(client,
|
|
220
|
-
"DELETE FROM
|
|
220
|
+
"DELETE FROM usersession WHERE ExpirationDate < CURRENT_TIMESTAMP"
|
|
221
221
|
);
|
|
222
222
|
|
|
223
223
|
return result[0].changes;
|
|
@@ -241,13 +241,13 @@ export async function storeOAuthToken(
|
|
|
241
241
|
|
|
242
242
|
// Delete existing tokens for this user/provider combo
|
|
243
243
|
await db_query(client,
|
|
244
|
-
"DELETE FROM
|
|
244
|
+
"DELETE FROM oauthtokens WHERE userid = ? AND Provider = ?",
|
|
245
245
|
[userId, provider]
|
|
246
246
|
);
|
|
247
247
|
|
|
248
248
|
// Insert new token
|
|
249
249
|
await db_query(client,
|
|
250
|
-
`INSERT INTO
|
|
250
|
+
`INSERT INTO oauthtokens
|
|
251
251
|
(ID, userid, Provider, AccessToken, RefreshToken, ExpiresAt, CreatedAt, UpdatedAt)
|
|
252
252
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
253
253
|
[tokenId, userId, provider, accessToken, refreshToken || null, expiresAt, now, now]
|
|
@@ -264,7 +264,7 @@ export async function getOAuthToken(
|
|
|
264
264
|
const client = await db_init();
|
|
265
265
|
|
|
266
266
|
const tokens = await db_query(client,
|
|
267
|
-
"SELECT * FROM
|
|
267
|
+
"SELECT * FROM oauthtokens WHERE userid = ? AND Provider = ?",
|
|
268
268
|
[userId, provider]
|
|
269
269
|
);
|
|
270
270
|
|
|
@@ -283,8 +283,8 @@ export async function validateSession(sessionToken: string): Promise<{
|
|
|
283
283
|
|
|
284
284
|
// Get session details
|
|
285
285
|
const sessions = await db_query(client,
|
|
286
|
-
`SELECT s.*, u.* FROM
|
|
287
|
-
JOIN
|
|
286
|
+
`SELECT s.*, u.* FROM usersession s
|
|
287
|
+
JOIN users u ON s.userid = u.userid
|
|
288
288
|
WHERE s.SessionToken = ? AND s.ExpirationDate > CURRENT_TIMESTAMP AND u.IsActive = ?`,
|
|
289
289
|
[sessionToken, true]
|
|
290
290
|
);
|
|
@@ -325,7 +325,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
|
|
|
325
325
|
|
|
326
326
|
// Get existing session
|
|
327
327
|
const sessions = await db_query(client,
|
|
328
|
-
"SELECT * FROM
|
|
328
|
+
"SELECT * FROM usersession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
|
|
329
329
|
[oldSessionToken]
|
|
330
330
|
);
|
|
331
331
|
|
|
@@ -338,7 +338,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
|
|
|
338
338
|
|
|
339
339
|
// Update session with new token
|
|
340
340
|
await db_query(client,
|
|
341
|
-
"UPDATE
|
|
341
|
+
"UPDATE usersession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
|
|
342
342
|
[newSessionToken, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), session.ID]
|
|
343
343
|
);
|
|
344
344
|
|
package/dist/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 };
|
|
@@ -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 };
|
package/dist/generators/sql.js
CHANGED
|
@@ -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}
|
|
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.
|
|
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": [
|