Handle maxLibrarySize and maxHistory
This commit is contained in:
parent
37ffb3144c
commit
8be48072df
62
server.js
62
server.js
|
@ -57,7 +57,9 @@ function Server () {
|
||||||
|
|
||||||
this.server.get('/give', (req, res) => {
|
this.server.get('/give', (req, res) => {
|
||||||
const resourcePath = (req.url.substr(-1) === '/' ? '../' : './');
|
const resourcePath = (req.url.substr(-1) === '/' ? '../' : './');
|
||||||
const body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath });
|
let body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath });
|
||||||
|
body = this.replaceBodyWithTooManyBooksWarning(body);
|
||||||
|
|
||||||
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body });
|
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body });
|
||||||
res.send(html);
|
res.send(html);
|
||||||
});
|
});
|
||||||
|
@ -79,7 +81,8 @@ function Server () {
|
||||||
isActive: 'is-active',
|
isActive: 'is-active',
|
||||||
content: messageBox,
|
content: messageBox,
|
||||||
});
|
});
|
||||||
const body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath });
|
let body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath });
|
||||||
|
body = this.replaceBodyWithTooManyBooksWarning(body);
|
||||||
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body, modal });
|
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body, modal });
|
||||||
res.send(html);
|
res.send(html);
|
||||||
}, (err) => {
|
}, (err) => {
|
||||||
|
@ -92,7 +95,8 @@ function Server () {
|
||||||
isActive: 'is-active',
|
isActive: 'is-active',
|
||||||
content: messageBox,
|
content: messageBox,
|
||||||
});
|
});
|
||||||
const body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath, title, author, summary, contributor });
|
let body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath, title, author, summary, contributor });
|
||||||
|
body = this.replaceBodyWithTooManyBooksWarning(body);
|
||||||
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body, modal });
|
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body, modal });
|
||||||
res.send(html);
|
res.send(html);
|
||||||
});
|
});
|
||||||
|
@ -112,7 +116,8 @@ function Server () {
|
||||||
header: 'Missing Required Fields',
|
header: 'Missing Required Fields',
|
||||||
message: errorMessage,
|
message: errorMessage,
|
||||||
});
|
});
|
||||||
const body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath, title, author, summary, contributor });
|
let body = this.fillTemplate('./templates/pages/uploadForm.html', { resourcePath, title, author, summary, contributor });
|
||||||
|
body = this.replaceBodyWithTooManyBooksWarning(body);
|
||||||
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body, message });
|
const html = this.fillTemplate('./templates/htmlContainer.html', { title: 'Give a Book', resourcePath, body, message });
|
||||||
res.send(html);
|
res.send(html);
|
||||||
}
|
}
|
||||||
|
@ -291,8 +296,27 @@ Server.prototype.fillTemplate = function (file, templateVars = {}) {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Server.prototype.replaceBodyWithTooManyBooksWarning = function (body) {
|
||||||
|
if (settings.maxLibrarySize > 0) {
|
||||||
|
const numberOfBooks = fs.readdirSync(this.fileLocation).filter(fileName => fileName.includes('.json')).length;
|
||||||
|
if (numberOfBooks >= settings.maxLibrarySize) {
|
||||||
|
body = this.fillTemplate('./templates/elements/messageBox.html', {
|
||||||
|
style: 'is-danger',
|
||||||
|
title: 'Library Full',
|
||||||
|
message: 'Sorry, the library has reached its maximum capacity for books! You will need to wait until a book is taken before a new one can be added.',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
Server.prototype.generateHomePage = function (req) {
|
Server.prototype.generateHomePage = function (req) {
|
||||||
const files = fs.readdirSync(this.fileLocation).filter(fileName => fileName.includes('.json'));
|
const files = fs.readdirSync(this.fileLocation).filter(fileName => fileName.includes('.json'))
|
||||||
|
.map(fileName => { // Cache the file data so sorting doesn't need to re-check each file
|
||||||
|
return { name: fileName, time: fs.statSync(path.resolve(this.fileLocation, fileName)).mtime.getTime() };
|
||||||
|
}).sort((a, b) => a.time - b.time).map(v => v.name); // Sort from oldest to newest.
|
||||||
|
|
||||||
let books = files.map(fileName => {
|
let books = files.map(fileName => {
|
||||||
const bookData = JSON.parse(fs.readFileSync(path.resolve(this.fileLocation, fileName), 'utf8'));
|
const bookData = JSON.parse(fs.readFileSync(path.resolve(this.fileLocation, fileName), 'utf8'));
|
||||||
if (bookData.hasOwnProperty('fileName')) return '';
|
if (bookData.hasOwnProperty('fileName')) return '';
|
||||||
|
@ -342,7 +366,11 @@ Server.prototype.generateHomePage = function (req) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Server.prototype.generateHistoryPage = function (req) {
|
Server.prototype.generateHistoryPage = function (req) {
|
||||||
const files = fs.readdirSync(this.historyLocation).filter(fileName => fileName.includes('.json'));
|
const files = fs.readdirSync(this.historyLocation).filter(fileName => fileName.includes('.json'))
|
||||||
|
.map(fileName => { // Cache the file data so sorting doesn't need to re-check each file
|
||||||
|
return { name: fileName, time: fs.statSync(path.resolve(this.historyLocation, fileName)).mtime.getTime() };
|
||||||
|
}).sort((a, b) => b.time - a.time).map(v => v.name); // Sort from newest to oldest.
|
||||||
|
|
||||||
let history = files.map(fileName => {
|
let history = files.map(fileName => {
|
||||||
const bookData = JSON.parse(fs.readFileSync(path.resolve(this.historyLocation, fileName), 'utf8'));
|
const bookData = JSON.parse(fs.readFileSync(path.resolve(this.historyLocation, fileName), 'utf8'));
|
||||||
bookData.author = bookData.author ? bookData.author : '<em>author not provided</em>';
|
bookData.author = bookData.author ? bookData.author : '<em>author not provided</em>';
|
||||||
|
@ -460,6 +488,7 @@ Server.prototype.deleteBooks = function (socketId) {
|
||||||
fs.unlinkSync(bookPath);
|
fs.unlinkSync(bookPath);
|
||||||
// console.log('removed ' + bookPath);
|
// console.log('removed ' + bookPath);
|
||||||
fs.renameSync(bookDataPath, unusedFilename.sync(path.resolve(this.historyLocation, Date.now() + '.json')));
|
fs.renameSync(bookDataPath, unusedFilename.sync(path.resolve(this.historyLocation, Date.now() + '.json')));
|
||||||
|
this.removeHistoryBeyondLimit();
|
||||||
});
|
});
|
||||||
if (check === false) {
|
if (check === false) {
|
||||||
console.log('couldn\'t find data.bookId');
|
console.log('couldn\'t find data.bookId');
|
||||||
|
@ -469,6 +498,27 @@ Server.prototype.deleteBooks = function (socketId) {
|
||||||
this.takenBooks = this.takenBooks.filter(data => data.socketId === socketId);
|
this.takenBooks = this.takenBooks.filter(data => data.socketId === socketId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Server.prototype.removeHistoryBeyondLimit = function () {
|
||||||
|
if (settings.maxHistory > 0) {
|
||||||
|
let files = fs.readdirSync(this.historyLocation).filter(fileName => fileName.includes('.json'))
|
||||||
|
.map(fileName => { // Cache the file data so sorting doesn't need to re-check each file
|
||||||
|
return { name: fileName, time: fs.statSync(path.resolve(this.historyLocation, fileName)).mtime.getTime() };
|
||||||
|
}).sort((a, b) => b.time - a.time).map(v => v.name); // Sort from newest to oldest.
|
||||||
|
if (files.length > settings.maxHistory) {
|
||||||
|
files.slice(settings.maxHistory).forEach(fileName => {
|
||||||
|
const filePath = path.resolve(this.historyLocation, fileName);
|
||||||
|
fs.unlink(filePath, err => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
} else {
|
||||||
|
console.log('Deleted ' + filePath);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Server.prototype.uuid4 = function () {
|
Server.prototype.uuid4 = function () {
|
||||||
// https://stackoverflow.com/a/2117523
|
// https://stackoverflow.com/a/2117523
|
||||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||||
|
|
Loading…
Reference in New Issue