Meal Tracker v1 - complete
This commit is contained in:
119
server/models/db.js
Normal file
119
server/models/db.js
Normal file
@@ -0,0 +1,119 @@
|
||||
import Database from 'better-sqlite3';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
import 'dotenv/config';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
const DB_PATH = process.env.DB_PATH || path.join(__dirname, '../../data/meal-tracker.db');
|
||||
|
||||
let db;
|
||||
|
||||
export function getDb() {
|
||||
if (!db) {
|
||||
db = new Database(DB_PATH);
|
||||
db.pragma('journal_mode = WAL');
|
||||
}
|
||||
return db;
|
||||
}
|
||||
|
||||
export function initialize() {
|
||||
const database = getDb();
|
||||
|
||||
database.exec(`
|
||||
CREATE TABLE IF NOT EXISTS entries (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
description TEXT,
|
||||
image_url TEXT,
|
||||
notes TEXT,
|
||||
calories REAL DEFAULT 0,
|
||||
protein REAL DEFAULT 0,
|
||||
carbs REAL DEFAULT 0,
|
||||
fat REAL DEFAULT 0,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
)
|
||||
`);
|
||||
|
||||
database.exec(`
|
||||
CREATE INDEX IF NOT EXISTS idx_entries_created_at ON entries(created_at)
|
||||
`);
|
||||
|
||||
console.log('Database initialized');
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
export function getAll(dateFilter = null) {
|
||||
const db = getDb();
|
||||
let query = 'SELECT * FROM entries';
|
||||
let params = [];
|
||||
|
||||
if (dateFilter) {
|
||||
query += ' WHERE date(created_at) = date(?)';
|
||||
params.push(dateFilter);
|
||||
}
|
||||
|
||||
query += ' ORDER BY created_at DESC';
|
||||
|
||||
const stmt = db.prepare(query);
|
||||
return params.length ? stmt.all(...params) : stmt.all();
|
||||
}
|
||||
|
||||
export function getById(id) {
|
||||
const db = getDb();
|
||||
const stmt = db.prepare('SELECT * FROM entries WHERE id = ?');
|
||||
return stmt.get(id);
|
||||
}
|
||||
|
||||
export function create(entry) {
|
||||
const db = getDb();
|
||||
const stmt = db.prepare(`
|
||||
INSERT INTO entries (name, description, image_url, notes, calories, protein, carbs, fat)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`);
|
||||
|
||||
const result = stmt.run(
|
||||
entry.name,
|
||||
entry.description || null,
|
||||
entry.image_url || null,
|
||||
entry.notes || null,
|
||||
entry.calories || 0,
|
||||
entry.protein || 0,
|
||||
entry.carbs || 0,
|
||||
entry.fat || 0
|
||||
);
|
||||
|
||||
return { id: result.lastInsertRowid, ...entry };
|
||||
}
|
||||
|
||||
export function remove(id) {
|
||||
const db = getDb();
|
||||
const stmt = db.prepare('DELETE FROM entries WHERE id = ?');
|
||||
const result = stmt.run(id);
|
||||
return result.changes > 0;
|
||||
}
|
||||
|
||||
export function getDailyTotals(date) {
|
||||
const db = getDb();
|
||||
const stmt = db.prepare(`
|
||||
SELECT
|
||||
SUM(calories) as total_calories,
|
||||
SUM(protein) as total_protein,
|
||||
SUM(carbs) as total_carbs,
|
||||
SUM(fat) as total_fat,
|
||||
COUNT(*) as entry_count
|
||||
FROM entries
|
||||
WHERE date(created_at) = date(?)
|
||||
`);
|
||||
|
||||
const result = stmt.get(date);
|
||||
return {
|
||||
date,
|
||||
total_calories: result.total_calories || 0,
|
||||
total_protein: result.total_protein || 0,
|
||||
total_carbs: result.total_carbs || 0,
|
||||
total_fat: result.total_fat || 0,
|
||||
entry_count: result.entry_count || 0
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user