Add smart member list with manual+login merge and duplicate detection

This commit is contained in:
Torsten Schulz (local)
2025-10-21 14:35:21 +02:00
parent fa54e53820
commit b024bfe884
134 changed files with 15439 additions and 10 deletions

View File

@@ -0,0 +1,108 @@
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { promises } from 'fs';
import path from 'path';
const JWT_SECRET = process.env.JWT_SECRET || "harheimertc-secret-key-change-in-production";
const getDataPath = (filename) => {
const cwd = process.cwd();
if (cwd.endsWith(".output")) {
return path.join(cwd, "../server/data", filename);
}
return path.join(cwd, "server/data", filename);
};
const USERS_FILE = getDataPath("users.json");
const SESSIONS_FILE = getDataPath("sessions.json");
async function readUsers() {
try {
const data = await promises.readFile(USERS_FILE, "utf-8");
return JSON.parse(data);
} catch (error) {
console.error("Fehler beim Lesen der Benutzerdaten:", error);
return [];
}
}
async function writeUsers(users) {
try {
await promises.writeFile(USERS_FILE, JSON.stringify(users, null, 2), "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der Benutzerdaten:", error);
return false;
}
}
async function readSessions() {
try {
const data = await promises.readFile(SESSIONS_FILE, "utf-8");
return JSON.parse(data);
} catch (error) {
console.error("Fehler beim Lesen der Sessions:", error);
return [];
}
}
async function writeSessions(sessions) {
try {
await promises.writeFile(SESSIONS_FILE, JSON.stringify(sessions, null, 2), "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der Sessions:", error);
return false;
}
}
async function hashPassword(password) {
const salt = await bcrypt.genSalt(10);
return await bcrypt.hash(password, salt);
}
async function verifyPassword(password, hash) {
return await bcrypt.compare(password, hash);
}
function generateToken(user) {
return jwt.sign(
{
id: user.id,
email: user.email,
role: user.role
},
JWT_SECRET,
{ expiresIn: "7d" }
);
}
function verifyToken(token) {
try {
return jwt.verify(token, JWT_SECRET);
} catch (error) {
return null;
}
}
async function getUserById(id) {
const users = await readUsers();
return users.find((u) => u.id === id);
}
async function getUserFromToken(token) {
const decoded = verifyToken(token);
if (!decoded) return null;
const users = await readUsers();
return users.find((u) => u.id === decoded.id);
}
async function createSession(userId, token) {
const sessions = await readSessions();
const session = {
id: Date.now().toString(),
userId,
token,
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString()
// 7 days
};
sessions.push(session);
await writeSessions(sessions);
return session;
}
async function deleteSession(token) {
const sessions = await readSessions();
const filtered = sessions.filter((s) => s.token !== token);
await writeSessions(filtered);
}
export { getUserFromToken as a, verifyToken as b, createSession as c, deleteSession as d, getUserById as e, generateToken as g, hashPassword as h, readUsers as r, verifyPassword as v, writeUsers as w };
//# sourceMappingURL=auth.mjs.map