Initiële commit: VibeFinance 3-container opzet

Basislijn van de bestaande applicatie (Vite/React frontend, Express
backend, PostgreSQL) zoals die in de index stond, plus dev-, release-
en documentatiescripts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jordy Hoogeveen
2026-09-04 09:19:14 +02:00
co-authored by Claude Opus 5
commit e45d5b73fb
54 changed files with 11434 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
import { db } from "../db.js";
import { INITIAL_DATA } from "../constants/initialData.js";
export const dataStore = {
async load(userId) {
const { rows } = await db.query("SELECT data FROM user_data WHERE user_id = $1", [userId]);
return rows[0] ? JSON.parse(rows[0].data) : structuredClone(INITIAL_DATA);
},
async save(userId, payload) {
await db.query(
"INSERT INTO user_data (user_id, data) VALUES ($1, $2) ON CONFLICT (user_id) DO UPDATE SET data = $2",
[userId, JSON.stringify(payload)]
);
return payload;
},
async reset(userId) {
await db.query(
"INSERT INTO user_data (user_id, data) VALUES ($1, $2) ON CONFLICT (user_id) DO UPDATE SET data = $2",
[userId, JSON.stringify(structuredClone(INITIAL_DATA))]
);
},
};
+43
View File
@@ -0,0 +1,43 @@
/**
* PostgreSQL-backed user store.
*/
import { db } from "../db.js";
const toUser = (row) => row ? { ...row } : null;
export const userStore = {
async list() {
const { rows } = await db.query("SELECT * FROM users");
return rows.map(toUser);
},
async findByEmail(email) {
const { rows } = await db.query("SELECT * FROM users WHERE email = $1", [email]);
return toUser(rows[0]);
},
async findById(id) {
const { rows } = await db.query("SELECT * FROM users WHERE id = $1", [id]);
return toUser(rows[0]);
},
async create(data) {
const u = { id: `u${Date.now()}`, ...data };
await db.query(
"INSERT INTO users (id, naam, email, wachtwoord, rol, actief) VALUES ($1, $2, $3, $4, $5, $6)",
[u.id, u.naam, u.email, u.wachtwoord, u.rol ?? "Viewer", u.actief ?? true]
);
return u;
},
async update(id, patch) {
const { rows } = await db.query("SELECT * FROM users WHERE id = $1", [id]);
const user = toUser(rows[0]);
if (!user) return null;
const u = { ...user, ...patch };
await db.query(
"UPDATE users SET naam=$1, email=$2, wachtwoord=$3, rol=$4, actief=$5, avatar=$6 WHERE id=$7",
[u.naam, u.email, u.wachtwoord, u.rol, u.actief, u.avatar ?? null, id]
);
return u;
},
async remove(id) {
await db.query("DELETE FROM users WHERE id = $1", [id]);
},
};