geocrop-platform./apps/nextgen/server/seed_library.js

205 lines
5.6 KiB
JavaScript

const Database = require('better-sqlite3');
const path = require('path');
const { v4: uuidv4 } = require('uuid');
const dbPath = process.env.DB_PATH || path.join(__dirname, 'data/school.db');
const db = new Database(dbPath);
db.pragma('foreign_keys = ON');
console.log('Seeding library data into school.db...');
try {
// Clear any existing mock library data (optional, but counts are already 0)
db.prepare('DELETE FROM library_fines').run();
db.prepare('DELETE FROM library_reservations').run();
db.prepare('DELETE FROM library_issues').run();
// Reset book available copies to total copies before starting
const books = db.prepare('SELECT id, total_copies FROM library_books').all();
for (const b of books) {
db.prepare('UPDATE library_books SET available_copies = ? WHERE id = ?').run(b.total_copies, b.id);
}
// Define student/librarian IDs found in users table
const studentIds = [3, 23, 24, 25, 26]; // Nyasha Mapfumo, Kudzai Makoni, Tafadzwa Khumalo, Simbarashe Moyo, Shingai Muzenda
const librarianId = 5; // Tawanda Sibanda
// Define issue data
// Current local time: 2026-06-21
const issuesToSeed = [
{
uid: uuidv4(),
book_id: 1, // Things Fall Apart
user_id: 3, // Nyasha Mapfumo
issue_date: '2026-06-01',
due_date: '2026-06-15',
return_date: '2026-06-14',
status: 'returned',
issued_by: librarianId
},
{
uid: uuidv4(),
book_id: 2, // Cry, the Beloved Country
user_id: 23, // Kudzai Makoni
issue_date: '2026-06-05',
due_date: '2026-06-19', // Overdue (due before June 21)
return_date: null,
status: 'issued',
issued_by: librarianId
},
{
uid: uuidv4(),
book_id: 3, // Nervous Conditions
user_id: 24, // Tafadzwa Khumalo
issue_date: '2026-06-15',
due_date: '2026-06-29', // Active (due after June 21)
return_date: null,
status: 'issued',
issued_by: librarianId
},
{
uid: uuidv4(),
book_id: 4, // House of Hunger
user_id: 25, // Simbarashe Moyo
issue_date: '2026-06-10',
due_date: '2026-06-24', // Active
return_date: null,
status: 'issued',
issued_by: librarianId
},
{
uid: uuidv4(),
book_id: 1, // Things Fall Apart
user_id: 26, // Shingai Muzenda
issue_date: '2026-06-02',
due_date: '2026-06-16', // Overdue
return_date: null,
status: 'issued',
issued_by: librarianId
}
];
const insertIssue = db.prepare(`
INSERT INTO library_issues (uid, book_id, user_id, issue_date, due_date, return_date, status, issued_by)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`);
const issueIds = [];
for (const issue of issuesToSeed) {
const res = insertIssue.run(
issue.uid,
issue.book_id,
issue.user_id,
issue.issue_date,
issue.due_date,
issue.return_date,
issue.status,
issue.issued_by
);
issueIds.push({ id: res.lastInsertRowid, book_id: issue.book_id, status: issue.status });
// Decrement available copies if it is active (issued)
if (issue.status === 'issued') {
db.prepare('UPDATE library_books SET available_copies = available_copies - 1 WHERE id = ?').run(issue.book_id);
}
}
console.log(`Successfully seeded ${issuesToSeed.length} issues.`);
// Define fines
const finesToSeed = [
{
uid: uuidv4(),
issue_id: issueIds[1].id, // Issue 2 (Kudzai Makoni - Overdue)
user_id: 23,
amount: 5.00,
reason: 'Late return penalty for Cry, the Beloved Country',
status: 'unpaid'
},
{
uid: uuidv4(),
issue_id: issueIds[4].id, // Issue 5 (Shingai Muzenda - Overdue)
user_id: 26,
amount: 2.50,
reason: 'Late return penalty for Things Fall Apart',
status: 'unpaid'
},
{
uid: uuidv4(),
issue_id: issueIds[0].id, // Issue 1 (Nyasha Mapfumo - Returned)
user_id: 3,
amount: 1.50,
reason: 'Minor cover scratch penalty',
status: 'paid'
}
];
const insertFine = db.prepare(`
INSERT INTO library_fines (uid, issue_id, user_id, amount, reason, status)
VALUES (?, ?, ?, ?, ?, ?)
`);
for (const fine of finesToSeed) {
insertFine.run(
fine.uid,
fine.issue_id,
fine.user_id,
fine.amount,
fine.reason,
fine.status
);
}
console.log(`Successfully seeded ${finesToSeed.length} fines.`);
// Define reservations
const reservationsToSeed = [
{
uid: uuidv4(),
book_id: 1, // Things Fall Apart
user_id: 23, // Kudzai Makoni
reservation_date: '2026-06-20',
status: 'pending',
notes: 'Need for Literature assignment next week'
},
{
uid: uuidv4(),
book_id: 3, // Nervous Conditions
user_id: 25, // Simbarashe Moyo
reservation_date: '2026-06-21',
status: 'pending',
notes: 'Prep study'
},
{
uid: uuidv4(),
book_id: 4, // House of Hunger
user_id: 24, // Tafadzwa Khumalo
reservation_date: '2026-06-18',
status: 'fulfilled',
notes: 'Class research request'
}
];
const insertReservation = db.prepare(`
INSERT INTO library_reservations (uid, book_id, user_id, reservation_date, status, notes)
VALUES (?, ?, ?, ?, ?, ?)
`);
for (const res of reservationsToSeed) {
insertReservation.run(
res.uid,
res.book_id,
res.user_id,
res.reservation_date,
res.status,
res.notes
);
}
console.log(`Successfully seeded ${reservationsToSeed.length} reservations.`);
console.log('Library database seeding complete!');
} catch (err) {
console.error('Failed to seed library database:', err);
}