From a6a819503fb6800539efe5e6d4869f148912cc7e Mon Sep 17 00:00:00 2001 From: Robbie Antenesse Date: Mon, 24 Aug 2020 17:14:08 -0600 Subject: [PATCH] Consolidate and improve creating BookReferences --- server/controllers/bookData/Inventaire.js | 5 +--- server/controllers/bookData/index.js | 19 -------------- server/controllers/bookReference.js | 30 ++++++++++++----------- server/controllers/search/index.js | 12 +++------ server/controllers/shelf.js | 1 + server/routes/books.js | 6 ++--- server/routes/shelf.js | 5 ++-- 7 files changed, 28 insertions(+), 50 deletions(-) diff --git a/server/controllers/bookData/Inventaire.js b/server/controllers/bookData/Inventaire.js index e3855e0..df83152 100644 --- a/server/controllers/bookData/Inventaire.js +++ b/server/controllers/bookData/Inventaire.js @@ -202,10 +202,7 @@ class Inventaire { return a.publishDate < b.publishDate ? -1 : 1; }); - return covers.map(cover => { - delete cover.publishDate; - return cover; - }); + return covers; }); } } diff --git a/server/controllers/bookData/index.js b/server/controllers/bookData/index.js index 4a6f387..c741932 100644 --- a/server/controllers/bookData/index.js +++ b/server/controllers/bookData/index.js @@ -93,25 +93,6 @@ class BooksController { ), }; } - - async createBookReference (bookReferencesModel, source, uri) { - const inventaire = new Inventaire(this.language); - const bookData = await inventaire.getBookData(uri); - return await bookReferencesModel.create({ - name: bookData.name, - description: bookData.description, - sources: { - [source]: uri, - }, - covers: (bookData.covers ? bookData.covers : []).map(cover => { - return { - sourceId: uri, - url: cover.url, - }; - }), - locale: this.language, - }); - } } module.exports = BooksController; \ No newline at end of file diff --git a/server/controllers/bookReference.js b/server/controllers/bookReference.js index 75991d1..6313821 100644 --- a/server/controllers/bookReference.js +++ b/server/controllers/bookReference.js @@ -7,12 +7,14 @@ class BookReferenceController { this.lang = language; } - async createOrUpdateReference(source, sourceId) { + async createOrUpdateReference(source, sourceId, skipSearchBySourceCodes = false) { const searchController = new SearchController(this.models); - const existingReference = searchController.searchReferencesBySourceCode(source, sourceId); + if (!skipSearchBySourceCodes) { + const existingReferences = await searchController.searchReferencesBySourceCodes(source, [sourceId]); - if (existingReference.id !== null) { - return existingReference; + if (existingReferences.length > 0) { + return existingReferences[0]; + } } let dataClass; @@ -30,13 +32,13 @@ class BookReferenceController { // Get formatted book data from source const bookData = await dataClass.getBookData(sourceId); - if (typeof bookData.uri !== 'undefined') { + if (typeof bookData.sources[0].uri !== 'undefined') { // Check for references by exact name and author from source - const matchingReference = await searchController.searchReferencesForExactMatch(bookData.name, bookData.description); + const matchingReferences = await searchController.searchReferencesForExactMatch(bookData.name, bookData.description); - if (matchingReference.id !== null) { + if (matchingReferences.length > 0) { // If a match is found, update the sources of reference in the database and return it. - return await this.addSourceToReference(matchingReference, source, sourceId); + return await this.addSourceToReference(matchingReferences[0], source, sourceId); } return await this.createReference(bookData, source, sourceId); @@ -57,12 +59,12 @@ class BookReferenceController { covers: bookData.covers, locale: this.lang, }); - newReference.totalInteractions = 0; - newReference.numReviews = 0; - newReference.averageRating = null; - newReference.Interactions = []; - newReference.Reviews = []; - newReference.Ratings = []; + // newReference.totalInteractions = 0; + // newReference.numReviews = 0; + // newReference.averageRating = null; + // newReference.Interactions = []; + // newReference.Reviews = []; + // newReference.Ratings = []; return newReference; } diff --git a/server/controllers/search/index.js b/server/controllers/search/index.js index 0e2958e..6726745 100644 --- a/server/controllers/search/index.js +++ b/server/controllers/search/index.js @@ -168,15 +168,11 @@ class SearchController { ); } - async searchReferencesBySourceCode(source, sourceId) { - const sourceJSONKey = `"${source}"`; // Enable searching withing JSON column. - return await this.models.BookReference.findOne({ + async searchReferencesForExactMatch(name, description) { + return await this.models.BookReference.findAll({ where: { - sources: { - [sourceJSONKey]: { // Where the object key is the source - [Op.eq]: sourceId, - }, - }, + name, + description, }, ...this.bookReferenceSearchAttributes, }).then( // Empty results give 1 empty model in an array, so filter those out diff --git a/server/controllers/shelf.js b/server/controllers/shelf.js index 0d816cf..fd1f243 100644 --- a/server/controllers/shelf.js +++ b/server/controllers/shelf.js @@ -1,4 +1,5 @@ const fetch = require('node-fetch'); +const BookReferenceController = require('./bookReference'); class ShelfController { constructor (sequelizeModels, language) { // Language needs to be passed with every request involving books. diff --git a/server/routes/books.js b/server/routes/books.js index 9d9c7b9..4868d13 100644 --- a/server/routes/books.js +++ b/server/routes/books.js @@ -1,5 +1,6 @@ const BooksController = require('../controllers/bookData'); const SearchController = require('../controllers/search'); +const BookReferenceController = require('../controllers/bookReference'); async function routes(fastify, options) { fastify.get('/api/books', async (request, reply) => { @@ -39,9 +40,8 @@ async function routes(fastify, options) { return existingBookReferences[0].id; } - const books = new BooksController(request.body.source, request.body.uri, request.language); - const newBookReference = await books.createBookReference(fastify.models.BookReference, request.body.source, request.body.uri); - console.log('created new bookreference', newBookReference); + const bookReference = new BookReferenceController(fastify.models, request.language); + const newBookReference = await bookReference.createOrUpdateReference(request.body.source, request.body.uri, true); return newBookReference.id; }); } diff --git a/server/routes/shelf.js b/server/routes/shelf.js index ffc1884..ddb541b 100644 --- a/server/routes/shelf.js +++ b/server/routes/shelf.js @@ -188,10 +188,11 @@ async function routes(fastify, options) { }); } - const shelf = await request.user.getShelf({ + const shelf = (await request.user.getShelves({ where: { id: request.body.shelfId }, include: [ fastify.models.ShelfItem ], - }); + limit: 1, + }))[0]; if (!ShelfController.userOwnsShelf(request.user, shelf)) { return reply.code(403).send({