feat: add display name functionality for users and update related views
All checks were successful
Build Images and Deploy / Update-PROD-Stack (push) Successful in 29s
All checks were successful
Build Images and Deploy / Update-PROD-Stack (push) Successful in 29s
This commit is contained in:
@@ -24,8 +24,8 @@ function getPointsForScanNumber(scanNumber) {
|
||||
const Users = {
|
||||
create(username, password) {
|
||||
const hash = bcrypt.hashSync(password, 12);
|
||||
const stmt = db.prepare('INSERT INTO users (username, password_hash) VALUES (?, ?)');
|
||||
const result = stmt.run(username, hash);
|
||||
const stmt = db.prepare('INSERT INTO users (username, password_hash, display_name) VALUES (?, ?, ?)');
|
||||
const result = stmt.run(username, hash, username);
|
||||
return result.lastInsertRowid;
|
||||
},
|
||||
|
||||
@@ -34,7 +34,7 @@ const Users = {
|
||||
},
|
||||
|
||||
findById(id) {
|
||||
return db.prepare('SELECT id, username, is_admin, is_organizer, created_at FROM users WHERE id = ?').get(id);
|
||||
return db.prepare('SELECT id, username, display_name, is_admin, is_organizer, created_at FROM users WHERE id = ?').get(id);
|
||||
},
|
||||
|
||||
verifyPassword(user, password) {
|
||||
@@ -58,6 +58,10 @@ const Users = {
|
||||
db.prepare('UPDATE users SET password_hash = ? WHERE id = ?').run(hash, userId);
|
||||
},
|
||||
|
||||
setDisplayName(userId, displayName) {
|
||||
db.prepare('UPDATE users SET display_name = ? WHERE id = ?').run(displayName, userId);
|
||||
},
|
||||
|
||||
createPasswordResetToken(userId) {
|
||||
const token = crypto.randomBytes(32).toString('hex');
|
||||
const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(); // 24 hours
|
||||
@@ -80,7 +84,7 @@ const Users = {
|
||||
},
|
||||
|
||||
getAllUsers() {
|
||||
return db.prepare("SELECT id, username, is_admin, is_organizer, created_at FROM users WHERE username NOT LIKE '[deleted_%]' ORDER BY username ASC").all();
|
||||
return db.prepare("SELECT id, username, COALESCE(display_name, username) as display_name, is_admin, is_organizer, created_at FROM users WHERE password_hash != '' ORDER BY COALESCE(display_name, username) ASC").all();
|
||||
},
|
||||
|
||||
getTotalPoints(userId) {
|
||||
@@ -139,9 +143,8 @@ const Users = {
|
||||
},
|
||||
|
||||
deleteUser(userId) {
|
||||
const placeholder = '[deleted_' + userId + ']';
|
||||
db.prepare('UPDATE users SET username = ?, password_hash = ?, is_admin = 0, is_organizer = 0 WHERE id = ?')
|
||||
.run(placeholder, '', userId);
|
||||
db.prepare('UPDATE users SET display_name = ?, password_hash = ?, is_admin = 0, is_organizer = 0 WHERE id = ?')
|
||||
.run('[deleted]', '', userId);
|
||||
db.prepare('UPDATE password_reset_tokens SET used = 1 WHERE user_id = ?').run(userId);
|
||||
db.prepare("DELETE FROM sessions WHERE sess LIKE ?").run('%"userId":' + userId + '%');
|
||||
}
|
||||
@@ -184,7 +187,7 @@ const Hunts = {
|
||||
},
|
||||
|
||||
getAll() {
|
||||
return db.prepare('SELECT h.*, u.username as creator_name FROM hunts h JOIN users u ON h.created_by = u.id ORDER BY h.created_at DESC').all();
|
||||
return db.prepare('SELECT h.*, COALESCE(u.display_name, u.username) as creator_name FROM hunts h JOIN users u ON h.created_by = u.id ORDER BY h.created_at DESC').all();
|
||||
},
|
||||
|
||||
getByCreator(userId) {
|
||||
@@ -198,7 +201,7 @@ const Hunts = {
|
||||
|
||||
getLeaderboard(huntId, limit = null, offset = 0) {
|
||||
let sql = `
|
||||
SELECT u.id, u.username, SUM(s.points_awarded) as total_points, COUNT(s.id) as scans
|
||||
SELECT u.id, u.username, COALESCE(u.display_name, u.username) as display_name, SUM(s.points_awarded) as total_points, COUNT(s.id) as scans
|
||||
FROM scans s
|
||||
JOIN users u ON s.user_id = u.id
|
||||
JOIN packages p ON s.package_id = p.id
|
||||
@@ -269,7 +272,7 @@ const Hunts = {
|
||||
const totalPackages = db.prepare('SELECT package_count FROM hunts WHERE id = ?').get(huntId).package_count;
|
||||
const totalPoints = db.prepare('SELECT COALESCE(SUM(s.points_awarded), 0) as total FROM scans s JOIN packages p ON s.package_id = p.id WHERE p.hunt_id = ?').get(huntId).total;
|
||||
const topFinders = db.prepare(`
|
||||
SELECT u.username, SUM(s.points_awarded) as points, COUNT(s.id) as finds
|
||||
SELECT u.username, COALESCE(u.display_name, u.username) as display_name, SUM(s.points_awarded) as points, COUNT(s.id) as finds
|
||||
FROM scans s
|
||||
JOIN users u ON s.user_id = u.id
|
||||
JOIN packages p ON s.package_id = p.id
|
||||
@@ -277,7 +280,7 @@ const Hunts = {
|
||||
GROUP BY u.id ORDER BY points DESC LIMIT 5
|
||||
`).all(huntId);
|
||||
const recentScans = db.prepare(`
|
||||
SELECT s.scanned_at, s.points_awarded, u.username, p.card_number
|
||||
SELECT s.scanned_at, s.points_awarded, u.username, COALESCE(u.display_name, u.username) as display_name, p.card_number
|
||||
FROM scans s
|
||||
JOIN users u ON s.user_id = u.id
|
||||
JOIN packages p ON s.package_id = p.id
|
||||
@@ -315,8 +318,10 @@ const Packages = {
|
||||
getByHunt(huntId) {
|
||||
return db.prepare(`
|
||||
SELECT p.*,
|
||||
u1.username as first_scanner_name,
|
||||
u2.username as last_scanner_name
|
||||
COALESCE(u1.display_name, u1.username) as first_scanner_name,
|
||||
u1.username as first_scanner_username,
|
||||
COALESCE(u2.display_name, u2.username) as last_scanner_name,
|
||||
u2.username as last_scanner_username
|
||||
FROM packages p
|
||||
LEFT JOIN users u1 ON p.first_scanned_by = u1.id
|
||||
LEFT JOIN users u2 ON p.last_scanned_by = u2.id
|
||||
@@ -329,8 +334,10 @@ const Packages = {
|
||||
return db.prepare(`
|
||||
SELECT p.*,
|
||||
h.name as hunt_name, h.short_name as hunt_short_name, h.id as hunt_id,
|
||||
u1.username as first_scanner_name,
|
||||
u2.username as last_scanner_name
|
||||
COALESCE(u1.display_name, u1.username) as first_scanner_name,
|
||||
u1.username as first_scanner_username,
|
||||
COALESCE(u2.display_name, u2.username) as last_scanner_name,
|
||||
u2.username as last_scanner_username
|
||||
FROM packages p
|
||||
JOIN hunts h ON p.hunt_id = h.id
|
||||
LEFT JOIN users u1 ON p.first_scanned_by = u1.id
|
||||
@@ -341,7 +348,7 @@ const Packages = {
|
||||
|
||||
getScanHistory(packageId) {
|
||||
return db.prepare(`
|
||||
SELECT s.*, u.username
|
||||
SELECT s.*, u.username, COALESCE(u.display_name, u.username) as display_name
|
||||
FROM scans s
|
||||
JOIN users u ON s.user_id = u.id
|
||||
WHERE s.package_id = ?
|
||||
@@ -410,7 +417,7 @@ const Scans = {
|
||||
|
||||
getGlobalLeaderboard(limit = null, offset = 0) {
|
||||
let sql = `
|
||||
SELECT u.id, u.username, SUM(s.points_awarded) as total_points, COUNT(s.id) as scans
|
||||
SELECT u.id, u.username, COALESCE(u.display_name, u.username) as display_name, SUM(s.points_awarded) as total_points, COUNT(s.id) as scans
|
||||
FROM scans s
|
||||
JOIN users u ON s.user_id = u.id
|
||||
WHERE s.points_awarded > 0
|
||||
@@ -429,7 +436,7 @@ const Scans = {
|
||||
getRecentActivity(limit = 5) {
|
||||
return db.prepare(`
|
||||
SELECT s.points_awarded, s.scanned_at,
|
||||
u.username,
|
||||
u.username, COALESCE(u.display_name, u.username) as display_name,
|
||||
p.card_number,
|
||||
h.name as hunt_name, h.short_name as hunt_short_name, h.package_count
|
||||
FROM scans s
|
||||
|
||||
Reference in New Issue
Block a user