1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2025-01-06 15:30:26 +00:00

Allow same user to login on multiple devices

This commit is contained in:
Thomas E Tuoti 2024-12-23 17:33:05 -07:00
parent d72a4c9826
commit 3a9977986b

View File

@ -46,7 +46,26 @@ SqlTiddlerDatabase.prototype.transaction = function(fn) {
return this.engine.transaction(fn); return this.engine.transaction(fn);
}; };
SqlTiddlerDatabase.prototype.createTables = function() { SqlTiddlerDatabase.prototype.createTables = function () {
// Drop and recreate sessions table
this.engine.runStatement(`
DROP TABLE IF EXISTS sessions
`);
this.engine.runStatement(`
CREATE TABLE sessions (
session_id TEXT PRIMARY KEY,
user_id INTEGER NOT NULL,
created_at TEXT NOT NULL,
last_accessed TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
)
`);
this.engine.runStatement(`
CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id)
`);
this.engine.runStatements([` this.engine.runStatements([`
-- Users table -- Users table
CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS users (
@ -194,6 +213,19 @@ SqlTiddlerDatabase.prototype.createTables = function() {
`]); `]);
}; };
SqlTiddlerDatabase.prototype.updateSessionTimestamp = function(sessionId) {
const currentTimestamp = new Date().toISOString();
this.engine.runStatement(`
UPDATE sessions
SET last_accessed = $timestamp
WHERE session_id = $sessionId
`, {
$sessionId: sessionId,
$timestamp: currentTimestamp
});
};
SqlTiddlerDatabase.prototype.listBags = function() { SqlTiddlerDatabase.prototype.listBags = function() {
const rows = this.engine.runStatementGetAll(` const rows = this.engine.runStatementGetAll(`
SELECT bag_name, bag_id, accesscontrol, description SELECT bag_name, bag_id, accesscontrol, description
@ -984,33 +1016,31 @@ SqlTiddlerDatabase.prototype.listUsers = function() {
SqlTiddlerDatabase.prototype.createOrUpdateUserSession = function(userId, sessionId) { SqlTiddlerDatabase.prototype.createOrUpdateUserSession = function(userId, sessionId) {
const currentTimestamp = new Date().toISOString(); const currentTimestamp = new Date().toISOString();
// First, try to update an existing session this.engine.runStatement(`
const updateResult = this.engine.runStatement(` INSERT INTO sessions (session_id, user_id, created_at, last_accessed)
UPDATE sessions VALUES ($sessionId, $userId, $timestamp, $timestamp)
SET session_id = $sessionId, last_accessed = $timestamp
WHERE user_id = $userId
`, { `, {
$userId: userId, $userId: userId,
$sessionId: sessionId, $sessionId: sessionId,
$timestamp: currentTimestamp $timestamp: currentTimestamp
}); });
// If no existing session was updated, create a new one
if (updateResult.changes === 0) {
this.engine.runStatement(`
INSERT INTO sessions (user_id, session_id, created_at, last_accessed)
VALUES ($userId, $sessionId, $timestamp, $timestamp)
`, {
$userId: userId,
$sessionId: sessionId,
$timestamp: currentTimestamp
});
}
return sessionId; return sessionId;
}; };
SqlTiddlerDatabase.prototype.deleteExpiredSessions = function() {
const expiryTime = new Date();
expiryTime.setHours(expiryTime.getHours() - 24); // 24 hour expiry
this.engine.runStatement(`
DELETE FROM sessions
WHERE last_accessed < $expiryTime
`, {
$expiryTime: expiryTime.toISOString()
});
};
SqlTiddlerDatabase.prototype.createUserSession = function(userId, sessionId) { SqlTiddlerDatabase.prototype.createUserSession = function(userId, sessionId) {
const currentTimestamp = new Date().toISOString(); const currentTimestamp = new Date().toISOString();
this.engine.runStatement(` this.engine.runStatement(`