205 lines
5.6 KiB
JavaScript
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);
|
|
}
|