Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions backend/models/books.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const mongoose = require("@utils/mongoose");
const id = require("@utils/id");
const spineWidth = require("@utils/spine-width");

const userSchema = mongoose.Schema({
const schema = mongoose.Schema({
bookId: {
type: String,
default: () => id(),
Expand All @@ -23,18 +23,18 @@ const userSchema = mongoose.Schema({
cover: { type: String },
coverColors: { type: Array },
ebook: { type: Object },
pages: { type: Number, default: 0 },
pages: { type: Number, default: 0, set: (v) => (Number.isNaN(v) ? 0 : v) },
hardback: { type: Boolean, default: false },
comments: [{ body: String, date: Date, user: String }],
lastUpdated: { type: Date, type: Date, default: () => new Date() },
order: { type: Number, required: true, default: 0 },
});

userSchema.virtual("width").get(function () {
schema.virtual("width").get(function () {
return spineWidth(this.pages, this.hardback);
});

userSchema.set("toJSON", { virtuals: true });
userSchema.set("toObject", { virtuals: true });
schema.set("toJSON", { virtuals: true });
schema.set("toObject", { virtuals: true });

module.exports = mongoose.model("books", userSchema);
module.exports = mongoose.model("books", schema);
34 changes: 34 additions & 0 deletions backend/utils/fetch-retry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const logger = require("@utils/logger")(module);

const fetchRetry = async (
url,
options = {},
{ retries = 3, retryDelay = 500 } = {}
) => {
let lastError;

for (let attempt = 0; attempt <= retries; attempt++) {
let response;
try {
response = await fetch(url, options);
logger.debug(
`Request attempt ${attempt + 1} for ${url} returned status ${response.status}`
);
if (response.status >= 500 && response.status < 600) {
throw new Error(`Server error: ${response.status}`);
}

return response;
} catch (err) {
lastError = err;

if (attempt >= retries) {
return response;
}

await new Promise((resolve) => setTimeout(resolve, retryDelay));
}
}
};

module.exports = fetchRetry;
20 changes: 18 additions & 2 deletions backend/utils/metadata-google.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,37 @@

const logger = require("@utils/logger")(module);
const getImage = require("@utils/image-get");
const fetchRetry = require("@utils/fetch-retry");

module.exports = async (isbn) => {
let data = {};
let parsedData = {};

try {
if (isbn) {
const response = await fetch(
const response = await fetchRetry(
`https://www.googleapis.com/books/v1/volumes?q=isbn:${isbn}`
);
if (!response.ok) {
logger.warn(
`Google books API request for ${isbn} returned status ${response.status}`
);
return {};
}
data = await response.json();
} else {
logger.warn(`Google books API request no ISBN provided`);
return {};
}

const book = data?.items[0];
if (!data?.items || data?.items?.length === 0) {
logger.warn(
`Google books API request for ${isbn} returned no results`
);
return {};
}

const book = data?.items[0];
logger.info(`Google books API request for ${isbn}`);
logger.debug(JSON.stringify(book, undefined, 4));

Expand Down
12 changes: 11 additions & 1 deletion backend/utils/metadata-openlibrary.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

const logger = require("@utils/logger")(module);
const getImage = require("@utils/image-get");
const fetchRetry = require("@utils/fetch-retry");

module.exports = async (isbn) => {
let data = {};
Expand All @@ -10,10 +11,19 @@ module.exports = async (isbn) => {

try {
if (isbn) {
const response = await fetch(
const response = await fetchRetry(
`https://openlibrary.org/isbn/${isbn}.json`
);
if (!response.ok) {
logger.warn(
`Open library API request for ${isbn} returned status ${response.status}`
);
return {};
}
data = await response.json();
} else {
logger.warn(`Open library API request no ISBN provided`);
return {};
}

if (data?.covers) {
Expand Down
Loading